AWS Bedrock ナレッジベースで遊戯王RAGを試す

お手軽にRAG構築ができると評判のBedrockナレッジベースを試してみた。

# 利用サービス概要

## Amazon Bedrock

生成AIアプリ開発のための基盤モデルAPI提供サービス。サードパーティ製の基盤モデルから選択利用できる。

## Knowledgebase for Amazon Bedrock

RAG構築のためのマネージドサービス。S3にドキュメントを上げて紐付けるだけで埋め込みも検索エンジンもよしなに用意してくれる。

> Amazon Bedrockのナレッジベースは、データソースへのカスタム統合を構築してデータフローを管理することなく、取り込みから取得、迅速な拡張まで、RAGワークフロー全体を実装するのに役立つフルマネージド機能です。あるいは、ベクトルデータベースを設定せずに、質問をしたり、単一のドキュメントからデータを要約したりすることもできます。

https://aws.amazon.com/jp/bedrock/knowledge-bases/

## データソース

そのへんのWikipedia読ませてもつまんないので遊戯王カードリストとルールブックをぶちこんでみる。
25年の歴史が積み重なったルールとカードテキストをAIはどう要約してくれるのか！？

![FoNImqeaMAYLMEc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/533e5ebd-0d6e-a8b3-c97f-2690dec66f52.jpeg)

### カードリスト
ygoprodeck APIを叩いてcards.csvを作る。
お試しなので一部のカード、ステータスのみで。

- メインデッキに入るモンスターカード(6,611種)
- レベル / 種族 / 属性 / 効果 / 効果テキスト

https://ygoprodeck.com/api-guide/

### ルールブック
ygoprodeck言語に合わせて英語版の公式ルールPDFを使用。
EXゾーンルール改定前の2020年版だけど、今回はEXカード使わないし誤差でしょ。

https://img.yugioh-card.com/en/downloads/rulebook/SD_RuleBook_EN_10.pdf

# 手順
## データソースBucket作成
Amazon S3を開き、**バージニア北部リージョン**でBucket作成。
2024-07現在、Bedrockはバージニア北部限定なため。

![スクリーンショット 2024-07-21 13.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/886d4b93-af22-515c-d22e-627abac2c501.png)

カードリストCSVとルールブックをアップロード
![スクリーンショット 2024-07-21 13.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/a4958cbf-2100-c7ab-9b0e-5716cc410621.png)

## Bedrock設定
Amazon Bedrock マネジメントコンソールから利用を開始。
モデルアクセス より使用する基盤モデルを選択。

- Anthropic/Claude
    - テキストチャットLLM
- Cohere/Embed English
    - データソースのベクトル変換用
    - Amazon Titan Text Embeddings でもいいです(違いは分かってない)

![スクリーンショット 2024-07-21 14.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/b39e563c-d30e-93b8-9166-2eff8a1e00ad.png)

オーケストレーション > ナレッジベースを作成

- IAM許可：新しいサービスロールを作成して使用
- Choose data source：Amazon S3

次へ

![スクリーンショット 2024-07-21 14.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/d6872cdd-718a-3cbb-897b-d0502d7fccf3.png)

データソースに先ほど作ったS3バケットを指定。
次へ
![スクリーンショット 2024-07-21 9.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/79690e91-4495-592d-772c-65228fdd028f.png)

埋め込みモデルを選択。
次へ→設定を確認してナレッジベース作成
作成には数分かかります。
![スクリーンショット 2024-07-21 9.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/4404384c-3b32-c914-d935-a8325b5cdeba.png)

ステータスがReadyになったら作成完了。
作成したナレッジベースを開き、使用する基盤モデルを選択。
データソースを同期。

以上で準備完了。
![スクリーンショット 2024-07-21 14.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/995eed36-8d3b-2f06-82a7-e6305360bab9.png)


# 遊戯王RAG検証
「使い物にならない」というのが結論。

- 自然言語でカードリスト検索を行える
- 質問に対し正しいルールを回答できる

の２点を期待していたが
いずれも回答可能なのは「データソースに直接的な記載がある」場合のみ。
他のカードステータスを参照するなど応用的な要素が入ると全く精度が出ない。

LLM設定とかプロンプトの工夫で解決し得るのかは不明。知識がないので。
Amazon Kendraで作り込めばなんとかなるのかもしれない。なにもわからない。
少なくともナレッジをデータソースにぶち込むんだだけのマネージドサービスでは実用に耐えるものはできないということは分かった。

前者に関しては、自然言語からの検索条件抽出を生成AIで行い
実際クエリ叩くのはアプリケーション側でやればかなりマシになりそう。

![スクリーンショット 2024-07-21 16.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/a72e4038-b78f-7724-4cad-6e73b5ebac9f.png)

--------------

以下検証。

## 自然言語でカードリスト検索できるか
[《トリック・デーモン/Archfiend Heiress》](https://www.db.yugioh-card.com/yugiohdb/card_search.action?ope=2&cid=10632&request_locale=ja)で検証。 
カード名に「デーモン(Archfiend)」を含むカードをサーチする効果を持つ。

>《トリック・デーモン/Archfiend Heiress》 
効果モンスター 星３/闇属性/悪魔族/攻1000/守 0
このカード名の効果は１ターンに１度しか使用できない。
①：このカードが効果で墓地へ送られた場合、または戦闘で破壊され墓地へ送られた場合に発動できる。デッキから「トリック・デーモン」以外の「デーモン」カード１枚を手札に加える。
If this card is sent to the Graveyard because of a card effect or being destroyed by battle: You can add 1 "Archfiend" card from your Deck to your hand, except "Archfiend Heiress". You can only use the effect of "Archfiend Heiress" once per turn.



> Q：《トリック・デーモン》で《デーモンの騎兵/Archfiend Cavalry》を手札に加えることはできますか？
-- 
A：❌ いいえ。《トリック・デーモン》はデッキから「デーモン」を手札に加えます。《デーモンの騎兵》は指定されていません。

![rag_trickdemon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/75e55049-15d8-2817-43e5-8bbe31f4fd00.png)

カードテキスト「"Archfiend" card」を「《デーモン》という特定のカード名」と解釈している。
補足して再トライ。
> Q：カードテキスト内に記載されている「～」カードとは、カード名に「～」を含むカード全てを指します。
《トリック・デーモン》で《デーモンの騎兵》を手札に加えることはできますか？
--
A：⭕️ はい。《トリック・デーモン》の効果で《デーモンの騎兵》をデッキから手札に加えることができます。（中略）
《デーモンの騎兵》は「デーモン」モンスターなので、《トリック・デーモン》の効果の条件を満たします。

![スクリーンショット 2024-07-21 11.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/1f92a742-bdda-bb3f-e239-113cb8e15731.png)


> Q：《トリック・デーモン》の効果で手札に加えることのできるカードを全て列挙してください。
--
A：❌（効果テキストの解説のみ）

![スクリーンショット 2024-07-21 15.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/31a02f08-5b55-8c98-aea8-9dce9ffcfb53.png)

リスト列挙指示はほぼ無視される。
たまーに挙げてくれてるが網羅性は皆無で中身も間違っている。
プロンプトやカードを変えてみても正しいリストが出力されることは無かった。

[《クリッター/Sangan》](https://www.db.yugioh-card.com/yugiohdb/card_search.action?ope=2&cid=4054&request_locale=ja)
![スクリーンショット 2024-07-21 12.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/c8ce607b-e298-cea4-08ef-c3e3c5728a6f.png)

もちろん[《魂の造形家/Spirit Sculptor》](https://www.db.yugioh-card.com/yugiohdb/card_search.action?ope=2&cid=14478&request_locale=ja)の攻守合計値参照など複雑な抽出も不可

![スクリーンショット 2024-07-21 11.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/80151de8-8448-5266-1637-dabe31ae5bef.png)

## 正しいルールを回答できるか

付属ルールブックに書いてないルールの方が多いカードゲーム、遊戯王。
まずは基本的なルール解釈ができるかを検証する。

ルールブックにまんま書いてあることはほぼ完璧に回答可能。

> Q：レベル６モンスターの通常召喚に必要なリリースは何体ですか？
--
A：⭕️ レベル6モンスターは通常召喚に1体のリリースが必要です

> Q：自分のATK2500モンスターと相手のATK 3000モンスターが戦闘を行った場合、何ポイントのダメージを受けますか？
--
A：⭕️ （略）攻撃力3000のモンスターが攻撃力2500のモンスターを超えた分(500 ATK)を戦闘ダメージとして攻撃プレイヤーのLPから減算します。

> Q：トークンをエクシーズ素材に使うことはできますか？
--
A：⭕️ いいえ、トークンをエクシーズ素材として使用することはできません。検索結果によると「トークンをエクシーズ素材として使用することはできない」とのこと

![スクリーンショット 2024-07-21 12.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/68b24d73-bec8-7c77-0f1e-4b8ed70040cc.png)


同じ内容でもカードステータスを参照するような質問はお手上げ🤷

> Q：自分の《ブラック・マジシャン》と相手の《青眼の白龍》が戦闘を行った場合、何ポイントのダメージを受けますか？
--
A：❌ 申し訳ございませんが、このリクエストには対応できません。

👤ブラマジの攻撃力は？
🤖2500！
👤青眼の攻撃力は？
🤖3000！
👤2体が戦闘したらどうなる？
🤖わかんない！
![スクリーンショット 2024-07-21 12.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657379/285d1bd7-dd79-4599-3444-8d7a2aaa6349.png)