一段“小米”和AI对话的故事
我还记得第一次把 ChatClient 跑起来那天,看到 AI 能回复我的业务问题时,心里别提多开心了。可是第二天产品经理问:“能不能让 AI 在回答前加个‘本回答仅供参考’?我们风控要求。”
我心想:“啊这……改模型不现实,Prompt 也不一定每次都能记住。怎么办?”
就在我琢磨着要不要手动给每条回答加 disclaimers 的时候,发现了 Spring AI 的一个接口:ResponseEnhancer。
它像是一扇通往无限可能的大门,从此我对 AI 回复的“再加工”,打开了新世界。
增强器 API 概述:这不是 Hook,是神器!
在 Spring AI 中,增强器(Enhancer)API 的定位是 —— 对 Prompt 请求/响应链路的预处理器/后处理器。
简单说就是:
- 你可以在“问”之前,插一脚 —— 改写用户问题、追加上下文。
- 你可以在“答”之后,插一脚 —— 增加 disclaimer、重新格式化结果、追加情感色彩等。
Spring AI 提供了两大核心接口:
- PromptEnhancer
- ResponseEnhancer
它们分别在对话生命周期中的两个阶段生效:
- PromptEnhancer:处理原始用户输入 Prompt,可改写或增强。
- ResponseEnhancer:处理 LLM 返回的结果 AIResponse,可改写答案或封装成特定格式。
从设计角度看,这其实是典型的责任链模式,非常适合扩展和插拔。
动手造轮子:实现两个增强器
1. 日志增强器:最实用的“调试神器”
如果你想知道每次问了什么,AI 回了啥,又不想在业务代码里写一堆 System.out.println,那就写个日志增强器。
这个增强器的好处:
- 开发阶段调试方便
- 生产阶段可以审计问答记录
- 搭配 MDC 还能定位哪个用户问了什么
2. Re2 重读增强器:再给我来一遍
有时候你会发现:AI 的第一句话很棒,但后面有点跑题了;或者你想尝试 AI 换种口吻、换种方式再说一次怎么办?
这时就可以通过增强器重写 prompt 或多轮调用实现“Re2”,即 再次发问、重新生成。
比如我们实现一个简单的“重读风格转化”增强器,让 AI 输出的内容更有趣:
你看,我们对第一次 AI 的回答不满意,就通过 enhancer 让它“再来一次”,这就像让助手自己润色自己的回答。
Spring AI 内置增强器,你可能已经在用!
Spring AI 自带了一些非常有用的增强器,不需要你亲自写。
1. HistoryPromptEnhancer
这是 Spring AI 内置的“对话上下文管理器”。如果你发现 AI 回答跟你上一句话对不上,那就很可能是没开启这个增强器。
它会自动维护一个 session buffer,把你前几轮的提问和 AI 回答拼接进 prompt 中,形成完整上下文。
使用方法非常简单,只要配置 MemoryChatClient 即可:
然后这个 enhancer 就会悄悄帮你做记忆处理了。
2. FunctionCallEnhancer
如果你用到了 @AiFunction 的函数调用能力,比如根据用户输入查天气、查汇率,那它背后就靠这个增强器来解析函数意图、绑定参数并调用的。
Spring AI 背后有一整套 Function Call Chain,增强器只是其中一环,但这个 enhancer 是让函数和对话融合的桥梁。
流式 vs 非流式增强器:如何优雅插队?
你可能会问,增强器这么好,那流式模式还能用吗?其实答案是:
两者可以兼容,但有细微差异!
在 Spring AI 中,ResponseEnhancer 主要作用于非流式响应。如果你启用了 StreamingChatClient 来获取 Publisher<AiResponseChunk>,那就不能直接使用 ResponseEnhancer,因为响应是一点点流出来的。
这时你需要:
- 要么在 Prompt 端处理,比如改写 Prompt(PromptEnhancer 是可以作用在流式的)。
- 要么在消费者端对 Chunk 做处理,比如组装后追加 disclaimers。
小米这里的建议是:
- 想加工结果内容:非流式 + ResponseEnhancer
- 想处理上下文或注入信息:PromptEnhancer 皆可用
- 流式响应:在 consumer 中处理会更灵活
结语:用增强器,打造你的专属 AI 助理
写完这篇文章,小米心里特别感慨:现在的 AI 开发,已经不是 “硬调模型” 的时代了,而是 “软调策略” 的比拼。而增强器 API,正是这场变革中的关键一环。
它就像 Java 的 AOP,又像 Servlet 的 Filter,更像是你写业务逻辑之前的“钩子”。
不管是加 disclaimers、风格润色、埋点记录,还是做多轮上下文增强,增强器都能帮你轻松搞定。
用一句话总结就是:
Prompt 写得好,不如 Enhancer 加得妙!
下次再遇到“AI 回答不合我意”,先别抱怨模型不行,试试写个 enhancer,说不定能立刻灵魂附体!
END
如果你喜欢这种开发故事风格的分享,欢迎点个在看、收藏一波!小米会持续更新 Spring AI 的更多高级玩法,比如:函数调用链路、RAG 重排增强、个性化缓存策略等,咱们下篇见!
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!