ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【元宝搜索开发者征文大赛】转发之前先溯个源:我做了个传闻核查器,40 条热搜谣言实测,不联网的大模型只能判对一半

【元宝搜索开发者征文大赛】转发之前先溯个源:我做了个传闻核查器,40 条热搜谣言实测,不联网的大模型只能判对一半

阶段标签:已上线服务
一句话介绍:粘贴一条传闻或一张聊天截图或者直接输入传闻,它去元宝搜索里把证据翻一遍,告诉你这事是真是假、官方说过什么、最早是谁传出来的、后面还有哪些相关的事。


一、起因:想转发,又不敢转

灵感来自一次犹豫。

那天Q群刷到一条截图的消息,白底黑字,像是从哪个通知里截出来的:“国家卫健委宣布,2026 年 1 月 1 日起全面取消医保个人账户,所有余额清零”。我第一反应是这事挺大的,得让家里人知道,手指已经按住了转发。

然后我停住了,医保这方面我不在行,之前都是学校交完医保就不管这方面了,万一又是 fake news 或者某个断章取义的文字截图不就炸了。

上一次我往家族群里转一条"某某食物致癌",被表弟甩了一个辟谣链接,那种尴尬我还记得。再往前,朋友群里有人转"高速节假日免费要取消了",被人回了一句"这都 2019 年的老谣言了",群里安静了半天。我不想再当那个人。

可我自己也拿不准。不转,万一是真的,家里人错过了;转了,万一是假的,又是一轮打脸。于是我去搜。某度某 bing 某狗搜出来都是一堆标题,有说取消的,有说辟谣的,有 2019 年的旧文,有自媒体复制粘贴的,还有自媒体套自媒体的,我一篇篇点进去,看完还得自己判断哪篇靠谱。等我把这事弄明白,已经过去二十分钟,转发的念头早就没了。

这种犹豫经常发生。热搜上一条"网传",朋友圈一张"内部文件"截图,短视频里一句"刚刚官宣",你想分享,又怕被说传谣。我们真正想知道的其实就三件事:这事是真的吗?最早是谁说的?官方到底表过态没有?如果是假的,我还想知道它是从哪一步开始变味的,是有人凭空编的,还是一条真新闻被传歪了。

这就是这个项目的全部动机。我想要一个东西,转发之前先过一遍它,二十分钟的翻链接变成一次点击,给我的不是"我觉得",而是一份能直接甩进群里的带出处的证据链。谁要质疑可以直接把这个甩给他。不解释。

二、为什么要造轮子

有人会说,现在的大模型不是都能联网搜索了吗,豆包、元宝、Kimi,随便哪个问一句不就行了?

我都试过。它们确实能搜,也确实会回答。但回答完之后,我发现自己并没有比之前更有底气。它给我的是一段话加几个网页链接,真正的工作还是我的:这几个链接哪个是政府网、哪个是营销号?它引用的那篇文章是今年的还是五年前的?它说"相关部门已辟谣",是哪个部门、哪一天、原话是什么?它没说,我就得自己点开一个个看。说到底,它把我要翻的二十个链接压缩成了五个,但串起来的活还是我在干。它们最有用的反倒是思考链,但还得自己展开慢慢看,顺着大模型怎么想的再来反推结果,不是倒反天罡了吗?

更关键的是,它们回答的都是"是不是真的",而我还想知道假的话,是从哪里开始假的。一条谣言很少是凭空出现的,它往往是一条真新闻被截了半句、换了个主语、改了个数字,然后在转发里越传越离谱。知道源头在哪,比知道"假的"更有用,因为那才是能跟别人解释清楚的东西。

我还做了一个对照实验来确认这个判断:同一个大模型,不联网,直接问它一条传闻真不真。40 条传闻它只答对 17 条;20 条真实发生的政策新闻,它只判对 3 条,其余一律"证据不足",因为这些事发生在它的知识截止日期之后。还有 1 条谣言它斩钉截铁地说"属实",理由写得像模像样。联网能解决"不知道",但解决不了"不给我看链条"。说到底,这方面强的不是大模型本身,而是喂给它的数据质量怎么样。一个好的搜索引擎或者数据源非常关键。

所以我要的东西慢慢清楚了。不是一个答案,而是一条看得见的链条:最上面是一个明确的判定,判定下面每一句话都指向一条证据;证据要分等级,政府网和营销号不能混在一起;要有一条时间线,告诉我这事最早出现在什么时候、谁发的、后来怎么传开的;要有官方的原话,有就贴出来,没有就老实说没找到。

要做到这些,搜索引擎就不能只是"找几个链接",它得能按信源类型搜、按时间段搜、按指定站点搜,并且把每条结果的发布时间、站点、摘要都结构化地交给我,让程序而不是我来串。这正是元宝搜索 API 做的事,也是我选它的原因。恰逢元宝搜索征文大赛,于是一拍即合,免费的额度不用白不用,万一真有用呢?

展示环节


因编辑器有文件大小限制,所以有点模糊,欢迎自行体验。

三、它是怎么工作的

整个工作流程可以用一句话概括:先把传闻拆成几句能查的话,再从几个不同的角度去搜,把搜到的东西按可信度排好队,交给大模型下判断,判断的每一句都要指向一条证据。画出来是下面这张图,蓝色的步骤是元宝搜索在干活,橙色的步骤是大模型在干活,绿色是最后交到你手上的东西。

【核查链条总览】

粘贴传闻 / 截图识别

拆成原子主张
大模型

五路检索
元宝搜索 SearchPro

去重 + 信源分级
五档白名单

溯源时间线
按日期排 + 向前补搜

原文深读
抓前 4 篇原文

有据判定
大模型 + 9 条硬规则

延伸话题
再搜 3 次

核查卡

整体流程还是有点小复杂的,但用起来很简单,无脑只有一个按钮,只有一步:把那段"网传"粘进输入框,或者直接把聊天截图 Ctrl+V 粘进来,点"开始核查"。接下来的四十秒里页面会实时显示它在干什么,拆出了哪几条主张、正在搜哪一路、深读了几篇原文,最后吐出一张核查卡。卡片从上到下的顺序,就是我在第二节里说的那条链条:判定、依据、官方口径、首发来源、时间线、全部证据、延伸话题。用户直接看结果就行,具体怎么做交给代码和大模型还有元宝的搜索引擎。

下面分步骤说说每一环在做什么,以及为什么这么做。

【整体流程】

3.1 先拆,再搜

一条传闻往往不止一个说法。“卫健委宣布取消医保个人账户,余额清零"其实是两件事:有没有宣布取消,余额会不会清零。第一步是让大模型把传闻拆成最多三条"原子主张”,每条只说一件事,并为每条生成三组检索词:一组最像新闻标题的核心关键词,一组带"辟谣""回应"的求证式关键词,一组换种说法的备用关键词。

然后是搜。这里是元宝搜索发挥作用的地方。它有几个参数对这个场景特别合适:Mode可以要求返回权威垂直信源,Industry可以限定只搜政府站或新闻站,Site可以定向搜某一个域名,Freshness可以限定时间段。每条主张我会搜五路:

pages+=search(core,mode=2,cnt=20)# 混合结果,面最广pages+=search(core,industry="news",cnt=10)# 只要新闻站pages+=search(core,industry="gov",cnt=10)# 只要政府站pages+=search(debunk,mode=0,cnt=10)# 带"辟谣"的求证词forsitein("piyao.org.cn","vp.fact.qq.com"):# 辟谣平台站内定向pages+=search(short_query,site=site,cnt=10)

最后两路是关键。中国互联网联合辟谣平台和腾讯较真是专门辟谣的地方,如果一条传闻已经被辟过谣,大概率在那里能找到。我原来用整句话去站内搜,几乎搜不到,后来发现这类站点索引小,得用短关键词,把检索词压到 12 个字以内之后命中率立刻上来了。

调用本身很简单,一个 POST 请求,返回的每条结果都带标题、链接、站点名、发布时间、摘要和相关性分数:

headers={"Authorization":f"Bearer{api_key}","Content-Type":"application/json; charset=utf-8"}resp=requests.post("https://api.wsa.cloud.tencent.com/SearchPro",json={"Query":"医保个人账户 取消 辟谣","Industry":"gov","Cnt":10},headers=headers)

3.2 给信源分等级

搜回来的东西要排队。我用的是标准版(个人账号只能开到这一档),拿不到旗舰版才有的权威度字段,所以自己建了一张域名白名单,分五档:政府和官方机构、中央媒体、主流媒体、门户和垂直站、自媒体和未知。排序时先按等级,同等级再按相关性分数。这一步看着土,但效果很直接:判定时模型看到的前几条,一定是政府网、新华社、人民日报这一类,营销号排在最后。

3.3 找最早的那一条

这是我最想做的一步,也是最容易做错的一步。

最朴素的做法是把所有带日期的结果按时间排,取最早的。我一开始就是这么干的,结果测试在高速公路免费那条传闻上翻了车:工具找到一篇 2019 年的报道当"首发",点开一看,是讲五一假期高速增加免费通道的,跟"取消免费"这条谣言根本没关系,只是话题相近。

后来改成两步。先按时间排序,在最早的那段时间之前再往前搜一个 30 天的窗口,看有没有漏掉更早的;然后把最早的 12 条交给大模型,让它判断其中哪一条是"最早转述这条传闻本身"的,而不是最早的相关背景报道。如果一条都不是,就老实说"检索范围内没找到传闻本身的早期版本",并把最早的背景报道单独标出来。

这个区分很重要。有的谣言确实能追到源头,有的追不到,追不到的时候硬指一篇当源头,比不说更糟。

3.4 原文深读

做到评测第三轮的时候,我发现一类错误反复出现:传闻说"某文件提出建设 1000 所以上优质普通高中",政府网的解读原文明明有这句,但搜索摘要是节选,恰好没截到,模型就判成"部分属实"。我们日常搜索的时候也容易碰到这种事,预览界面就只看到个摘要或者关键字,点进去发现货不对板或者只是偏安一隅。

搜索摘要毕竟是摘要。所以我加了一步:判定之前,每条主张挑出等级最高的 4 篇证据,把网页原文抓下来,围绕主张里的关键词截取原文片段,和摘要一起交给模型。关键词特别照顾了数字,年份、金额、人数、百分比、文号这些,因为它们恰恰是摘要里最常丢、又最影响判断的东西。

3.5 判定的规矩

最后一步是让大模型下结论。这一步我没有让它自由发挥,而是写了九条硬规矩,核心的几条是这样:

1、只能依据给定的编号证据,不得使用证据以外的知识,不得编造证据、链接、日期或机构表态。
2、没有与主张直接相关的证据时,必须输出「证据不足」。
3、「部分属实」只用于有证据明确表明某条主张与事实不符的情况;核心主张已被权威信源证实、其余只是细节在摘要里没出现、也没有证据与之矛盾时,应判「属实」,并说明哪些细节未能逐一核实。
4、某个表述同时出现在另一份文件里,不构成「本文件没有该表述」的证据。

输出是四选一:属实、不实、部分属实、证据不足。每句理由末尾都要带证据编号,官方口径单独一栏,没找到就写"未检索到"。

判定完,再让模型根据话题和实体生成三个"读者可能还想了解"的检索词,各搜一次,作为延伸话题附在卡片末尾。

整个过程一条传闻大约要调 8 到 16 次搜索、3 次大模型,耗时10秒上下。活动期间每月 6000 次免费额度,够核查两百多条。

3.6 截图识别:群里转的多半是图

回到第一节那个场景,我手里的其实不是一段文字,是一张截图。让用户先把截图里的字打出来,这个工具就已经输了一半。所以加了截图识别,三种入口走同一条路:点"上传截图"、把图拖到输入卡上、或者在页面任何地方直接 Ctrl+V。识别出来的文字填进输入框,可以先改一改再核查。

识别没有走大模型。一是访问者填的大模型不一定支持图片,二是把别人的聊天截图发给第三方模型我自己也膈应。用的是服务器本地的 RapidOCR,PaddleOCR 的模型跑在 onnxruntime 上,纯 CPU,中文效果够用。图片进来先缩到 1600 像素以内,识别完就丢,不落盘:

img=ImageOps.exif_transpose(Image.open(io.BytesIO(data))).convert("RGB")ifmax(img.size)>1600:img=img.resize(...)# 缩小,CPU 上更快res,_=engine(np.asarray(img)[:,:,::-1])# RapidOCR 要 BGR

有一个细节值得说。OCR 返回的是一行一行的文字块,直接拼起来会把一条聊天记录里的不同气泡粘成一句。我用每行文字框的坐标做了分段:两行之间的垂直间距超过行高的八成,就认为换了气泡,另起一段;上一行以句末标点结束也另起一段。这样一张群聊截图识别出来,基本还是一条消息一段。

效果上,一张普通聊天截图一两秒,我用那张信息很密的宣传海报测了一下,93 行文字 6 秒。

既然是公网服务,识别又是纯 CPU 的活,就得防着被刷。服务端做了两层限制:按来源 IP 每分钟 6 张、每小时 30 张;全站同一时刻只识别一张,排队超过 8 秒直接返回"稍后再试"。核查接口也有类似的限制,每分钟 5 次、每小时 30 次。这些数字都在代码开头,一眼能看到,想改就改。

四、它长什么样

第一版界面是 Streamlit 拼的,能用,但确实丑。后来重做成了自己写的页面:后端是 FastAPI,核查进度通过 SSE 实时推到前端;前端是纯 HTML、CSS 和 JS,没有引任何外部库和字体,国内打开不卡。设计上定了个"调查编辑部"的调子,暖白的纸感底色、墨蓝的主色、一个"证据橙"做强调,标题用衬线字。

【主页】

页面的主舞台是那条链条。点下"开始核查"之后,七个节点横着排开,拆主张、五路检索、溯源时间线、原文深读、有据判定、延伸话题、核查卡,节点之间的线随着后端推过来的进度一段段画出来,当前节点在呼吸,完成的打勾,下面是一个滚动的日志面板,拆出了什么主张、正在搜哪一路都看得见。我想让"过程"本身成为界面的一部分,而不是转一个圈等结果。

结果区从上到下就是第二节里说的那条链条:判定卡用大号衬线字写判定词,旁边一个环形进度显示置信度,数字从 0 滚到实际值;结论里的每个[编号]都是可以点的,悬停能看到那条证据的站点和日期,点一下跳到证据表对应的行;关键证据、官方口径、首发来源各一块;时间线是竖向的,进入视口时线从上往下长出来,首发的那条高亮并标"首发";再往下是能排序的完整证据表、三张延伸话题卡,最后是这次花了多少次搜索、多少秒、读了几篇原文。

同时我也特别设计了是否调用大模型的选项,因为调用需要使用大模型API,有时候不想要用到大模型,只是单纯的想要辅助搜索,只需要勾选左边的仅检索就可以了

就拿我举例那条医保传闻说。工具拆出两条主张,拿到 95 条证据,其中政府和央媒 占多数。判定是不实,置信度 95%。关键证据的第一条是国家医保局 2023 年 10 月的辟谣声明,第二条是中国互联网联合辟谣平台 2025 年 7 月的文章,标题就叫《警惕!"医保’个人账户’将全部取消"系旧谣新传》。官方口径一栏写的是:职工医保个人账户制度保留,不存在全面取消或余额清零,2026 年的政策重点是推进跨省共济。

【医保清零传闻的首发来源和传播时间线】

最有意思的是首发来源。工具把这条谣言追到了2019 年 5 月 22 日一个自媒体网站的文章,标题是《全国统一取消医保个人账户,余额要清零?》,并解释说它把当年"城乡居民医保个人(家庭)账户取消"的政策误读成了"全面取消并清零"。辟谣平台说它是"旧谣新传",工具把那个"旧"具体到了哪一年、哪个站、哪篇文章。我把这张卡的截图发进了群,这次没人甩辟谣链接,倒是有人问这工具哪来的。

五、它到底靠不靠谱

光看几个案例是不够的,所以我做了一个评测集。

评测集怎么来的不实的 20 条,全部取自中国互联网联合辟谣平台已经明确辟过谣的文章,把传闻本身改写成"网传"的口吻;属实的 20 条,取自中国政府网、新华网等近一年的具体政策和事实新闻,同样改写成"网传"口吻,内容不夸大、不改数字。标签来自原站点,不是我拍的。初版是用脚本加大模型自动筛的,然后我逐条人工复核,删掉了 8 条站不住脚的,比如原文只是科普提醒并没有判定为谣言的,或者凭常识一眼就能看出假的,再补了 8 条并核对了原文。一共 40 条,覆盖医保、社保、高考、房贷、交通、食品安全等 19 个话题。

跑了四轮每一轮都是看错例、改规则、再跑一遍,搜索结果有本地缓存,所以后几轮只花大模型调用。

轮次改了什么判定准确率不联网基线
第一轮初始版本83.8%43.8%
第二轮收紧"部分属实"的口径,修正 3 条评测数据91.2%41.2%
第三轮加入原文深读、JSON 修复重试92.5%46.2%
第四轮深读关键词补上"75万亿元"这类数字格式100%43.8%

其他指标:每条平均 7.7 次搜索、39 秒;证据不足为零;每一条的关键证据里都至少有一条政府或央媒来源。

不联网基线是同一个模型直接判断的成绩,四轮都在 41% 到 46% 之间。两边差的那 50 多个百分点,就是"联网搜索"这四个字的价值。

错例也值得看。第三轮有一条 HPV 疫苗的新闻,新华网原文写的是"2 月中下旬各省份均已开展疫苗采购",工具因为搜到各地采购时间分散,判了"部分属实"。它的推理其实有道理,只是比新闻稿更较真。还有一条"中南大学首届直招 145 人",来源文章没进检索结果前列,145 这个数字无从核实,它也判了部分属实。这两条告诉我,工具的上限就是搜索可见的范围,它不会凭空知道任何东西,这既是它的局限,也是它值得信任的原因。

六、没做完的和想做的

1、权威度判断用的是我自己维护的域名白名单。旗舰版的元宝搜索会直接返回权威度分数,企业用户可以省掉这一步,个人开发者暂时只能这样。地方媒体和机构自建的域名没收录的,会被归到"自媒体/未知"那一档,这是白名单天然的毛病。

2、截图识别对手写体和花哨排版效果一般,识别完的文字记得扫一眼再点核查。

3、还有一个更大的口子,是传播渠道。现在传闻主要走四条路:QQ、微信这类社交软件,某乎、某书这类论坛,某音、某手这类短视频平台,还有网页和报纸这类传统媒体。我自己感触最深、接触最多的反倒是短视频,但视频的溯源最难做,得先把画面和声音识别成文字,而且搜索引擎普遍索引不到短视频里的内容,元宝搜索也不例外。很多传闻恰恰是在视频里传歪的,再被营销号添油加醋,这一段链条现在是空的。什么时候能把这个口子补上,辟谣才算真的方便。

4、最后一点是态度上的:这个工具给出的从来不是"真相",而是"根据公开可查的权威信息,目前能得出的结论"。它每一句话都带出处,就是为了让你可以不信它,自己点开看。

总言

就像福尔摩斯的那句名言:排除一切不可能的,剩下的即使再不可能,那也是真相。我们想做的,就是把所有的可能摆出来,然后一一排除,但万事有为应有尽,此身无我自无穷。元宝搜索搜不尽天下万物,所以“溯源”也不会给你百分百的真假概率,只是帮你把所有能搜到的做整合、判断,把证据链摆在你的面前,你可以选择信或不信。决策权依旧在人的手上。

“溯源”取自“追根溯源”,我们把溯源的工具做出来交给你,但希望你依旧拥有追根的胆识和追根的意识,即使工具给出的概率只有百分之一,你也能有选择那百分之一的勇气和权利。

但是如果有年幼的小孩或者不常上网的老年人,如何给他们辟谣,我相信,“溯源”里的官媒、官方文章证据链会是最有说服力的工具。


说明。文中所有运行结果、数字和截图均来自真实调用,代码不含任何密钥。代码与海报由AI进行辅助实现

项目仓库:https://github.com/yimengzhiyan/suyuan

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进