一、系统提示词
@SystemMessage 设定角色,塑造AI助手的专业身份,明确助手的能力范围
1.配置@SystemMessage
在SeparateChatAssistant类的chat方法上添加@SystemMessage注解
@SystemMessage("你是我的好朋友,请用湖南话回答问题。")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
@SystemMessage 的内容将在后台转换为 SystemMessage 对象,并与 UserMessage 一起发送给大语言模型(LLM)。
SystemMessaged的内容只会发送给大模型一次。
如果你修改了SystemMessage的内容,新的SystemMessage会被发送给大模型,之前的聊天记忆会失效。
2.测试
package com.zhan.chat;
import com.zhan.chat.assistant.SeparateChatAssistant;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PromptSystemMessageTest {
@Autowired
private SeparateChatAssistant separateChatAssistant;
@Test
public void test() {
String answer = separateChatAssistant.chat(4, "介绍下湖南的特点");
System.out.println(answer);
}
}
如果要显示今天的日期,我们需要在提示词中添加当前日期的占位符{{current_date}}
因为大语言模型的训练数据是有实效的
@SystemMessage("你是我的好朋友,请用湖南话回答问题。今天是{{current_date}}")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
package com.zhan.chat;
import com.zhan.chat.assistant.SeparateChatAssistant;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PromptSystemMessageTest {
@Autowired
private SeparateChatAssistant separateChatAssistant;
@Test
public void test() {
String answer = separateChatAssistant.chat(4, "今天是几号?");
System.out.println(answer);
}
}
3.资源中加载提示模板
@SystemMessage 注解还可以从资源中加载提示模板:
@SystemMessage(fromResource = "my-prompt-hunan.txt")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
二、户提示词模板
@UserMessage:获取用户输入
1.配置@UserMessage
在 MemoryChatAssistant 的 chat 方法中添加注解
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;
/**
* @author zhanxuewei
*/
@AiService(wiringMode = AiServiceWiringMode.EXPLICIT, chatModel = "qwenChatModel", chatMemory = "chatMemory")
public interface MemoryChatAssistant {
@UserMessage("你是我的好朋友,请用上海话回答问题,并且添加一些表情符号。 {{message}}")
String chat(String message);
}
2.测试
package com.zhan.chat;
import com.zhan.chat.assistant.MemoryChatAssistant;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PromptUserMessageTest {
@Autowired
private MemoryChatAssistant memoryChatAssistant;
@Test
public void test() {
String answer = memoryChatAssistant.chat("我是詹学伟");
System.out.println(answer);
}
}
三、指定参数名称
1.置@V
@V 明确指定传递的参数名称
@UserMessage("你是我的好朋友,请用上海话回答问题,并且添加一些表情符号。{{message}}")
String chat(@V("message") String userMessage)
2.多个参数的情况
如果有两个或两个以上的参数,我们必须要用 @V ,在 SeparateChatAssistant 中定义方法 chat2
@UserMessage("你是我的好朋友,请用粤语回答问题。{{message}}")
String chat2(@MemoryId int memoryId, @V("message") String userMessage);
测试: @UserMessage 中的内容每次都会被和用户问题组织在一起发送给大模型
@Test
public void test2() {
String answer = separateChatAssistant.chat2(4, "介绍下湖南的特点");
System.out.println(answer);
}
3.@SystemMessage和@V
也可以将 @SystemMessage 和 @V 结合使用
在 SeparateChatAssistant 中添加方法chat3
@SystemMessage(fromResource = "my-prompt-template3.txt")
String chat3(@MemoryId int memoryId, @UserMessage String userMessage, @V("username") String username, @V("age") int age);
建提示词模板my-prompt-template3.txt,添加占位符
测试:
@Test
public void test3() {
String answer = separateChatAssistant.chat3(5, "我是谁?", "詹学伟", 18);
System.out.println(answer);
}