コンテンツにスキップ

article_generation Lambda 入出力定義

article_generation Lambda の入出力スキーマを定義します。 処理フローや責務などの概要は 概要 を参照してください。


SQS イベントペイロード(受信)

App Lambda から SQS(article-generation キュー)経由で受信するメッセージのスキーマ。

{
  "article_id": "string",
  "race_id": "string",
  "racing_type": "horse_racing",
  "title": "string",
  "race_result": {},
  "custom_prompt": "string"
}
フィールド データ型 必須 備考
article_id string ◯ article テーブルの _id(generating 状態)
race_id string ◯ auto_racing / bicycle_racing / horse_racing テーブルの _id
racing_type enum ◯ auto_racing / bicycle_racing / horse_racing
title string ◯ 生成する記事のタイトル・トピック
race_result object ◯ レース結果。App Lambda が racing テーブルから取得してペイロードに含める
custom_prompt string 再生成時の追加指示(POST /v1/articles/{article_id}/regeneration 由来)
category_id string 後方互換のため残しているフィールド。現在の App Lambda は送信しない

レース動画・コース画像はペイロードに含めず、本 Lambda が S3 から取得します。

メディア S3 キー 渡し方
レース動画 {racing_type}/video/{race_id}.mp4 S3 URI(s3://{bucket}/{key})として Bedrock に渡す
コース画像(競馬のみ) horse_racing/course_image/{race_id}.gif インラインバイトで渡す

どちらも存在しない場合は「無い」ものとして解析を続行します。


article-builder キューへの送信内容(出力)

生成完了時に SQS(article-builder キュー)へ送信するメッセージのスキーマ。

{
  "article_id": "string",
  "race_id": "string",
  "racing_type": "horse_racing",
  "content": {
    "headline": "string",
    "summary": ["string", "string", "string"]
  },
  "accuracy_test_data": {}
}
フィールド データ型 必須 備考
article_id string ◯ 更新対象の article テーブルの _id
race_id string ◯ レースの _id
racing_type enum ◯ サマリーの配色テーマの決定に使う(競馬=緑 / 競輪=青 / オート=赤)
content object ◯ 生成した「レース結果10秒サマリー」
accuracy_test_data object 精度検証用データ。article.accuracy_test_data へ保存される

content のスキーマ

packages/article_generation_agent/src/schemas.py の ArticleContent に対応します。

フィールド データ型 必須 備考
headline string ◯ サマリーの見出し(例: 衝撃のレコード決着!)
summary string[] ◯ レース結果の要点をまとめたちょうど3つの文章。各文は60文字以内が目安

accuracy_test_data のスキーマ

{
  "generated_article": {
    "title": "string",
    "contents": ["string", "string", "string"]
  },
  "race_result_in_generated_article": {},
  "race_analysis": "string"
}
フィールド 内容
generated_article 生成した記事(見出し + サマリー各行)
race_result_in_generated_article 記事で使用した順位・払戻金等の数字情報を、記事生成 AI が race_result と同じ形式で申告したもの
race_analysis 1段目(レース動画・コース画像の解析)の出力。記事の記述がレース結果と動画のどちらに由来するかを測るために残す

scripts/article_accuracy_test/audit.py がこのデータを使って突合と由来の集計を行います。


1段目: race_analysis_agent の入出力

レース動画・コース画像・レース結果を総合的に解析する LangGraph の ReAct エージェント。

入力

フィールド データ型 必須 備考
racing_type string ◯ auto_racing / bicycle_racing / horse_racing
race_result object ◯ レース結果
media_files MediaFile[] ◯ レース動画(s3_uri)・コース画像(data)
client boto3 client ◯ Lambda が初期化した Bedrock クライアント
model_id string ◯ Nova Pro の推論プロファイル ARN

MediaFile は file_name / mime_type(image / video)と、 data(インラインバイト)または s3_uri のいずれかを持ちます。

出力

項目 内容
summary レース動画・コース画像・レース結果を統合した総合サマリー(文字列)

ツール構成

ツール 入力 処理 出力
analyze_race_video レース動画(S3 URI) Bedrock でレース映像をマルチモーダル解析する 解析結果の説明文
analyze_course_image コース画像(バイト) Bedrock でコース画像を解析する(競馬のみ) 解析結果の説明文

ツールはメモ化されており、同じツールを呼び直しても同じ結果しか返りません。 1ツールあたり2回、エージェント全体で4回を上限とし、超過分は打ち切って強制的に出力へ進ませます。 エージェント実行が失敗した場合は、ツール無しの単発呼び出しへフォールバックします。


2段目: article_generation_agent の入出力

確定事実と総合サマリーを根拠に記事を執筆する、構造化出力の単一呼び出し。

ReAct エージェントではない

2段目はツールを使わないテキスト処理のため、ReAct エージェントではなく with_structured_output による単一呼び出しで生成します。

入力

フィールド データ型 必須 備考
title string ◯ 記事タイトル・トピック
race_result object ◯ レース結果(確定事実ブロックの組み立てとプレースホルダー差し込みに使う)
race_analysis string ◯ 1段目の総合サマリー
racing_type string ◯ 競技種別
ng_word_matcher NgWordMatcher NG ワード検査に使うマッチャ
custom_prompt string 再生成時の追加指示
client / model_id / provider / base_model_id ◯ Bedrock クライアントとモデル指定

出力

項目 内容
headline / summary 生成した10秒サマリー
race_result_in_generated_article 記事が言及した数字情報(別の構造化出力呼び出しで抽出したもの)

race_result_in_generated_article は、LLM には「どの情報を使ったか」の選択だけを出力させ、 実際の値はコード側が入力 race_result から転記します(LLM に転記させると1文字化けが起きるため)。