新闻媒体Agent不是简单把大模型接到定时任务上。它需要持续观察多个信息源,判断哪些事件正在形成热点,再调用生成能力完成稿件初稿。这个过程涉及数据采集、信号清洗、热度排序、选题策略、结构化写作、事实核验和审核发布多个环节,任何一环只依赖模型输出都容易失效。

接下来重点讨论三个问题:热点发现如何设计信号与热度模型,自动写作如何约束事实并控制风格,以及生产环境如何用状态机和消息队列串联整个流程。
一、热点发现:从多源信号到热度排序
热点发现的第一步是接入足够多样的数据源。新闻媒体Agent通常同时拉取权威新闻API、社交平台热搜、垂直社区帖子、搜索引擎趋势词和RSS订阅。单一来源容易漏报或误报,例如社交平台可能放大情绪化内容,而新闻API存在发布延迟。因此采集层需要统一数据结构,至少包含标题、正文摘要、发布时间、来源域名、互动数、关键词标签等字段。
在原始数据进入排序前,必须做去重与聚类。同一事件可能被几十家媒体转发,文本相似度计算可以将它们归并为一个事件簇。常用方法是先对标题和导语生成向量表示,再用余弦相似度配合滑动窗口聚类,避免历史新闻和新事件被错误合并。聚类后的簇内文章数量本身也是一个热度信号。
import time
from dataclasses import dataclass
@dataclass
class EventSignal:
event_id: str
title: str
source_count: int
total_interactions: int
authoritative_count: int
first_seen: float
last_updated: float
def heat_score(ev: EventSignal, now: float = None) -> float:
now = now or time.time()
age_hours = max((now - ev.first_seen) / 3600.0, 0.1)
decay = 1.0 / (1.0 + 0.15 * age_hours)
authority_weight = 1.0 + min(ev.authoritative_count * 0.12, 1.2)
velocity = ev.total_interactions / age_hours
return round((velocity * 0.55 + ev.source_count * 0.25 + ev.total_interactions * 0.2) * authority_weight * decay, 2)
热度公式不能只看总量,传播速度和权威来源占比更重要。上述示例把互动速度、来源数量和互动总量加权,并引入时间衰减与权威来源权重。这样一条刚发布但快速传播的事件能够超过一篇已沉淀多时的旧闻。实际系统还会根据业务目标调整权重,例如财经媒体需要提高政策类和公司公告类来源的权重。
热度计算完成后,选题策略模块再决定是否进入写作队列。为了避免重复报道,Agent会维护最近N小时内已覆盖事件库,对新候选做近似重复检测。若热度超过阈值且未覆盖,则生成选题卡片,附带事件描述、来源列表、关键数据和潜在角度。
二、自动写作:事实约束下的结构化生成
自动写作不能直接让大模型根据一句提示自由生成。新闻稿件要求事实准确、结构固定、风格统一。通常先把选题卡片转换为结构化提纲,包括核心事实、时间线、涉事主体、关键数字和可能的标题方向。提纲生成后再分步完成标题、导语、正文段落和标签,每一步都有独立校验。
一个可落地的提示词策略是使用角色约束和事实清单。角色提示要求模型只使用给定素材,不补充未经证实的信息;事实清单则把来源中的关键句和数字列出,强制模型在写作中引用。这样可以降低幻觉概率,但不能完全消除,因此还需要后续核验。
prompt_template = (
"你是一家严肃新闻媒体的编辑助手。\n"
"请根据以下事实清单撰写一篇300字以内的新闻简讯。\n"
"规则:\n"
"1. 只使用事实清单中出现的实体、时间和数字。\n"
"2. 不要添加背景猜测、评价或感叹。\n"
"3. 标题不超过25字,导语必须回答时间、地点、主体和事件。\n\n"
"事实清单:\n{fact_list}\n\n"
"输出JSON格式:{\"title\": \"\", \"summary\": \"\", \"body\": \"\"}"
)
风格控制方面,不同媒体对导语长度、引语使用、段落节奏和标题风格要求不同。可以在提示词中注入风格样例,也可以使用轻量级微调或LoRA让模型更好地遵循固定文风。对于自动化程度要求高的场景,还可以使用模板与生成结合:标题和关键数字来自规则系统,段落润色由模型完成,这样能减少事实偏差。
事实核验通常分为两个阶段。第一阶段是规则校验,检查稿件中的日期、金额、人名是否与来源一致,数字是否出现矛盾。第二阶段是外部检索确认,将稿件中的关键声明拆成查询语句,从可信知识库或搜索引擎结果中验证。如果置信度不足,段落会被标记为待人工复核。核验结果可以写回事件库,形成可追溯记录。
三、工程化落地与人工审核
将上述能力部署到生产环境时,新闻媒体Agent通常由消息队列和状态机驱动。一个事件从发现到发布会经历采集、聚类、选题、生成、核验、审核、发布等状态。状态机明确每个环节的输入输出、超时时间和异常回退路径。比如生成超时可以重新派发任务,核验失败则退回编辑草稿箱。
人工审核是安全兜底,不应被完全自动化替代。稿件自动生成后先进入审核队列,编辑可以看到候选标题、事实来源、生成稿和核验报告。系统会高亮低置信度片段,并展示原始来源链接,方便快速比对。通过审核后才允许发布,同时记录版本和操作者,支持回滚。
from enum import Enum
class TaskState(Enum):
COLLECTED = "collected"
CLUSTERED = "clustered"
SELECTED = "selected"
DRAFTED = "drafted"
VERIFIED = "verified"
APPROVED = "approved"
PUBLISHED = "published"
REJECTED = "rejected"
ALLOWED_TRANSITIONS = {
TaskState.COLLECTED: {TaskState.CLUSTERED},
TaskState.CLUSTERED: {TaskState.SELECTED, TaskState.REJECTED},
TaskState.SELECTED: {TaskState.DRAFTED},
TaskState.DRAFTED: {TaskState.VERIFIED},
TaskState.VERIFIED: {TaskState.APPROVED, TaskState.REJECTED},
TaskState.APPROVED: {TaskState.PUBLISHED, TaskState.REJECTED},
TaskState.PUBLISHED: set(),
TaskState.REJECTED: set(),
}
def can_transition(current: TaskState, target: TaskState) -> bool:
return target in ALLOWED_TRANSITIONS.get(current, set())
评估自动写作质量不能只看文本流畅度。除了ROUGE、BERTScore等文本相似度指标,还需要建立事实准确率、标题点击率、审核驳回率和发布后退稿率等业务指标。事实准确率可以通过抽样人工标注来持续监控,如果模型在某个领域频繁出错,则需要调整知识库或加入领域专用预训练数据。
合规方面,新闻媒体Agent需要处理版权、肖像权和内容安全等问题。采集时应过滤不允许转载的来源,写作时避免直接大段复制原文。内容安全模块可以在生成前后进行敏感词扫描和多模态审核,确保稿件符合平台规范。最终架构应当保留所有中间产物,这样任何一篇问题稿件都能追溯是信号层误判、生成层幻觉还是审核层疏漏。