AiServices —— LangChain4j 最优雅的 AI 编程方式
一、开篇AI 调用还能更简单吗假设你已经用 LangChain4j 调用了大模型Autowired private ChatLanguageModel model; public String chat(String msg) { return model.generate(msg); }这已经很简洁了。但 LangChain4j 觉得还不够——能不能让 AI 调用像调用普通 Java 方法一样自然答案就是 AiServices。二、AiServices 是什么AiServices 是 LangChain4j 提供的一个核心功能通过动态代理技术让你定义的 Java 接口自动变成 AI 服务的实现。简单说就是你只需要定义一个接口声明你要什么AiServices 自动生成实现帮你完成 AI 调用三、快速上手5 分钟体验 AiServicesStep 1定义接口public interface Assistant { String chat(String userMessage); }就这么简单一个普通的 Java 接口。Step 2创建代理对象Autowired private ChatLanguageModel model; Test void test() { Assistant assistant AiServices.create(Assistant.class, model); String answer assistant.chat(你好); System.out.println(answer); }调用assistant.chat(你好)时AiServices 自动把你好包装成UserMessage调用model.generate(你好)把结果返回给你整个过程你不需要写任何实现类四、AiServices 的原理动态代理机制AiServices.create(Assistant.class, model)在运行时动态创建了一个Assistant接口的代理对象相当于自动生成了// 这是 AiServices 自动生成的你完全不用写 public class AssistantImpl implements Assistant { private final ChatLanguageModel model; public AssistantImpl(ChatLanguageModel model) { this.model model; } Override public String chat(String userMessage) { return model.generate(userMessage); } }核心优势优势说明零实现代码只定义接口不写实现类类型安全编译时检查参数和返回值类型易于测试接口容易 Mock声明式编程通过注解声明行为而非编码五、注解加持功能瞬间升级AiServices 的真正威力在于注解。你可以在接口和方法上添加注解让 AI 服务具备各种高级能力。1.SystemMessage—— 系统提示词public interface Assistant { SystemMessage(你是一个专业的 Java 技术顾问用简洁清晰的方式回答技术问题) String chat(String userMessage); }每次调用都会自动带上系统提示词。2.UserMessage—— 消息模板public interface Assistant { UserMessage(请将以下英文翻译成中文{{it}}) String translate(String english); UserMessage(请用 {{style}} 的风格写一首关于 {{topic}} 的诗) String writePoem(V(topic) String topic, V(style) String style); }使用assistant.translate(Hello World); // → 请将以下英文翻译成中文Hello World assistant.writePoem(春天, 唐诗); // → 请用唐诗的风格写一首关于春天的诗3.Memory—— 多轮对话记忆public interface Assistant { SystemMessage(你是一个友好的聊天机器人) Memory(id sessionId) String chat(UserMessage String userMessage, MemoryId String sessionId); }使用assistant.chat(我叫小明, session-001); // 第一轮 assistant.chat(我叫什么名字, session-001); // 第二轮 → 你叫小明Memory让 AiServices 自动保存和加载对话历史实现多轮对话。4.Tool—— 工具调用Function Callingpublic interface Assistant { Tool(获取指定城市的当前天气) String getWeather(ToolParam(城市名称) String city); }加上Tool后模型可以自动决定调用这个方法获取天气信息。5.Moderate—— 内容审核public interface Assistant { Moderate String chat(String userMessage); }调用前会自动对用户输入和模型输出进行安全审核。6. 完整示例AiService // 标记这是一个 AI 服务 public interface CustomerService { SystemMessage( 你是一个专业的客服助理。 你的语气要友好、耐心。 如果用户的问题超出你的知识范围要诚实地告知用户。 ) Memory(id userId) Moderate String handleQuery( UserMessage String query, MemoryId String userId ); Tool(查询订单状态) String getOrderStatus(ToolParam(订单号) String orderId); }六、AiServices vs 传统方式对比维度传统方式直接调用 ModelAiServices 方式代码量多需要手动组装消息少只定义接口系统提示词手动拼接到消息列表SystemMessage注解多轮对话手动维护ListMessageMemory自动管理参数替换手动处理UserMessage模板工具调用手动解析 JSON SchemaTool注解内容审核手动实现Moderate注解业务代码耦合度高低接口隔离可测试性一般高接口容易 Mock可读性一般高声明式编程七、集成 Spring Boot配置langchain4j.open-ai.chat-model.api-keysk-xxx langchain4j.open-ai.chat-model.base-urlhttps://api.deepseek.com langchain4j.open-ai.chat-model.model-namedeepseek-chat定义接口AiService // 加上这个注解Spring 会自动创建代理 Bean public interface Assistant { SystemMessage(你是一个乐于助人的助手) String chat(String userMessage); }使用RestController public class ChatController { Autowired private Assistant assistant; // 直接注入Spring 已经帮你创建好了 GetMapping(/chat) public String chat(RequestParam String msg) { return assistant.chat(msg); // 像调用普通方法一样 } }注意加上AiService后就不需要手动AiServices.create()了Spring 启动时会自动扫描并创建代理 Bean。八、工作流程图┌─────────────────────────────────────────────────────────────────────┐ │ 你定义的接口 │ │ AiService │ │ public interface Assistant { │ │ SystemMessage(你是一个助手) │ │ Memory(id session) │ │ String chat(UserMessage String msg, MemoryId String id); │ │ } │ └──────────────────────────┬──────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ AiServices 动态代理 │ │ │ │ 1. 拦截对 chat() 方法的调用 │ │ 2. 读取方法上的注解 SystemMessage、UserMessage、Memory │ │ 3. 把方法参数 注解信息 → 构建成 ChatRequest │ │ 4. 从 Memory 中加载历史消息如果有 │ │ 5. 调用底层的 ChatLanguageModel │ │ 6. 把响应保存到 Memory如果有 │ │ 7. 把模型的返回结果 → 转换成方法的返回值 │ └──────────────────────────┬──────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ ChatLanguageModel │ │ 实际的模型客户端 │ │ │ │ 实现类OpenAiChatModel / QwenChatModel / OllamaChatModel │ └─────────────────────────────────────────────────────────────────────┘九、版本兼容性功能最早支持版本说明基础 AiServices0.30.0接口代理SystemMessage0.30.0系统提示词UserMessage0.30.0消息模板Memory0.31.0多轮对话记忆Tool0.32.0工具调用Moderate0.33.0内容审核AiServiceSpring Boot 自动扫描0.33.0Spring 整合⚠️ 推荐使用 0.33.0 版本功能最完整且稳定。十、总结AiServices 的核心价值价值说明声明式编程用接口 注解声明 AI 能力而非编写实现代码自动生成实现动态代理技术运行时自动生成代理类功能注解化系统提示词、记忆、工具调用等全部通过注解实现Spring Boot 无缝整合AiServiceAutowired像使用普通 Service 一样使用 AI极低的学习成本只需要会定义接口和加注解一句话总结AiServices 让 AI 调用像调用普通 Java 方法一样自然用声明式编程代替命令式编程让代码更简洁、更优雅、更易维护。附录快速参考常用注解速查表注解作用使用位置AiService标记 AI 服务接口Spring 自动创建代理接口SystemMessage设置系统提示词方法UserMessage自定义用户消息模板方法Memory开启多轮对话记忆方法MemoryId标记记忆 ID 参数方法参数Tool标记工具方法方法ToolParam标记工具参数方法参数Moderate开启内容审核方法