Создание контента

Firebase Genkit предоставляет простой интерфейс для создания контента с помощью LLM.

Модели

Модели в Firebase Genkit — это библиотеки и абстракции, которые обеспечивают доступ к различным LLM от Google и сторонних разработчиков.

Модели полностью оснащены инструментами для наблюдения и оснащены интеграцией инструментов, предоставляемых пользовательским интерфейсом разработчика Genkit — вы можете опробовать любую модель с помощью средства запуска моделей.

При работе с моделями в Genkit сначала необходимо настроить модель, с которой вы хотите работать. Конфигурация модели осуществляется системой плагинов. В этом примере вы настраиваете плагин Vertex AI, который предоставляет модели Gemini.

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

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

Чтобы использовать модели, предоставляемые плагином, вы можете либо обращаться к ним по имени (например 'vertexai/gemini-1.5-flash' ), либо некоторые плагины экспортируют объекты модели, которые предоставляют дополнительную информацию о типах возможностей и параметров модели.

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

Поддерживаемые модели

Genkit обеспечивает поддержку моделей через свою систему плагинов. Официально поддерживаются следующие плагины:

Плагин Модели
Генеративный искусственный интеллект Google Близнецы Про, Близнецы Про Видение
Google Вертекс ИИ Gemini Pro, Gemini Pro Vision, Gemini 1.5 Flash, Gemini 1.5 Pro, Imagen2
Оллама Многие местные модели, в том числе Gemma, Llama 2, Mistral и другие.

Информацию о настройке и использовании см. в документации каждого плагина. Существует также широкий выбор моделей, поддерживаемых сообществом, которые вы можете найти, выполнив поиск пакетов, начинающихся с genkitx- на npmjs.org .

Как генерировать контент

generate — вспомогательная функция для работы с моделями.

Чтобы просто вызвать модель:

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());
})();

Вы можете передать различные параметры модели для этой модели, включая указание пользовательской модели для конкретных LLM.

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

Если модель поддерживает мультимодальный ввод, вы можете передавать изображения в качестве входных данных:

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

Или из локального файла:

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',
      },
    },
  ],
});

Инструменты и вызов функций

Model также поддерживает инструменты и вызов функций. Поддержка инструмента зависит от конкретных моделей.

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,
  },
});

Это автоматически вызовет инструменты для выполнения запроса пользователя.

Вы можете указать returnToolRequests: true для ручного управления вызовом инструмента.

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

Добавление контекста ретривера

Документы из ретривера могут передаваться непосредственно для generate , чтобы обеспечить базовый контекст:

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

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

Контекст документа автоматически добавляется к содержимому приглашения, отправленного в модель.

Запись истории сообщений

Модели Genkit поддерживают ведение истории сообщений, отправленных модели, и ее ответов, которые можно использовать для создания интер��ктивных возможностей, например чат-ботов.

Чтобы создать историю сообщений на основе ответа модели, вызовите метод toHistory() :

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

Вы можете сериализовать эту историю и сохранить ее в базе данных или хранилище сеансов. Затем передайте историю вместе с подсказкой о будущих вызовах generate() :

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

Если используемая вами модель поддерживает system роль, вы можете использовать исходную историю для установки системного сообщения:

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();

Потоковая передача ответов

Genkit поддерживает потоковую передачу ответов модели по частям с помощью 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());