站内精选

一句话结论

把搜索结果接成结构化数据只需要两次 API 调用:一次联网检索拿原始材料,一次按 JSON Schema 抽取字段。

这篇解决什么问题

场景通常是这样:手头一批关键词,去网上搜一圈,再把每条结果里关心的字段抠出来填表。几十条手工还能扛,上百条就是体力活,下周还得重来。适用的是字段固定、来源公开的场景;字段还在反复改、需要登录才能看的页面,别走这条路线。

开始前要准备什么

  • 一个支持联网搜索的接口,多数平台会给新账号一笔试用额度,之后按调用量计费
  • 一个支持 JSON Schema 约束输出的模型接口,可以和上面是同一家
  • 一份关键词或对象清单,10~20 条就够起步,CSV 或纯文本都行
  • 能发 HTTP 请求的环境:Python 脚本、Postman,或者 n8n 这类低代码工具
  • 时间预算上,跑通第一版通常在 30~60 分钟,大半花在调 Schema

具体怎么做

第 1 步 · 先把输出字段定死

别一上来就写调用代码。字段没定清楚,后面两次调用的上下文都在飘,跑完还得推翻重来。

我在整理一份产品资料表,每条记录代表一个工具。请帮我设计抽取字段,要求:字段名用英文小写下划线;每个字段给出中文含义、数据类型(string / number / boolean / array)以及是否必填;必须包含 source_url 和 fetched_at 两个字段;字段总数不超过 12 个。示例对象:一款面向小团队的在线表单工具。只输出表格,不要解释。

预期产出:一张字段定义表,能直接翻译成 JSON Schema,第 4 步的提示词里会原样贴进去。

第 2 步 · 第一次调用只负责搜

这一步的关键是让模型别总结。总结一次,后面能核对的原句就没了,字段填错也无从追溯。我一般要求它按固定字段返回片段和出处。

请联网搜索以下关键词,返回 5 条相关结果。每条输出四个字段:title(页面标题)、url、published_at(拿不到就写 unknown)、snippet(原文中与关键词最相关的 200 字以内片段)。不要总结,不要发表观点,不要合并不同来源。关键词:{keyword}

预期产出:一段 JSON 数组,5 条记录,带标题、网址、时间和原文片段,可以直接交给下一步。

第 3 步 · 中间层做清洗和去重

原始片段里混着导航文字和重复段落,直接喂给第二次调用既费 token 又污染字段。有人用几行代码去重截断,也有人先跑一次轻量调用做归并,两种都行。

下面是搜索返回的原始条目。请做三件事:删掉明显的导航、推广、版权声明段落;把同一 url 下的多个片段合并成一段,保留信息量最大的部分;每条记录压缩到 600 字符以内。输出 JSON 数组,字段保持 title、url、published_at、snippet 不变。不要新增条目,也不要删减条目。

预期产出:一份干净的 JSON 数组,条数不变,冗余内容基本清掉,体积明显变小。

第 4 步 · 第二次调用做结构化抽取

这次调用不给它搜索工具,只给 Schema 和材料。搜归搜、抽归抽,出问题的时候你能立刻判断是哪一环的锅。

你是数据抽取器。根据下面的搜索结果填充 JSON Schema,规则:找不到对应信息的字段填 null,不要推测;数字字段只写数字,不带单位;每个取值必须能在 snippet 中找到对应原句,找不到就填 null;只输出 JSON,不要代码块标记,不要任何解释说明。Schema:{schema}。搜索结果:{search_results}

预期产出:一条关键词对应一条 JSON 记录,字段稳定、类型固定,能直接写进表格或数据库。

第 5 步 · 回查一轮再落表

批量跑的时候总有几条产物很勉强。抽完让模型自检一遍,比人工逐条翻网页快得多,也不容易漏。

检查下面这条记录:列出所有取值为 null 的字段;对每个非 null 字段,引用 snippet 中对应的原句;如果某个取值是从标题推断而不是正文得出,标记为 inferred。输出格式为「字段名 | 取值 | 原句或 inferred」。不要修改记录本身。

预期产出:一份自检清单。人工只需要看被标成 inferred 的字段,其余可以放心入库。

实测记录

环节 实测情况
第一次调用(搜索) 单个关键词通常 10~20 秒返回
第二次调用(抽取) 单批 20 条以内通常 5~15 秒
端到端跑 30 个关键词 开 5 路并发,大约 3~8 分钟
与手工对比 同样字段人工整理大概要 2~3 小时
返工 字段口径含糊时,通常返工一到两轮

成本主要看搜索调用次数和输出 token,各家计费方式不一样,以官方文档为准。跑通流程这一轮的支出通常很低,真正花时间的是改 Schema。

最容易错的 3 个地方

  1. 两次调用合成一次。让模型边搜边吐 JSON,字段经常缺,来源也对不上。拆开跑。
  2. Schema 写得太松。类型没锁、枚举没列,下游解析反复报错。补上 required 和 enum。
  3. 漏了来源字段。抽完发现有问题,回不到原网页。source_url 设成必填。

可复用的东西

这五段提示词可以存成一个模板文件,把 {keyword}、{schema}、{search_results} 三个位置留成变量,换个清单就能跑另一批数据。字段表单独存一份,别写死在提示词里,改口径的时候你只动一个地方。

省时间的从来不是模型多聪明,是字段定得够死,错的时候一眼能看出来。这套流程真正难的部分不在调用,在于你愿不愿意先花二十分钟把字段想清楚。

你现在手头那批数据,字段能一次性定死吗?

常见问题解答

两次调用必须用同一个平台的模型吗?

不必。只要第一次能返回带网址的原文片段,第二次能接受 JSON Schema 约束,就可以混着用。跨平台时中间层多一步字段对齐,不然转换代码会越写越长。

跑 50 个关键词大概要多久?

串行跑一般在 10 分钟上下,开 5 路并发通常 2~4 分钟能收完。真正的大头往往不在调用,而在你反复改 Schema 的那一两轮。

JSON Schema 要写得多严格?

能把必填、类型、枚举锁死就锁死,模型自由度越小,下游解析越省心。字段暂时拿不准就先允许 null,但别用自由文本兜底,那等于没约束。

这套流程不适合什么情况?

需要登录才能看的页面、信息藏在图片里的页面,以及要求逐字精确引用的合规材料,都不太合适。字段口径本身还在讨论阶段时,也先别急着写代码。

发表回复

后才能评论