Amazon Bedrock ナレッジベースの使い方（API編）

# ナレッジベースとは
Amazon Bedrock のナレッジベースについてはこちらにまとめているので、良かったら見てください。

https://qiita.com/devKita/items/fecf03eb9f812ff77ffa

# 今回やること
前回はコンソールからナレッジベースを作成してテストまでやりましたので、今回はAPI利用して実行してみようと思います。

https://qiita.com/devKita/items/82ef91977b86d85f1ac0

最近気になっていた Chatbot UI からAPIを実行してみます。

:::note info
Chatbot UI とは？
https://github.com/mckaywrigley/chatbot-ui

ChatGPTライクなユーザインタフェースのオープンソース生成AIチャットアプリです。
・ ローカルやクラウドにデプロイして利用可
・ MITライセンスなので改変可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/3dc4d442-ef9c-101c-5cd5-a434abc5f0b3.png)

:::

以下リンク先の記事でChatbot UI の魅力とローカル環境構築方法を分かりやすくまとめていますので、良かったら見てみてください。

https://qiita.com/devKita/items/97709980d331c231ea80

### 前提
Chatbot UIをローカル環境に構築済とし、
ローカルChatbot UI から直接 AWS Bedrock APIを実行する構成で検証します。
※ Chatbot UI のローカル環境構築方法については別記事で書こうと思います

### ステップ０．SDK準備
AWS Bedrock ナレッジベースを利用するために、
@aws-sdk/client-bedrock-agent-runtime を導入します。
package.jsonに定義しChatbot UIのルートディレクトリでnpm install。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/5880e3e6-1515-7011-1f7e-2d2b61ac5b40.png)

### ステップ１．モデルの追加
Chatbot UI には様々な生成AI基盤モデルを利用するための機能がデフォルトで備わっています。Bedrockはデフォルトでは利用できませんが、ちょこっとカスタマイズするだけで利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/322d00c0-6167-f39a-51f0-fc9f6e8bd611.png)


Name欄に適当な基盤モデル名を入れておけばひとまず大丈夫です。

### ステップ２．実装
追加したモデルから呼び出されるバックエンドは「\app\api\chat\custom\route.ts」です。これをBedrockナレッジベースAPIを呼び出すように変更していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/376e7cde-1c1e-dc51-a108-a6e41279d006.png)

ステップ０で準備したSDKをインポート。
```typescript:custom\route.ts
import {
  BedrockAgentRuntimeClient,
  RetrieveAndGenerateCommand,
  RetrieveAndGenerateType,
} from '@aws-sdk/client-bedrock-agent-runtime'
```

AWS BedrockナレッジベースAPIを呼び出し、レスポンスをフロントに返却。少ないコードで実装できるのは本当にありがたいですよね。。
```typescript:custom\route.ts
try {
  // 利用するナレッジベースの設定
  const ragConfig = {
    type: RetrieveAndGenerateType.KNOWLEDGE_BASE,
    knowledgeBaseConfiguration: {
      knowledgeBaseId: 'XXXXX', // 作成したナレッジベースのIDを指定
      modelArn: 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1',   // ユーザクエリ＋ナレッジベース取得結果に基づいて応答を生成するために利用する基盤モデルを指定
    },
  }
  
  // APIパラメータ設定
  const command = new RetrieveAndGenerateCommand({
    input: {'text': message},  // messageは文字列
    retrieveAndGenerateConfiguration: ragConfig
  });

  // API呼び出すためのクライアント設定
  const bedrockClient = new BedrockAgentRuntimeClient({
    region: "us-east-1",
    credentials: {
      accessKeyId: "XXXXX",     // 簡易的に実装
      secretAccessKey: "XXXXXX" // 簡易的に実装
    }
  })

  // API呼び出しとレスポンス返却
  const bedrockResponse = await bedrockClient.send(command)
  return new NextResponse(bedrockResponse.output.text)

} catch (error: any) {
  console.error("Error parsing Bedrock API response:", error)
}
```

:::note info
AWS Bedrock ナレッジベースのAPIについて

APIリファレンス
https://docs.aws.amazon.com/ja_jp/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html

AWS SDK for JavaScript v3リファレンス
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/bedrock-agent-runtime/command/RetrieveAndGenerateCommand/
:::

### ステップ３．実行

ステップ１で作成したモデルに切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/303d3896-cc9e-764e-19f2-8b4d6e414e89.png)

プロンプトに質問を投げます。
※ナレッジベースのデータソースには、オリエンタルランドの2023年3月有価証券報告書PDFを入れてあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/847593d6-f2c1-aa15-b373-1439a29ced35.png)

もう１つ投げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/1e6b72b5-b995-33ff-c32a-2000c724d1d7.png)

売上高、経常利益は正しくとれていますね。
当期純利益は残念ながら取得できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3567948/104abc8f-86c7-c087-2779-1e86f9863626.png)

# 最後に
Chatbot UIとAmazon Bedrockのナレッジベースを組み合わせることで簡単に爆速でRAGアプリが作れました。AWSのマネージドサービスの素晴らしさをあらためて実感しました。
次はエージェントを触ってみようと思います。

※間違いなどあれば、ご指摘いただけると助かります。