RESULT
稼働中の3媒体で出している結果
- 本番稼働中
- 3 サイト
- AI / 自動車 / ガジェット
- 公開中の記事
- 556 本
- AI 272 / 自動車 90 / ガジェット 194
- 人が書いた記事
- 0 本
- 執筆はすべてAIエージェントが担当
- 事実確認の合格条件
- 100 %
- 全ての事実主張に原文の根拠があること
いずれも2026年8月時点の実測値です。記事本数は「公開中」の本数で、累計の作成本数ではありません。
稼働中の3サイトを見る
同じ仕組みのまま、ジャンルの設定を差し替えて3媒体を運用しています。テーマ色と分類だけが媒体ごとに異なります。
いずれも実際に公開しているサイトです。
権利面への配慮
発表元の一次情報だけを根拠にするという設計は、そのまま権利面の設計でもあります。
技術の話に入る前に、何をしていて何をしていないかを先に書いておきます。
- 他社の記事本文を保存しない
ニュースサイトの記事は、発表元へたどり着くための入口として読み通すだけで、システムには残していません。
- すべての記事に発表元へのリンクを出す
読者が「ここを読めば発表元の話がわかる」状態を、記事1本ごとに必ず用意しています。
- 引用の量と出典の明示を機械が検査する
原文どおりの一致が本文をどれだけ覆っているかを判定し、過大なら書き直させます。出典が示されていない記事は公開しません。
- 掲載を止めてほしいという求めに応じられる
ドメイン単位の拒否指定と、公開済み記事の下書きへの差し戻しで対応できる仕組みを備えています。
システム構成 ― WordPressを配信基盤に据える
記事を作るところまでをPythonのパイプラインが担い、読者に見せるところはWordPressに任せています。
作る側と見せる側を分けているので、サイトの見た目やカテゴリの構成は、パイプラインを止めずに手を入れられます。
横にスクロールできます →
収集元からWordPressまでが本流。パイプラインはオンプレLLMとPostgreSQLを参照し、運営者は管理画面から収集元の登録と記事の承認だけを行う。
WordPressをどう使っているか
- ジャンルごとに作り分けたブロックテーマ3本(AI / 自動車 / ガジェット)
- 重要記事枠・日別の新着・アクセスランキングなどを組む独自ブロック11種
- テーマから独立して常時有効な mu-plugins 5本
- WordPress標準のREST APIで、記事本文とアイキャッチ画像をまとめて投稿
- 記事ページに NewsArticle の構造化データを出力し、検索結果でニュース記事として扱われるようにする
- Meilisearch によるサイト内検索
- 直近24時間で30本という公開上限と、投稿に失敗したときの自動再試行(最大5回)
- 公開済み記事を下書きへ戻す取り下げと、理由が解消したときの復帰
業務ワークフロー ― 編集部の役割をAIエージェントが分担する
構成図の中央にあった8つの工程を、1つずつ開いたものが下の図です。
新聞社の編集部がやっていること(取材・執筆・校閲・掲載判断・配信)を役割ごとにAIエージェントへ置き換えていて、
エージェントは互いの成果物を受け渡しながら1本の記事を仕上げます。
8体のエージェントが記事1本を仕上げるまで
このシステムがいちばん手をかけているのは、書くことではなく書かないと決めることです。
どの工程も条件を満たさなければそこで止まり、止まったものを無理に記事にする経路はありません。
進む 止まる(記事にしない・レビュー待ち・公開保留)
青いラベルは編集部でいう役割、オレンジの縦線はそのエージェントが守っている決まりです。
- 01
収集エージェント 取材記者
運営者が登録した収集元を2時間ごとに巡回し、新しい記事URLを拾う。取り方はRSS・サイトマップ・リンク読み取りから自動で選ぶ
どこを見に行くかは人が決める。編集方針は編集の仕事であって、機械が勝手に増やさない
- 02
一次情報エージェント 裏取り
記事から外部リンクをたどって公式ページを読み、「この文章を書いたのは発表した本人か」だけを判定する
迷ったら「いいえ」。ドメインでは決め打ちせず、必ず本文を読んで判定する
記事にしない 発表元の原文にたどり着けない
ここで終わり。あとから記事にする経路は無い
- 03
選別エージェント デスク
重要度を100点満点で採点し、同じ発表が別のURLで重複していないかを突き合わせる
AIには分類だけを答えさせ、点数の計算は機械が行う。同じ入力なら必ず同じ点数になる
記事にしない ジャンルごとの足切りに届かない、または既出の発表と同一
ここで終わり。あとから記事にする経路は無い
- 04
執筆エージェント 記者
一次情報の原文1件だけを材料に、タイトル・リード・本文・要約を日本語で書く
材料も出典も照合先も原文1件に限る。原文にない日付や「本日」などの相対表現は書かせない
- 05
校閲エージェント 校閲
本文を1文ずつに分解し、事実の主張それぞれについて原文のどこで裏づけられるかを紐づける
根拠の取れない文が1つでもあれば不合格。割合では判定しない
レビュー待ち 根拠の取れない記述が1文でもある
運営者が承認すると 07 掲載判断へ戻る(公開済へは直接進めない)
- 06
画像エージェント 写真部・整理部
原文の図版を出典つきで引用するか、記事の実データを載せた1枚をHTML/CSSで組んでブラウザで描画する
画像を生成しない。組版の崩れは推定せず、ブラウザに実測させてから撮影する
レビュー待ち 引用も描画も成立せず、載せる1枚を用意できない
運営者が承認すると 07 掲載判断へ戻る(公開済へは直接進めない)
- 07
掲載判断エージェント 編集長
出どころの完全性・引用の適正さ・根拠の純度・運営者の意思の4点だけを確認する
判定は許可か拒否の2択で、「判断できない」を返さない。この判定を飛ばす経路は無い
公開保留 4点のいずれかを満たさない
運営者が承認すると 07 掲載判断へ戻る(公開済へは直接進めない)
- 08
配信エージェント 配信
WordPressへ記事と画像を投稿し、検索エンジンとSNSへ公開を知らせる
記事のURLは壊さない。あとから本文・見出し・スラッグを書き換えず、取り下げは検索エンジンにも伝える
公開済
近道は作っていない
「レビュー待ち」から直接「公開済」へは進めません。「公開停止」から直接「公開済」へも進めません。
いったん止めた記事を戻すときも、必ず運営者の承認と掲載判断をもう一度通ります。
人が手を入れる場所
日常的な作業はほとんどありません。人が関わるのは、どこから情報を集めるかを決めるときと、
機械が「これは自信がない」と判断して差し出してきた記事を承認するときの2つです。
記事の本文そのものは1本も人が書いていません。
運営者の管理画面
人が見るのはこの画面だけです。工程ごとの滞留件数と、次に動かすのが機械か人かがひと目で分かるようにしています。
実測値が無い指標は「0」ではなく「未計測」と表示し、両者を混同させません。
ダッシュボード。収集元のURLは伏せています(登録先は編集方針そのものであり、相手先との関係もあるため)。 記事レビュー。見出しは「配信されているか。されていないならなぜか」。重要度は機械が計算した点数で、同じ入力なら必ず同じ値になります。 主な機能
- 運営者が登録した収集元を2時間ごとに巡回し、新しい記事URLを拾う(RSS・サイトマップ・リンク読み取りを自動で使い分け、クロール規則とアクセス間隔を尊重)
- ニュース記事を入口として、発表した本人が書いた原文を特定する(AIへの問いは1つ、迷ったら採用しない)
- 一次情報ごとに重要度を0〜100点で採点(AIは分類だけを答え、点数の計算は機械が行うため結果が再現する)
- 記事を書く直前に、同じ発表が別URLで重複していないかを突き合わせて1件に絞る
- 一次情報の原文だけを根拠に日本語の記事を生成(丸写しと、原文にない日付を機械で抑止)
- 1文ずつ原文と突き合わせる事実確認。根拠の取れない記述が1つでもあれば公開せず、運営者のレビューへ回す
- 記事に必ず画像を1枚つける(出典を明記した引用、またはHTML/CSSで組んだブランドの型をブラウザで描画)
- 掲載判断は出どころ・引用・根拠・運営者の意思の4点のみ。結果は許可か拒否の2択で、判定を飛ばす経路は無い
- WordPressへ自動投稿。直近24時間30本の公開上限、失敗時の自動再試行、公開後の取り下げと復帰
- 公開直後に検索エンジンへ通知(IndexNow)し、SNS(Bluesky)へ投稿。記事ページはNewsArticleの構造化データを出力
- 運営者向け管理画面(稼働状況・収集元・カテゴリ・記事レビュー)。カテゴリを変更すると全記事が自動で分類し直される
- 1プロセス1ジャンルの構成で、設定ファイルを足すだけでジャンルを増やせる(現在3サイト)
使用技術
- Python 3.12 / SQLAlchemy 2.0 / Alembic
- PostgreSQL(ジャンルごとにスキーマを分離)
- オンプレLLM(LM Studio: 執筆用 / 判断用 / 画像を読む用 / 埋め込み)
- WordPress(ブロックテーマ3本 + 独自ブロック11種 + mu-plugins 5本)
- WordPress REST API による自動投稿
- FastAPI + Jinja2(運営者向け管理画面)
- Playwright(動的ページの取得・ヒーロー画像の描画)
- trafilatura / feedparser / protego / curl_cffi / pypdf
- Meilisearch(サイト内検索)
- IndexNow / Bluesky / NewsArticle 構造化データ
- pytest / mypy(strict) / ruff / import-linter