【AI】AIService(基本使用与指令定制)
本文介绍了AIService的基本使用与指令定制功能。AIService作为应用程序服务层组件,能够处理复杂AI操作,包括格式化输入、解析输出、聊天记忆等功能。通过@AIService注解可快速实现自动装配,支持ChatModel、ChatMemory等多种组件。文章详细讲解了如何使用@SystemMessage和@UserMessage注解定制系统提示词和用户提示词,包括参数占位符的使用方法。通
【AI】AIService(基本使用与指令定制)
文章目录
1. 简介
AIService可以被视为应用程序服务层的一个组件,提供对应的ai服务,所以被称为AIService,它能够帮助我们完成一些复杂的ai操作:
- 为模型格式化输入内容
- 解析模型的输出结果
- 聊天记忆Chat Memory
- 工具 Tools
- 检索增强生成RAG
同时AIService有两种使用方式,一种需要手动装配,另一种通过 @AIService 注解即可调用,后面的文章我们都使用 @AIService 来进行讲解。
2. @AIService
@AIService可以添加在服务类上,然后实现组件在AI服务中的自动装配,支持以下常用组件:
- ChatModel:指定聊天模型
- StreamingChatModel:流式响应聊天模型
- ChatMemory:聊天记忆(内存存储)
- ChatMemoryProvider:分离记忆聊天(可指定存储位置)
- Tools:可自定义接口服务然后进行调用
以上不同的组件会在后续的文章中讲解,接下来完成对AIService的初步使用:
2.1 引入依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
2.2 编写AIService接口
import dev.langchain4j.service.spring.AiService;
import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {
String chat(String userMessage);
}
其中AIService带了两个参数,wiringMode默认为AiServiceWiringMode.EXPLICIT,即自动装配chatModel,框架会自己去自动装配IOC容器中已有的chatModel,而chatModel参数代表这里我们指定了模型qwenChatModel
2.3 测试代码
可以注解将Assistant注入进测试代码进行调用:
@Autowired
private Assistant assistant;
@Test
public void testAssistant() {
String answer = assistant.chat("你是谁");
System.out.println(answer);
}
执行结果:
我是Qwen,这是我的英文名,中文名叫通义千问。我是阿里云自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。
这样AIService就引入成功了!
3. 指令定制
在将我们的提示词交给ai去解析之前,我们可以通过一些特定的注解,来完成对指令提示词的重新定制
3.1 系统提示词
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {
@SystemMessage("你是我的好朋友小明,请用粤语回答我的问题。 ")
String chat(String userMessage);
}
在chat方法上添加@SystemMessage注解,该注解内部内容将会被转换成SystemMessage对象,并于UserMessage一起发给LLM(大语言模型),且会在用户提示词之前提交给模型,相当于给此时的模型回复加上一个角色设定 或 要求定制*,此时再问ai你是谁,回复会有所改变:

如果你需要定制的要求内容较多,也可以将其存储在一个资源文件中让@SystemMessage去读取:
@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {
@SystemMessage(fromResource = "myPrompt.txt")
String chat(String userMessage);
}
@Test
public void testAssistant()
String answer = assistant.chat("你知道故宫吗?");
System.out.println(answer);
}
文件内容如下:

执行结果:
注:@SystemMessage的内容只会在这次记忆中给模型发送一次,但效果会在这次记忆中一直延伸。
3.2 用户提示词
@UserMessage能够将方法参数嵌入到预定义的提示结构中,例如:
@UserMessage("你是谁,猜猜{{it}}")
String chat(String userMessage);
@Test
public void testAssistant()
String answer = assistant.chat("我是谁");
System.out.println(answer);
}
这里的{{it}}表示这里唯一参数的占位符,使用@UserMessage会将我们的提供给ai的提示词信息嵌入到对应的占位符中,如上述的“我是谁”将转变为:
你是谁,猜猜我是谁
执行结果如下:

如果用户提供的参数不止一个,则需要使用@V来结合使用:
@UserMessage("我的名字是{{name}},今年{{age}}岁,请用天津话回答问题。{{it}}")
String chat(@V("age") String age, @V("name") String name, @V("it") String userMessage);
@Test
public void testAssistant() {
String answer = assistant.chat("18", "李明", "我是谁");
System.out.println(answer);
}
// 用户的提问内容会被转变为:我的名字是李明,今年18岁,请用天津话回答问题。我是谁
执行结果:

同时@V也可作用于@SystemMessage:
@SystemMessage(fromResource = "myPrompt.txt")
String chat(@V("age") String age, @V("name") String name, @UserMessage String userMessage);
@Test
public void testAssistant() {
String answer = assistant.chat("20", "天天", "你那里有什么特色美食吗");
System.out.println(answer);
}
文件内容:

执行结果:

注:这里需要做好对@SystemMessage和@UserMessage的区分,最直接的区别就是:@SystemMessage的内容会单独优先发一条信息给模型,而@UserMessage则是将用户提供的prompt与@UserMessage的内容结合起来然后一起发给模型,所以二者还是有区别的!
以上便是对AIService(基本使用与指令定制)的介绍与使用了,如果上述内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧✨
更多推荐


所有评论(0)