第2篇:从“直接扔给 AI”到 7400 行代码

系列:我们构建了一条几万行代码的流水线。智能体为何做不到。
上一篇:第1篇。
Read the English version.
上篇讲的是投资组合经理的不可能任务:一家基金需要 5000 家公司的 ESG 数据。聊天机器人做不到,因为规模、完整性、可审计性全不过关。于是她把问题带给了开发团队。
开发者的第一直觉很直接:从每家公司的首页提取所有链接,然后判断该采集哪些。听起来很简单,直到你真正去做。
简而言之:让 AI 判断哪些链接跟 ESG 有关,听起来很简单吧?实际做下来,变成了七层工程:多级关键词打分体系、跨语言规则、把整个网站 URL 变成树状结构分析、分数继承、PDF 文件名评分、经过多轮打磨的 prompt、以及会自动调松紧的预算分配。
AI 真正处理的只是最后那一小部分模糊情况。前面几层工程已经把能过滤的全过滤了。每一层的存在,都是因为上一层在某个真实网站上翻了车。
接到任务
组合经理把需求推了过来:能不能系统性地从几千家公司的官网上,把 ESG 相关的页面和文件全都采集下来?
开发者的第一反应很直接:访问每家公司的首页,提取页面上所有链接,然后判断哪些该采集、哪些不该采集。采集完之后再从新页面里提取链接,再判断,再采集。如此循环,直到没有新链接可看。
听起来不难。问题是怎么“判断”。
“判断哪些链接该采集”这句话说出来只要三秒,做出来花了几个月。
先试最朴素的办法:关键词匹配
最直觉的思路是在 URL 里找关键词。包含 sustainability、ESG、climate 的就留,不包含的就扔。写几行正则就搞定了,对吧?
跑了几家公司就发现不行。
/energy/ 是能源产品页面还是气候政策?看公司。/csr/ 在一些企业网站上就是 ESG,但英文正则压根不认识。/content/dam/doc-847293.pdf 这个 URL 里一个关键词都没有,但它恰好就是这家公司的年度可持续发展报告。
关键词太多会误伤,把产品页、新闻页全收进来。关键词太少会漏掉,真正重要的披露文件藏在完全无关的路径下。
正则写了几百行,还是两头不靠。这不是规则能单独解决的问题,因为同一个路径在不同公司、不同语言、不同行业下含义完全不同。
好,既然规则不行,那就让 AI 来判断。
同一个词在不同公司的网站上意思完全不同。规则永远追不上现实的多样性。
扔给大语言模型:最简单的 AI 方案
这一步感觉应该能直接搞定。毕竟你看过那些演示:AI 读文档、答问题、分类文本,准确率看起来接近人类。让它看一个 URL,判断是不是 ESG 相关,对一个能写诗、能答复杂题的模型来说,应该是小菜一碟吧?
最直觉的第一步:把每个 URL 单独发给模型。“这个跟 ESG 有关吗?”简单。准确。但马上就发现:贵得离谱。一家公司上万个链接,一个一个问,乘以 5000 家公司。
那就搞批量。把 50 个甚至 100 个 URL 塞进一个 prompt:“哪些是 ESG 相关的?”成本一下子降了几十倍。但一批放多少个?太少,API 调用次数还是太多。太多,模型开始走神:分类质量下降,漏掉条目,返回格式出错。
最佳批次大小不是拍脑袋能定的。你得测:20、50、80、100。看准确率,看成本,看超时率,反复调整。
这是人类判断第一次变得不可回避的地方。没有公式能告诉你最优批次大小。它取决于模型、prompt 长度、URL 复杂度和上下文密度。机器能执行批次,但只有人能判断哪个平衡点是可接受的。
能用。算是吧。
对于一个 URL 超过 10000 个的大型公司,这意味着多个批次、每批数分钟,而且费用很快累积。有时 API 调用在批次处理到一半时超时。有时响应格式有误:模型返回了 50 个 URL 中的 47 个分类结果,你不知道哪 3 个被遗漏了。有时它就是分错了。
/content/dam/doc-847293.pdf 的 URL 里没有任何 ESG 关键词,于是模型跳过了它。
你刚失去了这家公司的主要可持续发展报告,因为 URL 路径是内容管理系统自动生成的编号。
“让 AI 来判断”是最自然的想法,也是后面每一层复杂度的起点。
后面七层,每一层的起点都一样:你满怀期待地觉得,AI 这个在演示里表现得如此神奇的技术,应该可以直接搞定,不需要你去了解底下那些脏活累活的细节。然后现实一层一层告诉你:不行。
不是说 AI 没用。AI 很有用,而且越来越有用。但“演示里看着惊艳”和“在几千家公司、多种语言的真实数据上稳定运行”之间,有一段很长的距离。这段距离不是靠期望能跨过去的。你得试、得测、得一次次踩到边界,哪怕这个边界一直在扩。
第 1 层:上下文改变一切
洞察:裸 URL 携带的信息不够。
链接不是孤立存在于网页上的。它们被标题、描述、周围文字所包围。一个标注为“下载我们的 2024 年可持续发展报告”并位于“ESG 披露”标题下的链接,即使 URL 是 /content/dam/doc-847293.pdf,也显然是相关的。
所以你构建了链接上下文提取。对每个 URL,捕获锚文本、周围段落、父级标题。将这些与 URL 一起传给模型。
分类准确率从大约 70% 跃升至大约 95%。
提取代码本身?AI 编码助手可以高效编写,因为这是直接的 DOM 遍历。但“需要链接上下文对,裸 URL 不够,周围文字才承载信号”这个洞察,来自数周观察分类器在真实网站上的失败。
智能体能写代码。它无法自动拥有“需要写这段代码”的洞察。
说白了:一个链接的门牌号不重要,旁边贴的标签才重要。
问题不是 AI 不够聪明,而是没人给它看对东西。
第 2 层:Token 爆炸
现在你要为每家公司 10000 个 URL 发送段落级上下文。
10000 个 URL × 每个约 2000 token = 2000 万 token。因为准确分类通常不能只看 URL 本身,还要带上它周围的背景文字段落。仅仅是分类。仅仅是一家公司。乘以 5000。
而且关键问题是结果仍不理想:模型在大批次中失去了对条目的追踪。你需要更聪明的方法。
解决了准确率问题,又制造了成本问题。工程就是这样一环套一环。
第 3 层:树
URL 不是随机的。它们有结构。
/sustainability/reports/annual-2024 和 /sustainability/policies/climate 有共同前缀。如果把所有 URL 组织成一棵树,一个域名前缀树,按路径段分解,会怎样?
现在,/sustainability/ 下有 40 个子节点,显然值得探索。/careers/ 下有 200 个子节点,显然不需要。
但一个大型企业网站的完整树可能有数千个节点,超出上下文窗口。所以你只先评估前三层。如果一整个分支明显不是 ESG,例如 /products/、/careers/、/e-commerce/,不看任何子节点就直接跳过。
对大型网站而言,这在模型看到任何东西之前就消除了 40–60% 的 URL。
但这棵树的作用不止是剪枝。它还会识别轨迹,例如 /sustainability/reports/ 这样自带强 ESG 信号的路径前缀。每条轨迹都有一个置信度分数,基于命中的关键词、深度和子节点数量。后续阶段把这些轨迹当锚点:在高置信度轨迹下发现的任何东西,都继承它的可信度。
好比分拣信件先按邮编归堆。大部分分拣工作在你拆开任何一封信之前就完成了。
不是所有 URL 都需要逐一判断。结构本身就是信息。
第 4 层:分数继承
/sustainability/reports/ 的一个可持续发展页面链接到了一个 PDF:/content/dam/report.pdf。
这个 PDF 的路径 /content/ 看起来像通用内容管理文件夹。规则给它评了“未知”。但这个链接来自一个可持续发展页面。
所以你添加父子追踪。在高分页面上发现的 PDF 继承该页面的分数。现在 /content/dam/report.pdf 被正确分类了,不是因为它自己的路径,而是因为指向它的页面。
没有这个,你会丢失所有托管在内容管理系统或静态文件服务上的文件。这样的文件非常多。
放在“可持续发展”书架上的文件,大概率就是讲可持续发展的,哪怕它的文件名只是一串编号。
一份文件的价值不取决于它自己叫什么名字,而取决于谁推荐了它。
第 5 层:关键词大脑
还有大量模型调用是不必要的。但解决方案不是一张简单的跳过列表,而是一套打分引擎。
硬跳过规则处理最明显的:/careers/、/login/、/shop/、/press-releases/。多种语言,几十条正则模式。在任何网站上,它们通常都不是 ESG。
然后是真正的主力:多级关键词打分体系。
- 强披露信号:例如
sustainability-report、climate-action、human-rights-policy。URL 或上下文里出现这些,直接判定 ESG,不需要模型。 - 模糊信号:例如
report、strategy、policy、governance、privacy。可能是 ESG,也可能是产品策略文档。得看上下文。 - 话题信号:例如
renewable、solar-farm、circular-economy。只在非商业路径下才有价值。renewable出现在/products/下是产品页,出现在/sustainability/下才可能是气候行动。 - 新闻和博客惩罚:新闻稿根据周围文本是否包含 ESG 证据,得分调整。
同一个关键词 energy,在 /sustainability/energy/ 和 /products/energy/ 下分数完全不同。商业路径惩罚会自动降低 /services/、/products/、/business/ 等路径下话题关键词的权重。
PDF 有自己的文件名评分体系,因为文件名本身透露了大量信息。文件名里带 sustainability-report 或 esg-report 的,直接判 ESG。带气候披露缩写或 climate-report 的,几乎确定是 ESG。带 annual-report 的,很可能是,但不绝对。带 newsletter 或 press-release 的,价值很低,排到最后。而文件名是 doc-847293.pdf 这种纯编号的,才是真正需要模型来判断的。
经过前面几层过滤,这类真正含糊的文件已经所剩不多。
电商检测防止另一类误伤:一个 ESG 页面侧边栏碰巧出现了 deals 或 clearance 这样的词,不应该被跳过。所以系统要求多个电商信号同时出现才会过滤。单个词不够。
这些列表都不是纯手写的。模型生成候选,但每一条都经过人工审核。因为模型会犯微妙的错:把 energy 一律标为 ESG,或者漏掉某些地区企业惯例中的同义词。
想象一本 500 个词条的字典,每个词在不同公司的网站上意思都不一样。这一层维护的就是这么一本字典。
同一个词在不同语境下意思截然相反。这不是 AI 能自动学会的,只有踩过坑的人才知道。
第 6 层:Prompt 的进化
这是没人预料到要花数月的部分。
第 1 版:分类为 ESG 或非 ESG。
/about/governance/ 被分类为非 ESG。模型把 about 读成企业信息前缀。你重写:将治理、道德和董事会监督视为 ESG 相关。
现在它抓住了治理,但对 /about/our-leadership/ 过度触发。那只是高管简介。第 3 版加入反面示例。
某些地区公司常用的 csr 路径被遗漏了,因为英文示例没有覆盖这种惯例。第 4 版。
PDF 链接被误分类。第 5 版。模型返回“也许”而不是是/否。第 6 版。批量 prompt 和单项 prompt 表现不同。第 7 版。某个行业特定的安全披露被跳过。第 8 版。
你已经在第 10 版以上了,而你原以为第 2 版就“搞定了”的 prompt。
每个版本都修复了一个真实网站上的真实误分类。Prompt 不是巧妙的,而是精确的。精确来自失败。
智能体每次运行都会从第 1 版开始。同样的错误。每次运行。除非有人把所有这些改进编码成确定性的 prompt 模板。这正是你做的。
Prompt 不是一条巧妙的指令,而是一张实战检查清单,由几百次真实失败锻造而成。
你以为写好了 prompt 就完事了,结果每家新公司都能让它翻车一次。
第 7 层:预算和分配
有些公司生成几千个 ESG 相关 URL。你无法全部采集。但硬性上限很危险:如果 400 个都是关于可持续发展奖项的新闻文章,而真正的报告从第 450 个才开始,上限就会遗漏所有重要内容。
所以你设计了分配机制。新闻页面需要有子上限。ESG 核心内容绕过上限。系统追踪哪些类别已满。线索充裕时从严,线索稀缺时放宽。
真正的加速器是迭代上下文复用。一个探索缓存存储了每一轮的路径评估结果。第二次遍历同一家公司的网站时,大部分模型调用被省掉了,系统已经知道答案。到第三轮,命中缓存的比例更高。
原本每家公司每轮迭代可能花费数美元,现在只需要其中一小部分。
线索多的时候收紧标准,线索少的时候放宽。就跟真人分析师一样。
资源有限时该收什么、该放什么,这个判断本身就需要工程,不能每次临场发挥。
一个诚实回答
几周前,一家 AI 驱动的 ESG 数据供应商来推销数据产品。看他们的流水线描述,一切都似曾相识:同样的问题、同样的解决方案、同样的复杂度。
于是有人直接问:你们的数据从哪来?怎么确保捕获了所有内容?
对方很诚实:他们有一个数据收集引擎,也有一个专门团队,必要时手动点击检查所有内容。
不是智能体。不是一个巧妙 prompt。是人工团队作为完整性的最后防线。即使一家整个业务都是 ESG 数据的公司,仍然无法完全自动化判断。
如果智能体能做到,他们早就不需要这道防线了。
连专门做 ESG 数据的公司都需要人工兜底。完全自动化判断目前仍是幻想。
结果
在 10000 个候选 URL 中,模型最终看到的只有几十个含糊分组。
分类成本:每家公司大约几角美元。
七层:
- 链接上下文提取:锚文本、标题、周围段落。
- 硬跳过 + 多级关键词打分:跳过规则、关键词分层、商业路径惩罚、电商检测。
- 域名前缀树 + 轨迹映射:树结构识别 ESG 路径前缀并赋予置信度,裁剪大量 URL。
- 分数继承:PDF 和子页面继承发现者的可信度。
- PDF 文件名评分:强披露文件名直接通过,含糊文件转交模型。
- 实战打磨的 prompt:多个版本,每个版本修复真实误分类。
- 预算分配 + 迭代缓存:自适应阈值、类别上限、跨迭代上下文复用。
即使是采集器的“AI 部分”,也是 90% 工程、10% 智能。
而这套分类系统是流水线的大脑,但也只是一个器官。剩下的全是纯编排:批次大小、浏览器级联、状态追踪、重试逻辑、PDF 处理、cookie 管理、反爬检测。
不需要智能。只需要精确。
这篇里每一层的起点都一样:“AI 应该能搞定吧。”每一层的终点也一样:“能,但得先有人搞清楚该喂它什么、什么时候信它、什么时候不信。”
AI 的潜力是真的,而且还在快速增长。但潜力不等于交付。交付靠的是工程。上面这七层不是在否定 AI,而是让 AI 在生产环境里、真实数据上、真金白银的场景下真正跑起来所付出的代价。
下一篇:第 3A 篇——LLM 闪耀的地方,以及智能体会毁掉的 90%(上)。
Originally published externally: source article.