一、需求
我平时有空会写技术科普文章。这件事有个经常被忽视的痛点——事实会过期,而我手里的知识不会自动更新。
举几个真实场景。写一篇《2026 年 Python 该升级到哪个版本》的文章,我想确认"Python 3.13 是不是真的引入了可关闭 GIL 的自由线程";做一份行业对比,我要核"React 19 正式版到底哪天发布";整理合规材料,又得确认"生成式 AI 服务现在是不是必须做算法备案"。这些问题有三个共同特征:答案不在我的训练知识里、或者我记不清、或者它随时在变。以前我的做法是打开浏览器一条条搜,手动复制到文档里,再手抄来源链接。笨、慢,而且来源和时间经常被我抄漏,读者一追问就露怯。
这就是我做这个工具的出发点:我需要一个能把"待核验的事实"批量变成"带来源、带时间、可点击"的核对表的东西,而且它调用的必须是实时、权威的检索,而不是模型凭记忆编。
二、为什么需要搜索(而不是只问大模型)
很多人会问:直接问大模型不就行了?我的结论是——确定性的搜索归 API,概率性的表达归大模型,两者必须分开。
大模型有两个硬伤在这里会致命。第一是知识截止:训练数据之后发布的版本、政策、财报,它答不出来,或者答一半。第二是来源不可控:它经常"一本正经地编",给你一段听起来合理但查无此处的引用。而我写文章要对读者负责,引用必须可溯源。
元宝搜索(原腾讯云联网搜索 API)正好补这个位:它背靠全网索引加腾讯内容生态,覆盖 13 个垂直行业、157 个权威信源,返回的是结构化的title / url / passage / site / date / score,而不是一段自然语言。这意味着我可以把它当成一个"事实取证库"——我负责把事实列出来并发起查询,它负责把带链接的证据还给我,最后由我(或我的大模型)来写结论。搜索在这一步是应用运行时调用,也就是工具真正跑起来的时候才去查,而不是写代码时写死的。
三、我怎样实现
3.1 接入方式
元宝搜索提供 API / MCP / Skill 三种接入。我选了最灵活的API 直连:一个 HTTPS POST,Bearer 鉴权,几分钟就能跑通。
接入前置动作(都来自官方文档):
- 腾讯云控制台开通"元宝搜索",日常免费 2000 次/月;活动期用邀请码ZVR8T824提到 6000 次/月(2026-10-10 ~ 11-30,以活动页最新码为准)。
- 在"服务 API KEY"里新建密钥,明文
sk-开头,只显示一次,存好。 - 配置 Key(三选一):写进脚本顶部
DEFAULT_API_KEY、命令行--key "sk-xxxx"、或环境变量TENCENTCLOUD_WSA_APIKEY。我图省事直接写死在脚本里,本地自用没问题(注意别把带 Key 的脚本外传)。
3.2 搜索词与参数设计
调用 SearchPro 时,几个参数直接影响结果质量,我的经验是:
Query:具体、带实体和意图,比如"Python 3.13 free threading no GIL experimental",别写"Python 新特性"这种空话。Site:查官方文档就锁docs.python.org,查政策锁gov.cn。锁站比换更强的模型更管用。Freshness:查近期信息用d7(近 7 天)/m3/y1,查长期事实可省略。Industry:查政务用gov、查财经用finance,做领域过滤。Mode:0 公开网页 / 1 垂直信源卡片 / 2 混合;Cnt取 10/20/30/40/50。
3.3 结果处理(关键代码)
元宝搜索的响应里,Response.Pages是一个JSON 字符串数组——每个元素本身是一条 JSON 字符串,要先json.loads再取字段。这是最容易踩的坑。核心代码片段:
importos,json,urllib.request ENDPOINT="https://api.wsa.cloud.tencent.com/SearchPro"defyuanbao_search(api_key,query,site=None,mode=2,cnt=10,freshness=None,industry=None):payload={"Action":"SearchPro","Version":"2025-05-08","Query":query,"Mode":mode,"Cnt":cnt}ifsite:payload["Site"]=siteiffreshness:payload["Freshness"]=freshnessifindustry:payload["Industry"]=industry headers={"Authorization":f"Bearer{api_key}","Content-Type":"application/json; charset=utf-8"}req=urllib.request.Request(ENDPOINT,data=json.dumps(payload).encode("utf-8"),headers=headers,method="POST")withurllib.request.urlopen(req,timeout=10)asr:data=json.loads(r.read().decode("utf-8"))returndatadefget_pages(raw):pages=(raw.get("Response")or{}).get("Pages")or[]return[json.loads(p)ifisinstance(p,str)elsepforpinpages](完整可运行脚本见附件yuanbao_search_demo.py:纯标准库、无需pip install,支持单次检索、批量核验、以及无密钥的--sample预览模式。)
我做了一层封装:在脚本顶部的「可编辑配置区」里维护一组{fact, query, site}(变量名COMPARE_CLAIMS,也可以改用--claims claims_sample.json从外部 JSON 读取),脚本自动逐条发起搜索、取前TOP_N条结果,渲染成一份 Markdown / HTML 的事实核对表,每条都带标题、站点、时间、相关度和可点击链接。报告按"每个事实一个分区"排版,列对齐、长文本自动换行,截图发文章也很清爽。
3.4 怎么跑起来(一键复现)
依赖只有 Python 标准库,不需要pip install。三种跑法:
# 方式 A:Key 写死在脚本 DEFAULT_API_KEY,直接跑(我用的)python yuanbao_search_demo.py# 方式 B:命令行传 Keypython yuanbao_search_demo.py--key"sk-xxxx"# 方式 C:传入自己的论断文件python yuanbao_search_demo.py--claims claims_sample.json# 没 Key 想先看效果:样例预览(不消耗额度)python yuanbao_search_demo.py--sample跑完生成report.html,打开即是事实核对表;加--debug还会把每次原始返回存成debug_raw.json,方便排查参数和返回结构。
四、最后结果
真实输入就是上面那几条待核验事实。运行后,yuanbao_search_demo.py会生成一份report.html。
以"Python 3.13 自由线程"为例,搜索返回了 Python 官方 3.13 What’s New 文档与 PEP 703,发布时间 2024-10-07、相关度 0.91,摘要明确写了"以实验特性提供 free-threaded 构建"。我把这条写进文章,读者点链接就能验证——这就是"查得到,更信得过"。
最终成果是一张可复用的核对表:写任何文章前,把要验证的论断加进脚本里的COMPARE_CLAIMS(或用--claims传一个 JSON 文件),跑一遍,几分钟拿到带信源的证据链,再动笔。
五、实际效果如何
有帮助的地方:最直观的是省时间——以前手动搜+抄链接十几分钟的事,现在一条命令。更重要的是质量:锁站 + 锁时间让我基本只拿到官网/政府源,幻觉和营销号内容被天然过滤;score字段帮我排序,低相关的直接忽略。
遇到的问题与改进:
Mode=1垂直信源卡只吃极简实体短句(“特斯拉股价”“北京天气”),一旦加"最新/日期"等限定词就返回 0 条,而且返回 0 条也扣 1 次额度。改进:这类查询我改用Mode=2混合,实测能稳定命中。Cnt最小 10 条,想要更少得自己截断。改进:我在渲染时只取前 3 条展示,原始数据保留。- 单条调用失败会拖垮整张表。改进:
verify_claims里对每条做了异常捕获,失败只标红该行,不影响其他事实。
耗时测量方法:用time包裹单次yuanbao_search,实测单次调用往返约 0.35–0.48 秒(官方标称最快 300ms),4 条事实批量核验总耗时约 1.5–2 秒。测量均在本地宽带、标准版后付费下进行,样本量 10 次取均值。
作品阶段:可演示原型
AI 辅助声明:本文代码框架与部分表述由 AI 辅助完成,接入调试、参数设计、结果核验与运行均由本人完成,运行结果真实可查。
参考:元宝搜索产品页 https://cloud.tencent.com/product/wsa | 接入说明 https://docs.qq.com/doc/DWE54SHRMdkVnRXNK