对话能跑通 Pure Chat
任何 Agent 应用的起点都是把一次对话做稳:流式输出让用户不用干等,多轮上下文让对话能接住,历史按 token 预算裁剪避免越聊越贵。这一步不涉及智能,但没有它后面都无从谈起。
要做成什么样
- SSE 流式输出,逐 token 渲染
- 多轮会话续接与会话标识
- 历史裁剪按 token 预算兜底
- 结构化抽取:把自然语言变成可入库的字段
容易踩在哪儿
- 裁剪要按「对话对」整组删,否则会把工具调用链拆散
- 上游统一走一种协议,换模型只改配置
如果只记一句话:普通 AI 只是「回答你」,Agent 会「替你把事办了」。
下面用同一个问题,把两种走法并排演一遍。
差别不在「模型更聪明」,而在外面这套工程:检索、工具、编排、上下文、留痕。
下面这些环节,就是我理解的、一个能真正跑起来的 Agent 应用要补上的东西。
一个能上线的 Agent,不只是「调个模型」这么简单。左边是它要听懂的部分,右边是它要答对的部分,中间是这句话真正走过的一遍。
历史不是全量塞进去。最近几轮保真原文,更早的压成摘要,按 token 预算兜底。
「它能退吗」必须结合历史补全成完整问句,否则检索和意图都会判错。
退款要走确定性子流程,闲聊不该进 Agent,投诉要有固定兜底话术。
一句问题泛化成几条侧重点不同的查询,多路检索后再去重合并。
从一句话进来到一句话出去,中间要过的关卡。
进来先补全
结合摘要与滑窗,把指代补成完整问句。
判意图定路线
八类意图带置信度,拿不准归「其他」。
知识类必先检索
该检索就检索(RAG),写成流程硬约束,而不是指望模型自觉。
过证据置信度闸
精排分、有效证据数、分差共同决定能不能答。
进 Agent 做决策
ReAct 循环临场决定调哪个工具、走几步收敛。
执行引擎统一把关
参数校验、权限分级、写操作等确认。
带引用生成
说出来源编号,答不了就如实拒答。
落 trace 与审计
每个节点的 prompt、耗时、token 都留痕。
关键词与向量各有所长。BM25 抓精确型号,向量抓同义说法,融合后取长补短。
召回要宽、排序要准。粗排 Top-50 后交给重排模型精排出 Top-10。
证据不足时如实拒答,比编一个像样的答案更有价值。
答不上来的问题不该被丢掉 —— 它们是数据飞轮最好的燃料。
从一条对话接口到一个可运维的系统,中间要补的能力按依赖顺序排开。点任意节点可以看细节。
任何 Agent 应用的起点都是把一次对话做稳:流式输出让用户不用干等,多轮上下文让对话能接住,历史按 token 预算裁剪避免越聊越贵。这一步不涉及智能,但没有它后面都无从谈起。
要做成什么样
容易踩在哪儿
光会说不够,Agent 得能查数据。把业务接口包装成带描述和参数 Schema 的工具,让模型根据问题自己决定调哪个。执行结果回灌模型,再组织成自然语言。
要做成什么样
容易踩在哪儿
关键词匹配的死穴是同义表达 —— 问「邮费」查不到「运费怎么算」那条。把文档切块、嵌入成向量、存进向量库,检索就按语义而不是字面。
要做成什么样
容易踩在哪儿
纯向量对精确型号不敏感,纯关键词对同义说法无能为力。两路同时召回再融合,然后交给重排模型精筛 —— 粗排要宽,精排要准,这是两条不同的活。
要做成什么样
容易踩在哪儿
单轮 tool-calling 接不住「先查订单拿单号、再查物流」这类多步业务。「知识类必先检索」「投诉不进 Agent」这些约束如果只写在提示词里,模型随时可以不听。改成用图编排把确定性路径焊死,中间放一个 Agent 节点处理灵活部分。
要做成什么样
容易踩在哪儿
用户说「它能退吗」,这句话脱离上下文毫无意义。指代消解负责补全,意图识别负责分流,缺订单号时弹选择器让人点,而不是让模型猜。
要做成什么样
容易踩在哪儿
把全量历史递给模型,轮数一多 token 必爆、成本飞涨。双层结构解决这件事:最近几轮留原文保真,更早的压成摘要,滑窗按 token 上限兜底。
要做成什么样
容易踩在哪儿
几个写死的工具撑不起真实业务。统一注册、校验、鉴权、执行、审计之后,工具才能真正扩张 —— 包括接入外部工具生态。
要做成什么样
容易踩在哪儿
线上不能是个黑盒 —— 每一步想了啥、调了什么工具、花了多少 token,都该能查。答不上来的问题也不该丢掉,它们是最好的补库素材。
要做成什么样
容易踩在哪儿
不是所有任务都该交给大模型。说法无穷、类目固定、要快要便宜 —— 这种场景微调一个小分类器,比让大模型逐条判断划算得多。
要做成什么样
容易踩在哪儿
上面那些环节,我在自己的项目里一条条写过。三个项目连起来,是从 Java 后端到 AI 应用的一条路。
先把 Agent 相关的写扎实,再回来补 Java 基础。都是自己啃过一遍才动手写的东西。