Firebase Genkit は、LLM を使用してコンテンツを生成するための簡単なインターフェースを提供します。
モデル
Firebase Genkit のモデルは、 Google LLM と Google 以外の LLM で表現されます。
モデルはオブザーバビリティのために完全にインストルメント化され、ツールが Genkit デベロッパー UI に統合されています。モデルランナーを使用すると任意のモデルを試すことができます。
Genkit でモデルを扱う場合は、まず扱うモデルを構成する必要があります。モデル構成はプラグイン システムによって行われます。イン この例では、Gemini を提供する Vertex AI プラグインを構成しています。 構築できます
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 Generative AI | Gemini Pro、Gemini Pro Vision |
Google Vertex AI | Gemini Pro、Gemini Pro Vision、Gemini 1.5 Flash、Gemini 1.5 Pro、Imagen2 |
Ollama | Gemma、Llama 2、Mistral など、多くのローカルモデル |
設定と使用方法については、各プラグインのドキュメントをご覧ください。また、
コミュニティでサポートされているさまざまなモデルがあります。
npmjs.org で genkitx-
で始まるパッケージを検索する。
コンテンツの生成方法
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());
})();
モデルにさまざまなモデル オプションを渡すことができます。たとえば、 カスタムモデルを作成します。
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,
},
});
Retriever コンテキストの追加
リトリーバーのドキュメントは、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
ロールをサポートしている場合は、最初の
History を使用してシステム メッセージを設定します。
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());