AI / MLAmazon BedrockAWSLLM

Agents for Amazon Bedrockで、作成済みのKnowledge baseを元にしたエージェントを作成してみた

この記事は、2023年のAWS re:inventでのAmazon Bedrockのアップデートについての内容です。Bedrockを使用してKnowledge baseを作成し、作成したKnowledge baseやモデルを使用してAgentを作成する方法について詳しく説明されています。Agentの作成手順やテスト方法、さらにAWS SDKを使用してAgentを実行する方法についても示されています。記事では、Bedrock Agentsの機能や利点についても触れており、今後のワークフローの改善に期待が寄せられています。

広告ここから
広告ここまで

この記事は、「Amazon Bedrock Advent Calendar 2023」5日目の記事です。

2023年のAWS re:inventでは、Amazon Bedrockに関するアップデートが複数登場しました。昨日はBedrockを利用してKnowledge baseを作成する機能に挑戦してみました。今日は作成したKnowledge baseやモデルを利用してAgentを作る機能を試してみます。

Amazon Bedrock管理画面から、Agentsを作成する

Bedrock管理画面にアクセスすると、OrchestrationメニューにAgentsが増えています。新しくAgentsを作成するには、Create Agentsをクリックしましょう。

作成のためのウィザードが立ち上がります、1つ目のステップでは、ユーザーからの入力を受け付けるかなどの設定を行います。

また、IAMとかKMSまわりのお馴染みの設定系も、このステップで行います。

2番目のStepでは、Agentが利用する言語モデルを選べます。が、今の所AnthropicのClaude V2のみが利用できる様子で、AmazonのTitan Expressが今後サポートされる予定の様子です。

モデルを選択する際には、前提条件を伝えるテキストを1200文字(おそらく英語換算)まで入れることができます。今回は「あなたはAPI設計のエキスパートです。APIに関する質問にのみ回答してください。回答はMarkdown形式で行います。」と登録してみました。

Step3では、処理の中で呼び出すLambdaを登録できます。この辺りからOptionalな選択が増えてきました。Agentが処理を行う中で、必要に応じてAWS Lambdaを実行する仕組みがある様子で、LangChainの持つAgentのAWS版という印象を受けました。

次のステップでKnowledge baseを選べます。今回は前の記事で作成したものを指定します。

最後に確認画面が表示され、作成を行います。作成に成功すると、Agentの詳細画面に移動します。

作成したAgentをブラウザ上でテストする

右側のウィジェットでテストができます。ただしStream形式でレスポンスを返すわけではないため、返答が出てくるまで少し時間がかかります。あと、英語で返事が返ってきました。

Agentにエイリアスを設定してデプロイする

エイリアスが作れます。デフォルトはWorking draftですので、v1とかliveとかつけるとよさそうかなと思います。

AWS SDK (Node.js v3)からAgentを利用しようとしてみた

実際に組み込むことを想定して、AWS SDKからも呼び出してみました。まずはAWS SDKをインストールします。

npm i @aws-sdk/client-bedrock-agent-runtime

その後、BedrockAgentRuntimeClientInvokeAgentCommandを利用することでエージェントを実行できる様子です。

import { BedrockAgentRuntimeClient, InvokeAgentCommand  } from '@aws-sdk/client-bedrock-agent-runtime'

const app = new Hono()
app.get('/invoke', async c => {
    const client = new BedrockAgentRuntimeClient()
    const sessionId = Math.random().toString(36).substring(2, 15)
    const command = new InvokeAgentCommand({
        agentId: 'xxxx',
        agentAliasId: 'xxxx',
        sessionId: sessionId,
        inputText: 'Stripeで請求書を作る方法を教えて'
    })
    const response = await client.send(command)
    return c.json(response)
})

実行結果がこんな感じです。テキストが返ってきていないですが、Streamのためでしょうか。一応動いてはいるように見えます。

{
  "$metadata": {
    "httpStatusCode": 200,
    "requestId": "1767da0b-5896-4c5c-9637-3a83ecf0d61a",
    "attempts": 1,
    "totalRetryDelay": 0
  },
  "contentType": "application/json",
  "sessionId": "1zq6hn578xo",
  "completion": {
    "options": {
      "messageStream": {
        "options": {
          "inputStream": {},
          "decoder": {
            "headerMarshaller": {},
            "messageBuffer": [],
            "isEndOfStream": false
          }
        }
      }
    }
  }
}

RetrieveCommandの方も試してみました。

import { BedrockAgentRuntimeClient, RetrieveCommand  } from '@aws-sdk/client-bedrock-agent-runtime'

const app = new Hono()
app.get('/invoke', async c => {
    const client = new BedrockAgentRuntimeClient()
    const sessionId = Math.random().toString(36).substring(2, 15)
    const command = new RetrieveCommand({ // RetrieveRequest
        knowledgeBaseId: "xxxx", // required
        retrievalQuery: { // KnowledgeBaseQuery
          text: "Stripeで請求書を作る方法を教えて", // required
        },
        retrievalConfiguration: { // KnowledgeBaseRetrievalConfiguration
          vectorSearchConfiguration: { // KnowledgeBaseVectorSearchConfiguration
            numberOfResults: Number(5), // required
          },
        },
    })
    const response = await client.send(command)
    return c.json(response)
})

こちらの場合は、回答に利用できるKnowledge base上のデータを配列で返してくれている様子です。

{
  "$metadata": {
    "httpStatusCode": 200,
    "requestId": "9259e8e0-711b-49cb-98f9-f11d73025cac",
    "attempts": 1,
    "totalRetryDelay": 0
  },
  "retrievalResults": [
    {
      "content": {
        "text": "Depending on                     the purchase, they can pay with four interest-free payments                     (Split Pay) or pay over a longer term (Installments), which                     might include interest. Check this                     [page](https://stripe.com/docs/payments/affirm) for more                     details like country availability.                   properties:                     display_preference:                       properties:                         preference:                           enum:                             - none                             - 'off'                             - 'on'                           type: string                       title: display_preference_param                       type: object                   title: payment_method_param                   type: object                 afterpay_clearpay:                   description: >-                     Afterpay gives your customers a way to pay for purchases in                     installments, check this                     [page](https://stripe.com/docs/payments/afterpay-clearpay)                     for more details like country availability. Afterpay is                     particularly popular among businesses selling fashion,                     beauty, and sports products.                   properties:                     display_preference:                       properties:                         preference:                           enum:                             - none                             - 'off'                             - 'on'                           type: string                       title: display_preference_param                       type: object                   title: payment_method_param                   type: object                 alipay:                   description: >-                     Alipay is a digital wallet in China that has more than a                     billion active users worldwide. Alipay users can pay on the                     web or on a mobile device using login credentials or their                     Alipay app."
      },
      "location": {
        "s3Location": {
          "uri": "s3://hidetaka-lab-tmp/stripe-openapi-spec3.yaml"
        },
        "type": "S3"
      },
      "score": 0.5854195952415466
    },

2つのAPIを組み合わせると、「回答」と「参考にしたデータソース」の2つをユーザーに提示できるということでしょうか。

Bedrock agents ≒ Managed LangChain

ワークショップに載っている図をみる限り、「LangChainみたいなやつを、AWS上で作れる」くらいのざっくり理解から入るのがよさそうに見えます。タスクの実行などもLambda経由で行えるので、AWS内のリソースの状況やStripe / Shopifyなどのデータと連携できると、いろいろ捗りそうな予感がします。

https://catalog.us-east-1.prod.workshops.aws/workshops/a4bdb007-5600-4368-81c5-ff5b4154f518/en-US/90-agents/91-agents-w-langchain

とはいえ、LangChainのアップデート速度やモデル・VectorDBサポートの幅に追従できるかについては懐疑的で、Amazon Bedrockを軸にするか否かでLangChainを採用するかしないかが変わってくる・・・くらいの変化にとどまるともみています。

いずれにせよ、選択肢や作り方が多様化していくのは、今後が楽しみですね。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts