Saltar para o conteúdo
Giovani Drosda Lima
IA · Chrome · Desatualizado

IA integrada no Chrome: pôr o assistente a lembrar-se da conversa

·

Desatualizado

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);
  }
}
Consola do Chrome a correr o código acima, com o poema a crescer um pedaço de cada vez.
Deve ver isto a acontecer

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:

Conversa em que o utilizador pede uma tabela com duas músicas e depois pede para acrescentar uma dos Nirvana; o modelo responde com uma tabela nova, sem relação com a primeira.
Adeus, Ed Sheeran. Estava à espera de um rickroll, não estava?

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.

Excerto da documentação com um exemplo de few-shot prompt, em que artigos e resumos de exemplo estão separados pela sequência ctrl23.
O exemplo da documentação

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:

A mesma conversa na minha aplicação: depois de pedir para acrescentar uma música dos Nirvana, o modelo devolve a tabela original com a linha nova.
Agora o contexto não se perde. Usar Markdown nas respostas do modelo também ajuda.

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.

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.