コンテンツにスキップ

article テーブル

概要

項目 内容
テーブル名 article
説明 レース(オートレース・競輪・競馬)に紐づく「レース結果10秒サマリー」記事を管理するテーブル。AI 生成(status: generating で作成され、ビルド完了後 draft になる)と手動作成の両方の記事を扱う
主な用途 記事の作成・更新・公開管理・生成失敗の追跡

カラム定義

カラム名 データ型 PK FK Unique Nullable デフォルト 備考
_id ObjectId ◯ ◯ DocumentDB自動採番
race_id string auto_racing:_id / bicycle_racing:_id / horse_racing:_id いずれかのレーステーブルの _id を参照する。インデックスあり
title string
body_html string HTML形式。AI 生成時は article_builder Lambda が React コンポーネント(RaceSummary)を renderToStaticMarkup で HTML 化したもの。スタイルを内包した self-contained なフラグメント
status enum draft generating: 生成中 / draft: 下書き / published: 公開 / failed: 生成失敗
opening_at number 公開予定日時。インデックスあり
closing_at number ◯ 公開終了日時
accuracy_test_data object ◯ 精度検証用データ。scripts/article_accuracy_test/audit.py が突合に使う
generation_error string ◯ status=failed のときの失敗理由(最大2000文字)。管理画面に表示する
custom_prompt string ◯ 再生成時に運用者が与えた追加指示。次の再生成でも引き継ぐ
created_at number
updated_at number 一覧取得のデフォルトは更新日時順にする
deleted_at number ◯

category_id は持たない

article はカテゴリを持たない。カテゴリを持つのは blog / old_blog のみ。

ステータス遷移

stateDiagram-v2
    [*] --> generating: POST /v1/articles/generation
    [*] --> draft: POST /v1/articles(手動作成)
    generating --> draft: article_builder が body_html を保存
    generating --> failed: 生成が最終試行で失敗
    failed --> generating: POST /v1/articles/{id}/regeneration
    draft --> published: 担当者が公開
    published --> draft: 担当者が非公開化

generating / failed は生成パイプラインが付けるステータスであり、 POST /v1/articles・PUT /v1/articles/{id} の入力としては指定できない(400 になる)。

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段目(レース動画・コース画像の解析)の出力。記事の記述がレース結果と動画のどちらに由来するかを後から測るために残す