Pinecone を使って、Amazon Bedrock Knowledge base と Agent で番組情報を扱えるようにしてみた

# Amazon Bedrock Knowledge base と Agent

自社で開発・運用している動画配信サービス「hod」のデータを使って、番組情報を教えてもらうチャットボットを構築してみます

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/4f6915a6-c34d-a133-b8b3-6d722962c2d3.png)

Amazon Bedrock の新機能としてGAした Knowledge Base と Agent を使っていきます。

使用する追加データとしては、HTBが開発・運用している動画配信サービス「hod」の番組マスタデータの一部をcsvにしたものを使ってみたいと思います。

(Bedrock の周辺機能をアーキテクチャ図に落とし込むときどうもしっくりこない。。笑)

## Vector Store として Pinecone を採用して、Knowledge base で RAG を構築する

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/3d322226-9016-ce96-a1c7-d9fdd029d34b.png)

Knowledge base は S3 にあるデータを Vector Store に格納して
RAG(Retrieval-Augmented Generation)を簡単に実現するサービスです

Vector Store としては、デフォルトで OpenSearch あたりが使われますがが、外部サービスを指定することも可能です。
OpenSearch は私にはちょっと難しくて扱いきれないので、
今回は無料で始めることができる [Pinecone](https://www.pinecone.io/) を使ってみたいと思います。
（re:Invent の EXPO にも出展されていましたね。）

そして、その手順について、Pinecone のブログが見つかりましたので、これに習って進めていきたいと思います。

https://www.pinecone.io/blog/amazon-bedrock-integration/

### Pinecone の準備

アカウントを作成すると、クレジットカードの登録なしで、Starter Plan から、Vector Store を使用することができます。

まずは、セットアップを終わらせて、

![スクリーンショット 2023-12-05 12.26.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/29471cc8-d6d9-db7e-ad60-3be298538f76.png)

Indexを作成していきます。

![スクリーンショット 2023-12-05 12.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/b4749ed2-e3b6-f63a-af72-c4bda545ca1b.png)

その際、Dimensions を指定する必要があるのですが、`1536` とします。
後に S3 においた CSVデータを Bedrcok が ここにVectorデータとして格納してくれるのですが
この時使用することになる `Amazon Titan Embeddings G1 - Text v1.2` がアウトプットする Vector の Dimensions が `1536` であるため、これに合わせます。Metric は `cosine` を指定します。

![スクリーンショット 2023-12-05 19.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/cf55de02-0dbc-9548-d1e1-e52dfc11aea1.png)

Free Plan なのを確認して Index を作成します。
しばらくすると、出来上がります。以下の情報を Bedrcok 側に渡す必要があるので、確認しておきます

- Index の HOST のアドレス（https://〜）
- API Keys の Value (default のものをそのまま使います)

### Bedrock の準備

AWS コンソールから Bedrock の Knowledge base を作成します。
左側メニューの Orchestration のなかに入っています。

#### Step 1: Provide details

名前を適当につけつつ、IAM も新しく作成して次へ

![スクリーンショット 2023-12-05 19.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/c1d63efa-2544-0750-2c6b-e1534c89ca0f.png)


#### Step 2: Set up data source

同じリージョンの S3 Bucket を選択します。
(手順省略)

![スクリーンショット 2023-12-05 19.30.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/dffaa501-74f6-65eb-4624-940308a04348.png)

#### Step 3: Configure vector store

Embeddings Model として、先述した`Amazon Titan Embeddings G1 - Text v1.2`が出てきました。
別のVector Store を選択して、Pinecone を選択します。
（この時、下の同意ボタンのチェックを入れる必要があります）

Pinecone の Index の HOST の　URL を Connection String に入力。
API Key は Secrets Manager に格納して、そのARN を入力します（手順省略）

Text は番組データが入るので、`program-info`
Metadata はそのまま `metadata`を入力してみます

![スクリーンショット 2023-12-05 19.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/db3e5112-03fc-0ea2-462f-40f9fabcddac.png)

#### Step 4: Review and create

作成します。しばらく待ちます。

指定した、S3 Bucket に Vector 化したいデータを入れます。
今回は2000件ほど入っているhodの番組メタデータをCSVにしたものを特に掃除をすることもなくそのまま入れてみます。

S3にCSVをアップロードできたら、Data source の `Sync` ボタンをクリックします。

![スクリーンショット 2023-12-05 19.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/aa36bee3-687a-6075-cb35-9d00a3aeb579.png)

Syncing がクルクルして、しばらく時間がかかります。
この時 `Amazon Titan Embeddings G1 - Text v1.2` が csvを Vector にして Pinecone に格納してくれているはずです。

Status が Ready になったら完了です

### Pinecone 側で確認

Pinecone 側にちゃんとデータが入っていそうです！

![スクリーンショット 2023-12-05 19.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/e2530246-f9e3-e609-24b7-3103ee8d9e43.png)

### Knowledge base まとめ

これで、準備完了です。
S3データおいて、ぽちぽちするだけで、Vector Store に自社のデータを置くことができちゃいました！
Bedrock すごい。Pinecone すごい。

## Agent for Amazon Bedrock


### Agent の構築

次に、Agent から、今回作成した Knowledge base を使用してみましょう

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/b4fff408-f577-0b5c-1c69-2d92f435c1ba.png)

#### Step 1: Provide Agent detail 

名前を入力して、その他は、そのまま次へ

#### Step 2: Select model

モデルを選択します。
Anthropic の Cloude V2 を尽かします。

![スクリーンショット 2023-12-05 20.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/aa2ee32d-c211-7cfa-3812-752359621fc0.png)

エージェントへの指示を記入します。  
> あなたは動画配信サービス「hod」のAI アシスタントです。
> Knowledge base に入っている番組のメタデータを最大限に活用して、hodのユーザからの番組に関する筆問に答えます。
> ユーザは最終的に番組名を知りたいため、最終的な答えは番組グループタイトルを番組名として答えてください

#### Step 3: Add Action groups

オプションなので飛ばします

#### Step 4: Add Knowledge base

先ほど作成した Knowledge base を選択して、Agentに対しての説明を入力します。
どんな感じで描くと良いのかは、ちゃんとわかっていませんが、データの説明を簡単にしてみました。

> 動画配信サービスhodで配信している番組情報が入っています。出演者や概要説明から、どんな番組なのかを知ることができます

#### Step 5: Review and create

確認して次へ。

### 動作確認

これで、作成すると、テキストチャットが試せるようになります。

![スクリーンショット 2023-12-05 20.18.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/69779aa5-21e9-2ab2-fa7c-1c909253c055.png)

番組内容についても聞いてみます

![スクリーンショット 2023-12-05 20.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517555/f73c454c-9351-ae29-472a-2fb63ac92adb.png)

いい感じ

## まとめ

ということで、Amazon Bedrock の Knowledge base と Agent を使って、RAG を試してみました。
本当に簡単に実装できてびっくりです。

動画配信サービスでの、検索機能はメタデータが大きいので、なかなか最適な状態で提供するのが難しくて悩んでいるのですが、
このような形での提供はありかもしれません。

サービスの昨日として追加するのはまだハードルがありそうでが、試してみるまでのハードルがこんなに低いとはびっくりです
リリースできるように検討してみたいと思います。

以上