Azure OpenAI Service #AOAIドーナツ本 第4章 RAG 勉強メモ

この本『**Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門 エンジニア選書**』（通称『AOAIドーナツ本』）を読んだので、
学んだことや調べたことを軽くメモしていきます。
この記事では RAG を中心にまとめます。

この記事の続きです↓

https://qiita.com/chomado/items/3098ce48e06b63143bfc

（つよつよエンジニア７名によって書かれた、すごく良い本でした！おすすめです！）

https://www.amazon.co.jp/Azure-OpenAI-Service%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BChatGPT-LLM%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80-%E6%B0%B8%E7%94%B0/dp/4297139294/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=

発売日：2024/01/24(水) 

:::note
めっちゃ言いたいこと：

この本の内容が良すぎる（とくに図が分かりやすい）ので、このまとめ記事では、この本からたくさん引用しています。
でも、もちろん全部は引用していませんので、購入してすべてを読むのをとてもオススメします。
:::

（ちなみに、前回の記事を書いてから何人かに聞かれたので、ここで一応書いておきますが、この本がたくさん売れても私に 1 円も入りません。アフィリエイトもやってないし宣伝も頼まれていません。 **本当に良い本なので勝手に書いてるだけ** です）（本当に素晴らしい本をありがとうございます！）

## 紹介ツイート

https://twitter.com/chomado/status/1762552374655344793

## 本のもくじ

充実していますね…！！

**第1部 Microsoft AzureでのChatGPT活用**

1. 第1章 生成AIとChatGPT
2. 第2章 プロンプトエンジニアリング
3. 第3章 Azure OpenAI Service

**第2部 RAGによる社内文章検索の実装**

1. **第4章 RAGの概要と設計**
1. 第5章 RAGの実装と評価

**第3部 Copilot stackによるLLMアプリケーションの実装**

1. 第6章 AIオーケストレーション
1. 第7章 基盤モデルとAIインフラストラクチャ
1. 第8章 Copilotフロントエンド

**第4部 ガバナンスと責任あるAI**

1. 第9章 ガバナンス
1. 第10章 責任あるAI

## この記事では

内容盛りだくさんなので、
今回は、とくに第４章から勉強メモを引っ張ってこようと思います。

  **第4章 RAGの概要と設計**
  
* 4.1 ChatGPTの問題点と解決手法
* 4.2 **Retrieval-Augmented Generation** とは
* 4.3 検索システム
* 4.4 **Azure AI Search**
* 4.5 **オーケストレータ**
* 4.6 **Azure OpenAI on your data**
* 4.7 **Azure Machine Learningプロンプトフロー**
* 4.8 大規模言語モデル
* 4.9 **Azure OpenAI API**
* 4.10 まとめ

## 4-1: LLM の学習データが古い問題

ChatGPT など多くの LLM はインターネット上の多数のドキュメントをもとに学習しています。
（ちなみに、その「いつまでのデータを学習している」という期間を「カットオフ」といいます。）
なので、そのままだと、最新の内容は答えられません。

モデル|バージョン|いつまでのデータ (Training dataset cutoff)|参照 (公式ドキュメント)
--|--|--|--
GPT-3.5 |(0125)|2021 年 9 月まで|[https://learn.microsoft.com/azure/ai-services/openai/concepts/models#fine-tuning-models](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?WT.mc_id=dotnet-9827-machiy#fine-tuning-models)
GPT-4 Turbo Preview |(0125-Preview)|2023 年 12 月まで|[https://learn.microsoft.com/azure/ai-services/openai/concepts/models#gpt-4-and-gpt-4-turbo-preview-models](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models?WT.mc_id=dotnet-9827-machiy#gpt-4-and-gpt-4-turbo-preview-models)

## 4-2: そこで RAG ですよ

RAG アーキテクチャ（フレームワーク）、
本の説明がとてもわかり易いので、本からそのまま引用します

> 大規模言語モデル（LLM）が知らない情報を 外部の検索システムで検索し、その検索結果を情報源として回答を生成する手法は、
> 一般的に **Retrieval-Augmented Generation**（**RAG**）として知られており、
> 大規模言語モデルを活用したシステム開発では重要な概念です。

> また、大規模言語モデルに外部情報を連携することは **グラウンディング** と呼ばれています。

> 引用元『Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門 』 (p.56) より

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/9dfa53a6-7a48-97b9-597a-9e59af8f5169.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 56) より

### 英和辞典を引く

RAG は **Retrieval-Augmented Generation** （**検索により強化された文章生成**）の略ということで、
それぞれの英単語の意味をメモ

:::note
**Retrieval**
/rɪtríːv(ə)l/ りとりーゔる

> (なくしたものなどを) 取り戻すこと、
> (失なわれた名誉・敗北などの) 回復、挽回(ばんかい)、
> (損害・ミスなどの) 埋め合わせ、償い

(引用元： Weblio 英和辞典 https://ejje.weblio.jp/content/retrieval )

IT 分野ではよく **「（データの）検索」「取り出し」** の意味で使われることが多いと思います。
:::

:::note
**Augmented**
/ɑˈgmɛntɪd/ おーぎゅめんてぃど

> (…を) 増加させる

(引用元： Weblio 英和辞典 https://ejje.weblio.jp/content/augmented )

「拡張現実」と訳される AR (Augmented Reality) などで使われていますね。
:::

Generation は「生成」の意味で使われているでしょう。（generate の名詞形）

なので「**Retrieval-Augmented Generation**」は
「**検索により強化された文章生成**」と理解するのが自然かなと思いました。

## RAG 利用例 - Copilot (Bing Chat)

Bing (マイクロソフトの検索エンジン) のインターネット検索機能を使用して
最新の情報を参照し、それをもとに答えてくれます。
ちゃんとリファレンスの URL も示してくれます。

https://www.bing.com/chat

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/eb767ea1-dc21-b02c-c770-38e21d74a650.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/8bb9ddcd-4834-c59d-f95a-514c334b3fab.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 55) より

## RAG のメリット

* RAG を利用することで、LLM が知らない情報について回答を生成できる
* 最新の情報を参照できる
* モデルが言ってる情報の根拠（情報ソース）をユーザが参照できる → ハルシネーション（幻覚）（嘘情報を自信満々に返してくるやつ）への対策としても有効

## RAG アーキテクチャとその要素

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/9dfa53a6-7a48-97b9-597a-9e59af8f5169.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 56) より

### RAG の要素（登場人物）たち一例

本 P56 の文章を表にまとめます。

要素名|説明|Azure のサービス例
--|--|--
オーケストレータ|orchestrate (組織的に計画や操作を行うこと) をする人。全体の重要な指示役。<br />RAG 全体の処理やプロンプトを定義し、検索システムや LLM との仲介になる| * **Azure OpenAI on your data**<br />* **Azure Machine Learning プロンプトフロー**<br />* フルスクラッチ（自前で実装）
検索システム|LLM に知識を与えるためのシステム。|**Bing** のようなインターネット検索エンジンだったり、<br />**Azure AI Search** （旧称：Azure Cognitive Search）を使って社内文章の検索システムを構築する場合も。
大規模言語モデル (LLM)|プロンプトに対して回答を生成する処理を行う。|**Azure OpenAI API**

検索システムについて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/09e588a1-da9d-2376-1a21-648f94babc05.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 57) より

## 4-4: Azure AI Search

高精度な検索システムを構築できる PaaS の **Azure AI Search** について。

検索対象のドキュメントに事前に **インデックス** を登録してくれるので、
高速、効率的に検索を行うことが可能。

### 処理フロー

1. 検索用の **インデックス作成**
1. 作成されたインデックスを使用して **ドキュメント検索** （フルテキスト検索に加え、AI 搭載の **セマンティック検索** や **ベクトル検索** にも対応）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/51c90f50-4f17-13f8-d062-f56ba910bf64.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 59) より


### 多様なデータソースとフォーマットの対応

> PDF やテーブルデータ、JSON など多種多様なデータフォーマットに対応しており、
> Azure Blob Storage や Azure Cosmos DB などさまざまなデータソースにも対応

> 引用元『Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門 』 (p.60) より



### 製品公式ページ

https://azure.microsoft.com/ja-jp/products/ai-services/ai-search

### 開発者向けドキュメント

https://learn.microsoft.com/ja-jp/azure/search/

この後、本では、
Azure AI Search のインデックス作成の詳しい流れ（インデクサーの動きや キーフレーズ抽出などさまざまな処理を行うスキルセットの働きなど）や
ベクトル検索とは、セマンティック検索とは、ハイブリッド検索とは、
など、詳しいことが書いてありますが、
このまとめ記事では省略します。（気になる方はぜひ本を…！）

## 4-5: オーケストレータ

続いて、重要人物 **オーケストレータ** についてです。
orchestrate (組織的に計画や操作を行うこと) をする人で、全体の重要な指示役です。
RAG 全体の処理やプロンプトを定義し、検索システムや LLM との仲介になります。

### RAG の処理フロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/c875c426-95e7-a5d2-93dc-0db87d81edc5.png)

↑図の引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 73) より

### オーケストレータのやってること

上記の RAG システムの場合で、オーケストレータがやってること流れ

#|該当番号|説明
--|--|--
1| ① ②|ユーザーからの質問に基づき、<br />関連するドキュメントを検索システムから取得
2| ③|検索結果の中からスコアが高いドキュメントを選ぶ
3| ④ ⑤|検索結果をプロンプトに埋め込み、<br />大規模言語モデルから回答を取得
4| ⑥|生成された回答を最終的にユーザーに返却

↑引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 73) より

### Azure で実装する場合

次の３つの方法がある

* **Azure OpenAI on your data**
* **Azure Machine Learning プロンプトフロー**
* フルスクラッチ（自前で実装）

## Azure OpenAI on your data

![Azure OpenAI Service On Your Data](https://techcommunity.microsoft.com/t5/image/serverpage/image-id/553274iCF9F8AC93D41C8DC/image-dimensions/560x315?v=v2)


**Azure OpenAI on your data** は、その名の通り、
とても簡単に、Azure OpenAI のモデルに独自のデータを使用 (グラウンディング) することができる機能です。
社内システムを参照する chat bot とかに便利そうですね。


### 公式ドキュメント

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/use-your-data?tabs=ai-search&WT.mc_id=dotnet-9827-machiy

### 今がアツい

ずっと public preview でしたが、
ちょうど先月 (2024/2/20) に 一般リリースされたという記事が出ていましたね

https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/on-your-data-is-now-generally-available-in-azure-openai-service/ba-p/4059514

### 利用方法

Azure OpenAI Studio の Web ブラウザから利用できます。
（Azure サブスクリプションが必要です。）

https://oai.azure.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/ab3a9eca-bf4d-76e7-9a3d-19483b1ebed0.png)

↑ 「データ持ち込み」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/64fdd626-04b9-1fea-8441-9863150e72a7.png)

↑ 「+ データソースの追加」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/0b14c259-81dc-f72c-05d1-2492553bb4b4.png)

これで簡単に参照したいデータを食わせることができる、、、！
マウスポチポチで めっちゃ簡単でござる、けどその分、チューニングには制限あり。


そして、
この後 本では P76 から
利用の流れがスクショ付きで丁寧に解説してあります。気になる方はぜひ👀

## Azure Machine Learning プロンプトフロー

**Azure Machine Learning プロンプトフロー** は、
オーケストレータをローコードで作成できるサービスです。

![](https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/media/how-to-develop-a-standard-flow/link-llm-node-input-2.gif?view=azureml-api-2)
(図引用：公式ドキュメント『[フローを開発する](https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/how-to-develop-flow?view=azureml-api-2&WT.mc_id=dotnet-9827-machiy)』)


### つまり

> Azure OpenAI on your data と違って、ひとつひとつの処理を自分で作成していくため、プロンプトのチューニングが可能となります。
> また、テンプレートを活用するとプログラミング不要でオーケストレータが作成できることもメリットです。
> (引用元『[Azure OpenAI ServiceではじめるChatGPT/LLMシステム構築入門](https://www.amazon.co.jp/dp/B0CRT96W82) 』 (p. 75) より)

そして、
この後 本では P84 から
利用の流れがスクショ付きで丁寧に解説してあります。気になる方はぜひ👀


### 公式ドキュメント

https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/overview-what-is-prompt-flow?view=azureml-api-2&WT.mc_id=dotnet-9827-machiy

https://learn.microsoft.com/ja-jp/azure/machine-learning/prompt-flow/how-to-develop-flow?view=azureml-api-2&WT.mc_id=dotnet-9827-machiy

## RAG オーケストレータを自前実装マン - LangChain や Semantic Kernel

RAG オーケストレータを自前で実装するパターンもあります。

実装を便利にするライブラリに **LangChain** や **Semantic Kernel** があります。

### Semantic Kernel 推し

ちなみに個人的に、マイクロソフトがオープンソースで開発している LLM 用ライブラリ **Semantic Kernel** が大好きです。 
C# で書けるから。(Pyton や Java も対応してるよ)

https://github.com/microsoft/semantic-kernel

ハローワールド記事 (C#) も書いたのでぜひ👀

https://zenn.dev/chomado/articles/231208-chatbot-semantic-kernel-rc3

## まとめ

* **RAG (Retrieval-Augmented Generation)** - 大規模言語モデル LLM に学習されている知識だけでなく、外部から情報を検索して回答を生成するアーキテクチャ
* RAG においての登場人物たち：オーケストレータ、検索システム、LLM
* Azure OpenAI を使う場合、オーケストレータやデータストアに Azure 周りを使って実装したら、連携がとてもスムーズに行きそう

次もまた読書メモ書こうと思います