IA integrada no Chrome: pôr o assistente a lembrar-se da conversa
·
Este texto descreve uma versão experimental da IA integrada no Chrome, de 2024 (window.ai, Chrome 128 Canary e Dev). Essa API foi entretanto substituída e hoje já guarda o contexto da conversa sozinha. Fica aqui como registo. Para código atual, consulte a documentação da Prompt API.
Se estiver com pressa, salte para «A solução».
O Chrome lançou há pouco, para programadores e entusiastas, uma versão integrada do Gemini: um assistente offline que corre na sua própria máquina.
Para aceder a esta API, use uma versão compatível do Chrome (Canary ou Dev, versão 128 ou superior). Pode descarregá-las aqui:
Depois de instalar, abra chrome://flags (escreva-o na barra de endereço) e defina:
- Enables optimization guide on device como Enabled BypassPerfRequirement;
- Prompt API for Gemini Nano como Enabled.
Reinicie o Chrome e abra chrome://components. Deve aparecer um componente chamado Optimization Guide On Device Model. Descarregue-o (cerca de 1,5 GB, atenção ao tarifário).
Se não aparecer, carregue em F12, abra a consola e escreva:
await window.ai.createTextSession()
Carregue em Enter e o Optimization Guide On Device Model deve surgir na lista de componentes. Reinicie o Chrome mais uma vez e, se estiver tudo certo, a IA fica pronta a usar.
Preparar o básico
Antes de pôr o Gemini Nano local a lembrar-se da conversa, convém confirmar que funciona. Cole isto na consola:
const canCreate = await window.ai.canCreateTextSession();
if (canCreate !== "no") {
const session = await window.ai.createTextSession();
// Envia o pedido ao modelo e mostra a resposta à medida que chega:
const stream = session.promptStreaming("Write me an extra-long poem");
for await (const chunk of stream) {
console.log(chunk);
}
}
O problema a resolver é que, se perguntar à IA alguma coisa sobre a conversa anterior, mesmo dentro da mesma sessão, ela não consegue responder. Não guarda o contexto.
Veja um exemplo na aplicação da Vercel:
Como se vê, esqueceu a tabela anterior e inventou uma nova do nada. Não é o que queremos, por isso vamos resolver.
Pôr o Gemini a lembrar-se das mensagens anteriores
A investigação
É possível dar contexto à IA integrada através do próprio pedido. Ao contrário de parâmetros como a temperatura e o top-k, definidos quando se cria a sessão, o contexto é enviado a cada mensagem do utilizador.
Há uma sequência de controlo especial que permite fazê-lo. Na documentação oficial da altura, servia para ajudar o modelo a perceber rondas de interação simuladas, uma forma de o orientar para o resultado pretendido.
Como se vê, não diz grande coisa sobre contexto. Mas tive o palpite de que dava para ir mais longe e, depois de alguma pesquisa sobre o funcionamento interno do Gemini, encontrei uma maneira de o modelo se comportar como se tivesse contexto.
A solução
Em cada pedido, exceto no primeiro, passe à função de prompt uma string com este formato:
`${allPreviousMessages} <ctrl23> ${currentPrompt}`
Ou seja: as mensagens anteriores separadas por quebras de linha, depois a sequência de controlo especial (que é literalmente o texto <ctrl23>, não um símbolo Unicode exótico), e por fim o pedido atual. O resultado é uma IA que tem noção do contexto:
Pode experimentar aqui.
Para bons resultados, limite o tamanho do pedido: pedidos com milhares de caracteres podem estragar o modelo.
Se tiver curiosidade em ver como ficam os pedidos, este é o primeiro:
make a table with 2 songs and its artists
Este é o segundo:
make a table with 2 songs and its artists
| Song Title | Artist |
|---|---|
| "Strawberry Fields Forever" | The Beatles |
| "Born This Way" | Lady Gaga |
<ctrl23>
add a nirvana song to this table
E com um terceiro pedido ficaria assim:
make a table with 2 songs and its artists
| Song Title | Artist |
|---|---|
| "Strawberry Fields Forever" | The Beatles |
| "Born This Way" | Lady Gaga |
add a nirvana song to this table
| Song Title | Artist |
|---|---|
| "Strawberry Fields Forever" | The Beatles |
| "Born This Way" | Lady Gaga |
| "Smells Like Teen Spirit" | Nirvana |
<ctrl23>
What are the four seasons?
O pedido vai crescendo até ao limite de 4096 caracteres indicado na documentação. Pessoalmente, não passaria dos 1000. Um poema de 2552 caracteres estragou o modelo e deu algum trabalho pô-lo a funcionar outra vez. Também pode ter sido culpa do meu portátil antigo.
E é tudo
O repositório da versão com contexto está no GitHub. Deixe-lhe uma estrela se gostou.
- A minha aplicação: dlgiovani.github.io/chrome-ai-webapp
- Aplicação da Vercel: ai-sdk-chrome-ai.vercel.app
- Repositório: github.com/dlgiovani/chrome-ai-webapp
Fora do Jornal, o meu trabalho são integrações e automações entre CRM, ERP e plataformas de gestão, para empresas em Guimarães, Braga e no resto do país. Veja os trabalhos anteriores ou fale comigo.