Amazon Q for Business で おやき RAG を作成する

みなさんは、丸くて中にアンコが入っているあのお菓子をどう呼びますか?
2024.03.12

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_) です。

みなさん、おやき食べてますか?美味しいですよね。私はあずきのおやきが好きです。今回は、おやきがいつでも自然言語で説明できるように、 Amazon Q for Business で おやき RAG を作りたいと思います。

Amazon Q for Business とは

Amazon Q for Business とは re:Invent 2023 で発表されたフルマネージド型の生成 AI アシスタントです。 Amazon Q for Business を利用することで簡単に RAG のアプリケーションを構築することができます。

2024年3月現在、パブリックプレビュー中です。一般提供前に今回ご紹介する機能の仕様が、変更される可能性がございますのでご注意ください。

Amazon Q for Business の基本的な構成要素

Amazon Q for Business で RAG を作成する際に幾つか構成要素があるため、おさらいします。

アプリケーション

文字通り、 RAG アプリケーションをまとめる一番大きな構成要素になります。アプリケーションの中にデータソースを追加していくイメージです。データソースの設定以外にリトリーバーやウェブエクスペリエンス(チャットの UI 画面)を設定できます。

データソース

データソースでは、 RAG として利用したいデータを定義していきます。 Amazon Q リトリーバーを利用する場合に考える要素です。

代表的なもので言えば S3 バケット、 Web crawler (Webページ)、 Box などがあります。コネクターを使わず直接 Amazon Q にアップロードもできたりします。

その他、サポートされているデータソースコネクタは以下になります。

Supported connectors - Amazon Q

データソースを元にインデックスにデータが登録されていきます。「インデックス内の各ドキュメントは一意であることが望ましい」などベストプラクティスがあったりします。

データソースを検討するときは、以下を一読するといいと思います。

Best practices for data source connector configuration in Amazon Q - Amazon Q

リトリーバー

リトリーバーはインデックスからリアルタイムにデータを取得する役割を担います。

Amazon Q リトリーバーと Kendra リトリーバーの 2 つが存在します。 Amazon Q リトリーバーは Native リトリーバーとも呼ばれたりします。リトリーバーはアプリケーション作成時に選択します。アプリケーション作成後にリトリーバーの変更はできないため注意です。

You can't change the retriever for your application after your application has been created. To change your retriever, you must create a new application.

Creating and selecting a retriever for an Amazon Q application - Amazon Q

Amazon Q リトリーバー

Kendra リトリーバーは既存の Kendra インデックスを紐付ける方式なので、 Amazon Q リトリーバーについておさらいします。

まず、 Amazon Q リトリーバーでは、デフォルトで 10,000 文書のストレージ容量があり、毎秒 0.5 QPS で動きます。

The native retriever includes a default capacity of 10k documents and 0.5 queries per second (QPS).

Creating an Amazon Q application - Amazon Q

デフォルトのストレージ容量に加え、ストレージユニット (Index provisioning) を 1 から 50 の範囲で設定します。 各 1 ユニットあたり、 20,000 文書 または 200 MB の早い方がプロビジョニング目安になります。

For Index provisioning – Choose the Number of units that you need. Amazon Q charges you based on the document capacity that you choose. You can choose up to 50 units. Each unit is 20,000 documents or 200 MB, whichever comes first.

Creating an Amazon Q retriever - Amazon Q

また、月間 100 時間のコネクター同期時間がストレージユニット毎に含まれています。 1 ストレージユニットあたり $0.14/時間($100/月)で課金が発生します。後からでも増減できるので、過剰なプロビジョニングはお気をつけください。

Additional pricing *The Amazon Q index is charged for units of 20K documents at a rate of $0.14/hour ($100/month) to support your business knowledge. You can start with 1 unit and add additional storage units as required. Each storage unit includes 100 hours of connector usage per month.

Note: Some Amazon Q features may have additional pricing after the preview.

Generative AI Powered Assistant - Amazon Q Pricing - AWS

もう一点大事な点があります。アプリケーションでカスタマー管理キーを使う場合は、最低でも 10 ストレージユニットが必要となりますので、設計時はお気をつけください。

If you choose to use a customer managed key, you must provision at least 10 index storage units when you create an Amazon Q retriever.

Creating an Amazon Q application - Amazon Q

やってみる

ざっくり、 Amazon Q for Business についておさらいができた所で、さっそく おやき RAG を作っていきましょう。 2024 年 3 月時点では、バージニアとオレゴンリージョンのみサポートしているため、今回はバージニアリージョンで作成していきます。

IAM ロールの作成

Amazon Q for Business にはいくつか IAM ロールを利用します。今回は以下の IAM ロールを作っていきます。

  • アプリケーション用 IAM ロール
  • データソースコネクター用 IAM ロール

今回は緩めに IAM ポリシーを作っているので、もっと制御したい方は以下をご覧ください。

IAM roles for Amazon Q - Amazon Q

アプリケーション

Amazon Q for Business アプリケーションが利用する IAM ロールを作成していきます。 IAM のコンソールから以下の信頼ポリシーで IAM ロールを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AmazonQApplicationPermission",
            "Effect": "Allow",
            "Principal": {
                "Service": "qbusiness.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

IAM ポリシーは以下をアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AmazonQApplicationPutMetricDataPermission",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": "AWS/QBusiness"
                }
            }
        },
        {
            "Sid": "AmazonQApplicationDescribeLogGroupsPermission",
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AmazonQApplicationCreateLogGroupPermission",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "AmazonQApplicationLogStreamPermission",
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogStreams",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

コネクター

データソースコネクターの IAM ロールを設定します。信頼ポリシーはアプリケーションと同じく qbusiness.amazonaws.com を指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AmazonQApplicationPermission",
            "Effect": "Allow",
            "Principal": {
                "Service": "qbusiness.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

IAM ポリシーは以下を設定します。

{
    "Version": "2012-10-17",
    "Statement": [{
            "Sid": "AllowsAmazonQToIngestDocuments",
            "Effect": "Allow",
            "Action": [
                "qbusiness:BatchPutDocument",
                "qbusiness:BatchDeleteDocument"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowsAmazonQToIngestPrincipalMapping",
            "Effect": "Allow",
            "Action": [
                "qbusiness:PutGroup",
                "qbusiness:CreateUser",
                "qbusiness:DeleteGroup",
                "qbusiness:UpdateUser",
                "qbusiness:ListGroups"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

アプリケーションの作成

それでは、アプリケーションの作成を行います。作成した IAM ロールを 「Choose a method to authorize Amazon Q」で指定します。

これでアプリケーションは作成できました。簡単ですね。

リトリーバーの作成

今回は Amazon Q リトリーバーを選択します。 Index provisioning も 1 で設定します。

データソースの設定

データソース画面を見ると、多くのコネクターが存在していることがわかります。今回は Wikipedia から おやき の情報をクローリングしたい(おやきのアップデートを追っかけたい)ので、 Web crawler を選択します。

Amazon Q for Business は多言語での応答に対応しています。ただし、データソースは英語のドキュメントが推奨されているため、英語の Wikipedia のリンクを貼り付けます。

Amazon Q can respond in multiple languages. However, Amazon Q performs optimally for English language conversations and interactions. Amazon Q only indexes English language documents when you connect a Amazon Q data source or directly upload documents into your application. We recommend indexing only English language content.

Supported languages for Amazon Q - Amazon Q

よくわかりませんが、 Wikipedia では Imagawayaki が僕の知っている おやき に該当するので、このページを RAG のデータソースとして登録します。

今回は設定しませんが、 Web ページへの認証設定やプロキシ挟めるなど、クローンで必要になりそうなケースに対応していて、便利そうでした。

続いて VPC 設定と IAM 設定です。 VPC 設定は特にいじらず、 IAM ロールは先ほど作成した IAM ロールを設定します。

Snyc Scope では、 長野県の Oyaki と間違わないように、ひとまず Sync domains only を選んでいきます。

続いて、 Sync mode と Sync run schedule です。

Sync mode では、データソースのコンテンツが変更されたときに、インデックスを更新する方式を選択します。データソースを初めて同期する場合、デフォルトでは全てのコンテンツが同期されるのですが、後続の同期については、 Snyc mode で定義されたモードによって同期する範囲が変わってきます。今回は、 Full sync (全てのコンテンツを同期) を選択します。 Sync run schedule はその名の通り、同期処理の間隔です。今回は Run on demand を選択します。

データの同期

それでは、データソースの登録が済んだので Sync now からデータの同期を行います。

Wikipediaで 1 時間弱でしょうか、データ登録およびインデックス化が完了しました。

いくつか、インデックス化に失敗しているのがあったため、 CloudWatch Logs をみてみましょう。エラーコードを確認すると、対応していない文字列が含まれていたようです。

プレビューの設定

それでは、プレビュー画面の設定を行います。

Title, Subtitle, Welcome message を任意の画面に指定してみましょう。

プロンプトを投げてみる

おやきって何ですか?

シンプルに日本語で 「おやきって何ですか?」 と聞いてみましたが、残念ながらソースが英語だからなのか、回答が返ってこなかったです。(ソースを日本語で試すとどうなるのかは、また別のブログで試せればと思います。) 続いて、 英語で 「What is Oyaki?」と聞くと、無事回答が返ってきていますね。リンク付きでソースを回答してくれてありがたいです。

今川焼きって何ですか?

先ほど、 Imagawayaki のデータをインデックス化したので、 Imakagawayaki についても聞いてみました。同じ様な形式で回答が返ってきていますが、 Imagawayaki だと、 Oyaki RAG では無いので、ガードレールを使ってみましょう。

ガードレール

ガードレールではチャット内の特定のトピックにどのように応答するかを制御することができます。

Amazon Q の管理者コントロールとガードレール - Amazon Q

今回はブロックされたフレーズを使って、 Imagawayaki へのプロンプトを制御してみようと思います。

実際には以下の様に制御してみました。日本語、 ?(クエスチョンマーク)、改行など登録できないものがあるので注意です。

今回取り上げなかったですが、 「Only produce responses from retrieval augmented generation (RAG)」 と記載のある通り、デフォルトではインデックス化したデータのみで回答される様です。

もう一回プロンプト投げてみる

Imagawayaki について聞いてみると、確かにガードレールが働いて、 Oyaki で再検索するよう促されましたね。 ソースはインデックスしたデータの関係で Imagawayaki のままですが、データの整形してあげればクリアできそうですね。

まとめ

以上、簡単ではありますが 「Amazon Q for Business で おやき RAG を作成する」 でした。 ガードレールに設定可能なブロックされたフレーズは、現在 20 個までなのでギリギリ足りそうな気がしますが、 トピックレベルのコントロール も合わせてコントロールしてあげると良さそうな気がしました。

このブログがどなたかの参考になれば幸いです。AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!

参考

以下のハンズオンのおかげで 待望の おやき RAG を作ることができました...! スペシャルサンクスです...!

「地方エンジニアのためのAWSハンズオン〜生成系AIを使った開発力強化のポイント〜」のイベントページを公開しました - 株式会社ヘプタゴン