过去大半年,我连续做了两个智能体相关的项目,一个是给某公司的业务团队做内部知识问答,另一个是搭一个能自动完成数据分析流程的agent。这两个项目让我对标题这句话体会特别深:智能体的构建依然是个“脏活累活”。
很多人被“低代码拖拽搭Agent”的宣传吸引,觉得智能体就是把模型接进来、写几句提示词,再连几个工具就完事了。真上手你会发现,最折磨人的根本不是“模型调用”这一步,而是它前后左右那一圈没人帮你干的杂事——数据要清洗、环境要折腾、错误要反复追、效果要不断验。这篇文章就把我踩过的这些坑摊开讲一遍,适合两类人看:一类是正准备从Demo走向稳定落地的开发者,另一类是听了很多智能体概念、想亲自上手但还没摸清工作量的产品同学。
1. 最容易被低估的三块“脏活”:数据、环境、评估
先给一个反直觉的结论:模型本身的能力已经很强了,但真正决定一个智能体好不好用的,反而是那些模型“不管”的部分。
我见过一个宣传演示,演示者在界面上拖了几个节点,一个客服智能体就“嗖”一下跑起来了。但那个演示背后,是已经整理得干干净净的知识库、写好的话术模板、调好的评分卡——这些才是大头。很多人就是被这种“顺滑感”误导,低估了真实工作量。
1.1 宣传里的“拖拉拽”和真实世界的差距
把宣传片里的画面和实际开发放到一起对比,差距非常明显:
| 宣传中的画面 | 实际遇到的情况 |
|---|---|
| 上传文档自动解析 | 扫描件要OCR、错别字要清洗、表格要转格式 |
| 提示词写好就稳定运行 | 同一问题隔天问可能得到不同答案 |
| 拖拽几个节点完成流程 | 节点之间数据格式对不上也要排查半天 |
| 一键部署上线 | 超时、并发、资源限制全部要重新调配 |
这里不是要唱衰智能体,而是想说明,智能体工程化目前还处于一个“模型负责聪明、人负责兜底”的阶段。模型能做很多事,但每一件事都有边界,边界外的东西全靠人工去补。
1.2 我把脏活归成三张“账单”
做多了之后,我把这些麻烦事归成三类,每一类都有对应的“账单”要付。
第一张是数据账单。知识库文档怎么清洗、怎么分块、怎么保持版本更新,指令样本怎么打磨,这些问题每一个都费时费力。第二张是环境账单。依赖版本、外部服务可用性、资源并发,这些传统工程问题在智能体场景下因为“模型行为不确定”而变得更难排查。第三张是回归账单。改了一版提示词,到底是变好了还是变坏了,没有评测体系根本说不清。
这三张账单会越滚越大,根源在于模型输出的不确定性。模型不是纯逻辑函数,同样的输入可能给出不同的输出,所以你需要更多的数据去“扶正”、更多的环境约束去“收住”、更多的评测去“盯住”。这个过程没法绕开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据整理:模型以为自己“什么都会”,其实是你替它“什么都查好”
智能体落地最常见的场景是知识问答,但这个场景的真实工作量,很少有人提前估算准。我做的第一个项目是给某公司搭内部知识问答智能体,对方给过来的“知识库”是一个压缩包,里面有PDF扫描件、老式Excel表格、PPT转出来的图片,还有一堆聊天记录导出。拿到手的那一刻我就知道,真正的项目从“整理数据”才开始。
2.1 知识库文档的清洗比想象中麻烦得多
第一步是格式盘点,搞清楚手里到底有哪些类型的数据,然后分别处理。
扫描件需要OCR,识别出来的文本经常有错别字,尤其是表格和公式,基本要人工校对一遍。老式Excel表格不能直接丢给模型,得转成结构化的Markdown或CSV,不然检索和阅读都会出问题。PPT转出来的图片很多时候根本没有对应文本,需要单独补充说明。聊天记录里有大量口语化内容,哪些留、哪些丢,得结合业务场景判断,不然噪声会直接污染后续的检索命中。
然后是分块。块太小,信息不完整,检索容易漏;块太大,检索命中后塞进上下文,噪声又很大。这两个问题我反复横跳了很久,后来常用的做法是:先按标题层级切成章节,章节太长再按固定窗口切,同时保留相邻块的重叠。这个策略并不完美,但配合重排序模型,实测效果比单一固定大小要好。
2.2 指令样本的“人工打磨”其实是重体力活
很多人以为提示词写一次就一劳永逸,实际不是。同一个功能,用户有一百种问法,你得把这些问法都找出来,写进示例里让模型“看到”。
比如用户说“帮我查一下上个月的数据”和“我要看三月报表”,在业务语境里大概率是同一个意图,但模型不一定能建立这个关联。你需要准备一批标注好的指令样本,让模型“见过”这类表达。这部分工作不像写代码,更像在做数据标注,而且是重体力活。
我在这个环节会拉上业务方一起,把常见的问法、边界情况逐个过。有个案例我记得很清楚:用户问“为什么我的报表是空的”,智能体一开始当成查询请求去查数据,其实是用户没有权限时的抱怨。这种语义边界,不看真实对话根本发现不了。文本本身一模一样,但背后的真实意图完全不同,这种场景只能靠人肉积累。
2.3 数据版本管理:改了一版数据,怎么知道效果变好还是变坏
知识库是会变的。文档更新、删旧加新、调整分块策略,都会影响最终效果。如果没有版本管理,你根本说不清“这次回答变好是因为数据更新还是因为提示词改了”。
我后来给每个数据集版本加独立编号,并记录变更说明,比如“v3.2:新增XX部门的操作手册,调整了分块重叠长度”。每次实验前,先把数据版本固定下来,再和评测结果放到一张表里。这个习惯帮我省了大量返工时间。有时候一个效果提升,连提示词和数据都改了,最后复盘发现其实只是数据更新带来的收益,提示词改动反而是负优化。没有版本记录,这种结论根本得不出来。
3. 运行环境:跑通Demo只需要十分钟,跑稳服务需要一个月
如果说数据是“脏”,那环境就是“累”。Demo里一个脚本能跑,和线上服务稳定运行,完全是两码事。智能体的环境问题比传统Web服务更让人头疼,因为它的行为不稳定,环境出问题时你很难区分是环境坏了还是模型“抽风”了。
3.1 模型SDK升级引发的“连锁反应”
有一次我为了用上新功能,把模型SDK从旧版本升到新版本,结果原来调试好的提示词全部“失效”了——不是不跑,而是行为变了。参数名换了、默认值变了、返回值结构也改了,排查了好几个小时才发现是版本问题。
这个事给我的教训是:智能体项目里,SDK版本要像数据库表结构一样小心对待。升级前先看更新日志,升级后第一时间跑回归集,不要等上线了再发现行为漂移。模型的“能力”和“行为”是两回事,SDK版本升级很可能不改能力但大改行为,让你的提示词工程一夜回到解放前。
3.2 外部服务的兜底要按“不定期抽风”来设计
智能体一般要调用外部工具,比如检索服务、数据库、第三方接口。这些服务不可能永远稳定,你需要给每一次外部调用设计超时、重试和降级策略。
我见过最典型的问题是:检索服务偶发超时,智能体就直接返回“抱歉,我暂时无法回答”。用户感受极差。后来我调整了策略:检索失败自动重试一次,还失败就用简化提示词走兜底路径,而不是把错误抛给用户。记住,在传统程序里,服务异常是异常;在智能体里,服务异常是常态。设计的时候就要把“模型抽风”“服务抽风”“网络抽风”都当成正常情况处理。
3.3 资源限制和并发是上线前最容易被忽略的坎
本地调试的时候我用的是一个小模型,响应快,结果到了服务端换大模型,响应时间翻了十几倍。超时设置、队列长度、并发上限,这些都得重新评估。
还有一个很容易被忽略的问题:评测环境的复现。同样的评测脚本,在本地能跑,在服务端因为并发限制跑不动,导致评测结果对不上。后来我干脆把评测脚本和服务器的资源配置写在一个配置文件里,每次评测都固定环境。这个做法看起来笨,但能避免“本地全过、线上全挂”的尴尬局面。
4. 调试智能体:不是找Bug,而是在不确定性里“打捞”证据
智能体的调试是最折磨人的,因为它和传统程序调试完全不是一个思路。你没法靠“重读一遍代码”来找出问题,因为代码大概率没错,错的是“模型这次没理解对”。
4.1 传统程序调试和智能体调试的本质差异
两者在思维模式上的差异可以用一张表直接对比:
| 传统程序调试 | 智能体调试 |
|---|---|
| 同样的输入有同样的输出 | 同样的输入结果可能不同 |
| 报错有堆栈可以定位 | 只有“答得不对”这种模糊信号 |
| 单点问题居多 | 检索、上下文、提示词、模型能力组合出错 |
| 改完代码可以立即验证 | 改完要跑多次才能确认稳定 |
这意味着调试智能体更像侦探破案,你得在每个环节留下证据,再根据证据拼出完整的因果链。没有日志,你连从哪里开始查都不知道。
4.2 一次错误回答的完整排查链路
有一次,我的智能体面对“上周三的会议纪要在哪”这个问题,返回了“没有找到相关文档”。但文档库里明明有。
我开始一步步排查。第一步看检索日志,结果发现检索命中的不是会议纪要,而是另一个话题的文档,分数还很高。问题出在哪?继续看分块情况,发现会议纪要的正文被标题段落切成了碎片,检索时只匹配到“会议纪要”这个标题,正文内容因为块太小而被截断。
修复方案是把会议纪要这类文档改成“整篇索引、分段展示”,检索时用整篇内容算匹配度,展示时再按段落返回。改完之后,这类问题基本消失。
这次排查的关键,不是我“聪明”,而是我在每个环节都打了日志。智能体项目里,日志不是可选项,是必需品。每一步的输入、输出、中间结果,都要记录下来。检索命中了哪几条、相关性分数是多少、拼进上下文的文本是什么、模型最终输出了什么,这些信息缺一不可。
4.3 用“回归集”压住随机性
模型有随机性,一个bug修好了,下一次可能又变样了。我的做法是把所有失败案例沉淀成一个最小回归集,每次改动代码或提示词,都跑一遍这些案例。
这个回归集不用大,二三十条就够。关键在于“稳定触发”:找到那些能在多数情况下稳定复现问题的案例,用它们来验证修复是否有效。慢慢积累之后,你会发现回归集就是一份“智能体行为心电图”,任何改动都能在上面看到反应。如果改动让某个案例从通过变成失败,说明你引入了新的回归;如果失败变成通过,说明修复真的有效。
5. 评估与回归:没有评测的智能体,改代码全凭“感觉”
智能体项目的最大风险,不是功能实现不了,而是你不知道它到底做得好不好。没有评估体系,你所有的优化决策都是拍脑袋。我在前几个项目里吃过这个亏,改了一版又改回去,来回折腾,最后才意识到问题出在“没有一把尺子”。
5.1 人工评测和自动化评测怎么分工
我的做法是分两层。简单任务,比如精确查找、格式转换,用自动化规则和字符串相似度来打分。复杂任务,比如多轮对话、综合判断,就只能靠人工打分。人工打分也要有标准,不能凭感觉。我常用的评分维度包括:
| 评分维度 | 评估内容 | 常见问题 |
|---|---|---|
| 正确性 | 回答内容与事实是否一致 | 模型一本正经胡说八道 |
| 完整性 | 是否覆盖问题的关键信息 | 只答了一半 |
| 规范性 | 格式是否符合要求 | 该用列表时用大段文字 |
| 简洁性 | 是否包含无关废话 | 强行补充不相关内容 |
刚开始你可能觉得人工评测很慢,但实际算下来,它比“改了之后凭感觉说变好了”要快得多。因为凭感觉的结论没法复用,而一套评分标准沉淀下来之后,每次改动都可以用同一把尺子量。
5.2 评估集的构建:脏活里的脏活
评估集不会自己长出来。它来自几个地方:线上收集到的bad case,业务方提供的典型问题,还有你自己根据边界情况编的刁钻问题。
我特别建议把同一个问题换着花样写几条。比如“会议记录在哪”“帮我找一下会议纪要”“上周三开会的内容有存档吗”,这三条问的是同一件事,但模型的回答可能完全不一样。把它们都放进评估集,能帮你发现表达方式带来的稳定性问题。评估集还要定期翻新。每过一段时间,加入新的bad case,删掉已经稳定通过的旧案例。不然你会发现,智能体在某一个方向上变得很强,其他方向却悄悄退步了。
5.3 线上监控是发布之后的事
发布不代表结束。我通常会搭一个简单的看板,把用户反馈、日志失败率、检索命中率这些指标都放上去。一旦某个指标异常,第一时间去捞日志看bad case。
这个看板不用做得多漂亮,哪怕是一张表格都行。关键是持续看、持续记录。慢慢积累下来,bad case库就是整个项目最值钱的东西之一。它既是评估集的原材料,也是你向团队解释“为什么还要继续优化代码”的最好证据。没有bad case,你说“我觉得这个版本更稳了”,没人能跟你argue,但你也没法说服任何人;有了bad case,每一次优化都变得有据可依。
6. 这些“脏活累活”凭什么值得干
写了这么多脏和累,可能有人会问:那智能体是不是不值得做?我的看法刚好相反。正因为很多人低估了这些脏活,愿意踏实干的人反而更容易做出真正能用的东西。
6.1 门槛反而成了护城河
模型能力在快速同质化,调用API谁都行。真正拉开差距的,是那些“脏活累活”沉淀下来的东西:清洗过的高质量数据、覆盖真实边界的评估集、踩过坑才知道的工程经验。这些无法靠模型本身获得,只能靠时间堆。
我见过两个团队做同一个场景的智能体,一个直接调API加通用提示词,另一个花了三周整理知识库、建评测集、调兜底策略。上线后,前者的回答“看起来聪明”但经常跑偏,后者虽然不那么惊艳,但每一条回答都稳定可靠。用户最终用的是后者。这就是脏活的价值:它不显眼,但决定了产品能不能被信任。
6.2 工具会消解一部分脏活,但核心的脏活会迁移
接下来工具肯定会越来越完善,挂载模型、编排流程、自动评测,这些会越来越简单。但有一类脏活很难被工具替代:理解业务、梳理数据、定义“什么算答得好”。这些事越往后越值钱,因为它们决定了智能体到底能不能在真实场景里立住。工具能帮你把一块空地打扫干净,但盖什么楼、给谁住、住得舒不舒服,还是得人来想清楚。
6.3 给准备入局的人几句实在话
第一,先想清楚评估方案再动手,不然你会一直在“改代码”和“凭感觉”之间打转。第二,从最小闭环开始,先做一个功能,跑通数据、环境、评测的完整链路,再考虑扩展。第三,把脏活当成产品的一部分,别幻想能跳过。持续积累高质量的数据和bad case,比追新模型、新框架重要得多。
做了这么多个项目之后,我的心态也变了。最开始我也盼着有一天“什么都能自动完成”,现在反而觉得,“脏活累活”恰恰是这份工作里最有价值的部分。它逼着你去理解业务、打磨数据、建立评测体系,而这些才是一个智能体真正能用的根基。每一次被一个问题折磨到深夜,第二天找到根因的那一刻,都会觉得这些活没有白干。
