
完全な「Rags to Riches」ブログシリーズをお読みください:
https://dev.to/aws-heroes/rags-to-riches-part-1-generative-ai-retrieval-4pd7
AIの検索パターンについて学ぶのに役立つこのOpenAIベースのRAGチャットアプリケーション。ここのテクノロジーは、初心者に優しく、AWS Lambdaに展開しやすいです。ニーズが高まるにつれて、より堅牢なコンポーネントでこのアプリケーションを自由に生産してください。ラグとは何ですか? IBMの研究から:
RAGは、最も正確で最新の情報で、外部の知識ベースから大規模な言語モデル(LLM)を接地し、LLMSの生成プロセスに関する洞察をユーザーに提供するためのAIフレームワークです。


このアプリケーションを実行するには、OpenAI APIキーが必要です。これを使用して無料で入手できます。秘密のAPIキーはどこにありますか?ガイド。 OpenAIキーを取得したら、次のプロジェクトのルートで.env.development.localファイルを作成し、 sk...をキーに置き換えます。
OPENAI_API_KEY=sk...
このプロジェクトは、開発コンテナをサポートしています。つまり、VSコードを使用してコンテナ内のこのフォルダーを開くことができ、開発環境が作成されます。統合された端末またはノードがインストールされていると仮定して、ローカルマシンで次のコマンドを実行します。
./bin/setup
./bin/serverサーバーコマンドは、フロントエンド開発サーバーの両方を開始します。このURLを使用してアプリケーションにアクセスします。 http:// localhost:5173
このデモアプリケーションは、スプリットスタックアーキテクチャを使用します。つまり、明確なフロントエンドとバックエンドがあります。フロントエンドはvue.jsアプリケーションを使用していますか? PINIA for Stateと⚡⚡️開発のためのvite。フロントエンドも使用しますか? Tailwind CSSと一緒に?スタイリングのためのdaisyui。バックエンドは? httpフレームワークにExpressを使用するnode.jsアプリケーション、および? sqlite3 vssと一緒に?ベクトルストレージと検索用のBetter-SQLite3。
投稿全体を通して、さまざまなテクノロジーをより詳細に探索し、AI駆動型の統合と迅速なエンジニアリングの基本を学びながら、RAGアプリケーションの構築に役立つ方法を詳しく調べます。これはとても楽しいスペースです。私と同じように楽しんでいただければ幸いです!
それでは、最後を念頭に置いて始めましょう。 Lambdaragデモはローカルに実行され、開発と学習が容易になります。ある時点で、それを生産に発送したり、他の人と作品を共有したりすることをお勧めします。では、なぜLambdaに展開し、その展開オプションがどのようなメリットを提供するのでしょうか?いくつかの考え:
これらすべての中で、応答ストリーミングが最も強力だと思います。 Lambdaの比較的新しい機能であるこれにより、TextをChatGptと同じようにWebクライアントにテキストをストリーミングすることができます。また、Lambdaは6MBの応答ペイロードと30秒のタイムアウト制限を破ることができます。プロジェクトのtemplate.yaml内のこれらのいくつかの行は、Lambda Webアダプターとともにすべてを可能にします。
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM実行する前に./bin/deploy deployが初めて。 AWSコンソールにログインし、最初にSSMパラメーターストアに移動するようにしてください。そこから、path /lambda-rag/OPENAI_API_KEYを使用して秘密の文字列パラメーターを作成し、Openai APIキーに貼り付けます。
バックエンドには、非常に基本的なsrc/utils/openai.jsモジュールがあります。これにより、OpenAIクライアントとヘルパー機能をエクスポートして、埋め込みを作成します。このシリーズの最初の部分の基本的なアーキテクトセクションに埋め込みを簡単にカバーします。この関数は、ユーザーのクエリをベクトル埋め込みに変えるだけで、後でSQLiteデータベースに対して照会されます。埋め込みを作成してクエリする方法はたくさんあります。今のところ、それをシンプルに保ち、1536の寸法埋め込みを出力するOpenaiのtext-embedding-ada-002モデルを使用します。
import { OpenAI } from "openai" ;
export const openai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ,
} ) ;
export const createEmbedding = async ( query ) => {
const response = await openai . embeddings . create ( {
model : "text-embedding-ada-002" ,
input : query ,
} ) ;
return JSON . stringify ( response . data [ 0 ] . embedding ) ;
} ;では、OpenaiのAPIはチャットインターフェイスを作成するためにどのように機能し、パート1で説明されているコンテキストウィンドウはどのように機能しますか? Lambdaragに私の名前を伝え、それが覚えているかどうかを尋ねる次のスクリーンショットを考えてみましょう。
CHATGPTは、ほとんどのWebアプリケーションと同様に、ステートレスです。 LLMモデルのセッションはありません。メッセージを送信するたびに、以前のすべてのメッセージ(コンテキスト)を完了エンドポイントに送信する必要があります。これが私たちが使用する理由ですか?クライアント側の状態管理のためのピニア。したがって、APIの観点からは、以下のようになります。
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [
{ role : "user" , content : "Hello my name is Ken Collins." } ,
{ role : "assistant" , content : "Hello Ken Collins! How can I..." } ,
{ role : "user" , content : "Do you remember my name?" } ,
]
} ) ;アシスタントが私の名前だけでなく、贅沢なアパレルを手伝うためにここにあることを知っていたことに気づきましたか?これは、ロールプロンプトと呼ばれる手法です。この役割をsrc-frontend/utils/roleprompt.jsファイルでユーザーの最初のメッセージに準備することにより、Lambdaragデモでこれを行います。
Lambdaragデモが完全に書かれていることに気づいたかもしれません。 JavaScript vs. Python。 AIアプリケーションの構築の詳細については、最終的にはPythonや、より高度なフレームワークを学習する必要がある場合があります。ラングチェーンまたは抱きしめますか? Transformers.js。そのすべてにJavaScriptバージョンがあります。 JavaScriptのクライアントを提供するこの傾向が継続することを願っています。よりアクセスしやすい言語のように感じます。
次のセクションでは、SQLiteの新しいVSS拡張機能を使用して、データとドキュメントのクエリで埋め込みを作成する方法について説明します。
?♂️Lambdaragデモアプリケーションには、Kaggleの高級アパレルデータセットから約5,000の製品を備えたすぐに使用できるSQLiteデータベースが含まれています。また、ベクトルの埋め込みが事前にシードされ、すぐに使用できます!
SQLite-VSSを掘り下げる前に、この拡張機能がとても素晴らしいと思う理由を説明したいと思います。これまで、私はSQLite-VSSがベクトルの埋め込みを探索する最も簡単で最も迅速な方法であることがわかりました。多くのgenaiプロジェクトは、Supabaseを使用していますが、これは素晴らしいようですが、地元で実行するのは困難です。ここでの目標は学ぶことです!
アプリケーションが成長するにつれて、Amazon OpenSearch ServerLessを見ることを強くお勧めします。これは、ベクターの類似性検索をサポートする完全に管理され、非常にスケーラブルで、費用対効果の高いサービスです。 FAISSで事前にフィルタリングすることさえサポートしています。
SQLite-VSSをもう少し詳しく見てみましょう。この記事では、ベクター検索用のSQLite拡張機能は、標準テーブルの作成と、埋め込み用の仮想テーブルとそれらの両方を照会する方法をカバーする素晴らしいジョブを行います。 lambdaragデモは、これらすべてのパターンをdb/create.jsファイルで密接にフォローしています。結果として得られるスキーマは次のとおりです。
CREATE TABLE products (
id INTEGER PRIMARY KEY ,
name TEXT ,
category TEXT ,
subCategory TEXT ,
description TEXT ,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS " vss_products_index " (rowid integer primary key autoincrement, idx);
CREATE TABLE sqlite_sequence (name,seq);
CREATE TABLE IF NOT EXISTS " vss_products_data " (rowid integer primary key autoincrement, _);
CREATE VIRTUAL TABLE vss_products using vss0 (
embedding( 1536 )
); SQLiteデータベースを再作成するか、カスタムデータセットを作成する場合は、 db/create.jsを変更してnpm run db:create実行することでそうすることができます。これにより、既存のデータベースがドロップされ、CSVファイル、サポートスキーマ、またはコードアップしたいプロセスからのデータで再作成します。
> npm run db:create
> [email protected] db:create
> rm -rf db/lambdarag.db && node db/create.js
Using sqlite-vss version: v0.1.1
Inserting product data...
██████████████████████████████████░░░░░░ 84% | ETA: 2s | 4242/5001その後、 npm run db:embeddingsスクリプトを実行する必要があります。これは、OpenAI APIを使用して各製品の埋め込みを作成します。これには、すべてのAPI呼び出しを完了するのに数分かかります。タスクには、再実行するのが速くなるためのローカルキャッシュが含まれています。最後に、 npm run db:clean ScriptがDBのVACUUMを呼び出して、仮想テーブルの無駄なスペースを削除します。繰り返しますが、これらはすべて、データベースを再作成するか、カスタムデータセットを作成する場合にのみ必要です。これらすべての手順を実行する./bin/setup-dbラッパースクリプトがあります。
わかりました。そのため、セマンティック検索に使用する製品のデータベースとその一致するベクトル埋め込みがあります。チャットからデータベースからアイテムの取得にどのようにコーディングしますか? Openaiには、関数呼び出しという名前のこの驚くべき機能があります。デモでは、LLMが製品を検索し、結果を説明できるようになります。
しかし、それはどのように知っていますか?アプリケーションの装備およびチャット完了API呼び出し中に、アプリケーションが装備している一連の機能を説明するだけです。 Openaiは1)決定を自動的に行い、関数を呼び出す必要があります2)関数の名前を返して、必要なパラメーターとともに呼び出します。あなたのリクエストはこのようなものに見えます。
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." }
]
} ) ;関数が選択されている場合、応答には関数とパラメーターの名前が含まれます。あなたの責任はこれをチェックしてから、関数とパラメーターに一致するアプリケーションのコードを呼び出します。 LambDagptの場合、これはデータベースをクエリし、一致する行を返します。これをsrc/models/products.jsファイルで行います。
Openaiが結果に応答するために、2つの追加のメッセージが含まれている別のリクエストを送信します。 1つ目はタイプ「関数」で、呼び出された関数の名前とパラメーターが含まれています。 2番目は、検索プロセスから返された製品のJSONデータを含む「ユーザー」のタイプです。 Openaiは、まるでこの知識をずっと持っているかのように反応します!
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." } ,
{ role : "function" , name : "search_products" , content : '{"query":"trucker hats"}' } ,
{ role : "user" , content : '[{"id":3582,"name":"Mens Patagonia Logo Trucker Hat..."}]' } ,
]
} ) ;すべてのメッセージはクライアント側の状態で維持されているため、きちんとしたデバッグテクニックを使用して表示できます。 src-frontend/components/Message.vueファイルを開き、次の変更を行います。
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,これで、UIのすべてのメッセージの状態を見ることができます。これは、アプリケーションをデバッグし、何が起こっているかを確認するための素晴らしい方法です。
Openaiのチャットの完了を知識の取得のためにどのように増強することができるかについてのこの簡単な概要を見つけてください。探索して行うことはたくさんあります。ここにあなたが始めるためのいくつかのアイデアがあります:
src-frontend/stores/messages.js PiniaストアのfetchResponse 、ここですべての作業を行い、クライアント側の状態を管理します。src/utils/functions.jsonファイルにさらに検索方法を追加することを検討してください。たとえば、データベースを直接照会するIDメソッドによるfind_styleによるもの。@これらの投稿を楽しんで、知識の検索にAIを使用する方法を学ぶのに役立つLambdaragデモアプリケーションを見つけてください。お気軽に質問して、この投稿についてあなたの考えを共有してください。ありがとう!