从一条新闻到一个自主信息处理Agent

昨天(2026年5月29日)凌晨,I-95南向靠近Quantico海军陆战队基地路段发生严重车祸,5人死亡、30多人受伤。当我在手机上看到这条推送时,脑子里想的不是事故本身——而是:如果我们能让Agent自动完成信息收集、交叉验证、报告生成,记者和应急人员可以节省多少时间?

这条新闻来自WTOP,是一家本地广播电台。但实际救援中,需要从警方推特、医院声明、交通摄像头、目击者社交媒体等多个来源拼出完整拼图。每个来源可能互相矛盾(比如有的说“30多人受伤”,有的说“35人”)。手动验证要花大量精力,而Agent可以并行完成这些任务。

架构拆解:三个Agent协作

为了处理这类突发事件,我设计了三个专用Agent,按顺序和并行两种模式工作。

1. 信息收集Agent — 主动抓取+被动订阅

  • 工具:搜索引擎API(Tavily)、社交媒体API(Twitter/Facebook)、政府RSS订阅(Virginia State Police)
  • 任务:以初始新闻中的关键实体(“I-95 Stafford County”、“2026-05-29”、“fatal crash”)作为种子,搜索相关报道、官方声明、目击视频
  • 输出:一个结构化的数据集合,每条包含来源、时间戳、原始文本片段

2. 验证Agent — 交叉比对与置信度评分

  • 规则:每个关键字段(死亡人数、受伤人数、事故时间、地点)从至少两个独立来源验证
  • 冲突解决:如果来源不一致,按权威度加权(警方公告 > 主流媒体 > 社交媒体 > 个人推文)。同时标记置信度(高/中/低)。
  • 输出:一个已验证的事实表,附带冲突记录

3. 摘要Agent — 生成结构化报告

  • 输入:验证后的事实表 + 原始时间线
  • 任务:按“概要→关键数据→信息来源→时间线→影响”结构生成报告
  • 考虑输出格式:JSON(供内部系统消费)和Markdown(供人类阅读)

核心流程图

agent_workflow_news_pipeline

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
初始新闻触发
     ↓
信息收集Agent(并行)
 ├─ 搜索Tavily获取最新报道
 ├─ 爬取警方推特
 ├─ 检查本地新闻RSS
 └─ 提取地理坐标和时间
     ↓
验证Agent(串行+并行)
 ├─ 死亡人数: 来源A=5, 来源B=5, 来源C=4 → 加权平均 → 置信度高
 ├─ 受伤人数: 来源A=30+, 来源B=35, 来源C=32 → 取中位数32,置信度中
 └─ 原因: 施工区减速 → 所有来源一致 → 置信度高
     ↓
摘要Agent(LLM调用)
 └─ 生成最终报告(JSON+Markdown)

关键实现细节和踩坑记录

细节1:如何避免重复抓取

  • 给每个内容片段生成哈希(基于URL+发布时间),存入临时存储。下一次搜索时先检查哈希集合,跳过已处理的内容。

细节2:时间窗口管理

  • 事故发生在2:35 AM,搜索范围从2:30 AM开始到当前时间。之后每15分钟增量更新,直到事件热度下降。

踩坑1:API限流

  • Tavily和Twitter API都有速率限制。实现时增加指数退避重试,并设置最大并发数(我设为3)。

踩坑2:信息冲突处理

  • 试运行时发现受伤人数在多个来源中差异较大(30 vs 35 vs 32)。我的观点:在这种场景下不要盲目相信多数。应该优先采纳院方或警方直接发布的数字(如果有的话)。如果只有媒体,采用中位数或范围(如“30-35人”)。

踩坑3:LLM幻觉

  • 摘要Agent调用GPT-4时,曾自动补全“事故原因是司机疲劳驾驶”之类原文没有的信息。需要强制LLM只输出已验证字段,未验证字段标注“待核实”。

简化版动手实现(基于LangGraph)

下面是一个极简版Agent工作流,用Python伪代码展示核心逻辑。

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
from langgraph.graph import StateGraph, END

class NewsState:
    initial_news: str
    raw_sources: list = []
    verified_facts: dict = {}
    final_report: str = ""

def collect_sources(state: NewsState) -> NewsState:
    # 调用Tavily搜索,获取top 5结果
    results = tavily.search(state.initial_news, max_results=5)
    state.raw_sources = results
    return state

def verify_sources(state: NewsState) -> NewsState:
    facts = extract_and_validate(state.raw_sources)  # 内部逻辑:去重、冲突解决
    state.verified_facts = facts
    return state

def generate_report(state: NewsState) -> NewsState:
    prompt = f"""根据已验证事实{state.verified_facts},生成突发事件简报。只使用已验证字段,未验证的写'待核实'。"""
    report = call_llm(prompt)
    state.final_report = report
    return state

# 构建图
graph = StateGraph(NewsState)
graph.add_node("collect", collect_sources)
graph.add_node("verify", verify_sources)
graph.add_node("report", generate_report)
graph.set_entry_point("collect")
graph.add_edge("collect", "verify")
graph.add_edge("verify", "report")
graph.add_edge("report", END)
app = graph.compile()

# 执行
state = NewsState(initial_news="5 dead, dozens injured in crash on I-95 southbound in Stafford Co.")
result = app.invoke(state)
print(result.final_report)

这对开发者意味着什么

突发事件处理只是Agent在实时信息领域的一个应用。同样的模式可以套用到舆情监控、竞品动态、金融事件响应中。关键收获是:不要试图用一个Agent包揽所有事情,拆分成专门的Agent+明确的冲突解决策略,才能让系统可靠。 如果你的产品需要从多个来源自动聚合并验证信息,今天提到的三Agent架构是一个非常实用的起点。

另外注意,验证Agent是整个系统的守门人——没有它,信息收集Agent会收集垃圾,摘要Agent会输出垃圾。花时间在验证逻辑上,比花在优化摘要语法上重要得多。

(本文中涉及的真实事故新闻仅作技术案例,向死伤者致哀。)