资讯详情

资讯详情

【元宝搜索开发者征文大赛】用元宝搜索做一个「敢说不知道」的竞品对照仪

一句话概括把元宝搜索返回的几十条网页自动收敛成一张每个格子都能点回原文的对比表查不到就写查不到几个来源打架就把几个值并列摆出来绝不替你挑一个看起来最顺眼的数字。项目说明作品阶段可演示原型本地可一键启动已完成 95 项自动化测试尚未对外部署选题方向调研分析 · 竞品功能与定价对比技术栈Python 3.10 FastAPI httpx SQLite Jinja2 原生 HTML/JS无大模型参与抽取与判定元宝搜索接入SearchProVersion2025-05-08wsa.tencentcloudapi.comTC3-HMAC-SHA256 签名实际运行3 个对比对象 × 2 个维度10 次真实调用 4 次缓存命中5.3 秒66 条证据一、需求从哪里来我自己每周都在做的那件蠢事我在做技术选型时需要回答一个很朴素的问题混元、通义、豆包同样跑 100 万 token到底谁更便宜原来的做法是打开三个官网找到各自的「计费说明」用浏览器搜索框 CtrlF 找「元/百万」抄到一张 Excel 里再把链接贴到备注列。听起来十分钟能搞定实际上每次都要花掉一两个小时原因有三个同一个厂商有很多个模型。混元 Turbo S 输入 0.8 元/百万 tokens混元 Hy3 输入 1 元/百万 tokens腾讯云 VITA 推理输入 1.2 元/百万 tokens。它们都叫「腾讯混元」但价格不是同一个数。抄哪一个凭感觉挑一个就是把一张有争议的表交出去。官网找不到就去二手文章里找。技术社区、公众号转载、比价博客都写着「XX 元/百万 tokens」但没有一条标清楚是哪个模型、哪一天、什么上下文档位。抄完之后无法回溯。一周后老板问「这个 0.8 是哪儿来的」我只能重新搜一遍。所以我真正想要的不是一个「能搜的搜索框」而是一份能拿去过评审的表每个数字后面跟着原文链接和抓取日期互相矛盾的数字不许被悄悄抹平查不到的就老老实实空着。这就是这个工具的出发点把一个会撒谎的方便工具换成一个会承认自己不知道的可靠工具。二、为什么需要搜索这些信息不在我的知识里也不该在我的代码里这个需求有个硬性约束价格是会变的。我不能把价格写死在配置里否则三个月后就全错了。它必须是每次运行的时候从公开互联网上现查的。那为什么不直接让大模型去回答因为大模型回答「豆包输入多少钱」时给出的数字无法核验——你没有办法知道它是从哪篇文档里读到的也没有办法知道那个文档是哪一年的。评审要的是「注明时间和出处的对比表」而大模型的原生输出恰恰缺少这两样东西。元宝搜索在这里承担的是唯一的、不可替代的外部信息入口它返回的是原始网页标题、URL、站点、日期、正文片段不是被模型改写过的结论因此每一条都能回溯它支持site参数锁定域名因此我可以直接问「只在 cloud.tencent.com 里找混元的价格」而不是让一堆比价博客混进来它返回date字段因此我可以判断一条价格是「三个月前的」还是「两年前的」进而决定它能不能当主结论。一句话搜索负责「拿到可核验的原始材料」我的代码负责「把材料变成一张诚实的表」大模型不参与中间任何一步。三、怎样实现3.1 接入第一次调用踩到的四个坑接入本身不复杂拿 SecretId / SecretKey 走 TC3-HMAC-SHA256 签名POST 到wsa.tencentcloudapi.comActionSearchPro。但真实跑通之后我发现了四个文档里不显眼、却直接决定架构的细节这一节是我认为对后来者最有价值的部分返回体外层是Response大写 R不是小写。写resp[response]会一路拿到空列表而且不报错。Response.Pages是字符串数组不是对象数组。每个元素是一段 JSON 文本必须再json.loads一次才能拿到url / title / site / date / passage。第一次我按对象数组写取到的全是None排查了很久。Site参数一次只支持一个域名。想同时限制两个官网只能发两次请求。这直接决定了我的检索预算模型域名白名单不是「过滤条件」而是「调用次数」。date是2026/06/10 14:37:30这种非标准格式site字段是中文站点名「腾讯云」而不是域名——绝对不能用site字段做主体归属否则「腾讯云」三个字会把所有腾讯系产品都算成同一个主体。第 4 点后来变成了工具里的一条硬规则site字段只能作为最低档的弱证据且必须同时出现主体名才允许归属。3.2 检索词设计把「一次搜索」拆成「三类轮次」如果只发一句「腾讯混元 输入价格」回来的结果里会混进大量比价博客。所以我把一个「主体 × 维度」的格子拆成三类检索轮次检索词示例参数目的官方轮每个格子必发腾讯混元 输入价格 官方 文档sitecloud.tencent.com优先拿一手文档补充轮预算允许时腾讯混元 输入价格不限制 site官网没有明示时补二手来源时效轮仅时效敏感维度腾讯混元 输入价格 2026freshness压住过期价格三轮共享一个预算池按维度优先级从高到低分配超预算的计划不会被静默丢弃而是标记成budget_exhausted最终在表格里显示为「因预算未检索」——让用户知道是钱不够而不是没有数据。同时做了一次跨主体去重一句「腾讯混元 DeepSeek 价格对比」可能同时服务两个格子只需要调用一次。这一轮在本次运行中省掉了 4 次调用计划 14 次、实际 10 次。3.3 结果处理四道闸把「看起来像价格」变成「可以采信的价格」搜索结果里最危险的不是没有数字而是错误的数字看起来很正确。所以每一条正则命中都要过四道闸锚点闸命中片段前后 60 个字符内必须出现该维度的别名「输入价格」「输入费用」否则丢弃。这一闸拦掉了「上下文长度 128k」被当成价格的情况。反例闸出现「即将」「预计」「已停售」→ 保留但降级不参与主结论。营销闸「低至」「起价」「赠送」→ 降级并标注「非标称价格」。量纲闸归一化后的数值必须落在[min_value, max_value]内防止把版本号、日期、上下文长度当成价格。然后是归属判定这是整个项目最费功夫的部分。同样是「0.8 元/百万 tokens」来源不同可信度差好几个数量级档位判定依据置信度是否可独立支撑结论domain_exact命中官方域名且 URL 在官方文档前缀内1.00是A 级domain_subURL 命中官方文档前缀但域名未登记0.90是A/B 级domain_generic命中官方域名但不在文档前缀内社区文章/新闻0.70是但上限 B 级alias_in_title标题出现别名长度 ≥30.75是B 级name_in_title标题出现主体全名0.60否C 级site_field仅site字段出现主体名0.50否D 级第三档domain_generic是真实跑批之后补上的。第一版里我把「域名命中官方域名」一律判成 A 级结果一篇发在cloud.tencent.com/developer/article/的社区文章用一句「输入 1 元/百万 tokens」拿到了 A 级证据直接成了主结论。域名是官方的作者不是官方的——这个区别必须体现在分级里。3.4 判定宁可标「冲突」也不挑一个数聚合阶段有三条铁律多值全部保留绝不取平均。平均即编造。强证据A/B之间数值差异超过容差 → 判为冲突primary_value置空把各个值并列展示。「时间更新」只在最近 180 天内证据自洽时才允许解释差异。这一条是我在真实数据上改出来的下面第四部分会讲为什么。冲突判定之后还有一层「缺口归因」把「没查到」拆成五种完全不同的情况因为它们的待办事项完全不同缺口类型含义用户该做什么no_hit检索没有任何命中换检索词或放宽限制out_of_scope有命中但都归属到了别的主体补充官方域名no_extract已归属该主体但抽不出该维度的值人工看一眼原文ambiguous同一页面出现多个不同取值多模型/多档位需要指定具体模型budget_exhausted预算被裁剪没有检索提高调用上限blocked检索词被风控拦截改写检索词3.5 关键代码一处最核心的判定冲突检测里有一段代码直接决定这张表诚不诚实# app/core/analyzer.pydriftself._drift_note(strong)# 各来源日期是否相差 180 天ifdrift:# 漂移豁免的前提最近周期内部必须自洽。# 若最近 180 天内的来源本身就给出不同取值多模型/多档位# 那是口径冲突不能用「时间更新」解释掉。recentself._recent(strong)ifnotrecentorself._spread_within(recent,tolerance):returndisplays,True,# 判冲突returndisplays,False,driftreturndisplays,True,以及证据落盘每一次调用的原始响应都会写进data/raw/{run_id}/{plan_id}.json报告里每一条证据都带raw_path。这意味着任何一个数字都可以被独立复核——重新解析那个文件就行不需要重新调用 API。四、最后得到什么一次真实运行4.1 输入在表单页输入三个对比对象和两个维度对比对象腾讯混元 / 通义千问 / 豆包对比维度输入价格 / 输出价格单位元/百万tokens4.2 过程点击「开始检索并生成对比表」后进度页实时显示已完成调用数、缓存命中数、失败数与当前检索词该截图取自另一次更大的 4 对象 × 3 维度任务因此总数与本例不同。4.3 输出结果页给出 6 个格子的结论对比对象输入价格输出价格腾讯混元存在冲突0.8 / 1.2 / 1 元存在冲突2 / 3.5 / 4 元通义千问证据缺口证据等级不足仅 0.3 元来自非官方站点证据缺口同左豆包存在冲突0.8 / 6 元A 级证据已核验30 元/百万 tokensB 级整体指标覆盖率 70.0%官方来源占比 86.0%66 条可核验证据3 个冲突2 个缺口1 个已核验结论耗时 5.3 秒。这张表最有价值的部分恰恰是那些「不给结论」的格子。比如豆包的输入价格冲突点开证据就能看到原因0.8 元/百万tokensA 级volcengine.com/docs/82379/2123228抓取日期 2026/07/22原文「在线推理场景当输入长度为 16k则输入单价为 0.8 元/百…」豆包大模型 1.86 元/百万tokensB 级volcengine.com/article/2608580日期 2026/08/20原文「Pro 版本输入 6 元/百万tokens、输出 30 元/百万tokensTurbo 版本定价为 Pro 的 50%」两个数字都来自火山引擎体系都对但它们说的不是同一个模型。工具没有替我选 0.8而是把这个分歧摆到桌面上——这正是「结果质量与验证」想要的答案不确定的地方能不能被清楚地指出来。混元那一格更能说明问题0.8Turbo S2025/03、1.0/4.0Hy32026/07、1.2/3.5VITA2026/06三条证据并列。它其实在告诉你「混元输入价格」这个问题本身就不成立必须先指定模型。4.4 交付物自包含 HTML 报告单文件、无外部依赖可直接转发或存档CSV / JSON 导出CSV 一行一个格子缺口行同样保留已抓到的取值与来源链接历史记录页每次运行的结论与统计都落库重启不丢五、实际效果如何三个坑、一次修正、一个还没解决的问题5.1 有帮助的地方时间一次完整的 3×2 对比从点击到出表 5.3 秒检索预算 14 次调用实际 10 次4 次命中缓存。人工做同样的核对按我自己的经验是一到两个小时。可复核每个结论都能点开证据看到原文片段、站点、日期和原始响应文件。「这个 0.8 是哪儿来的」现在有确定答案。敢留白6 个格子里只有 1 个给出了单一结论。看起来「完成度低」但对评审场景来说2 个明确缺口 3 个显式冲突比 6 个来路不明的数字有用得多。5.2 遇到的问题与改法问题一社区文章伪装成官方口径。测试时发现cloud.tencent.com/developer/article/下的一篇选型指南被判定为 A 级证据并给出了「输入 1 元/百万 tokens」。域名确实是官方的但内容是社区作者写的。改法新增domain_generic档——域名命中官方域名、但不在人工登记的官方文档 URL 前缀内一律降为 B 级上限。同时把这条规则写成测试用例防止回退。问题二「时间更新」变成了编造的遮羞布。混元的输入价格有 0.8、1.0、1.2 三个值来源日期从 2025/03 到 2026/07 都有。第一版逻辑是「日期相差超过 180 天 → 记作时效漂移不算冲突」于是这三个值被一句话解释掉然后代码按分数随手取了「1 元」当结论。改法漂移豁免增加前提——最近 180 天内的证据必须互相一致。如果最近一个周期里本身就同时存在 1.0 和 1.2那不是「旧价格过时了」而是「现在就有两个档位」。修完之后这一格从「已核验 1 元」变成了「存在冲突」我认为这才是对的。问题三同源多档没有标注。一个页面里同时列出 120 元 和 3 元不同模型的输入价抽取器抽出了两条但表格只显示一个值。改法抽取阶段给每个命中打上multi_value标记并注明「同源多档 i/N」聚合阶段把这类格子单独归因为ambiguous措辞是「同一来源页面出现 N 个不同取值无法唯一确定口径」。5.3 还没解决 / 下一步英文文档抽不到值。DeepSeek 的官方定价页api-docs.deepseek.com/quick_start/pricing用的是美元和 HTML 表格当前的正则是围绕中文「元/百万 tokens」写的所以那一格只能落在缺口里。补表格类抽取和币种归一化是下一步最该做的事。通义千问的官方文档站没有稳定命中只有二手站点给出了 0.3 元等级不足因此如实标注为缺口。这类「官方站点抓不到」的情况我倾向于增加一个「站点可达性」提示而不是硬凑一个数。对比维度目前偏数值型。枚举型是否支持函数调用、是否支持缓存计费已经有enum_values的雏形但没有做过真实跑批验证。5.4 关于 AI 辅助这个项目的代码由 AI 编程助手参与编写架构与规则由我确定和验收文中所有数字、证据、截图均来自本机真实调用元宝搜索的运行结果原始响应已落盘留存可复现。密钥不在代码和仓库中通过环境变量注入。六、复现步骤# 1. 配置凭证不写入代码exportTENCENTCLOUD_SECRET_ID***exportTENCENTCLOUD_SECRET_KEY***# 2. 安装依赖并启动pipinstall-rrequirements.txt python run.py# http://127.0.0.1:8000# 3. 打开首页选择对比对象与维度点击「开始检索并生成对比表」# 4. 结果页可导出 HTML / JSON / CSV附录这次运行的关键参数项值Action / VersionSearchPro/2025-05-08检索计划 / 实际调用 / 缓存命中14 / 10 / 4每次调用返回条数cnt20可核验证据66 条官方来源占 86.0%跨主体复用ties90 次命中与多个主体同档并列降级为 D 级线索保留总耗时5.3 秒自动化测试95 项通过全部离线零网络所有结论仅代表本次检索时刻的公开网页内容工具不会把「没搜到」表述为「不存在」。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →