BedrockとPineconeで安くRAGを作ろう！ついでに参照リンクも表示

# AWSで「ほぼ無料」のRAGアプリを運用しよう！

生成AIアプリを作る際にみんながやるRAG（検索により強化された生成）ですが、ベクトルDBのランニングコストが高くなりがちです。

AWSならOpenSearch ServerlessやKendra、AzureならAI Searchなど、いずれも月数万円以上の維持費となるため個人検証にはちょっと辛いです。

そこで今回は、ベクトルDB専用のSaaSであるPineconeを使って、AWSで安くRAGを構築する手順を紹介します！

![スクリーンショット 2024-11-10 0.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/5e42f180-ec61-a1bf-97e9-989ebe7cfe54.png)

これならベクトルDBのランニングコストが無料となります。
（RAGの推論や埋め込みに利用するモデルの呼び出し料金のみが発生します）


# Pineconeのメリデメ

PineconeはサーバーレスなSaaS製品のため、特に利用頻度が低い場合はかなり安くRAGのデータベースを維持することができます。

AWSのBedrockでRAGを簡単に作れる機能「ナレッジベース」でもサポートされているので、入門に使いやすいのも魅力です。

https://aws.amazon.com/jp/blogs/news/leveraging-pinecone-on-aws-marketplace-as-a-knowledge-base-for-amazon-bedrock/

一方で、ナレッジベースの高度な機能（ハイブリッド検索やチャンク戦略のチューニングなど）はOpenSearch ServerlessをベクトルDBに利用していないと使えないものもあるので、注意してください。

また、PineconeはAWS外のSaaSのため、業務で利用する際はセキュリティルールなどに注意してください。（SaaSではあるものの、AWS上に構築されたPineconeインフラを指定して利用することもできます）


# 構築手順

### 1. Pineconeインデックスの作成（無料プラン）

PineconeはAWSマーケットプレイスからも購入できますが、請求をAWS利用料とまとめられる反面、無料プラン（Starter Plan）が利用できない制約があります。

そこで、今回は公式サイトから普通にアカウントを作って、インデックス（ベクトルDB）を作成しましょう。

https://www.pinecone.io/

なお、Dimensions（埋め込みの次元数）は以下の値を入力しましょう。

- Amazon Titan Text Embeddings v2を使う場合：1024（512 / 256も選択可能）
- Cohere Multimodal Embeddings v3を使う場合：1024

画面下部の帯に、Starter Plan（無料プラン）と表示されていることを確認のうえ作成ください。

![スクリーンショット 2024-11-09 22.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/2cde516d-b7ab-5445-2414-854e8bd99d15.png)

:::note info
ここでいう「Cloud provider」は、Pineconeのリソースがどのクラウド上で作成されるかを表しています。（他のクラウドから、このインデックスを利用できないわけではありません）
:::

作成完了後、表示されるホスト名（HOST）は後でナレッジベースの作成時に使います。

![スクリーンショット 2024-11-09 22.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ba25bef9-74c7-666a-00ec-532bf3e23f2c.png)



### 2. シークレットマネージャーの設定

Pineconeの画面を離れる前に、APIキーの文字列をコピーしておいてください。

![スクリーンショット 2024-11-09 22.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/03f53da5-44bc-3cb7-3177-9bd2180c1f28.png)

AWSアカウントにサインインし、Secrets Managerを検索してコンソールにアクセスします。
以下のとおりシークレットを作成しましょう。

- シークレットのタイプ：その他のシークレットのタイプ
- キー/値
    - キー：`apiKey`
    - 値：（PineconeのAPI keysページからコピー）
    - シークレットの名前：`Pinecone`

![スクリーンショット 2024-11-09 22.48.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/afa994ac-5df8-14dc-5b15-b536d4dd75eb.png)

:::note info
キー名は上記のとおり `apiKey` である必要があります。公式ドキュメントは以下を参照。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-setup.html
:::

作成完了後、画面を更新するとシークレットが確認できます。ARNはこの後、ナレッジベース作成時に利用します。

![スクリーンショット 2024-11-09 22.57.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/36844918-13f8-1223-98bd-f98d6e210ea7.png)


### 3. S3バケットの作成

S3バケットを新規作成し、RAGの検索対象に利用したいドキュメントを配置しましょう。

ナレッジベースに取り込み可能なファイル形式は `.pdf`、`.xlsx`、`.docx` などです。詳細は以下。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-ds.html

今回の例では、以下のページをPDFへ出力したものを利用します。

https://prtimes.jp/main/html/rd/p/000000010.000115171.html


### 4. Bedrock 基盤モデルの有効化

Amazon Bedrockコンソールの「モデルアクセス」より、以下の2モデルを有効化しましょう。

- Amazon > Titan Text Embeddings v2
- Anthropic > Claude 3.5 Sonnet　※v2じゃない方

なお、2024/11/10現在、新規作成したばかりのAWSアカウントを中心に、モデルの有効化ができない現象が多数報告されています。該当した場合はリージョンを変えるか、無料のサポートリクエストを上げて数日待ちましょう。

https://qiita.com/minorun365/items/c1706f91ce6490697451


### 5. Bedrock ナレッジベースの作成

Amazon Bedrockの「ナレッジベース」を新規作成します。
以下設定で、ほかはデフォルトのままでOKです。

- ステップ1：すべてデフォルトでOK
- ステップ2
    - S3のURI：前述の手順でドキュメントを配置したS3バケットを指定する
- ステップ3
    - 埋め込みモデル：Titan Text Embeddings v2
    - ベクトルデータベース
        - 作成したベクトルストアを選択 > Pinecone
        - 同意にチェックを入れる
        - エンドポイントURL：PineconeのIndexesページからコピペする
        - 認証情報シークレットARN：先ほど作成したSecrets ManagerのARNをコピペする
        - メタデータフィールドマッピング
            - テキストフィールド名：`text`
            - Bedrockマネージドメタデータフィールド名：`metadata`

![スクリーンショット 2024-11-09 23.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fc8a61b9-5ec8-1c0c-f286-6bf8c21def72.png)


# 使ってみよう！

ナレッジベースが作成できたら、マネジメントコンソールからデータソースの「同期」を実行すれば準備完了です。

![スクリーンショット 2024-11-09 23.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/19e4877c-e695-d1b3-3f17-94a1512c1f25.png)

GUIからもすぐにテストできますし、APIからも呼び出すことができます。以下はPythonアプリの例です。

```py: kb-pinecone.py
import boto3

# クライアントを初期化
bedrock_agent = boto3.client(
    service_name='bedrock-agent-runtime',
    region_name='us-east-1'
)

# レスポンスを取得
response = bedrock_agent.retrieve_and_generate(
    input={'text': "かぐたんって何？"},
    retrieveAndGenerateConfiguration={
        'knowledgeBaseConfiguration': {
            'knowledgeBaseId': "XXXXXXXXXX", # ナレッジベースIDを入れる
            'modelArn': "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0"
        },
        'type': 'KNOWLEDGE_BASE'
    }
)

# 生成結果を表示
print(response['output']['text'])

# 参照したドキュメントのURIを表示
print(response['citations'][0]['retrievedReferences'][0]['location']['s3Location']['uri'])
```

上記のコードでは、RAGで回答生成時に参照されたドキュメントの場所（ここではS3のURI）を表示しています。

生成結果の出力例：

```zsh
かぐたんは、KDDIアジャイル開発センター株式会社（KAG）が開発した生成AIチャットボットです。このボットはSlackから利用でき、AWSの生成AIサービス「Amazon Bedrock」を活用しています。KAGという社名愛称をもとに、親しみやすさを意図してネーミングされました。

かぐたんの主な特徴は以下の通りです：

1. Slackから直接利用可能で、通常のコミュニケーションツールの延長線上で生成AIを活用できます。

2. 一般的な知識に関する質問や、文書作成、アイデア出しなどの業務効率化に役立ちます。

3. Slackのスレッド機能を活用し、会話履歴を記憶しながら効率的に追加質問を続けることができます。

4. KDDI Digital Divergence Holdings（KDH）傘下の各社に展開され、セキュアな環境で生成AIの業務活用を推進しています。
```

参照元URIの出力例：

```
s3://<バケット名>/プレスリリース.pdf
```

このように、ナレッジベースのAPIでは引用元の情報を取得できるため、RAGアプリにソースドキュメントへのリンクを付与するような実装もしやすいです。


# 次のステップ

GUIを含めて、もっと本格的なアプリを作りたくなったら、以下の記事を参照してください！

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56

また、書籍も出していますのでよければ基礎習得やハンズオンにご活用ください。

https://www.sbcr.jp/product/4815626440/