Firebase Genkit

Firebase Genkit es un framework de código abierto que te ayuda a compilar, implementar y supervisar apps potenciadas por IA listas para la producción.

Logotipo de Genkit

Genkit está diseñado para desarrolladores de apps con el objetivo de ayudarte a integrar con facilidad capacidades de IA potentes en tus apps con patrones y paradigmas conocidos. Lo desarrolló el mismo equipo detrás de Firebase y aprovecha nuestra experiencia en la compilación de herramientas que usan millones de desarrolladores de todo el mundo.

Usa Genkit para crear apps que generen contenido personalizado, usar la búsqueda semántica, controlar entradas no estructuradas, responder preguntas con los datos de tu empresa, tomar decisiones de forma autónoma, organizar llamadas a herramientas y mucho más.

Actualmente, Genkit es compatible con el desarrollo del servidor en JavaScript/TypeScript (Node.js) y admite Go en el desarrollo activo.

Sigue su desarrollo o haz tus propias contribuciones en su repositorio de GitHub.

Funciones clave

Genkit está aquí para ayudarte en cada paso de tu recorrido de desarrollo de IA, desde el comienzo del prototipado hasta la supervisión en producción, por lo que hay mucho de qué hablar.

Para comenzar, estas son 10 funciones clave de Genkit que creemos que te encantarán:

1. Muchos modelos, una interfaz

Genkit proporciona complementos que te brindan acceso a modelos populares listos para usar y una abstracción de modelos flexible que facilita la integración de cualquier API de modelos y el uso de modelos que mantiene la comunidad. Probar un modelo nuevo es tan fácil como cambiar un solo argumento, pero cada modelo puede especificar configuraciones personalizadas.

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

function flipACoin(a, b) {
  return Math.random() > 0.5 ? a : b;
}

const result = await generate({
  model: flipACoin(geminiPro, 'ollama/gemma'),
  config: { temperature: 0.3, maxOutputTokens: 200 },
  prompt: 'What makes you the best LLM out there?',
});

console.log(result.text());

2. Salida estructurada

Genera datos de tipado fuerte con Genkit mediante el esquema Zod. Esto puede ayudarte a analizar texto no estructurado, generar contenido creativo, seleccionar tareas y enviar resultados a tu app como objetos estructurados de tipo seguro.

import { generate } from "@genkit-ai/ai";
import { geminiPro } from "@genkit-ai/vertexai";
import { z } from "zod";

const CreatureSchema = z.object({
  name: z.string().describe('the name of the creature'),
  hitPoints: z.number().describe('hit points, between 5 and 100'),
  attacks: z.array(z.object({
    name: z.string(),
    damage: z.number().describe('amount of damage, between 2 and 25'),
  })).describe('3 attacks the creature can use')
});

const createCreature = defineFlow({
    name: "createCreature",
    inputSchema: z.string(),
    outputSchema: CreatureSchema,
  },
  (habitat) => {
    const result = await generate({
      model: geminiPro,
      prompt: `You are a brilliant RPG designer. Generate a creature that lives in ${habitat}.`,
      output: {schema: CreatureSchema}
    });
    // strongly typed and ready to go
    return result.output();
  }
)

console.log(await createCreature("a developer conference"));

3. Multimodal, multimedia

Genkit proporciona un formato común para el contenido que admite combinaciones de texto, datos y medios arbitrarios. Esto te permite usar Genkit para los modelos que realizan cualquier tarea generativa (como la generación de imágenes), no solo LLM.

import { imagen2, geminiProVision } from '@genkit-ai/vertexai';
import { generate } from '@genkit-ai/ai';

const imageResult = await generate({
  model: imagen2,
  prompt: 'Generate an image of a very specific historical time and place.',
});
const generatedImage = imageResult.media();

const descriptionResult = await generate({
  model: geminiProVision,
  prompt: [
    {
      text: 'What is the historical time and place represented in this picture?',
    },
    { media: generatedImage },
  ],
});
console.log(descriptionResult.text());

4. Proporciona herramientas a los LLM

Genkit facilita las llamadas de funciones con LLM a través de herramientas. Las herramientas permiten que la IA recupere datos, muestre la IU, escriba en una base de datos o realice cualquier otra acción que puedas programar.

import { generate, defineTool } from '@genkit-ai/ai';
import { geminiPro } from '@genkit-ai/vertexai';
import { z } from 'zod';

const createReminder = defineTool(
  {
    name: 'createReminder',
    description: 'Use this to create reminders for things in the future',
    inputSchema: z.object({
      time: z
        .string()
        .describe('ISO timestamp string, e.g. 2024-04-03T12:23:00Z'),
      reminder: z.string().describe('the content of the reminder'),
    }),
    outputSchema: z.number().describe('the ID of the created reminder'),
  },
  (reminder) => db.reminders.create(reminder)
);

const searchNotes = defineTool(
  {
    name: 'searchNotes',
    description: "Use this to search the user's notes for people or phrases",
    inputSchema: z.string().describe('the search query'),
    outputSchema: z.object({ notes: z.array(NoteSchema) }),
  },
  (query) => db.notes.search(query)
);

const result = await generate({
  model: geminiPro,
  tools: [createReminder, searchNotes],
  prompt: `
  You are a note-taking assistant. Using the tools available, try to answer the provided query.
  If you create a reminder, describe in text the reminder you created as a response.

  Query: I took a note about a meeting with Anna - can you set a reminder for the time?
  `,
});
console.log(result.text());

5. Administración de instrucciones con Dotprompt

La ingeniería de instrucciones es más que solo retocar el texto. El modelo que usas, los parámetros que proporcionas y el formato que solicitas afectan la calidad del resultado. Genkit ofrece Dotprompt, un formato de archivo de mensaje que te permite colocarlo todo en un solo archivo para facilitar las pruebas y la organización.

---
model: vertexai/gemini-1.0-pro
config:
  temperature: 0.9
input:
  schema:
    properties:
      location: {type: string}
      style: {type: string}
      name: {type: string}
    required: [location]
  default:
    location: a restaurant
---

You are the world's most welcoming AI assistant and are currently working at {{location}}.

Greet a guest{{#if name}} named {{name}}{{/if}}{{#if style}} in the style of {{style}}{{/if}}.

6. Ejecuta flujos de manera local

La IA generativa tiene muchísimas variaciones en los resultados, por lo que experimentar es muy importante. La IU local para desarrolladores de Genkit te permite interactuar con componentes esenciales de IA, como modelos y retrievers, y probar de forma manual tus flujos de extremo a extremo, incluido todo el código personalizado que escribiste.

7. Cómo inspeccionar seguimientos

La depuración de flujos de trabajo complejos de varios pasos con IA puede ser un desafío debido a la aleatoriedad y los procesos ocultos. Genkit proporciona un inspector de seguimiento en la IU para desarrolladores que te permite inspeccionar los seguimientos de cada llamada al modelo y paso de tu flujo. Puede ver seguimientos de la producción y hasta renderizar imágenes.

8. Abierto y extensible

El ecosistema de IA está creciendo más rápido de lo que ningún equipo puede seguir. Genkit tiene un modelo de complemento abierto que proporciona integraciones previamente compiladas a modelos nuevos, recuperadores y mucho más. Si bien el equipo de Genkit mantiene un pequeño conjunto de complementos oficiales, cualquiera puede publicar sus propios complementos de Genkit en NPM.

¿No encuentras un complemento para la integración que deseas? No hay problema. Las abstracciones de Genkit son flexibles y facilitan la compilación de componentes personalizados que se integran en el framework, como este retriever personalizado de Firestore:

import { embed } from '@genkit-ai/ai/embedder';
import { Document, defineRetriever } from '@genkit-ai/ai/retriever';
import { textEmbeddingGecko } from '@genkit-ai/vertexai';
import {
  FieldValue,
  VectorQuery,
  VectorQuerySnapshot,
} from '@google-cloud/firestore';
import { Firestore } from 'firebase-admin/firestore';
import * as z from 'zod';
import { augmentedPrompt } from './prompt';

const QueryOptions = z.object({
  k: z.number().optional(),
});

const firestoreArtifactsRetriever = defineRetriever(
  {
    name: 'firestore/artifacts',
    configSchema: QueryOptions,
  },
  async (input, options) => {
    const embedding = await embed({
      embedder: textEmbeddingGecko,
      content: input,
    });

    const db = new Firestore();
    const coll = db.collection('vectors' /* your collection name */);

    const vectorQuery: VectorQuery = coll.findNearest(
      'embedding' /* the name of the field that contains the vector */,
      FieldValue.vector(embedding),
      {
        limit: options.k ?? 3,
        distanceMeasure: 'COSINE',
      }
    );

    const vectorQuerySnapshot: VectorQuerySnapshot = await vectorQuery.get();
    return {
      documents: vectorQuerySnapshot.docs.map((doc) =>
        // doc.data() represents the Firestore document. You may process
        // it as needed to generate a Genkit document object, depending on your
        // storage format.
        Document.fromText(doc.data().content.text)
      ),
    };
  }
);

9. Creado para la producción

Implementa tus flujos con facilidad en cualquier plataforma que pueda entregar una app de Express.js. Genkit está completamente equipado con OpenTelemetry y metadatos personalizados para la supervisión de producción de nivel empresarial.

También hay complementos oficiales para Google Cloud y Firebase que te ayudan a exportar datos a Google Cloud's operations suite y a integrarlos en servicios de Firebase, como Cloud Functions para Firebase, Firebase Authentication, la Verificación de aplicaciones y Firestore.

Captura de pantalla de Cloud Trace

10. Manejo de autorizaciones y seguridad

Cuando compilas cualquier aplicación pública, es importante proteger los datos almacenados en tu sistema. Cuando se trata de los LLM, se requiere diligencia adicional para garantizar que el modelo solo acceda a los datos que debería, que las llamadas a las herramientas tengan el alcance adecuado para el usuario que invoca el LLM y que solo las aplicaciones cliente verificadas puedan invocar el flujo.

Genkit proporciona mecanismos para administrar contextos y políticas de autorización.

import { defineFlow, runFlow } from '@genkit-ai/flow';

export const selfSummaryFlow = defineFlow(
  {
    name: 'selfSummaryFlow',
    inputSchema: z.object({uid: z.string()}),
    outputSchema: z.string(),
    authPolicy: (auth, input) => {
      if (!auth) {
        throw new Error('Authorization required.');
      }
      if (input.uid !== auth.uid) {
        throw new Error('You may only summarize your own profile data.');
      }
    }
  },
  async (input) => { ... });

Integraciones

Genkit proporciona integraciones con modelos de IA, bases de datos vectoriales, plataformas de telemetría y mucho más a través de su sistema de complementos. El equipo de Genkit mantiene los siguientes complementos:

Complementos oficiales
googleai Modelos generativos: Gemini Pro, Gemini 1.5 Pro y Gemini Pro Vision
Modelos de incorporación: Incorporación de texto en Gecko
vertexai Generative models: Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2, Anthropic Claude 3
Modelos de incorporación: Incorporación de texto de Gecko
Evaluadores: Evaluación de Vertex AI
ollama Modelos generativos: Muchos modelos locales, incluidos Gemma, Llama 3, Mistral y muchos más
chroma Base de datos de vectores: ChromaDB
pinecone Base de datos de vectores: Piña
google-cloud Herramientas de supervisión: Google Cloud Trace y Google Cloud Logging
firebase Implementación de Cloud: Cloud Functions, Firebase Authentication, Verificación de aplicaciones
Base de datos de vectores: almacén de vectores de Cloud Firestore
langchain Cómo usar cadenas y utilidades de LangChain en flujos de Genkit

Comenzar

Lee la guía de introducción para aprender a instalar Genkit y ejecutar tu primer flujo de IA.