一、开篇: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 分钟体验 AiServices
Step 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 Calling)
public 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 传统方式
| 对比维度 | 传统方式(直接调用 Model) | AiServices 方式 |
|---|---|---|
| 代码量 | 多(需要手动组装消息) | 少(只定义接口) |
| 系统提示词 | 手动拼接到消息列表 | @SystemMessage注解 |
| 多轮对话 | 手动维护List<Message> | @Memory自动管理 |
| 参数替换 | 手动处理 | @UserMessage模板 |
| 工具调用 | 手动解析 JSON Schema | @Tool注解 |
| 内容审核 | 手动实现 | @Moderate注解 |
| 业务代码耦合度 | 高 | 低(接口隔离) |
| 可测试性 | 一般 | 高(接口容易 Mock) |
| 可读性 | 一般 | 高(声明式编程) |
七、集成 Spring Boot
配置
langchain4j.open-ai.chat-model.api-key=sk-xxx langchain4j.open-ai.chat-model.base-url=https://api.deepseek.com langchain4j.open-ai.chat-model.model-name=deepseek-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 │ └─────────────────────────────────────────────────────────────────────┘九、版本兼容性
| 功能 | 最早支持版本 | 说明 |
|---|---|---|
| 基础 AiServices | 0.30.0 | 接口代理 |
@SystemMessage | 0.30.0 | 系统提示词 |
@UserMessage | 0.30.0 | 消息模板 |
@Memory | 0.31.0 | 多轮对话记忆 |
@Tool | 0.32.0 | 工具调用 |
@Moderate | 0.33.0 | 内容审核 |
@AiService(Spring Boot 自动扫描) | 0.33.0 | Spring 整合 |
⚠️ 推荐使用 0.33.0+ 版本,功能最完整且稳定。
十、总结
AiServices 的核心价值
| 价值 | 说明 |
|---|---|
| 声明式编程 | 用接口 + 注解声明 AI 能力,而非编写实现代码 |
| 自动生成实现 | 动态代理技术,运行时自动生成代理类 |
| 功能注解化 | 系统提示词、记忆、工具调用等全部通过注解实现 |
| Spring Boot 无缝整合 | @AiService+@Autowired,像使用普通 Service 一样使用 AI |
| 极低的学习成本 | 只需要会定义接口和加注解 |
一句话总结
AiServices 让 AI 调用像调用普通 Java 方法一样自然,用声明式编程代替命令式编程,让代码更简洁、更优雅、更易维护。
附录:快速参考
常用注解速查表
| 注解 | 作用 | 使用位置 |
|---|---|---|
@AiService | 标记 AI 服务接口,Spring 自动创建代理 | 接口 |
@SystemMessage | 设置系统提示词 | 方法 |
@UserMessage | 自定义用户消息模板 | 方法 |
@Memory | 开启多轮对话记忆 | 方法 |
@MemoryId | 标记记忆 ID 参数 | 方法参数 |
@Tool | 标记工具方法 | 方法 |
@ToolParam | 标记工具参数 | 方法参数 |
@Moderate | 开启内容审核 | 方法 |