Movatterモバイル変換


[0]ホーム

URL:


たーせる日記

この広告は、90日以上更新していないブログに表示しています。

AWS Lambda で遊ぼう(第11話: Bedrock編)

前書き

お久しぶりです。 たーせるです。

昨年末、AWS の re:Invent 2024 に現地参加して参りました。 聞くところによると、世界中からなんと6万人もの参加者がラスベガスに集結したそうです。

本来ならばこのブログでも何らかアウトプットしたかったところですが、自社向けの出張報告レポートで持ち帰ってきたネタをだいぶ吸い尽くされた上に仕事が増えたり私生活が立て込んだりでほとほと疲れてしまい、生来の筆無精に拍車がかかった今日この頃であります。 面目ない。

ところで現地でなにか面白い話は聞けた?

やはり生成AI関連はワクワクしたねー。

Matt Garman CEOも、キーノートで「Generative AI will be a core component of every application」と言っていたし。

そういや EXPO も、AI 絡みの展示がいっぱいあったね。

もはやAIがシステムの心臓部に位置づいているソリューションもあったみたいだし。

特に耳目を集めていたのがAmazonBedrockベッドロック というサービスでした。

これまでなかなか食指が動かずキャッチアップを疎かにしていましたが、実際の活用事例を見ると俄然興味をそそられて、自分でも使ってみたくなりました。

Amazon Bedrock とは

Amazon Bedrock は、さまざまな生成AIモデルを簡単に利用できるマネージドサービスです。

AWS の Bedrock コンソールにアクセスすると、まるで百貨店のごとく生成 AI の基盤モデルが陳列されているのが確認できます。

ここで、使いたい基盤モデル(たとえば Claude 3.5 Sonnet)をポチっとやるだけで、すぐに使い始めることができるのです。

Bedrock で有効化した基盤モデルは、基本的に自分だけのものとしてAWS アカウント内でローカルに動作します。 すなわち、ユーザが AI に対して与えたデータがAWS や基盤モデルの提供企業に共有されることはありません。

生成AIを使ってみたいけど、業務で扱う情報をクラウド事業者に渡すのはダメなんですよ」という企業であっても、Bedrock ならばコンプライアンス要件をクリアできるかも知れません。

また、RAG や AI エージェントなどの高度なソリューションを比較的容易に構築できる点も魅力です。

今日のゴール

今日の目標は「AWS Lambda 関数から、Bedrock 経由でテキスト生成 AI を動かすこと」です。

Lambda で生成 AI を動かすことができれば、「何らかの新着情報を定期的に確認して要約」とか、「API 化してVS Code拡張から利用する」とか、いろいろ応用できそうです。

まずはいきなり Lambda を作るのではなく、スタンドアロンPythonスクリプトで Bedrock を動かし、要領を摑んだ上で Lambda に移植していきます。

試運転

ここでは簡単のため、Cloud9 上でコーディングすることを前提とします(残念ながら、現在、新規アカウントで Cloud9 の環境が作成できなくなっているのですが……)。 さらに新兵器として LangChain なるフレームワークも導入します。

理由は、コードの記述量を減らすためであり、覚えることを減らすためでもあります。

以下のコマンドをターミナルに入力しましょう。

パッケージのインストール

$ pip install langchain langchain-aws langchain-community python-dateutil==2.8.2

なんで新規アカウントで Cloud9 使えなくなったんだろうね。

便利だったのにね。

CodeCommit が使えなくなったのも地味に痛い。

── 続いて、Python のファイルを新規作成してコーディングしていきます。

main.py

from langchain_awsimport ChatBedrockfrom langchain_core.messagesimport HumanMessage, SystemMessagechat = ChatBedrock(  model_id ="anthropic.claude-3-5-sonnet-20240620-v1:0",# Claude 3.5 Sonnetを指定  model_kwargs = {"max_tokens":1000 })messages = [  SystemMessage(content="あなたは世界トップクラスのコンサルタントです。"),  HumanMessage(content="ポテトのおいしいメニューを3つ答えよ。")]response = chat.invoke(messages)print(response.content)


え?

たったこれだけ?

これだけ。

ほとんど解説が要らないくらい。

ちなみにコード中のmodel_id は、Bedrock で有効化したモデルのページからコピペできます。

このコードを実行すると、以下のような結果が得られます(実行結果は毎回変わります)。

実行結果

はい、ポテトを使った美味しいメニューを3つご提案させていただきます:1. ハッシュドポテトクリスピーで香ばしい外側と、中はふんわり柔らかい食感が特徴です。朝食やブランチに最適で、卵料理やベーコンと相性抜群です。2. グラタン・ドフィノワ薄くスライスしたジャガイモを重ね、クリームとチーズを加えてオーブンで焼き上げる伝統的なフランス料理です。濃厚で贅沢な味わいが楽しめます。3. スパニッシュオムレツ(トルティージャ・エスパニョーラ)ジャガイモと玉ねぎを炒めて卵と合わせて作る、スペインの定番料理です。冷めても美味しく、ピクニックやお弁当にも適しています。これらのメニューは、ポテトの特性を活かし、様々な食事のシーンで楽しめる人気の料理です。調理法や味付けのバリエーションも豊富で、アレンジの幅が広いのも特徴です。

このように、たった20行足らずのコードで、生成 AI が組み込めてしまいました。 驚くほど簡単です。

Lambda関数に乗せる

ではいよいよ、AWS Lambda から Bedrock を利用してみましょう。

書籍やネットにも同様の内容について手順が公開されていますが、 Lambda Layers を利用したり、マネジメントコンソールを利用するGUI ベースの操作手順であったりと手数が多い傾向にあります。

(個人の好みではありますが)Lambda Layers を使わず、AWS SAM ベースで Lambda を構築するのが好きなので、今回もその方式を採用しようと思います。

まずは、sam initコマンドでSAMプロジェクトを作成します。 プロジェクトの作成手順は基本的に過去記事の通りなのですが、プロジェクト名はsam-app-bedrock、ランタイムは現時点で最も新しいPython 3.12 を選択しましょう(アプリケーションテンプレートはHello World Example で OK です)。

プロジェクトのフォルダ階層は以下の通りとなります。

sam-app-bedrock├── events├── hello_world│   ├── __init__.py│   ├── app.py│   └── requirements.txt├── tests├── __init__.py├── README.md├── samconfig.toml└── template.yaml

このあとの手順で手を加えるファイルは3つ ──template.yamlrequirement.txtapp.py です。

テンプレートの修正

生成されたコードから、template.yaml を開き、以下のように修正します(★印が修正箇所です)。

template.yaml

AWSTemplateFormatVersion:'2010-09-09'Transform: AWS::Serverless-2016-10-31Description: >  sam-app-bedrock  Sample SAM Template for sam-app-bedrockGlobals:Function:Timeout:30 # ★タイムアウトを30秒にするResources:HelloWorldFunction:Type: AWS::Serverless::FunctionProperties:CodeUri: hello_world/Handler: app.lambda_handlerRuntime: python3.12Architectures:-x86_64Policies:-AmazonBedrockFullAccess # ★ BedrockFullAccess ポリシーをアタッチEvents:HelloWorld:Type: ApiProperties:Path: /helloMethod: getOutputs:HelloWorldApi:Description:"API Gateway endpoint URL for Prod stage for Hello World function"Value:!Sub"https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"HelloWorldFunction:Description:"Hello World Lambda Function ARN"Value:!GetAtt HelloWorldFunction.ArnHelloWorldFunctionIamRole:Description:"Implicit IAM Role created for Hello World function"Value:!GetAtt HelloWorldFunctionRole.Arn

修正のポイントは2つあります。

まず Lambda 関数のタイムアウト時間を30秒に延ばしている点に注目しましょう。 デフォルト値(3秒)では、AIが応答を返す前にタイムアウトになってしまうためです。

次に、Lambda 関数から Bedrock を利用できるよう、AmazonBedrockFullAccessポリシーをアタッチします。

requirements.txt の修正

続いて、Lambda 関数が利用するライブラリをrequirements.txt に書いていきます。

requirements.txt

langchain==0.3.14langchain-aws==0.2.11langchain-community==0.3.14python-dateutil==2.8.2

外部のライブラリを利用する際に Lambda Layers を利用する方法もありますが、あんまりあちこちに依存関係を作りたくないので、基本的に必要なものはrequirements.txt に全書きする方が好みです。

Lambda 関数の実装

最後に関数本体をコーディングしていきましょう。 ……といっても、先ほどの試運転コードと内容はほぼ同じです。

app.py

from langchain_awsimport ChatBedrockfrom langchain_core.messagesimport HumanMessage, SystemMessageimport jsondeflambda_handler(event, context):    chat = ChatBedrock(      model_id ="anthropic.claude-3-5-sonnet-20240620-v1:0",      model_kwargs = {"max_tokens":1000},    )        messages = [      SystemMessage(content="あなたは世界トップクラスのコンサルタントです。"),      HumanMessage(content="ポテトのおいしいメニューを3つ答えよ。")    ]        response = chat.invoke(messages)return {"statusCode":200,"headers": {"Content-Type":"application/json; charset=utf-8"      },"body": json.dumps({"message": response.content,      }, ensure_ascii=False),    }
ビルドとデプロイ

ここまで完了したら、sam build -usam deployコマンドを実行すると、APIGateway と Lambda がデプロイされます。

デプロイに成功すると、ターミナルにAPI のエンドポイント URL が表示されるので、ブラウザのアドレスバーにコピペしましょう。

JSONが整形されていないためやや見づらいですが、ポテトのおいしい食べ方が3つ提示されているのが確認できます。

まとめ

ここでは、Bedrock と連携する最も簡単な Lambda の実装を行いました。

アイディア次第で、たとえば僕の時間を奪う管理業務(進捗の集計とか報告資料の作成とか)をなんとかしてラクにできないかなーと思う次第です。

そういえば、実際に生成AIで時短につながった例ってなにかあったりするの?

あんまり大きな声では言えないけど、かなり毒々しいメールがしばしば僕のもとに届くので、AI の力でやさしい文面に変換している。

メールを開くときの心の準備が要らなくなったので、だいぶ時短になっているんじゃないかなぁ……。

お……おう。

あと現場にもよるんだけど、未だにアホみたいにアナログなことをやっているプロジェクトがあったり、やる価値のない作業にやたら時間をかけたり……。

おっとそれ以上はいけない

検索
このブログについて
励ましのお便り
    リンク
    tikzjax

    Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.

    引用をストックしました

    引用するにはまずログインしてください

    引用をストックできませんでした。再度お試しください

    限定公開記事のため引用できません。

    読者です読者をやめる読者になる読者になる

    [8]ページ先頭

    ©2009-2025 Movatter.jp