Firebase Genkit は、LLM を使用してコンテンツを生成するための簡単なインターフェースを提供します。
モデル
Firebase Genkit のモデルは、Google と Google 以外のさまざまな LLM へのアクセスを提供するライブラリと抽象化です。
モデルはオブザーバビリティのために完全に計測可能で、Genkit Developer 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.0-pro'
)。また、一部のプラグインは、モデルの機能とオプションに関する追加の型情報を提供するモデル参照オブジェクトをエクスポートします。
import { geminiPro } from '@genkit-ai/vertexai';
サポートされているモデル
Genkit はプラグイン システムを通じてモデルのサポートを提供します。次のプラグインが正式にサポートされています。
Plugin(プラグイン) | モデル |
---|---|
Google の生成 AI | Gemini Pro、Gemini Pro Vision |
Google Vertex AI | Gemini Pro、Gemini Pro Vision、Gemini 1.5 Flash、Gemini 1.5 Pro、Imagen2 |
オラマ | Gemma、Llama 2、Mistral など、多くのローカル モデル |
設定と使用方法については、各プラグインのドキュメントをご覧ください。
コンテンツの生成方法
generate
は、モデルを操作するためのヘルパー関数です。
モデルを呼び出すだけの場合:
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());
})();
特定の LLM にカスタムモデルを指定するなど、そのモデルのさまざまなモデル オプションを渡すことができます。
const response = await generate({
model: geminiPro,
prompt,
config: {
temperature: 1,
stopSequences: ['abc'],
},
});
モデルがマルチモーダル入力をサポートしている場合は、画像を入力として渡すことができます。
const result = await generate({
model: geminiProVision,
prompt: [
{ text: 'describe the following image:' },
{ media: { url: imageUrl, contentType: 'image/jpeg' } },
],
});
またはローカル ファイルから:
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
は、ツールと関数の呼び出しもサポートしています。ツールのサポートは特定のモデルによって異なります。
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,
},
});
これにより、ユーザー プロンプトを満たすためにツールが自動的に呼び出されます。
returnToolRequests: true
を指定すると、ツール呼び出しを手動で制御できます。
const llmResponse = await generate({
model: geminiPro,
prompt: 'Tell me a joke.',
tools: [myTool],
returnToolRequests: true,
config: {
temperature: 0.5,
},
});
また、それをサポートするモデルから出力をストリーミングできます。
await generate({
model: geminiPro,
prompt: 'Tell me a very long joke.',
streamingCallback: (chunk) => {
console.log(chunk);
},
});
Retriever のコンテキストの追加
Retriever からのドキュメントは、根拠づけのコンテキストを提供するために generate
に直接渡すことができます。
const docs = await companyPolicyRetriever({ query: question });
await generate({
model: geminiPro,
prompt: `Answer using the available context from company policy: ${question}`,
context: docs,
});
ドキュメントのコンテキストは、モデルに送信されるプロンプトのコンテンツに自動的に追加されます。
メッセージの履歴を録音しています
Genkit モデルは、モデルに送信されたメッセージとそのレスポンスの履歴の維持をサポートしています。これにより、chatbot などのインタラクティブなエクスペリエンスを構築できます。
モデルのレスポンスからメッセージ履歴を生成するには、toHistory()
メソッドを呼び出します。
let response = await generate({
model: geminiPro,
prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();
この履歴をシリアル化して、データベースまたはセッション ストレージに保持できます。次に、generate()
に対する今後の呼び出しで、履歴をプロンプトとともに渡します。
response = await generate({
model: geminiPro,
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: geminiPro,
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: 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());