【AI】AIService(基本使用与指令定制)
文章目录
- 【AI】AIService(基本使用与指令定制)
- 1. 简介
- 2. @AIService
- 2.1 引入依赖
- 2.2 编写AIService接口
- 2.3 测试代码
- 3. 指令定制
- 3.1 系统提示词
- 3.2 用户提示词
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(基本使用与指令定制)的介绍与使用了,如果上述内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧✨