LangChain4j 提示词模板与注解使用
·
一、核心注解概述
LangChain4j 中通过特定注解配置提示词模板,实现对大语言模型(LLM)的精准指令控制,核心注解包括 @SystemMessage、@UserMessage、@MemoryId、@V,主要用于定义系统提示、用户输入、会话记忆和参数绑定。
二、@SystemMessage(系统提示词)
2.1 核心作用
- 设定 AI 助手的角色、能力范围、回答风格等基础指令。
- 内容会转换为
SystemMessage对象,与UserMessage一起发送给 LLM。 - 关键特性:仅发送一次;修改内容会导致之前的聊天记忆失效。
2.2 配置方式
方式 1:直接注解赋值
// 在 chat 方法上添加注解,直接指定系统提示词内容
@SystemMessage("你是我的好朋友,请用东北话回答问题。")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
方式 2:包含动态占位符
支持 {{current_date}} 占位符,自动填充当前日期:
@SystemMessage("你是我的好朋友,请用东北话回答问题。今天是{{current_date}}")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
方式 3:从资源文件加载
通过 fromResource 指定外部提示词模板文件(如 .txt),解耦提示词与代码:
// 加载 resources 目录下的 my-prompt-template.txt 文件
@SystemMessage(fromResource = "my-prompt-template.txt")
String chat(@MemoryId int memoryId, @UserMessage String userMessage);
模板文件示例(my-prompt-template.txt):
plaintext
你是我的好朋友,请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。
2.3 测试代码
package com.atguigu.java.ai.langchain4j;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
@SpringBootTest
public class PromptTest {
@Autowired
private SeparateChatAssistant separateChatAssistant;
@Test
public void testSystemMessage() {
// 调用 chat 方法,memoryId 用于标识会话记忆
String answer = separateChatAssistant.chat(3,"今天几号");
System.out.println(answer); // 输出带东北话、当前日期的回答
}
}
三、@UserMessage(用户提示词模板)
3.1 核心作用
定义用户输入的模板格式,可结合占位符动态替换用户输入内容,每次调用都会将模板 + 用户输入发送给 LLM。
3.2 配置方式
方式 1:默认占位符 {{it}}
适用于单个参数,{{it}} 自动绑定方法的唯一参数:
@UserMessage("你是我的好朋友,请用上海话回答问题,并且添加一些表情符号。 {{it}}")
String chat(String message); // {{it}} 对应 message 参数
方式 2:指定参数名 {{参数名}} + @V 注解
适用于单个 / 多个参数,@V("参数名") 明确绑定模板中的占位符,多参数时必须使用:
// 单个参数指定名称
@UserMessage("你是我的好朋友,请用上海话回答问题,并且添加一些表情符号。{{message}}")
String chat(@V("message") String userMessage);
// 多个参数(结合 @MemoryId 会话记忆)
@UserMessage("你是我的好朋友,请用粤语回答问题。{{message}}")
String chat2(@MemoryId int memoryId, @V("message") String userMessage);
3.3 测试代码
@Autowired
private MemoryChatAssistant memoryChatAssistant;
// 测试默认占位符 {{it}}
@Test
public void testUserMessage() {
String answer = memoryChatAssistant.chat("我是环环");
System.out.println(answer); // 输出上海话+表情的回答:“侬是环环呀😜~”
}
// 测试 @V 注解绑定参数
@Test
public void testV() {
String answer1 = separateChatAssistant.chat2(1, "我是环环");
System.out.println(answer1); // 粤语回答:“你係环环㗎😝~”
String answer2 = separateChatAssistant.chat2(1, "我是谁");
System.out.println(answer2); // 粤语回答:“你係环环呀😜,唔记得啦?”
}
四、@SystemMessage + @V 结合使用(多参数场景)
4.1 核心场景
系统提示词模板包含自定义参数(如用户名、年龄),结合 @V 注解动态填充,实现个性化指令。
4.2 配置步骤
步骤 1:定义方法并组合注解
// 从资源文件加载系统提示词模板,结合多参数
@SystemMessage(fromResource = "my-prompt-template3.txt")
String chat3(
@MemoryId int memoryId, // 会话记忆ID
@UserMessage String userMessage, // 用户输入问题
@V("username") String username, // 绑定模板中的 {{username}}
@V("age") int age // 绑定模板中的 {{age}}
);
步骤 2:创建提示词模板文件(my-prompt-template3.txt)
plaintext
你是我的好朋友,我是{{username}},我的年龄是{{age}},请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。
步骤 3:测试代码
@Test
public void testUserInfo() {
// 传入参数:memoryId=1,用户问题=“我是谁,我多大了”,username=翠花,age=18
String answer = separateChatAssistant.chat3(1, "我是谁,我多大了", "翠花", 18);
System.out.println(answer);
// 输出示例:“翠花妹子😘,你今年18岁啦!今儿个是2026年2月24日,咋还忘咯~”
}
五、会话记忆配置(可选)
为保证上下文连续性,需配置会话记忆及持久化(如 MongoDB),核心代码片段:
// 构建 ChatMemory 时配置
ChatMemory.builder()
.id(memoryId) // 会话记忆唯一ID
.maxMessages(10) // 最大记忆消息数
.chatMemoryStore(mongoChatMemoryStore) // 持久化存储(MongoDB)
.build();
六、项目实战:硅谷小智(核心整合)
6.1 核心目标
实现带会话记忆、持久化、个性化提示词的聊天助手(东北话 + 表情 + 用户信息 + 当前日期)。
6.2 实现步骤
- 创建助手类 XiaozhiAgent:
@Component
public class XiaozhiAgent {
// 系统提示词从资源文件加载
@SystemMessage(fromResource = "zhaozhi-prompt-template.txt")
public String chat(
@MemoryId int memoryId,
@UserMessage String userMessage,
@V("username") String username,
@V("age") int age
) {
// 底层由 LangChain4j 自动调用 LLM 并返回结果
return "";
}
}
- 创建提示词模板(zhaozhi-prompt-template.txt):
plaintext
你是我的好朋友,我是{{username}},我的年龄是{{age}},请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。
- 测试调用:
@Autowired
private XiaozhiAgent xiaozhiAgent;
@Test
public void testXiaozhi() {
String answer = xiaozhiAgent.chat(1, "我是谁?多大了?", "翠花", 18);
System.out.println(answer);
}
七、关键注意事项
@MemoryId:用于标识会话记忆,不同 ID 对应不同的聊天上下文,配合maxMessages控制记忆长度。- 占位符规则:
{{current_date}}:自动填充当前日期,无需手动传参;{{it}}:仅适用于单个参数,自动绑定方法唯一参数;{{自定义参数名}}:需配合@V("自定义参数名")绑定,多参数必用。
- 资源文件路径:默认读取
resources根目录下的文件,如需子目录需指定路径(如templates/my-prompt.txt)。 - 会话记忆失效:修改
@SystemMessage内容会导致原有会话记忆失效,需重新建立会话。
总结
@SystemMessage用于定义 AI 角色 / 基础规则,支持直接赋值、占位符、资源文件加载,修改会清空会话记忆;@UserMessage用于定义用户输入模板,单参数可用{{it}},多参数必须用@V("参数名")绑定占位符;- 核心组合用法:
@SystemMessage(资源文件) + @V(自定义参数) + @MemoryId(会话记忆)实现个性化、带上下文的智能聊天。
更多推荐



所有评论(0)