9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Azure Chatを利用したRAGの試し方

Last updated at Posted at 2024-04-05

RAGを試すためにAzure Chatを利用した所、自分で作ったインデックスに合わせてコードを修正する必要のある箇所がいくつかあったので、Azure ChatをローカルにデプロイしてRAGを試すための手順をまとめます。

実行時点と執筆時点でAzure Chatの構成がだいぶ変わっていたため、実際に試す場合には、以下のように過去のコミットに戻してお試しください。

git checkout 601086b

Azure Chatとは

Azure ChatMicrosoftによって提供されているオープンソースの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. コード調整

検索対象インデックスのフィールド名に合わせて調整。

src/features/chat/chat-services/chat-api-data.ts
	// 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: "", // インデックスのフィールド名に合うフィルターを記述。ここではフィルターなし。
	});
src/features/chat/chat-services/azure-cog-search/azure-cog-vector-store.ts
	// 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に切り替えてプロンプトを送信する。

スクリーンショット 2024-04-02 9.19.52.png

まとめ

ここでは回答の精度にはこだわらず単純に動く状態にしただけなので、回答に不満がある場合にはインデックスやプロンプトの改良などを行い、納得がいく回答が返ってくるよう調整してみてください。

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?