Firebase Genkit proporciona una interfaz sencilla para generar contenido con LLM.
Modelos
Los modelos de Firebase Genkit son bibliotecas y abstracciones que proporcionan acceso a varios LLM de Google y de terceros.
Los modelos están completamente instrumentados para la observabilidad e incluyen herramientas que ofrece la IU de desarrollador de Genkit puedes probar cualquier modelo usando el ejecutor de modelos.
Cuando trabajas con modelos en Genkit, primero debes configurar el modelo con el que quieres trabajar. La configuración del modelo la realiza el sistema de complementos. En este ejemplo, configuras el complemento de Vertex AI, que proporciona Gemini e implementar modelos automáticamente.
import { configureGenkit } from '@genkit-ai/core';
import { firebase } from '@genkit-ai/firebase';
import { vertexAI } from '@genkit-ai/vertexai';
configureGenkit({
plugins: [vertexAI()],
});
Para usar los modelos proporcionados por el complemento, puedes hacer referencia a ellos por su nombre (p.ej.,
'vertexai/gemini-1.5-flash'
) o algunos complementos exportan objetos de referencia de modelo que
proporcionar información adicional de tipos sobre las capacidades y opciones del modelo.
import { gemini15Flash } from '@genkit-ai/vertexai';
Modelos compatibles
Genkit proporciona compatibilidad con los modelos a través de su sistema de complementos. Se admiten oficialmente los siguientes complementos:
Complemento | Modelos |
---|---|
IA generativa de Google | Gemini Pro, Gemini Pro Vision |
Google Vertex AI | Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro e Imagen2 |
Ollama | Muchos modelos locales, como Gemma, Llama 2, Mistral y muchos más |
Consulta la documentación de cada complemento para obtener información sobre la configuración y el uso. También está
una amplia variedad de modelos disponibles con asistencia de la comunidad que puedes descubrir
buscando paquetes que comienzan con genkitx-
en npmjs.org.
Cómo generar contenido
generate
es una función auxiliar para trabajar con modelos.
Para llamar solo al modelo, haz lo siguiente:
import { generate } from '@genkit-ai/ai';
import { gemini15Flash } from '@genkit-ai/vertexai';
(async () => {
const llmResponse = await generate({
model: gemini15Flash,
prompt: 'Tell me a joke.',
});
console.log(await llmResponse.text());
})();
Puedes pasar varias opciones para ese modelo, incluida la especificación de un personalizado para LLM específicos.
const response = await generate({
model: gemini15Flash,
prompt,
config: {
temperature: 1,
stopSequences: ['abc'],
},
});
Si el modelo admite entradas multimodales, puedes pasar imágenes como entrada:
const result = await generate({
model: gemini15Flash,
prompt: [
{ text: 'describe the following image:' },
{ media: { url: imageUrl, contentType: 'image/jpeg' } },
],
});
O desde un archivo local:
const result = await generate({
model: gemini15Flash,
prompt: [
{ text: 'describe the following image:' },
{
data: {
url: fs.readFileSync(__dirname + '/image.jpeg', {
encoding: 'base64',
flag: 'r',
}),
contentType: 'image/jpeg',
},
},
],
});
Herramientas y llamadas a funciones
Model
también admite herramientas y llamadas a funciones. La compatibilidad de las herramientas 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: gemini15Flash,
prompt: 'Tell me a joke.',
tools: [myTool],
config: {
temperature: 0.5,
},
});
De esta forma, se llamará automáticamente a las herramientas para cumplir con la instrucción del usuario.
Puedes especificar returnToolRequests: true
para controlar de forma manual las llamadas a herramientas.
const llmResponse = await generate({
model: gemini15Flash,
prompt: 'Tell me a joke.',
tools: [myTool],
returnToolRequests: true,
config: {
temperature: 0.5,
},
});
Cómo agregar contexto de retriever
Los documentos de un retriever se pueden pasar directamente a generate
para proporcionar
contexto de los fundamentos:
const docs = await companyPolicyRetriever({ query: question });
await generate({
model: gemini15Flash,
prompt: `Answer using the available context from company policy: ${question}`,
context: docs,
});
El contexto del documento se agrega automáticamente al contenido de la instrucción enviados al modelo.
Historial de mensajes de grabación
Los modelos de Genkit admiten mantener un historial de los mensajes enviados al modelo y sus respuestas, que puedes usar para crear experiencias interactivas, como chatbots.
Para generar un historial de mensajes a partir de una respuesta del modelo, llama al toHistory()
método:
let response = await generate({
model: gemini15Flash,
prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();
Puedes serializar este historial y conservarlo en una base de datos o en un almacenamiento de sesión.
Luego, pasa el historial junto con el mensaje en las llamadas futuras a generate()
:
response = await generate({
model: gemini15Flash,
prompt: 'How about in Spanish?',
history,
});
history = response.toHistory();
Si el modelo que usas admite el rol system
, puedes usar el
para configurar el mensaje del sistema:
let history: MessageData[] = [
{ role: 'system', content: [{ text: 'Talk like a pirate.' }] },
];
let response = await generate({
model: gemini15Flash,
prompt: "How do you say 'dog' in French?",
history,
});
history = response.toHistory();
Respuestas de transmisión
Genkit admite la transmisión fragmentada de respuestas del modelo a través del método generateStream()
:
// import { generateStream } from '@genkit-ai/ai';
const { response, stream } = await generateStream({
model: gemini15Flash,
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());