[やってみた]Amazon Qで作成したアプリケーションをAPIで呼び出してみた #AWSreInvent

2023.12.06

はじめに

2023/11/27~12/1 (米国太平洋標準時)に開催された、AWS re:Invent 2023。 2023/11/29のkeynoteでAmazon Q(プレビュー)が発表されました。

Amazon Qとは、生成人工知能 (AI) を活用した会話型アシスタントです。 Amazon QはAIを活用して、AWSの様々なサービスにおけるユーザーや開発者体験を向上させます。 具体的には、以下のような機能が公開されています。

  • Amazon Q in the console
  • Amazon Q in IDEs
  • Amazon Q and other services
    • Amazon Q (For Business Use)
    • Amazon Q in AWS Chatbot
    • Amazon Q in Amazon CodeCatalyst
    • Amazon Q in Amazon Connect
    • Amazon Q in Amazon QuickSight
    • Amazon Q in Reachability Analyzer

本記事では「Amazon Q (For Business Use)」のAPI利用に焦点を当てた、やってみたブログです。

3行まとめ

  • 「Amazon Q (For Business Use)」とはフルマネージド型の生成 AI を活用したエンタープライズチャットアシスタントです
  • 「Amazon Q (For Business Use)」にはAWS SDK for JavaScript v3などが用意されており、API利用が可能です
  • APIを利用することで、独自開発のアプリケーションにAmazon Qの機能を組み込むことができます

やってみた

以下はAmazon Q (For Business Use)のユーザーガイドとAWS SDK for JavaScript v3のリファレンスです。

ユーザー追加

AWSマネジメントコンソールで、us-east-1リージョンのAmazon Qのサービス画面を開きます。

画面左袖の[User provisioning]を押下し、[Edit]ボタンを押下します。

[Add user]ボタンを押下し、以下の情報を入力後、[Add user]ボタンを押下し、ユーザーを追加します。 Emailが後述のUserIDになるので、メモしておきます。

  • Name
  • Email

[Save]ボタンを押下し、ユーザーの設定を保存します。

Applicationの作成

画面左袖の[Applications]を押下し、[Create application]ボタンを押下します。

Step1の[Create application]では、アプリケーション名やAmazonQが利用するサービスロールなどを設定します。 今回は全てデフォルトのまま、[Create]ボタンを押下して30秒程度待ちます。Createされると、自動でStep2に進みます。

Step2の[Select retriever]では、レトリーバー(リアルタイムでデータを取得できるインデックス)の設定を行います。 既存のKendraを指定することも可能です。 今回はデフォルトのまま、[Use native retriever]を選択します。 なお、[Index provisioning]は検証用のため1にしておきます。 他はデフォルトのまま、[Next]ボタンを押下します。

Step3の[Connect data sources]では、Amazon S3やWeb crawler, Upload docsなどから、様々なデータソースから5つまでを設定できます。 今回は特に設定せず、画面下部の[Finish]ボタンを押下します。

作成したアプリケーションを開き、[Application settings]の欄内の[Application ID]をメモしておきます。

Applicationの設定変更

作成したアプリケーションを選択し、画面左袖の[Admin controls and guardrails]をクリック後、[Global controls]の[Edit]ボタンを押下します。

[Only produce responses from retrieval augmented generation (RAG)]のチェックを外して、[Save]ボタンを押下します。 これにより、Amazon Qからの一般的な回答と独自のドキュメントに関する内容の両方を回答してもらえるようになります。

IAMユーザーの作成

以下のインラインポリシーを持つIAMユーザーを作成します。 ポリシー内容は必要に応じて見直してください。

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Sid": "VisualEditor0",
   "Effect": "Allow",
   "Action": [
    "qbusiness:*"
   ],
   "Resource": "*"
  }
 ]
}

その後、IAMユーザーのアクセスキーを払い出し、AccessKeyIdとSecretAccessKeyをメモしておきます。

APIの利用

プログラム実行用のフォルダを作成します。 その後、必要なライブラリをインストールします。 たとえば、pnpmを利用する場合は以下のようになります。

pnpm install @aws-sdk/client-qbusiness

先にメモした内容を元に環境変数を設定します。

export Q_AWS_REGION=us-east-1
export Q_YOUR_AWS_ACCESS_KEY_ID={アクセスキー}
export Q_YOUR_AWS_SECRET_ACCESS_KEY={シークレットアクセスキー}
export Q_APPLICATION_ID={アプリケーションID}
export Q_USER_ID={メールアドレス}

以下のTypeScriptファイルmain.tsを用意します。 userMessageにて「スケーラブルなWebアプリケーションのバックエンドにおいて、AWS LambdaとAmazon EC2のどちらを選ぶべきですか?」という質問をセットしています。

import {
  ChatSyncCommand,
  ChatSyncCommandInput,
  QBusinessClient
} from '@aws-sdk/client-qbusiness';

export const createAmazonQClient = () => {
  const client = new QBusinessClient({
    region: process.env.Q_AWS_REGION || 'us-east-1',
    credentials: {
      accessKeyId: process.env.Q_YOUR_AWS_ACCESS_KEY_ID || '',
      secretAccessKey: process.env.Q_YOUR_AWS_SECRET_ACCESS_KEY || ''
    }
  });
  return client;
};

export async function chatSyncCommand(
  client: QBusinessClient,
  input: ChatSyncCommandInput
) {
  const command = new ChatSyncCommand(input);
  const response = await client.send(command);
  console.log('response: ', response);
  return response;
}

const client = createAmazonQClient();
const input = {
  applicationId: process.env.Q_APPLICATION_ID,
  userId: process.env.Q_USER_ID,
  userMessage: 'スケーラブルなWebアプリケーションのバックエンドにおいて、AWS LambdaとAmazon EC2のどちらを選ぶべきですか?' // 質問内容を入力
};
chatSyncCommand(client, input);

esbuild-registerを利用してスクリプトを実行します。

node -r esbuild-register main.ts

以下のようなレスポンスが得られます。 systemMessageにて、Amazon Qが持つAWSの情報を基に日本語で回答してくれました。

{
  '$metadata': {
    httpStatusCode: 200,
    requestId: 'xxxxx',
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  conversationId: 'xxxxx',
  failedAttachments: [],
  sourceAttributions: [],
  systemMessage: 'スケーラブルなWebアプリケーションのバックエンドにおいて、AWS LambdaとAmazon EC2のどちらを選ぶべきですか?\n' +
    ' AWS LambdaとAmazon EC2のどちらを選ぶかは、アプリケーションの要件によって異なります。\n' +
    ' - AWS Lambdaはサーバーレスコンピューティングで、アプリケーションコードは実行時にのみ起動し、実行が完了すると自動的に停止されます。これに対しEC2インスタンスは常時起動した仮想サーバーです。\n' +
    ' - Lambdaはリクエストドリブンでスケーラブルですが、長時間実行するタスクには向いていません。EC2は任意の時間実行可能です。\n' +
    ' - Lambdaの料金はリクエストと実行時間に基づき計算されますが、EC2は実際のインスタンス利用時間に基づき料金が発生します。\n' +
    ' - 高頻度な短時間のリクエストに適した場合はLambda、長時間実行や継続実行が必要な場合はEC2を選択することをおすすめします。\n' +
    ' 要件に合わせ、両者の長短を比較考慮することで、最適なソリューションを選定できると思います。',
  systemMessageId: 'xxxxx',
  userMessageId: 'xxxxx'
}

WebアプリケーションでのAPI利用

APIを利用して、クラスメソッドで開発している生成AIのWebアプリにAmazon Qを組み込んでみました。 下図のように、Amazon Qの回答を表示するようにしました。いい感じですね。

今後の展望

過去のやりとりを考慮した回答

レスポンスに入ってくる、conversationIdを利用して、過去のやりとりを考慮した回答を行うことができるように見受けられました。 こちらを考慮した実装を今後試したいと思います。

データソースの情報を用いた回答

Web crawlerなどのデータソースを設定すると、日本語ではなく英語で回答される事象を確認しました。 ここらへんは今後の改善に期待したいと思います。

さいごに

AmazonQを使うと、ビジネスの生産性を向上させるようなカスタム生成AIアプリケーションの開発を簡単に行うことができます。 今回、データソースの追加はしませんでしたが、AmazonQが持つ、AWSに関する知識にアクセスできるだけでも魅力的です。 今後、AmazonQを利用したアプリケーションの開発を更に進めていきたいと思います。 それではまた!