RAGを試すためにAzure Chat
を利用した所、自分で作ったインデックスに合わせてコードを修正する必要のある箇所がいくつかあったので、Azure Chat
をローカルにデプロイしてRAGを試すための手順をまとめます。
実行時点と執筆時点でAzure Chat
の構成がだいぶ変わっていたため、実際に試す場合には、以下のように過去のコミットに戻してお試しください。
git checkout 601086b
Azure Chatとは
Azure Chat
はMicrosoft
によって提供されているオープンソースのWebアプリで、Azure OpenAI
を利用したプライベートなChat GPT
を用意することができます。
実行時環境
- macOS Monterey 12.7.4
- Node.js 18.19.0
必要なモノの準備
Azure Chat
を利用するには以下のリソースを用意する必要があります。
- Azure OpenAI
- Azure AI Search
- Azure Cosmos DB
Azure OpenAI
GPTモデル
を用いた回答の生成と、必要な情報をベクトル検索するために、プロンプトをベクトル化する埋め込みモデル
を使用します。
これらのプロセスを実装するために、Azure OpenAI
を利用します。
以下を参考にリソースを作成し、GPT-4
もしくはGPT-3
のモデルと埋め込みモデル
をデプロイします。
GPTモデル
、埋め込みモデル
については以下を参考にしてください。
Azure AI Search
回答を生成するのに必要な情報をもつドキュメントを検索するために使います。
以下を参考にサービスを作成し、ドキュメントの内容をベクトル化したフィールドを持つインデックスを作成します。
Azure Cosmos DB
プロンプトと回答の履歴を残すために使います。
以下を参考にAzure Cosmos DBアカウント
を作成します。
構築手順
1. 以下実行
git clone https://github.com/microsoft/azurechat.git azurechat
cd azurechat/src
cp .env.example .env.local
npm install
2. .env.local
の以下定数記入
# [Azure OpenAI] -> [キーとエンドポイント]の[キー1]もしくは[キー2]
OPENAI_API_KEY
# Azure OpenAIリソース名
AZURE_OPENAI_API_INSTANCE_NAME
# GPTモデル名(GPTモデルをデプロイした際に付けた名前)
AZURE_OPENAI_API_DEPLOYMENT_NAME
# 埋め込みモデル名(埋め込みモデルをデプロイした際に付けた名前)
AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME
# [Azure Cosmos DB] -> [概要]の[URI]
AZURE_COSMOSDB_URI
# [Azure Cosmos DB] -> [キー] -> [Read-write Keys]タブの[PRIMARY KEY]もしくは[SECONDARY KEY]
AZURE_COSMOSDB_KEY
# [Azure AI Search] -> [キー]の[プライマリ管理者キー]、[セカンダリ管理者キー]、[クエリキー]のいずれか
AZURE_SEARCH_API_KEY
# Azure AI Searchサービス名
AZURE_SEARCH_NAME
# Azure AI Searchで作成したインデックス名
AZURE_SEARCH_INDEX_NAME
3. コード調整
検索対象インデックスのフィールド名に合わせて調整。
// ChatAPIData関数
const context = relevantDocuments
.map((result, index) => {
// result.[インデックスのドキュメント内容を保持するフィールド名].replace()に修正
const content = result.chunk.replace(/(\r\n|\n|\r)/gm, "");
const context = `[${index}]. file name: ${result.metadata} \n file id: ${result.id} \n ${content}`;
return context;
})
// findRelevantDocuments関数
const relevantDocuments = await
similaritySearchVectorWithScore(query, 10, {
filter: "", // インデックスのフィールド名に合うフィルターを記述。ここではフィルターなし。
});
// Azure AI Search からのレスポンスに合わせる
export interface AzureCogDocumentIndex {
id: string;
chunk: string; // 上記ChatAPIData関数修正の[インデックスのドキュメント内容を保持するフィールド名]に合わせる(コード上のエラーが気になるようであれば)
embedding?: number[];
user: string;
chatThreadId: string;
metadata: string;
}
// similaritySearchVectorWithScore関数
const searchBody: AzureCogRequestObject = {
search: filter?.search || "*",
facets: filter?.facets || [],
filter: filter?.filter || "",
vectors: [
{
value: embeddings.data[0].embedding,
fields: "vector", // fieldsの値を[インデックスのドキュメント内容のベクトルを保持するフィールド名]に合わせる
k: k
},
],
top: filter?.top || k,
};
4. ローカルサーバーを起動し、立ち上がったサイトにアクセス
npm run dev
5. RAGモードに切り替えて質問開始
+マーク
をクリックし、ルームを立ち上げ、How would you like to chat?
をFile
に切り替えてプロンプトを送信する。
まとめ
ここでは回答の精度にはこだわらず単純に動く状態にしただけなので、回答に不満がある場合にはインデックスやプロンプトの改良などを行い、納得がいく回答が返ってくるよう調整してみてください。