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文字化けが起きるため)。