一、核心注解概述

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 实现步骤

  1. 创建助手类 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 ""; 
    }
}
  1. 创建提示词模板(zhaozhi-prompt-template.txt)

plaintext

你是我的好朋友,我是{{username}},我的年龄是{{age}},请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。
  1. 测试调用

@Autowired
private XiaozhiAgent xiaozhiAgent;

@Test
public void testXiaozhi() {
    String answer = xiaozhiAgent.chat(1, "我是谁?多大了?", "翠花", 18);
    System.out.println(answer);
}

七、关键注意事项

  1. @MemoryId:用于标识会话记忆,不同 ID 对应不同的聊天上下文,配合 maxMessages 控制记忆长度。
  2. 占位符规则:
    • {{current_date}}:自动填充当前日期,无需手动传参;
    • {{it}}:仅适用于单个参数,自动绑定方法唯一参数;
    • {{自定义参数名}}:需配合 @V("自定义参数名") 绑定,多参数必用。
  3. 资源文件路径:默认读取 resources 根目录下的文件,如需子目录需指定路径(如 templates/my-prompt.txt)。
  4. 会话记忆失效:修改 @SystemMessage 内容会导致原有会话记忆失效,需重新建立会话。

总结

  1. @SystemMessage 用于定义 AI 角色 / 基础规则,支持直接赋值、占位符、资源文件加载,修改会清空会话记忆;
  2. @UserMessage 用于定义用户输入模板,单参数可用 {{it}},多参数必须用 @V("参数名") 绑定占位符;
  3. 核心组合用法:@SystemMessage(资源文件) + @V(自定义参数) + @MemoryId(会话记忆) 实现个性化、带上下文的智能聊天。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐