この広告は、90日以上更新していないブログに表示しています。
お久しぶりです。 たーせるです。
昨年末、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 は、さまざまな生成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 が組み込めてしまいました。 驚くほど簡単です。
ではいよいよ、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.yaml
、requirement.txt
、app.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
ポリシーをアタッチします。
続いて、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
に全書きする方が好みです。
最後に関数本体をコーディングしていきましょう。 ……といっても、先ほどの試運転コードと内容はほぼ同じです。
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), }
ここでは、Bedrock と連携する最も簡単な Lambda の実装を行いました。
アイディア次第で、たとえば僕の時間を奪う管理業務(進捗の集計とか報告資料の作成とか)をなんとかしてラクにできないかなーと思う次第です。
そういえば、実際に生成AIで時短につながった例ってなにかあったりするの?
あんまり大きな声では言えないけど、かなり毒々しいメールがしばしば僕のもとに届くので、AI の力でやさしい文面に変換している。
メールを開くときの心の準備が要らなくなったので、だいぶ時短になっているんじゃないかなぁ……。
お……おう。
あと現場にもよるんだけど、未だにアホみたいにアナログなことをやっているプロジェクトがあったり、やる価値のない作業にやたら時間をかけたり……。
おっとそれ以上はいけない。
Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。