API GatewayとLambdaで生成AI(Bedrock)との連携APIを作成してみる

最近、生成AIが流行りですね。
AWSでもBedrockという生成AIのサービスがあります。
少し前までは、東京リージョンでは使えなかったり、日本語が少し怪しかったりしましたが、
最近では十分に使えるレベルまで改善されてきました。
API GatewayとLambdaを使うことで、サービスとしてBedrockを使用する構成を紹介します。

使用例

このページのLambdaとAPI Gatewayを使用することで、
生成AIの機能をWebサービスとして提供することができます。
自社サービスや自作ツールとBedrockを連携させて、サービスをレベルアップすることも可能です。

構成図

API GatewayからLambdaを経由して、Bedrockへ生成AIへ問い合わせを行います。
※本ページに記載するLambdaは問い合わせ内容を固定にしています。

自社サービスや自作ツールにて入力フォーム等を用意して、APIGateway宛てに問い合わせ内容を送信できます。
API Gatewayに届いた問い合わせ内容は、LambdaからBedrockに問い合わせができるという仕組みです。
途中経路にLambdaを挟むことで、プロンプトの内容や生成AIのモデルをカスタマイズできるのもメリットです。
API Gatewayの作り方は、「API Gatewayを作成する」を参考に作成してください。

Lambdaソースコード

import boto3
import json

def lambda_handler(event, context):
    bedrock_client = boto3.client('bedrock-runtime')

    prompt="Amazon Lambdaがどのようなサービスか教えてください。"

    body = json.dumps({
        "inputText": prompt,
        "textGenerationConfig": {
            "maxTokenCount": 3072,
            "stopSequences": [],
            "temperature": 0.7,
            "topP": 0.9
        }
    })

    response = bedrock_client.invoke_model(
        modelId='amazon.titan-text-express-v1',
        accept='application/json',
        contentType='application/json',
        body=body
    )
    
    response_body = json.loads(response.get('body').read())
    output_text = response_body['results'][0]['outputText']
    print(output_text)

    return {
        'statusCode': 200,
        'body': output_text
    }                   

権限(IAMロール設定)

LambdaにアタッチするIAMロールに「bedrock:InvokeModel」の権限を付与してください。

解説

紹介したLambdaのフローは以下の通りです。
  1. prompt変数に問い合わせ格納
  2. json形式で問い合わせ形式に整形
  3. Bedrockに問い合わせ
  4. Bedrockからの回答をAPI Gateway経由で返答
boto3のinvoke_model関数を使用することで、AWS Bedrockの生成AIモデルへプロンプトを問い合わせします。
問い合わせする内容にパラメータを含むため、生成AIからの回答精度を上げたい場合は、
「temperature」や「Top P」の値を変更することも可能です。

使い方

モデルは「Amazon Titan Text G1-Express」を選択しています。
必要に応じて、モデルを変更してみてください。

また、自社サービスや自社ツールとの連携では変数の「prompt」に格納すれば生成AIへの問い合わせが可能です。
問い合わせ元のサービスがなくとも、作成したAPI Gatewayにブラウザからアクセスすれば回答を試し見することも可能です。