AI LLM をリアルタイムの接地ソースおよびデータに接続するアダプター
主な機能強化のリスト
リリース | 日付 | 主な特長 |
---|---|---|
2.0.5 | 2024 年 4 月 1 日 | メジャーアップデート: OpenAI と GoogleAI に加えて ClaudeAI をサポートします。 |
2.0.0 | 2024 年 1 月 5 日 | メジャーアップデート: OpenAI に加えて GoogleAI をサポートします。 |
1.3.0 | 2023 年 12 月 16 日 | 関連するデータを利用し、関連する応答を生成するためのプロンプトが改善されました。すべてのメソッドの応答で実行時情報が提供されるようになりました。 |
1.2.9 | 2023 年 11 月 3 日 | (1) エージェント設定では、(オプションの) 言語キーを指定できます。これが設定されている場合、LLM は常に指定された言語 (入力言語に関係なく) を考えて応答します。注: 場合によっては翻訳の品質が最適ではない可能性があるため、徹底的なテストを行うことを強くお勧めします。 (2) オールインワン方式からの応答には、LLM が応答を生成するために使用する接地データが含まれます。これにより信頼性が向上するはずです。 |
1.2.8 | 2023 年 10 月 26 日 | 応答の質を向上させるために、詳細なプロンプト技術を組み込みました。 |
1.2.2 | 2023 年 10 月 18 日 | API 決定のための LLM プロンプトとロジックが改善されました。 |
1.1.1 | 2023 年 10 月 9 日 | LLM プロンプトを導入し、憲法上の AI の要素を組み込んで、ユーザーの入力が公正、責任、敬意を持って人道的であることを保証しました。 |
1.1.0 | 2023 年 10 月 8 日 | フォローアップの質問のコンテキスト/記憶を構築する機能が導入されました。 |
1.0.0 | 2023 年 10 月 8 日 | 最初の起動。 |
マルチモーダル人工知能モデルとして、LLM は最小限の命令でコンテンツを生成するための幅広い適用性を備えています。ゼロショットやフューショットなどのプロンプト手法は、このような LLM 上に構築されたチャット アプリケーションの日常ユーザーの間で人気があります。とはいえ、対応の質は素晴らしいですが、どこまで信頼できるのでしょうか?モデルがその場で「でっち上げ」(幻覚)していないとどうやってわかるのでしょうか?
そのため、適切なプロンプト手法と組み合わせてコンテキスト データを提供することで LLM を確立することが非常に重要です。 LLM がより良い応答を生成できるように、根拠のある情報をコンテキストとしてプロンプトに使用することは、広く行われている慣行です。
そのようなアプローチの 1 つが検索拡張生成 (RAG) です。これは、プロンプトとともに LLM に提供されるテキスト埋め込みの保存と検索に依存します。ただし、RAG は、テキスト埋め込みに変換され、それらをグラフ データベース (別名ベクトル データベース) に保存する静的情報に依存しているため、そこから関連情報を取得し、グラウンディングを介して拡張してテキスト/応答を生成できます。
RAG パターンでは、リアルタイム データを LLM とともに使用して効果的で信頼性の高い応答を生成できるかどうかという疑問が生じる可能性があります。簡単な答えは、 「もちろん、そうです!」です。 。しかし、それはアプリケーション開発者の肩にかかる責任がより多くなることを意味します。開発者は API を呼び出してプロンプト内に応答をラップし、LLM に関連する応答を生成させる必要があります。しかし、すべての質問に対して同じ API を何度も呼び出すことは機能するのでしょうか? -おそらくそうではありません!質問に基づいて、どの API を呼び出す必要があるか、どのパラメータを渡す必要があるかを動的に決定するにはどうすればよいでしょうか?それも LLM の機能のように思えます。
そこで登場するのが AI-Dapter ( AI アダプター) です。 AI-Dapter は、開発者にとって LLM ベースのアプリケーション開発プロセスを加速し、後続のアクティビティの負担を LLM にオフロードしながらアプリケーションのみに集中できるようにします。
事前定義された API リポジトリから適切な API エンドポイントを特定し、
特定された API エンドポイントからリアルタイム データを取得する、
選択した LLM モデルを使用して応答を生成します。
AI-Dapter フレームワークをアプリケーション コード内にプラグインし、それをブラック ボックスとしてシームレスに使用して、ユーザーの質問に対する LLM ベースの応答を実行することにより、開発者のエクスペリエンスが大幅に向上します。これらのユーザーの質問自体は、ゼロショットのプロンプトに近い可能性があることに注意してください。
このブラック ボックスの背後で行われる実際の作業には次のものが含まれます。
選択した LLM モデルを認証情報と統合する機能 (注: 現在、OpenAI GPT モデルのみがサポートされています)。
ユーザー入力を活用して識別を実行する統合エンジン -
APIベースのデータソース、
それらの API からのリアルタイム データの取得、および
LLM を使用したリアルタイム データに基づいた応答の生成。
フィードバックや新機能のリクエストは、GitHub ディスカッション経由で送信してください。
GitHub Issues 経由で問題を送信してください。
コマンド ラインで次のコマンドを実行して、NodeJS プロジェクトの AI-Dapter をインストールします。プロジェクトのルート ディレクトリ内にいることを確認してください。
npm install ai-dapter --save
typescript NodeJS プロジェクトを設定していると仮定して、次のように AIDapter クラスをインポートします。
「ai-adapter」から AIDapter をインポートします。
AI-Dapter を初期化するには、セットアップを完了するためにいくつかの必須およびオプションのパラメーターを渡す必要があります。以下に例を示し、その後にサポートされるパラメータのドキュメントを示します。
const ai = 新しい AIDapter({ "app_name": "<<短いアプリ名>>" "プロバイダー": "OpenAI", "モデル名": "gpt-3.5-turbo-16k", "エンドポイント": "https://api.openai.com/v1/chat/completions", "authentication": {"api_key": "<<あなたの OPENAI キー>>","org_id": "<<あなたの OPENAI 組織 ID>>" }、 "温度": "<<0.0 から 2.0 の間>>"});
セットアップを初期化するためにサポートされているパラメータのリスト。
パラメータ | 必須(M) / 任意(O) | 目的 | 可能な値 |
---|---|---|---|
app_name | M | 短いアプリ名。 | - |
provider | M | LLM モデルのプロバイダー。注: 現在、OpenAI によって直接提供されるモデルのみがサポートされています。 | 「オープンAI」 |
model_name | ○ | プロバイダーがリリースしたモデルを選択できます。 gpt-3.5-turbo-16k 、 gemini-pro 、 claude-3-haiku-20240307 など、大きなトークン サイズを許可するモデルを使用することをお勧めします。 | - |
endpoint | ○ | プロバイダーが LLM モデルを提供するエンドポイント。プロバイダー固有のドキュメントを参照する必要がある場合があります。たとえば、OpenAI チャット完了モデルはhttps://api.openai.com/v1/chat/completions エンドポイントから提供され、GoogleAI モデルはhttps://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent から提供されます。 https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent と ClaudeAI モデルはhttps://api.anthropic.com/v1/messages から提供されます。 | - |
authentication | M | プロバイダーの指定に従って認証の詳細を入力します。たとえば、OpenAI には API キーと組織 ID が必要なため、上記の初期化例に示すように、これらはapi_key フィールドとorg_id フィールドに指定されます。 | - |
telemetry | ○ | テレメトリ データの収集。デフォルトは true です。 | 真/偽 |
AI-Dapter を使用すると、役割やパーソナリティなどの追加など、特定のエージェント構成をカスタマイズできます。同様に、リアルタイム API 応答からのレコード数の制御、追加のコンテキストの受け渡し、またはフォローアップなどをシミュレーションするための基礎情報。
エージェントと構成オプションは、次のように単一のオブジェクトとして渡されます。これらの構成値を検索して調整するには、以下の該当するセクションを参照してください。
let オプション: AIDapterOptions = { "agentConfig": { "役割": "パーソナルアシスタント" }、 "dataConfig": { "最大レコード数": 7 }};
以下は現在サポートされているエージェント構成パラメータです。これらのフィールドをagentConfig
オブジェクトの下に追加します。
パラメータ | 必須(M) / 任意(O) | 目的 | 可能な値 |
---|---|---|---|
role | M | ユーザーの質問に対する LLM のアプローチをガイドするのに役立ちます。たとえば、陸軍軍曹の役で、LLM は現在時刻に関する質問に「現在時刻は午前 8 時 01 分(東部夏時間)です」のように答えるかもしれませんが、コメディアンは私の質問に対していつも一言ジョークを言います。 「時計を買う時期が来ました! 冗談ですが、現在は東部夏時間 (EDT) タイムゾーンで 2023 年 10 月 7 日の午前 8 時 1 分です。」 のように応答するかもしれません。 | - |
personality | ○ | LLM の応答のトーンに個性を与えます。 | - |
language | ○ | ユーザーの質問の言語に関係なく、エージェントに応答してもらいたい言語。デフォルト = 英語。 | - |
expert_at | ○ | LLM がヘルスケアや自動車エンジンなどの特定の分野の専門家であると想定する必要がある場合。 | - |
max_words | ○ | LLM の応答をどの程度の長さまたは短さ以内に収めるかを制御します。デフォルトは 200 ワード未満です。 | 1 ~ 200 の任意の数値 |
以下は現在サポートされているデータ構成パラメータです。これらのフィールドをdataConfig
オブジェクトの下に追加します。
パラメータ | 必須(M) / 任意(O) | 目的 | 可能な値 |
---|---|---|---|
max_records | M | リアルタイム API 呼び出しから取得した結果セットの上位レコードをいくつ小売りするかを制御します。 API 呼び出しの結果がグラウンディングに使用されるため、このパラメーターは入力トークン サイズを制御するために不可欠です。注: 上位 X 行のみが保持されるため、降順でソートされたデータを含む API エンドポイントを提供することが最善です。デフォルト=10 | 1 から 10 までの任意の数字 |
additional_context | ○ | フォローアップのような機能が期待される場合は、追加のコンテキストを提供できます。 (「6.3. リアルタイム データを接地した LLM 応答の生成」の例を参照してください)。 | 次のような構造の配列である必要があります: [{ "question": "", "response_summary": "", "entities": { ... } }, { ... }] |
max_contexts | ○ | 最新の X コンテキストを保持します。 AI-Dapter は、最新のコンテキストが常にこの配列の最後に追加されることを前提として、 additional_context 配列の最後の 2 つの要素を保持します。 | 1 または 2 |
AI-Dapter は次の 3 つの機能を提供し、したがってこれらの機能にアクセスする 3 つの方法を提供します。
推奨事項:最適な開発者エクスペリエンスについては、6.3 を参照してください。リアルタイム データを接地して LLM 応答を生成
AIDapter.getRealtimeSources(input: string, apiRepository: Types.APIRepository[]): Promise
ユーザーの質問に基づいて関連する API エンドポイントを取得することが目的の場合は、このメソッドを使用します。
パラメータ | 必須(M) / 任意(O) | 目的 | データ型 |
---|---|---|---|
input | M | ユーザーの質問 | 文章 |
apiRepository[] | M | API エンドポイントに関する詳細 (メソッド、URL、ヘッダー、データ)、API エンドポイントで使用されるプレースホルダー、および LLM が使用する検証手順を含む完全な API リポジトリを提供します。 | 「7. API リポジトリ」を参照してください。 |
分野 | 目的 |
---|---|
api_endpoints[] | 識別されたすべての API エンドポイントの配列。 |
provider | どの LLM プロバイダーが使用されたかを示します。 |
runtime | 全体的な応答時間を追跡するため。これは LLM の API 応答時間に依存することに注意してください。 |
// AI-Dapterimport AIDapter をインポートして初期化します。 from "ai-adapter";const ai = new AIDapter({ "プロバイダー": "GoogleAI", "authentication": {"api_key": "<<あなたの API キー>>" }});// 適切な API が識別、更新、返される API リポジトリを定義します。// この例では、API エンドポイントの例が 1 つだけ示されていることに注意してください。ただし、これは配列であるため、複数の例を提供する必要があります。このような API endpoints.const apiRepository = [ {"api_info": { "title": "現在時刻", "description": "指定された場所の適切なタイムゾーン領域と場所を特定し、その場所での時間を取得します。"},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location の例: America/New_York または Europe/London。提供された有効な場所に基づいて、適切な area_location を決定します。" ,"デフォルト": "アメリカ/ニューヨーク" }] }];// これはユーザーの質問です input = "ムンバイは何時ですか?"// ここで getRealtimeSources() メソッドを呼び出して有効な API を取得します endpointsai.getRealtimeSources(input, apiRepository) .then((resp) => {console.log(resp);/* { "api_endpoints": [ { "api": { "method": "GET", "url": "https://worldtimeapi.org /api/timezone/Asia/Kolkata", "headers": { "Content-Type": "application/json" } }, "placeholders": [ { "placeholder": "[エリアの場所]", "決定済み": true } ], "ステータス": "OK" } ], "プロバイダー": "GoogleAI", "ランタイム": "2 秒" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
ユーザーが指定した都市Mumbaiに基づいて、LLM がプレースホルダーarea_locationの適切な値を決定し、更新された API エンドポイントを返したことに注目してください。
AIDapter.getDataFromRealtimeSource(input: string, apiRepository: Types.APIRepository[], dataConfig?: Types.DataConfig | unknown): Promise
ユーザーの質問に基づいて関連する API エンドポイントからデータを取得することが目的の場合は、このメソッドを使用します。
パラメータ | 必須(M) / 任意(O) | 目的 | データ型 |
---|---|---|---|
input | M | ユーザーの質問 | 文章 |
apiRepository[] | M | API 情報、エンドポイント (メソッド、URL、ヘッダー、データ)、およびプレースホルダーの配列。 | 「7. API リポジトリ」を参照してください。 |
dataConfig | ○ | API呼び出しから取得したデータを制御するための構成パラメータ。 | 5.2を参照してください。データ構成 |
分野 | 目的 |
---|---|
api_results[] | すべての API 呼び出しからの応答の配列。 |
provider | どの LLM プロバイダーが使用されたかを示します。 |
runtime | 全体的な応答時間を追跡するため。これは LLM の API 応答時間に依存することに注意してください。 |
// AI-Dapterimport AIDapter をインポートして初期化します。 from "ai-adapter";const ai = new AIDapter({ "プロバイダー": "GoogleAI", "authentication": {"api_key": "<<あなたの API キー>>" }});// 適切な API が識別、更新、返される API リポジトリを定義します。// この例では、API エンドポイントの例が 1 つだけ示されていることに注意してください。ただし、これは配列であるため、複数の例を提供する必要があります。このような API endpoints.const apiRepository = [ {"api_info": { "title": "現在時刻", "description": "指定された場所の適切なタイムゾーン領域と場所を特定し、その場所での時間を取得します。"},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location の例: America/New_York または Europe/London。提供された有効な場所に基づいて、適切な area_location を決定します。" ,"デフォルト": "アメリカ/ニューヨーク" }] }];// これはユーザーの質問です input = "ムンバイは何時ですか?"// データ構成レット dataConfig = { "max_records": 3 }// ここで getDataFromRealtimeSource() メソッドを呼び出して、関連するすべての呼び出しからデータを取得しますユーザーの質問に基づく API エンドポイントai.getDataFromRealtimeSource(question, apiRepository, dataConfig) .then((resp) => {console.log(resp);/* { "api_results": [ { "api_sources": "worldtimeapi.org", "data": { "略語": "IST", "client_ip ": "50.126.214.61"、"日時": "2024-01-05T22:48:30.316887+05:30"、"day_of_week": 5、"day_of_year": 5、"dst": false、"dst_from": null、"dst_offset": 0、"dst_until": null、「raw_offset」: 19800、「タイムゾーン」: "アジア/コルカタ"、"unixtime": 1704475110、"utc_datetime": "2024-01-05T17:18:30.316887+00:00"、"utc_offset": "+05:30"、"week_number": 1 } } ]、"プロバイダー": "GoogleAI"、"ランタイム": "4秒" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
API 呼び出しからの応答。このデータは LLM 接地に使用できます。
AIDapter.getLLMResponseFromRealtimeSources(入力: 文字列、apiRepository: Types.APIRepository[]、オプション?: AIDapterOptions | 未定義): Promise
ユーザーの質問に基づいて LLM 応答を取得することが目的の場合は、この方法を使用します。これには、関連する API エンドポイントの識別、識別された API の呼び出し、LLM プロンプトでそれを使用して LLM からの応答を受信することが含まれます。
推奨事項:アプリケーション開発プロセスを最大限に高速化するには、この方法を使用してください。
パラメータ | 必須(M) / 任意(O) | 目的 | データ型 |
---|---|---|---|
input | M | ユーザーの質問 | 文章 |
apiRepository[] | M | API 情報、エンドポイント (メソッド、URL、ヘッダー、データ)、およびプレースホルダーの配列。 | 「7. API リポジトリ」を参照してください。 |
options | ○ | エージェントとデータ構成 | 「5. エージェントとデータ構成オプション」を参照してください。 |
分野 | 目的 |
---|---|
ai_response | LLM が生成した応答。 |
ai_status | 応答が、API 呼び出しを成功させるために必要なすべてのデータ要素の可用性に基づいているかどうかを判断するのに役立ちます。可能な値: OK、FOLLOW-UP、または INCOMPLETE |
ai_context | これには、短い応答の概要とエンティティのリストが含まれます。このフィールドの背後にある考え方は、フォローアップの会話を伴うユースケース向けです。フォローアップの質問を送信する場合、オブジェクト全体をdataConfig オプション内のadditional_content として渡すことができます。 |
provider | どの LLM プロバイダーが使用されたかを示します。 |
runtime | 全体的な応答時間を追跡するため。これは LLM の API 応答時間に依存することに注意してください。 |
// AI-Dapterimport AIDapter をインポートして初期化します。 from "ai-adapter";const ai = new AIDapter({ "プロバイダー": "GoogleAI", "authentication": {"api_key": "<<あなたの API キー>>" }});// 適切な API が識別、更新、返される API リポジトリを定義します。// この例では、API エンドポイントの例が 1 つだけ示されていることに注意してください。ただし、これは配列であるため、複数の例を提供する必要があります。このような API endpoints.const apiRepository = [ {"api_info": { "title": "現在時刻", "description": "指定された場所の適切なタイムゾーン領域と場所を特定し、その場所での時間を取得します。"},"api_endpoint": { "method": "GET", "url": "http://worldtimeapi.org/api/timezone/|area_location|", "headers": {"Content-Type": "application/json" }},"placeholders": [ {"placeholder": "|area_location|","validation_criteria": "area_location の例: America/New_York または Europe/London。提供された有効な場所に基づいて、適切な area_location を決定します。" ,"デフォルト": "アメリカ/ニューヨーク" }] }];// これはユーザーの質問です input = "ムンバイは何時ですか?"// エージェント構成とデータ構成レットのオプションを組み合わせた AI-Dapter オプション: AIDapterOptions = { "agentConfig": { "role": "私の質問についていつも一言ジョークを言うコメディアン" }, "dataConfig": { "max_records": 7 }};// 次に、getLLMResponseFromRealtimeSources() メソッドを呼び出して、ユーザーの質問に対する LLM 応答を取得します。// LLM 応答は、グラウンディングにリアルタイム データを使用するプロンプトに基づいています。 ai.getLLMResponseFromRealtimeSources(質問、apiRepository、オプション) .then((resp) => {console.log(resp);/* { "ai_response": "ボリウッドの夢が羽ばたき、屋台の食べ物の香りが漂う活気に満ちた都市ムンバイでは、現在 22: 2024 年 1 月 5 日のこの素晴らしい金曜日には、50 名が集まります。インド門でチャイを飲んでいるときも、ビートに合わせてグルーミングしているときも、地元のダンスクラブでは、忘れないでください、時間は誰も待ってくれません、たとえボリウッドの大スターであってもです!", "ai_status": "OK", "ai_context": { "questions": "ムンバイは何時ですか?ムンバイの現在の日付は?", "entities": [], "data": [ { "abbreviation": "IST", "client_ip": "50.126.214.61"、"datetime": "2024-01-05T22:50:51.261990+05:30"、"day_of_week": 5、"day_of_year": 5、"dst": false、"dst_from": null、 "dst_offset": 0、"dst_until": null、 "raw_offset": 19800、"timezone": "アジア/コルカタ"、"unixtime": 1704475251、"utc_datetime": "2024-01-05T17:20:51.261990+00:00"、"utc_offset": "+05: 30"、"週番号": 1 } ], "ソース": [ "worldtimeapi.org" ] }, "プロバイダー": "GoogleAI", "ランタイム": "6 秒" } */ }).catch((err) => console.log(JSON.stringify(err, null, 4)));
ユーザーの質問は、提供された API リポジトリから関連する API を識別するために最初に使用されることに注意してください。このメソッドはまた、識別された API を呼び出し、その応答を収集して最終的な LLM プロンプトを確立し、生成された応答を返します。
また、応答には、 ai_response
フィールド内の LLM 生成コンテンツと、 ai_context
フィールド内のコンテキストが含まれることに注意してください。コンテキスト全体を、フォローアップの質問とともにdataConfig.additional_context
として渡すことができます。
例では、フォローアップの会話を可能にするためにコンテキストを渡す方法を示します。
// 前の例で示したように、ai_context には次の情報が含まれています:// --------------------------------- --------------------------------------------// resp.ai_context: {// "questions": "ムンバイは何時ですか? ムンバイの現在の日付は何ですか?",// "entities": [],// "data": [// {// "abbreviation": "IST",// "client_ip": "50.126.214.61",// "datetime": "2024-01-05T22:50:51.261990+05:30",// "day_of_week": 5,// "day_of_year": 5,// "dst": false,// "dst_from": null,// "dst_offset": 0,// "dst_until": null,// "raw_offset": 19800,// "timezone": "アジア/コルカタ",// "unixtime": 1704475251,// "utc_datetime": "2024-01-05T17 :20:51.261990+00:00",// "utc_offset": "+05:30",// "week_number": 1// }// ],// "sources": [// "worldtimeapi.org"// ]// }// --- -------------------------------------------------- ------------------------// 上記のコンテキストを dataConfig.Additional_context に追加します ...if(options.dataConfig[Additional_context]){