Azure Open AIとClaude 3使ってRAGシステムを作ってみた

# ざっくりどんな記事か
- AIによる回答システムを構築してみたかったので、社内規則を入れたらそれらしい質問回答システムを作れないかと思ったので試してみました。
- Azure Open AI の本を読んだのでRAG(Retreival argumented generation)システムを作ってみました。
- 回答にAnthropic Claude 3を使ってみました。

# 参考文献
ほぼほぼこの本で書いてあることをそのまま参考にしてるので末尾と言わず冒頭に紹介しておきたいと思います。めちゃ参考になりました！

「Azure OpenAI Service実践ガイド ～ LLMを組み込んだシステム構築」
https://amzn.to/3xlmjtx

# RAG(Retreival argumented generation)とは
AIに回答してもらう時の参考情報ドキュメントを別途検索システム等に登録しておきます。まず質問した際に、質問文に関するドキュメントを検索してきます。それらのドキュメントを参考情報として質問文プロンプトに含ませます。その質問文と参考情報をあわせたプロンプトをAIに質問して回答を得る方法です。

参考リンク
https://qiita.com/ksonoda/items/ba6d7b913fc744db3d79

# 期待するシステム
弊社リツアンでは月額単価についてエンジニアの還元率の高さを売りにしています。それは在籍年数で変わりますので、そのような質問回答がどのようになるのか試してみます。
また子供が産まれた時に会社手続きとして何をすればいいのか？といった事務的な質問も回答できないかというのを期待動作としています。

## 注意事項
今回はリツアン社内の規則を一部抜粋してシステム構築のために使いましたが、私が勝手にやってることでありオフィシャルな活動ではありませんし、今後そういった機能をつけるなどする予定はありません。
また登録したドキュメントも一部簡易的に文言を変えていますので、内容に関してはこの記事の内容を参考にせず弊社のURLをご確認ください。

## 在籍年数に関する質問

### 質問と期待する回答

「私は在籍2年目で月額単価は80万円です。5年目の年収はどれくらい上がる可能性がありますか？」
→「現状だと650万円くらいで、在籍年数が長くなれば760万円くらいになります。」
といった回答を期待しています。

#### ポイント
ドキュメントには何年目で還元率x%と1年ごとに還元率を指定しているわけではありません。初年度～3年目在籍でx%の還元率、といった期間の範囲で示したドキュメントでも年数を理解して回答することができるのかを試してみたいと思いました。
また金額計算も正確にできるかもポイントです。

### 登録するドキュメント
登録するドキュメントは下記のようなものを用意しました。
```
{
    "Id": "1",
    "title": "リツアンの給与について 入社",
    "title_vector": "",
    "description": "<入社～3年目在籍>月給社員及び日給月給社員は派遣料金の原則として平均約68%を支払います。",
    "description_vector": ""
},
{
    "Id": "2",
    "title": "リツアンの給与について 4年目以降",
    "title_vector": "",
    "description": "<4年目〜10年目在籍>毎月の給与はそのまま、年3回の賞与により大幅に年収がアップする上位契約が選択可能になります。還元率は平均約80%になります。あくまでも平均である点をご理解下さい。 ※自動では切り替わりません。切り替えをご希望の場合は担当営業にご連絡をお願いいたします。",
    "description_vector": ""
},
{
    "Id": "3",
    "title": "リツアンの給与について 10年目以降",
    "title_vector": "",
    "description": "<11年目在籍〜>10年在籍以降に選択できる給与形態です。還元率は平均約90%になります。※自動では切り替わりません。切り替えをご希望の場合は担当営業にご連絡をお願いいたします。",
    "description_vector": ""
},
{
    "Id": "4",
    "title": "プロフェッショナル契約",
    "title_vector": "",
    "description": "プロフェッショナル契約とは、入社4年目以降から選択可能な給与形態です。毎月の給与は還元率68%のままですが、月額単価の12%の4カ月分を年3回（3月、7月、11月）の賞与として支給されます。還元率は平均約80%になります。それにより大幅に年収がアップする上位契約を選択可能になります。実働勤務37ヶ月目以降の社員の方となります。担当営業へご連絡いただき、制度の仕組みについてご説明させていただきます。自動で切り替わることはありませんので、必ずご自身で申告いただくようお願いいたします。",
    "description_vector": ""
},
```
https://github.com/suganoo/open_ai_works/blob/main/docs_rules.json

## 子供ができた時の質問

### 質問と期待する回答
「妻が妊娠しました。会社手続きになにかやることはありますか？」
→「お子様が産まれましたら扶養加入手続きが必要です、また産休もお考えになっているのであればxxxxをする必要があり....。」
といった回答を期待しています。

#### ポイント
子供が産まれた時にする手続きはどこの会社でも働いてればよくあることだと思いました。
そこで社内規則には手続きなどは書いてあるけれど、総務的な部署に聞く前にあれこれやることをまとめて回答してくれないかと期待しました。
ほかにもピンポイントの単語を使ってなくてもベクターデータベースから意味検索できることを確認したかったです。
例えば登録するドキュメントに「出産した場合の手続きは...」といったドキュメントがあって、質問の単語に"出産"といった一致した単語がなくても"妊娠した"という意味として近しい単語で検索できることを確認してみたいと思いました。

### 登録するドキュメント
登録するドキュメントは下記のようなものを用意しました。
```
{
    "Id": "5",
    "title": "子供が生まれたら",
    "title_vector": "",
    "description": "＜お子様の扶養について＞先ずは以下の書類にご入力頂き以下、担当まで、メール連絡をお願いします。メール連絡後お子様のマイナンバー登録等の処理に進みます。お子様のマイナンバーについては出生届を提出後、住民票(マイナンバー記載あり)でもご確認頂けます。担当者：山田太郎 testtesttest@ritsuan.com ◆扶養加入手続き 併せて扶養控除等異動申告書もご記入お願いいたします",
    "description_vector": ""
},
{
    "Id": "6",
    "title": "産休について",
    "title_vector": "",
    "description": "＜ご連絡方法＞配属先への連絡が必要になりますので、事前に担当営業へ連絡をお願いいたします。産休担当は以下です。山田太郎 testtesttest@ritsuan.com ＜産前産後休業必要書類＞・母子手帳のコピー（予定日が確認できるページ）・産前、産後休暇申請書 産前開始日１カ月前までにご提出しお願いいたします。 ＜出産後ご提出いただく書類＞・健康保険出産手当金支給申請書・健康保険出産一時金申請書",
    "description_vector": ""
}
```
https://github.com/suganoo/open_ai_works/blob/main/docs_rules.json

# 構成
- ベクターデータベース：Azure Open AI Search
- Embedding：Azure Open AIのtext-embedding-ada-002
- AIサービス：Anthropic Claude 3 (2週間無料)

構成図はこのような感じです。図を作るのがめんどくさくなったので下記図は上述の参考文献から引用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17698/7ff17fbb-0fad-0aff-c8d4-c90ff7470ef6.png)

# コード
実装の解説は省略します。ほとんど上述の参考文献のコードを利用しました。
なのでgithubにあがってるコメントはほぼそこからのコピーです。
ただちょこちょこ参考文献のコードでは動かなかった部分はありましたが、それは別記事にします。
https://github.com/suganoo/open_ai_works/tree/main

# 結果
## 在籍年数に関する質問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17698/5a3ee3ef-a3bb-96bc-7ae8-55bb2691a52d.png)
```
question: 私は在籍2年目で月額単価は80万円です。5年目の年収はどれくらい上がる可能性がありますか？

あなたの現在の状況と提供された情報を基に、5年目の年収予測を試みます。

現状:
- 在籍2年目
- 月額単価80万円

4年目以降の契約オプション:
- プロフェッショナル契約を選択可能
- 毎月の給与は還元率68%のまま
- 月額単価の12%を4カ月分として年3回の賞与支給
- 平均還元率は80%に上昇

5年目の年収予測:
月額単価80万円 × 12ヶ月 = 9,600,000円 (年収ベース)
9,600,000円 × 80% (平均還元率) = 7,680,000円

したがって、プロフェッショナル契約を選択した場合、5年目の年収は約768万円になる可能性があります。これは現在の還元率68%の年収652.8万円から約115万円の増加となります。

ただし、これはあくまで平均値に基づく予測であり、実際の年収は個人の業績や会社の業績によって変動する可能性があることにご留意ください。より正 確な情報については、担当営業にご相談されることをおすすめします。
```
計算はあっていました。登録したドキュメントには初年度~3年目、4年目以降しかなかったんですがちゃんと5年目も判断されています。
余談なんですが、temparatureを1.0にすると80%の計算をx0.8ではなくそのままx80にされたこともあったので注意が必要だなと思いました。

## 子供ができた時の質問
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17698/4f008fb4-1b8b-6974-e56b-da6a9662deca.png)
```
question: 妻が妊娠しました。会社手続きになにかやることはありますか？

妻の妊娠おめでとうございます。会社への手続きとしては以下のことが必要になります。

1. 扶養加入手続き
- 扶養加入手続きの書類に記入し、担当の山田太郎さん(testtesttest@ritsuan.com)にメールで連絡
- お子様のマイナンバー登録等の処理を進める
- 扶養控除等異動申告書も記入

2. 配属先への連絡
- 事前に担当営業へ連絡

3. 産前産後休業の手続き
- 母子手帳のコピー（予定日が確認できるページ）を提出
- 産前、産後休暇申請書を産前開始日の1カ月前までに提出
- 担当は山田太郎さん(testtesttest@ritsuan.com)

4. 出産後の手続き
- 健康保険出産手当金支給申請書を提出
- 健康保険出産一時金申請書を提出

入社4年目以降であれば、プロフェッショナル契約への切り替えも可能です。
これにより年収アップが見込めますので、希望される場合は担当営業にご相談ください。

以上が主な手続きになります。ご不明な点があれば担当の山田太郎さんにお問い合わせください。
奥様のご健康とお子様の誕生を心よりお祈りしております。
```
「妻の妊娠...」敬語がw。とはいえ必要な手続きをまとめて回答してるようで、期待通りの結果です。

## 感想
思ったようにうまくいってた。

# その他所感
- 登録ドキュメントは数件
登録したドキュメントは数件であるためだったからこそうまくいったんだろうなと。似たようなドキュメントが多数あったときはどうなるのか、そういった検索精度も考慮に入れる必要があります。そうした時に意味的検索がほんとにいいのかNgram検索で十分だとか考慮が必要でしょう。
- AI サービス
AIサービスにはAzure Open AIのGPT3(だったかな)を使ってたんですが、あんまり精度の良い回答が返されなかったので省略しました。(そこを深めるべきだったなと思いますが力尽きた) 
回答はClaude 3を使ったので今後は他のものでもやってみたい。
- ファインチューニング
聞くところによるとファインチューニングは数時間かかるし料金も数万円でかかると聞いたのであきらめました。もう少し中身を理解したらやってみたいと思います。
- 登録ドキュメントの準備
質問に対する回答の精度をあげようとすると、登録ドキュメントをどういう粒度で準備するのか、登録してみて検索精度はどうなのかと、そういったドキュメントの検索精度のメンテナンスは重要だと思いました。
10年ほど前にSolr使って検索システムの運用に携わっていたので、その知識を振り返ろうと思います。
- AIの回答精度のメンテナンス
質問に対する想定した回答については定期的にメンテナンスが必要なんじゃないのかと思いました。例えば80%の還元率の計算の時にtemperatureを上げると何回かx0.8ではなくてx80になってることがあり、ヘンテコな数値を返されることがありました。
- テストとかどうするんだろう
質問回答は文章でやってるので理想的な答えがちゃんと返っていることの担保はどうしたらいいのかなと思いました。AIシステム用のテストツールなんてあるんでしょうか。
- やっぱお金かかるな
お試しでAzureを使ってみましたが、無料期間では終わらなかったのでサブスクリプションに課金したら6000円近くかかってしまいました。ちょっとやってみたいだけだったのに、俺にとっては大きな出費で泣きそうです。。
どうにかして取り返したい。。