本記事は TechHarmony Advent Calendar 12/25付の記事です。 |
こんにちは、SCSKの木澤です。
今年初めて企画したTechHarmony Advent Calendarも、本日で完走となりました。
TechHarmony寄稿者から広く協力いただき、本企画を完遂できたことは感激ひとしおです。
各記事をご覧頂いた頂いた皆様も、ありがとうございました。
さて今年の話題と言えば、最後としては何と言っても生成AIのブームでしょう。
昨年11月のChatGPT発表以降一世を風靡し、AWSとしても今年4月にAmazon Bedrockを発表、プレビュー期間を経て9月にGAされました。
Amazon Bedrockの特徴としては、多数の生成AIモデルから選択できること、データセキュリティに強く配慮していること、他のAWSサービスと統合が容易なことが挙げられます。
生成AIモデルの性能としては後塵を拝しているとの評価もありますが、用途によっては十分に使えるため、既にAWSを活用しているユーザーにとっては有力な選択肢になると思われます。
私は昨年、AWSブログの更新を検出しTeamsに通知するという記事を発信しました。
そこで今回はこれに生成AIの要素を追加し、記事を要約して通知することにチャレンジしてみたいと思います。
アーキティクチャ・生成AIモデルの選択
アーキティクチャとしてはこんな感じ。
前回の記事から、翻訳に用いていたAmazon TranslateをAmazon Bedrockに取り替えているだけです。
- Amazon SNS経由メール通知
- Amazon SMS経由Teams通知(HTMLメール)
- Webhook経由Slack
など幅広く対応可能です。
生成AIモデルにはAmazon Titan Text G1 – Expressを利用しました。
こちらは今年のre:Inventで発表があったAmazon Bedrockの言語モデルです。英語以外にも100を超える言語に対応しますが、2023年12月時点で英語以外はプレビューの扱いとなっています。
今回はTitan Textの日本語性能をチェックしてみたかったことや、コストの観点での選択した次第です。
もしやAWS情報の要約であるためAmazon謹製の生成AIモデルでも期待できるのでは?という思いもありました。
価格は Claudeの1/8~1/10程度、Claude Instantの2/3~1/2程度の費用となります。
もし実用に耐えるのであれば有力な選択肢になるでしょう。
設定手順
以下の手順を実施しました。
なお、当方では東京リージョン(ap-northeast-1)で実装しました。
パラメータストアの作成
後述のLambda関数では取得元RSSフィード情報をAWS Systems Managerのパラメータストアから取得するように設計してありますので、下記のようなJSON形式でパラメータストアを作成します。
タイトルとURL、言語のみしているシンプルなものです。
[
{"TITLE":"AWS What's New(英語版)","URL":"https://aws.amazon.com/about-aws/whats-new/recent/feed/","LANG":"en"},
{"TITLE":"AWS What's New(日本語版)","URL":"https://aws.amazon.com/jp/about-aws/whats-new/recent/feed/","LANG":"ja"},
{"TITLE":"AWS News Blog(英語版)","URL":"https://aws.amazon.com/blogs/aws/feed/","LANG":"en"},
{"TITLE":"Amazon Web Servicesブログ(日本語版)","URL":"https://aws.amazon.com/jp/blogs/news/feed/","LANG":"ja"},
{"TITLE":"AWS JAPAN APN ブログ","URL":"https://aws.amazon.com/jp/blogs/psa/feed/","LANG":"ja"}
]
Amazon SESへのメールアドレス登録
今回はAmazon SES経由で通知を行いますので、メールの「From」になるメールアドレスと、宛先となるTeamsのメールアドレスを登録し認証しておきます。
Amazon Bedrock 生成AIモデルのリクエスト
Amazon Bedrockのコンソールに接続し、Model AccessからTitan Text G1 – Expressを有効化します。
Access grantedと緑で表示されていることを確認します。
Lambda関数の作成
IAMロールの事前準備
以下のアクションを許可したポリシーを作成し、これらをアタッチしたロールを作成します。
英語版ブログのタイトルの翻訳を含むため、Translateの権限も残してあります。
- AWS Systems Manager(Parameter Store)からの値の取得
- ssm:GetParameterHistory
- ssm:GetParametersByPath
- ssm:GetParameters
- ssm:GetParameter
- Amazon Translateでの翻訳実行
- translate:TranslateText
- Amazon Bedrockでの推論実行
- bedrock:InvokeModel
- SESでのメール送信
- ses:SendEmail
- CloudWatch Logsへのログ送信
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvent
Bedrockのモデル呼び出しはbedrock:InvokeModelのみで良いようです。ポリシーはこちら。
{ "Version": "2012-10-17", "Statement": [ { "Action": "bedrock:InvokeModel", "Resource": "*", "Effect": "Allow" } ] }
Lambda関数の作成
2023年12月にLambdaでPython 3.12ランタイムがリリースされました。
内包されているbotoのバージョンは1.28.72となっており、boto3をアップデートするためにLambdaレイヤーの作成もしくは関数内への埋め込みは不要になりました。
そこで、前回同様組み込みが必要なライブラリはfeedparserのみとなります。
AWS Cloudshellにログインし、適当なフォルダを生成し以下のようなコマンドで生成→S3バケットにプッシュします。
$ pip3 install feedparser -t .
$ touch lambda_function.py
$ zip -r func.zip ./*
$ aws s3 cp ./func.zip s3://(S3バケット名)/
関数のひな形をデプロイ後、ソースコードは以下のように改修しました(ダウンロードしご確認ください)
なお、botoにてAmazon Titan Textを呼び出すためのパラメータはこちらで確認できます。
一般設定・環境変数の設定
元々本Lambda関数はRSSのパース及び外部の呼び出しに少々時間がかかりますが、Bedrockの呼び出しで更に時間が掛かります。タイムアウト時間は3分程度まで延ばしておいた方がよいと思われます。
また環境変数として以下を指定します。
- MAIL_FROM 送信するメールの発信元
- MAIL_DEST_EN 英語版ブログの通知先メールアドレス(Teams)
- MAIL_DEST_JA 日本語版ブログの通知先メールアドレス(Teams)
- PARAMETER_STORE 作成したAWS Systems Managerパラメータストアの名前
EventBridgeルールの設定
最後に、Amazon EventBridgeのルールを追加し、作成したLambda関数を定期実行するように設定します。
動作確認
以上、AWSアップデートの要約チャレンジでした。
Lambdaを実行すると、Bedrock(Titan)で記事が要約された通知が行われます。
日本語版ブログを要約させたもの
概ね想定通りの結果が得られました。
英語版ブログをTitanで直接日本語解説させたもの
下記は比較的良い結果を載せましたが、出力結果が不安定な印象があります。
まとめ&今後の展望
LambdaからBedrockを呼び出して、アプリケーションに生成AIモデルを組み込むことが非常に簡単なことが解りました。
今回の検証の結果では、英語版ブログの翻訳まで組み込んだ形で要約するにはまだ不安定であるといった印象でしたが、Amazon Translateと組み合わせることで実用に耐えうるレベルに達するのでは無いかという印象です。
また今回は時間切れのため検証できませんでしたが、プロンプトの調整で改善される可能性もあるかと思います。
実際にはRSSで配布される記事の要約文(Description)もあるため、今後の本番運用に関しては引き続き検証し判断していきたいと思います。
今後ともAmazon Bedrockを用いて色々なサーバレスアプリに生成AI要素を組み込んでいきたいですね。
では。