Gerar conteúdo

O Firebase Genkit tem uma interface fácil para gerar conteúdo com LLMs.

Modelos

Os modelos no Firebase Genkit são bibliotecas e abstrações que dão acesso a vários LLMs do Google e de terceiros.

Os modelos são totalmente instrumentados para observabilidade e vêm com integrações de ferramentas fornecidas pela interface do desenvolvedor do Genkit. É possível testar qualquer modelo usando o executor de modelos.

Ao trabalhar com modelos no Genkit, primeiro é preciso configurar o modelo com que você quer trabalhar. A configuração do modelo é executada pelo sistema de plug-ins. Neste exemplo, você está configurando o plug-in Vertex AI, que fornece modelos do Gemini.

import { configureGenkit } from '@genkit-ai/core';
import { firebase } from '@genkit-ai/firebase';
import { vertexAI } from '@genkit-ai/vertexai';

configureGenkit({
  plugins: [vertexAI()],
});

Para usar os modelos fornecidos pelo plug-in, é possível se referir a eles pelo nome (por exemplo, 'vertexai/gemini-1.0-pro') ou alguns plug-ins de exportação de objetos de referência do modelo que fornecem mais informações de tipo sobre os recursos e as opções do modelo.

import { geminiPro } from '@genkit-ai/vertexai';

Modelos compatíveis

O Genkit é compatível com modelos pelo sistema de plug-ins. Estes plug-ins têm suporte oficial:

Plug-in Modelos
IA generativa do Google Gemini Pro e Gemini Pro Vision
Vertex AI do Google Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Olama Muitos modelos locais, incluindo Gemma, Llama 2, Mistral e muito mais

Consulte a documentação de cada plug-in para ver informações de configuração e uso.

Como gerar conteúdo

generate é uma função auxiliar para trabalhar com modelos.

Para chamar o modelo:

import { generate } from '@genkit-ai/ai';
import { geminiPro } from '@genkit-ai/vertexai';

(async () => {
  const llmResponse = await generate({
    model: geminiPro,
    prompt: 'Tell me a joke.',
  });

  console.log(await llmResponse.text());
})();

É possível transmitir várias opções para esse modelo, incluindo a especificação de um modelo personalizado para LLMs específicos.

const response = await generate({
  model: geminiPro,
  prompt,
  config: {
    temperature: 1,
    stopSequences: ['abc'],
  },
});

Se o modelo for compatível com entrada multimodal, será possível transmitir imagens como entrada:

const result = await generate({
  model: geminiProVision,
  prompt: [
    { text: 'describe the following image:' },
    { media: { url: imageUrl, contentType: 'image/jpeg' } },
  ],
});

Ou a partir de um arquivo local:

const result = await generate({
  model: geminiProVision,
  prompt: [
    { text: 'describe the following image:' },
    {
      data: {
        url: fs.readFileSync(__dirname + '/image.jpeg', {
          encoding: 'base64',
          flag: 'r',
        }),
        contentType: 'image/jpeg',
      },
    },
  ],
});

Model também oferece suporte a chamadas de ferramentas e funções. O suporte às ferramentas depende de modelos específicos.

const myTool = action(
  {
    name: 'myJoke',
    description: 'useful when you need a joke to tell.',
    inputSchema: z.object({ subject: z.string() }),
    outputSchema: z.string(),
  },
  async (input) => 'haha Just kidding no joke! got you'
);

const llmResponse = await generate({
  model: geminiPro,
  prompt: 'Tell me a joke.',
  tools: [myTool],
  config: {
    temperature: 0.5,
  },
});

Isso chamará as ferramentas automaticamente para atender ao comando do usuário.

É possível especificar returnToolRequests: true para controle manual da chamada de ferramentas.

const llmResponse = await generate({
  model: geminiPro,
  prompt: 'Tell me a joke.',
  tools: [myTool],
  returnToolRequests: true,
  config: {
    temperature: 0.5,
  },
});

E é possível transmitir saídas de modelos compatíveis:

await generate({
  model: geminiPro,
  prompt: 'Tell me a very long joke.',
  streamingCallback: (chunk) => {
    console.log(chunk);
  },
});

Adicionar contexto de recuperação

Os documentos de um recuperador podem ser transmitidos diretamente para generate para fornecer contexto de embasamento:

const docs = await companyPolicyRetriever({ query: question });

await generate({
  model: geminiPro,
  prompt: `Answer using the available context from company policy: ${question}`,
  context: docs,
});

O contexto do documento é anexado automaticamente ao conteúdo do comando enviado ao modelo.

Gravando histórico de mensagens

Os modelos do Genkit permitem manter um histórico das mensagens enviadas ao modelo e das respostas dele, que você pode usar para criar experiências interativas, como bots de chat.

Para gerar o histórico de mensagens com base em uma resposta de modelo, chame o método toHistory():

let response = await generate({
  model: geminiPro,
  prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();

É possível serializar esse histórico e mantê-lo em um banco de dados ou armazenamento de sessão. Em seguida, transmita o histórico com a solicitação nas próximas chamadas para generate():

response = await generate({
  model: geminiPro,
  prompt: 'How about in Spanish?',
  history,
});
history = response.toHistory();

Se o modelo que você está usando for compatível com o papel system, use o histórico inicial para definir a mensagem do sistema:

let history: MessageData[] = [
  { role: 'system', content: [{ text: 'Talk like a pirate.' }] },
];
let response = await generate({
  model: geminiPro,
  prompt: "How do you say 'dog' in French?",
  history,
});
history = response.toHistory();

Respostas de streaming

O Genkit é compatível com o streaming em partes das respostas do modelo pelo método generateStream():

// import { generateStream } from '@genkit-ai/ai';
const { response, stream } = await generateStream({
  model: geminiPro,
  prompt: 'Tell a long story about robots and ninjas.',
});

for await (const chunk of stream()) {
  console.log(chunk.text());
}

// you can also await the full response
console.log((await response()).text());