Amazon Bedrock と Amazon Kendra を組み合わせたRAGチャットのサンプルを試してみた

こちらは、[デジタルキューブ ＆ ヘプタゴン Advent Calendar 2023](https://qiita.com/advent-calendar/2023/digitalcube-heptagon) 12/23分の記事です。


# はじめに

最近何かと話題の生成系AIですが、AWSで生成系AIを構築するためのサービス Amazon Bedrock を試してみたいと考えました。

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

数種類の基盤モデルをサーバーレスで試すことができ、検索拡張生成　(RAG : Retrieval-Augmented Generation) などの技術を用いて、独自のデータを活用してカスタマイズできることも魅力の一つです。

2023年9月に Amazon Bedrock がGAになり、その翌月には AWS AI Week For Developers というライブセッションも実施されました。

その中で紹介されていた、生成系AIを活用したビジネスユースケースをデモンストレーションできるサンプルコードを拝借し、どのようなことができるのかを確認してみました ... というお話です。

https://github.com/aws-samples/generative-ai-use-cases-jp

# デプロイ

手順に沿ってCDKによるデプロイをするだけで、全ユースケースのデモが行えるwebアプリが出来上がります。

![FireShot Capture 241 - GenAI Use Cases - d3igz7x3s6ywk7.cloudfront.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/dc994409-fc6f-1483-5ed7-5156cc79e996.png)

:::note warn
デプロイする先のAWSアカウントの Bedrock の「Model access」ページで、あらかじめ Anthropic の Claude を使用できるようにしておく必要があります。

![FireShot Capture 242 - Amazon Bedrock - us-east-1 - us-east-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/952c32e2-84af-e1c1-a229-0c4e10026b4c.png)

（画像生成も試したい場合は、その下の Stability AIも有効にしておく必要があります）
:::

# ユースケース

確認できるユースケースの一覧は以下の通り。

- チャット
- RAG チャット（デフォルトだと出てきません。後述する Kendora を使う設定が必要）
- 文章生成
- 要約
- 校正
- 翻訳
- Web コンテンツ抽出
- 画像生成

## チャット

結構なトンデモ回答が飛んでくることもあります。

![LLMチャット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/ed6c47df-7a93-c179-9399-b528a28ed26c.png)

## 文章生成

![文章生成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/1cb96d0f-f29a-3c1e-064d-2ab9aa92f1c0.png)

## 要約

![要約.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/77dfcf74-0c10-367c-8b3f-8114d0889ada.png)

## 校正

文章の誤字脱字や、文章を理解し改善点を指摘してくれます。

そして結構辛辣

![校正.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/f75aa4d6-6ca3-a755-3b4f-76e3a9ada063.png)

## 翻訳

Amazon Translate もあるし、個人的にはあまり使う機会がなさそう。

![翻訳.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/3c7520fa-72e5-ea71-8e52-75cdb65370de.png)

## Web コンテンツ抽出

（これだけよくわかっていない）

## 画像生成

かわいい

![画像生成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/7ae27e43-cb9c-f1cf-338b-4d48715c5a2e.png)



# RAG を試したい

LLMはあくまでも「与えられたテキストの次に来る単語の確率を算出する」だけなので、文章としては自然なのに、適切でない・正確ではない内容が出力されることがあります。

LLMにリクエストを送る前に、関連ドキュメントをまとめたデータベースから必要そうな情報を取得し、それらをまとめてLLMに送ることで、自社データの内容やドメインに特化した回答を生成することができるしくみをRAG（Retrieval-Augmented Generation）と言います。

AWS ではドキュメント検索サービスとして Amazon Kendra があり、今回使用しているサンプルでもすぐ使用できるようになります。

https://aws.amazon.com/jp/kendra/

デプロイ方法は readme に載ってます。
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/docs/DEPLOY_OPTION.md#%E6%97%A2%E5%AD%98%E3%81%AE-amazon-kendra-index-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88

## 前後の比較

試しに、Bedrockで使用できる基盤モデルの開発元・提供元について質問を投げてみました。

![normal_chat_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/413801da-8eac-279d-4bf0-fa6a78f7469e.png)

...期待している回答にはなっていませんね^^;

そして、Kendraを使用するように設定しなおしてデプロイしなおすと、RAGチャットが使えるようになり、そちらにも同じ質問を投げてみました。

![rag_chat_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116677/d03e27ac-e8bd-2a2d-a867-a145ae9c7539.png)

期待する結果が返ってきましたし、下に回答の元になったドキュメントも提示してくれています。

ソースコードを見ると、AWSの生成系AIのページやBedrockのページをデータソースとして持っていることがわかります。

```typescript
      new kendra.CfnDataSource(this, 'WebCrawler', {
        indexId: kendraIndexId,
        name: 'WebCrawler',
        type: 'WEBCRAWLER',
        roleArn: webCrawlerRole.roleArn,
        languageCode: 'ja',
        dataSourceConfiguration: {
          webCrawlerConfiguration: {
            urls: {
              seedUrlConfiguration: {
                webCrawlerMode: 'HOST_ONLY',
                // デモ用に AWS の GenAI 関連のページを取り込む
                seedUrls: [
                  'https://aws.amazon.com/jp/what-is/generative-ai/',
                  'https://aws.amazon.com/jp/generative-ai/',
                  'https://aws.amazon.com/jp/generative-ai/use-cases/',
                  'https://aws.amazon.com/jp/bedrock/',
                  'https://aws.amazon.com/jp/bedrock/features/',
                  'https://aws.amazon.com/jp/bedrock/testimonials/',
                ],
              },
            },
            crawlDepth: 1,
            urlInclusionPatterns: ['https://aws.amazon.com/jp/.*'],
          },
        },
      });
    }
```

今回はWebクローラによるものだけでしたが、Kendra はいろいろな場所にある情報をデータソースとして持てるようです。S3 や RDS の他にも、SlackやGithub、BoxやDropboxなど幅広いです。

https://docs.aws.amazon.com/kendra/latest/dg/hiw-data-source.html

どのように連携して活用させていけるのかが非常に気になるので、引き続き追っていこうと思います。