AiServices —— LangChain4j 最优雅的 AI 编程方式
2026/9/16 9:06:42 网站建设 项目流程

一、开篇: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 自动:

  1. "你好"包装成UserMessage

  2. 调用model.generate("你好")

  3. 把结果返回给你

整个过程,你不需要写任何实现类


四、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 │ └─────────────────────────────────────────────────────────────────────┘

九、版本兼容性

功能最早支持版本说明
基础 AiServices0.30.0接口代理
@SystemMessage0.30.0系统提示词
@UserMessage0.30.0消息模板
@Memory0.31.0多轮对话记忆
@Tool0.32.0工具调用
@Moderate0.33.0内容审核
@AiService(Spring Boot 自动扫描)0.33.0Spring 整合

⚠️ 推荐使用 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开启内容审核方法

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询