注解式AI服务实战
作者:微信文章在介绍更多特性前,先给大家介绍一下 LangChain4j 最重要的开发模式 —— AI Service,AI Service 提供了很多高层抽象的、用起来更方便的 API,把 AI 应用当做服务来开发。
LangChain4j 系列文章
1. LangChain4j - LangChain4j快速入门实战2. LangChain4j - 多模态开发踩坑实录3. LangChain4j - 系统提示词稳住AI
使用 AI Service
首先引入 langchain4j 依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.1.0</version>
</dependency>
然后创建一个编程助手 AI Service 服务,采用声明式开发方法,编写一个对话方法,然后可以直接通过 @SystemMessage 注解定义系统提示词。
/**
* AI 代码助手服务接口
*
* @author BNTang
*/
public interface AiCodeHelperService {
@SystemMessage("你是一位编程小助手")
String chat(String userMessage);
}
不过由于我们提示词较长,写到注解里很不优雅,所以单独在 resources 目录下新建文件 system-prompt.txt 来存储系统提示词。
@SystemMessage 注解支持从文件中读取系统提示词:
@SystemMessage(fromResource = "system-prompt.txt")
然后我们需要编写工厂类,用于创建 AI Service:
/**
* AI 代码助手服务工厂
*
* @author BNTang
*/
@Configuration
public class AiCodeHelperServiceFactory {
@Resource
private ChatModel qwenChatModel;
/**
* 创建 AI 代码助手服务实例
*
* @return AI 代码助手服务
*/
@Bean
public AiCodeHelperService aiCodeHelperService() {
// 创建并返回 AI 代码助手服务实例
return AiServices.create(AiCodeHelperService.class, qwenChatModel);
}
}
调用 AiServices.create 方法就可以创建出 AI Service 的实现类了,背后的原理是利用 Java 反射机制创建了一个实现接口的代理对象,代理对象负责输入和输出的转换,比如把 String 类型的用户消息参数转为 UserMessage 类型并调用 ChatModel,再将 AI 返回的 AiMessage 类型转换为 String 类型作为返回值。
但我们不用关心这么多,直接写接口和注解来开发就好。
你喜欢这种开发方式么?
编写单元测试,调用我们开发的 AI Service:
@SpringBootTest
class AiCodeHelperServiceTest {
@Resource
private AiCodeHelperService aiCodeHelperService;
@Test
void chat() {
String result = aiCodeHelperService.chat("你好,我是程序员NEO");
System.out.println(result);
}
}
Debug 运行,发现生成了 AI Service 的代理类,并且系统提示词生效了。是不是比之前自己拼接系统消息要方便多了?
Spring Boot 项目中使用
如果你觉得手动调用 create 方法来创建 Service 比较麻烦,在 Spring Boot 项目中可以引入依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.1.0-beta7</version>
</dependency>
然后给 AI Service 加上 @AiService 注解,就能自动创建出服务实例了:
/**
* AI 代码助手服务接口
*
* @author BNTang
*/
@AiService
public interface AiCodeHelperService {
@SystemMessage(fromResource = "system-prompt.txt")
String chat(String userMessage);
}
记得注释掉之前工厂类的 @Configuration 注解,否则会出现 Bean 冲突
再次运行单元测试,也是可以正常对话的:
这种方式虽然更方便了,但是缺少了自主构建的灵活性(可以自由设置很多参数),所以我建议还是采用自主构建。之后的功能特性,我们也会基于这种 AI Service 开发模式来实现。
如果这篇文章帮到了你,不妨点个“在看”或分享给同样需要的朋友吧! 你的每一次支持,都是我持续创作的动力!💪
往期推荐:
序号文章标题链接1MCP协议爆火揭秘查看详情2轻松配置Cursor玩转MCP查看详情3Browser-Tool 前端开发神器查看详情4AI编码焕新:用Context7查看详情5NotebookLM:靠谱知识库查看详情6Spring AI 玩转多轮对话查看详情7Cursor生成UI,加一步封神查看详情8神器!免费替代Postman查看详情
页:
[1]