社内チャットボットを作るにあたって考えたこと　～④LLM～

# はじめに
2024年8月頃からAWS上でBedrockを使って社内向け生成AIチャットボットを作っています。
初めて生成AIを使ってみたところで色々考える点があったので、メモとして残しておくことにしました。

生成AI技術が日々すごいスピードで進歩しているので既に古い技術になっていそうなのと、そもそも初心者が書いておりますで、あまり技術的な参考にはならないと思いますが、ポエム的な感じ？でお読みいただけたら幸いです。

# 考えたこと④　LLM
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/0049e428-7228-4a74-8d8d-d6834617cbcf.png)

前回からかなり時間が経ってしまい日に日に情報が古くなってしまっていますが、、
今回はLLMについて考えたことを書きたいと思います。


## LLMの比較
私達のチャットボットは東京リージョン上で動くことが前提のため、以下の３つのモデルが候補となりました。

- Amazon Titan Text G1 - Express
- Anthropic Claude 3 Haiku
- Anthropic Claude 3.5 Sonnet

このうち、「Amazon Titan Text G1 - Express」は日本語対応がプレビュー版？とのことなので対象外として（ちょっと試しましたがまだまだ使える感じではなかったです）、「Claude 3 Haiku」「Claude 3.5 Sonnet」の比較となりました。

### 特徴
AWSのサイトからの抜粋です。(比較用に横に並べてみました）
高精度のSonnetと高スピードのHaikuといったところでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/9ad4009b-9cb9-4c57-9300-587cb9792b1b.png)

https://aws.amazon.com/jp/bedrock/claude/

### 料金
Claude 3.5 Sonnetは Claude 3 Haikuに比べて、約10倍高いのお値段設定になってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/db8ff21d-5cb7-44af-8aa4-276f84de7d2c.png)

https://aws.amazon.com/jp/bedrock/pricing/


### 動作の違い
QAチャットボットに期待する動作は以下のポイントがありました。

①既にQAデータとして登録されている質問には、QAデータから正確に回答させたい
②過去のQAからピタり回答を導きだせない場合には、できるだけ意味合いの近いQAデータから回答させたい
③QAデータに関連しない質問には、はっきり「データなし」と言わせたい

これらに関してLLMのモデルで動作の違いを比較してみました。

※比較の前提として、プロンプトは全ケース共通、QAデータはLLM間で同じものを利用しています。

:::note warn
今回は非常に簡単なプロンプトとしています。
実際のLLMの動作はプロンプトの組み方やRAG構成等に依りますので、
あくまで超簡易的な比較を目的にしたものとしてご参照ください。
:::

```ruby:比較時に利用したプロンプト（全ケース共通） 
あなたの役割は、入力されたクエリからコンテキストを検索し回答文を抽出し出力することです。
・回答文が抽出できた場合、原文をそのまま出力してください。
・回答文が抽出できなかった場合、「データなし」と出力してください。
出力時は以下のルールに従ってください。
・事前学習データによる回答は行わないこと
・あなた独自の見解・コメントも含めないこと
```

#### ケース①　既にQAデータとして登録されている質問には、QAデータから正確に回答させたい

__クエリ①__
服装のルールはありますか？

```ruby:QAデータ①
服装のきまりはありますか,"服装は原則自由とします。<br>ただし、次の点に留意して実施してください。<br>（１）清潔である（人に不快感を与えない）<br>（２）調和が取れている（働く場にふさわしい）<br>（３）機能的である（動きやすく、仕事がしやすい）"
```

- Anthropic Claude 3.5 Sonnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/f7ae8e5e-a340-4cbf-b9d2-35d2f1f6a6b4.png)

- Anthropic Claude 3 Haiku
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/7cae1722-b3ac-4cc4-8f77-056cd8c5f4e7.png)

 __結果__ 
- SonnetもHaikuもQAデータから回答文を抽出できた
- Sonnetはプロンプト指示に従って原文そのまま回答してくれたが、Haikuはちょっとプロンプト意図を汲み取ってもらえなかった様子。
- 回答スピードはSonnetが2.547sに対してHaikuは1.299sとHaikuのほうが1秒以上早かった

|LLM|回答速度|トークン数|料金|
|:-|:-|:-|:-|
|Claude 3.5 Sonnet|2.547 s|1.335K|0.0052410 USD|
|Claude 3 Haiku|1.299 s|1.362K|0.0004665 USD|

#### ケース②　過去のQAからピタり回答を導きだせない場合には、できるだけ意味合いの近いQAデータから回答させたい

__クエリ②__
関西支店の住所を教えて
```
```ruby:QAデータ②
本社・拠点の住所や電話番号を教えてください,"本社・拠点の住所や電話番号については、会社のホームページを参照してください。<br><a href=""https://example.com/"" target=""_blank"">事業所一覧・アクセス</a>"
```
- Anthropic Claude 3.5 Sonnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/972e9801-8d43-4af4-acc1-e71c7649cb4a.png)
- Anthropic Claude 3 Haiku
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/af6063bf-0efd-4a8d-acd4-9df09575c7ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/bb5e010b-9158-4ac9-b82f-6bc20712bab9.png)

 __結果__ 
- Sonnetは拠点の住所に関する質問として質問意図の近いQAデータから回答を出してくれた
- Haikuは「データなし」やハルシネーション（全く異なる住所を回答）することがあった
- 回答スピードはSonnetが1.766sに対してHaikuは725msとHaikuのほうが1秒以上早かった

|LLM|回答速度|トークン数|料金|
|:-|:-|:-|:-|
|Claude 3.5 Sonnet|1.766 s|1.191K|0.0044490 USD|
|Claude 3 Haiku|725.332 ms|1.147K|0.0003098 USD|


##### ケース③　QAデータに関連しない質問には、はっきり「データなし」と言わせたい
```ruby:QAデータ③
なし
```
- Anthropic Claude 3.5 Sonnet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/3594245b-dfb6-4bb4-92c0-26f565cf87a3.png)

- Anthropic Claude 3 Haiku
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/dc1e9c85-d60b-47e6-958e-44b5b6aadcee.png)

 __結果__ 
- Sonnetはプロンプト指示通り「データなし」と回答してくれた
- Haikuもデータなしだったが回答文としては独自の文面だった
- 回答スピードはSonnetが954msに対してHaikuは1.107sとSonnetのほうが若干早かった

|LLM|回答速度|トークン数|料金|
|:-|:-|:-|:-|
|Claude 3.5 Sonnet|954.915 ms|1.151K|0.0035250 USD|
|Claude 3 Haiku|1.107 s|1.211K|0.0003708 USD|


## 考えた結果
今回のチャットボットではプロンプト指示に対する正確性と回答精度を優先したため、『Claude 3.5 Sonnet』を採用しました。私のような初心者の甘いプロンプトでも意図を理解して動いてくれる点が特に有難く感じました。

ただ、回答スピードが若干遅かったり（他の処理も入れたりすると1秒が大事になる）、コスト面ではHaikuのほうがお得だったりするので、プロンプト等で精度改善できるところはHaikuにするなど使い分けしていきたいと思います。
また、『Claude 3.5 Haiku』もそのうち東京にやってくるかと思いますので、最新モデルに切り替えて使っていきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569502/98980062-0cb0-4da2-9c67-3cfbbbcb070b.png)