核查 𝕏 帖子中的事实
此示例使用 Grok API 构建 AI 事实核查工具,结合网页和 𝕏 核对帖子中的说法。它演示如何并行核查每项主张,并在研究结果中给出来源。
粘贴 𝕏 帖子链接。Grok 会阅读帖子及其图片和视频,提取其中的主张,然后为每项主张分别发起请求,并行检索网页和 𝕏。最后,它写出类似社区注释的说明,每句话都链接到搜索实际返回的来源。你可以通过网页或终端运行,实时查看各次搜索及找到的页面。
你将学到
通过 X Search 根据链接找到帖子,启用以下两项功能以读取其图片和视频:
enable_image_understanding和enable_video_understanding以结构化输出提取帖子中的主张,并在 Grok 编写时实时展示
并行分派任务:为每项主张分别发起请求,使用
webSearch()和xSearch()进行调研,待并行请求完成后汇总结果根据引用验证来源:只保留搜索以引用形式返回的来源,没有来源支撑结论时回答“证据不足”
写出只能引用已保留来源的注释,在 Schema 中用
enum枚举可引用的来源编号实时展示每次搜索及结果页面,使用
server_tool_call事件和include: ["web_search_call.action.sources"]将调研模型切换为
grok-4.20-multi-agent,让四个 Agent 协作核查每项主张通过服务器发送事件从 Node 服务器向网页实时传送进度,并在页面关闭时取消任务
运行示例
需要 Node.js 22.13 或更高版本。将 API 密钥保存在 .env(仓库根目录),或导出环境变量 XAI_API_KEY。
cd examples/x-post-fact-check/typescript
npm install
npm run web打开 http://localhost:3000,粘贴帖子链接并点击 Fact-check,或点击四个示例帖子之一:GameStop 内部人士买入股票(含图片)、Starship 首次轨道飞行(含视频)、哈里·凯恩追平英格兰队出场纪录,或当年的诺贝尔物理学奖。页面类似事实核查工作台。左侧边读边展示帖子、Grok 查看过的图像或视频及其观察结果。右侧每张卡片对应一项主张,先显示搜索及找到的网站,再给出判定:有依据、缺少背景或证据不足。Grok 会在帖子下方逐句写出注释,来源按编号列在下面,页面还会显示费用。开启 Deep research 可让四个 Agent 调研每项主张。点击 Stop 或关闭页面可取消。
在终端核查帖子时,请传入其链接。添加 --deep 可进行深度调研,默认示例为 GameStop 帖子。
npm start -- https://x.com/unusual_whales/status/2106776609457844610注释、各项主张及其来源会保存至 output/,以 Markdown 格式输出,同目录下还有包含完整结果的 JSON 文件。
实测核查 Starship 帖子耗时 39 秒,约花费 0.15 美元;GameStop 帖子的主张数量是前者的两倍,测试时 API 响应较慢,约需三分钟,花费 0.30 至 0.40 美元。其中约三分之一是搜索费用:X Search 每获取 1,000 条帖子收费 5 美元,网页搜索每 1,000 次收费 5 美元。其余费用来自 50,000 至 130,000 个 token。网页和终端均会在结束时显示 API 报告的运行费用。
工作原理
共享代码位于 src/factcheck.ts。factCheck() 执行三个步骤,并通过回调报告进度,因此网页和终端可各自呈现相同的进度信息:
readPost()发出一个流式grok-4.7请求,使用xSearch(),并要求以 JSON 返回帖子文本、图像与视频的内容,以及最多四项主张。Grok 通过 X Search 的x_thread_fetch获取帖子,在 X 的图片服务器上打开配图,并通过view_x_video观看视频。server_tool_call事件实时报告这些操作及图片或视频的 URL,以便页面展示相应媒体。json事件在 Grok 编写过程中逐步交付帖子及各项主张,页面会立即为每项主张生成卡片。只有 X Search 实际返回的帖子才能成为引用。若某链接对应的帖子未出现在引用中,则核查失败,以免 Grok 猜测其内容。帖子日期取自含有发布时间的帖子 ID。checkClaim()使用独立的流式请求调研一项主张,调用webSearch()和xSearch();factCheck()为所有主张同时执行该步骤。Grok 以 JSON 返回依赖的来源、判定和理由。请求设置include: ["web_search_call.action.sources"],因此每次网页搜索都会通过server_tool_call事件返回找到的页面。citation事件列出搜索返回的全部页面和帖子。Grok 罗列的来源若不在其中就会被剔除,判定必须由保留的来源支撑:“有依据”需要支持该主张的来源;“缺少背景”需要反驳主张或补充背景的来源;其余情况均为“证据不足”。某项主张的请求失败时也记为“证据不足”,不会中断其他核查。writeNote()为所有主张保留下来的来源编号,要求以 JSON 返回注释,即一个句子列表,每句附上依据的来源编号。Schema 将编号限制为enum中枚举的已保留来源,minItems: 1要求每个句子至少引用一个来源,这样就无法引用搜索没有返回的资料。没有可用来源的主张不会纳入注释。json事件会逐句返回 Grok 已写好的内容。
三个步骤都采用低推理强度。即使如此,Grok 仍会为每项主张进行两到四次搜索。实测中,GameStop 帖子称其 CEO 买入了“约 5,700 万美元”的股票,Grok 将这项说法判为“缺少背景”:申报文件及帖子的配图显示合计约 7,400 万美元。
如果开启 Deep research,或在终端传入 --deep,checkClaim() 会改用 grok-4.20-multi-agent。对该模型而言,reasoning.effort 决定参与每项核查的 Agent 数量,而非思考时长:low 或 medium 使用四个 Agent,high 或 xhigh 使用 16 个。本应用使用 low。只有主 Agent 的工具调用会返回,因此卡片显示的搜索数少于实际搜索数。多 Agent 模型支持内置工具,例如 webSearch() 和 xSearch(),但不支持自定义函数,这一步只需内置工具即可。深度调研按 API 默认行为将响应保留 30 天。若不存储响应,SDK 会请求加密推理数据,多 Agent 模型会返回每个 Agent 的加密状态,使单个流式事件可能超过 SDK 可读取的 1 MiB。
src/server.ts 为网页运行 factCheck(),处理页面传入的链接,并以服务器发送事件报告每一步。它会将 AbortSignal 传给每个请求,因此关闭页面或点击 Stop 即可取消正在运行的任务。public/index.html 使用原生 HTML 和 JavaScript 展示这些事件,并直接从 X 的服务器加载帖子的图片或视频。src/index.ts 在终端中输出相同步骤,并将结果保存至output/。