はじめに

こんにちは!森長です!

Amazon Bedrock と Amazon Comprehend を掛け合わせたチャットアプリを作りました。

なぜBedrock だけでなく Comprehend も組み合わせたのか

単にAIだけを使用したチャットアプリではなくあえてComprehend を使用したのは、将来的にユーザー自身が毎日の感情を振り返り、可視化できることをイメージしたからです。

今回はその第一段階として CloudWatch へログを蓄積する仕組みを構築しました。

 Comprehend とは

Comprehend とは「文章を読んで、そこに込められた感情や重要なキーワードを自動で分析してくれるAIサービス」です。

ユースケースとして「ECサイトや口コミサイトの大量のレビューから、ユーザーの満足・不満を自動で判定・集計する」、「問い合わせメールやチャットの文章から顧客の怒りや不安の度合いを検知し、優先度の高い案件をサポート担当へ即座に割り振る」などがあります。

また、次のAPI オペレーションのいずれかを使用して、1 つもしくは複数のドキュメントの感情を検出できます。

今回はチャットボットで即時の簡単な分析を行いたいため、DetectSentimentを使用しました。

機能 概要 使用例
DetectSentiment 1つの文章を即時分析 即座な分析に使いたいとき
BatchDetectSentiment 1つのドキュメントの最大サイズは5KB、最大25個のドキュメントを含めることが可能 リアルタイムな会話ではなく、過去ログのまとめた処理
StartSentimentDetectionJob 大量のドキュメントに対して非同期の感情分析 大量のファイルをまとめて分析したいとき

さらにテキストの感情分析は以下の4つの項目で結果が返ってきます。

  • Positive — 全体的に肯定的。
  • Negative — 全体的に否定的。
  • Mixed – 肯定的と否定的の両方。
  • Neutral – 肯定的と否定的のどちらでもない。

概要

機能と実際の動作

使用イメージは朝の1日のスタートで元気がもらえるチャットです。
挨拶をするとその日の天気、気温、占いをしてくれ感情を分析しユーザーに寄り添ったトーンで会話を広げてくれます。

  • 1回目の会話:その日の天気・気温・占いを伝えてくれる
    ※私が大阪在住なので大阪の情報を呼び出すようにしました
  • 2回目以降の会話:ユーザーのトーンに合わせた会話をしてくれる

Comprehend の分析結果を CloudWatch で出力されるように Lambda 内に処理を組み込んでいます。

try:
res = comprehend.detect_sentiment(Text=text, LanguageCode='ja')
sentiment = res.get('Sentiment', 'NEUTRAL')

print(f"[Comprehend DEBUG] 分析テキスト: {text}")
print(f"[Comprehend DEBUG] 感情判定結果: {sentiment}")
print(f"[Comprehend DEBUG] スコア詳細: {res.get('SentimentScore')}")

↓↓↓ 実際の会話とそれに対する 感情分析の結果です。

ポジティブな会話の結果(クリックで開く)

[Comprehend DEBUG] 分析テキスト: おはよう!!☀️今日も大阪は暑いです💦けど今週も折り返しなので頑張れますよーー!!頑張れ自分!!🤩
2026-08-19T01:33:16.739Z

[Comprehend DEBUG] 感情判定結果: POSITIVE

2026-08-19T01:33:16.739Z
[Comprehend DEBUG] スコア詳細: {'Positive': 0.9983866214752197, 'Negative': 5.17370572197251e-05, 'Neutral': 0.0015001499559730291, 'Mixed': 6.144097278593108e-05}

■ 感情スコア詳細
* Positive (ポジティブ) : 約 99.8% (0.99838)
* Neutral (ニュートラル) : 約 0.15% (0.00150)
* Negative (ネガティブ) : 約 0.005% (0.00005)
* Mixed (ミックス) : 約 0.006% (0.00006)

ネガティブな会話の結果(クリックで開く)

[Comprehend DEBUG] 分析テキスト: お昼に気になってたお店にランチ行ったら、まさかの大行列で1時間待ち、、、結局入れへんくて最悪や〜😢 時間なくなってしまったショック大きすぎる、、、
2026-08-19T03:48:56.199Z

[Comprehend DEBUG] 感情判定結果: NEGATIVE

2026-08-19T03:48:56.199Z
[Comprehend DEBUG] スコア詳細: {'Positive': 7.99131448729895e-05, 'Negative': 0.9989211559295654, 'Neutral': 0.0009790145559236407, 'Mixed': 1.9903738575521857e-05}

■ 感情スコア詳細
* Negative (ネガティブ) : 約 99.9% (0.99892)
* Neutral (ニュートラル) : 約 0.10% (0.00098)
* Positive (ポジティブ) : 約 0.0079% (0.00008)
* Mixed (ミックス) : 約 0.002% (0.00002)

構成図


使用したサービスは以下の通りです。

  • Amazon API Gateway
  • AWS Lambda
  • Amazon Comprehend
  • Amazon Bedrock
  • Amazon DynamoDB
  • 外部API:Open-Meteo(無料の天気予報API)

手順

  1. DynamoDB を作成
  2. Lambda を二つ作成
    • ChatBotFunction(会話し会話履歴をDBに送る)
    • ClearHistoryFunction(DBの会話履歴を全て削除する)
  3. Chat用のLambda に以下の内容を組み込む
    • Bedrock と Comprehend を呼び出すプロンプトを作成
    • DynamoDB に会話履歴を入れる
    • 外部API:Open-Meteoを連携
  4. API Gateway と Lambda を連携・デプロイ
  5. フロントを作成し API Gateway と連携

Claude Haiku 4.5 を使用

AIモデルはClaude Haiku 4.5 にしています。

様々な特徴を持つモデルがたくさんありますが、画像を読み込ませるなどの複雑なやりとりをするわけではなかったので、安くて軽量なモデルを2つに絞りました!

左がNova Micro、右がClaude Haiku 4.5です。
Nova Micro はスピード感が圧倒的で、問題なかったのですが複数やりとりした結果、より自然でユーザーに寄り添った返答をしてみたかったので今回は Claude Haiku 4.5 を採用しました。

まとめ

今回は Amazon Bedrock と Amazon Comprehend を掛け合わせたチャットアプリを作りました!

テキストだけでポジティブやネガティブが判定され、しかもそれがわかりやすく数字として確認できる Comprehend は様々な使い方ができるのではないかと感じました!

やはりログを残すだけの仕組みだけでなくその結果をユーザにもグラフ化など見える形にすれば、ただ毎日アプリと会話しているだけで感情を分析してくれ、1週間や1ヶ月ごとにまとめて定期的に自身のメンタルの変化を振り返ることができる、アプリへと拡張できたらより面白いと感じました。