Langchain4j(3) Prompt 提示词工程 + PromptTemplate + SystemMessage 高级用法

一、LangChain4j 提示词(Prompt)核心三件套

PromptTemplate:提示词模板,支持变量替换
SystemMessage:系统角色设定(决定 AI 行为)
UserMessage / AiMessage:对话消息载体

二、基础:PromptTemplate 变量替换

复制代码
package org.deepseek.demo08;

import dev.langchain4j.model.input.Prompt;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.Map;

public class PromptTemplateDemo {

    public static void main(String[] args) {
        // 1. 定义带变量的模板
        PromptTemplate template = PromptTemplate.from(
                "你是专业的{{role}},请用{{style}}回答:{{question}}"
        );

        // 2. 填入参数
        Prompt prompt = template.apply(Map.of(
                "role", "Java工程师",
                "style", "简洁分点",
                "question", "什么是JVM?"
        ));

        // 3. 输出最终提示词
        System.out.println(prompt.text());
    }
}

三、最常用:SystemMessage 角色设定(决定 AI 性格)

复制代码
package org.deepseek.demo08;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

import java.util.List;

public class SystemPromptDemo {
    public static void main(String[] args) {
        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("https://api.deepseek.com")
                .apiKey("sk-XXXXXXXXXXXXXXXXXXXX")
                .modelName("deepseek-chat")
                .build();

        // 系统提示(核心)
        SystemMessage system = SystemMessage.from("""
            你是Java技术助手。
            规则:
            1. 只回答技术问题
            2. 回答简洁、分点
            3. 不编造内容
        """);

        UserMessage user = UserMessage.from("ArrayList和LinkedList区别");

        List<ChatMessage> messages = List.of(system, user);

        String answer = model.chat(messages).aiMessage().text();
        System.out.println(answer);
    }
}

四、@SystemMessage定义角色

和 AiServices 结合:

接口 + @SystemMessage

写法一:

复制代码
package org.deepseek.demo08;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;

public interface Assistant {
    @SystemMessage("""
        你是代码审查助手。
        只输出问题和优化建议,不废话。
    """)
    String review(@UserMessage String code);
}

package org.deepseek.demo08;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;

public class AssistantDemo {
    public static void main(String[] args) {
        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("https://api.deepseek.com")
                .apiKey("sk-XXXXXXXXXXXXXXXXXXXX")
                .modelName("deepseek-chat")
                .build();

        // 系统提示(核心)
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatModel(model)
                .build();

        String result = assistant.review("public class A{}");

        System.out.println(result);
    }
}

写法二:

所有 {``{变量}} 必须用 @V ("变量名") 绑定!

复制代码
    @SystemMessage("你是{{role}}") // 变量1
    @UserMessage("用户问题:{{question}}") // 变量2
    String answer(@V("role") String role,@V("question") String question);

package org.deepseek.demo08;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;

public class AssistantDemo {
    public static void main(String[] args) {
        // 2. 模型
        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("https://api.deepseek.com")
                .apiKey("sk-XXXXXXXXXXXXXXXXXX")
                .modelName("deepseek-chat")
                .build();

        // 系统提示(核心)
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatModel(model)
                .build();

        String result = assistant.answer(
                "Java工程师",    // 对应 {{role}}
                "什么是JVM?"     // 对应 {{question}}
        );

        // 输出结果
        System.out.println(result);

    }
}

五、高级:动态 SystemPrompt(模板 + 变量)

复制代码
package org.deepseek.demo08;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.input.PromptTemplate;
import dev.langchain4j.model.openai.OpenAiChatModel;

import java.util.List;
import java.util.Map;

public class SystemPromptDemo {
    public static void main(String[] args) {
        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("https://api.deepseek.com")
                .apiKey("sk-XXXXXXXXXXXXXXXXXXXX")
                .modelName("deepseek-chat")
                .build();

	// 写法一:
        // 静态文本(无变量、不替换)
        Prompt systemPrompt = Prompt.from("你是客服,语言:中文,风格:礼貌简洁");
        SystemMessage system1 = systemPrompt.toSystemMessage();

    // 写法二:
        // 真正的模板(可传变量、自动替换 {{key}})
        PromptTemplate systemPromptTemplate = PromptTemplate.from("""
            你是{{role}},
            语言:{{lang}},
            风格:{{style}}
        """);

        String systemText = systemPromptTemplate.apply(Map.of(
                "role", "客服",
                "lang", "中文",
                "style", "礼貌简洁"
        )).text();

        SystemMessage system = SystemMessage.from(systemText);

        UserMessage user = UserMessage.from("你是?");

        List<ChatMessage> messages = List.of(system, user);

        String answer = model.chat(messages).aiMessage().text();
        System.out.println(answer);
    }
}

六、结构化输出专用强力 Prompt( JSON 场景必备)

1.定义Json实体

复制代码
package org.deepseek.demo08;

import java.util.List;


public class UserIntent {
    private String intent;
    private List<String> keywords;

    public UserIntent() {
    }

    public UserIntent(String intent, List<String> keywords) {
        this.intent = intent;
        this.keywords = keywords;
    }

    public String getIntent() {
        return intent;
    }

    public void setIntent(String intent) {
        this.intent = intent;
    }

    public List<String> getKeywords() {
        return keywords;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }
}

2. 定义SystemMessage

复制代码
@SystemMessage("""
    你只输出标准JSON,不输出任何解释、markdown、标点外文字。
    输出格式:
    {
        "intent": "意图",
        "keywords": []
    }
""")
UserIntent analyze(String text);

3.对话

复制代码
package org.deepseek.demo08;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;

public class UserIntentDemo {
    public static void main(String[] args) {
        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("https://api.deepseek.com")
                .apiKey("sk-XXXXXXXXXXXXXXXXXX")
                .modelName("deepseek-chat")
                .temperature(0.1) // 越低越稳定,结构化必须低
                .build();

        Assistant assistant = AiServices.builder(Assistant.class)
                .chatModel(model)
                .build();

        String userText = "你们的Java课程多少钱?能不能优惠一点?我有点着急报名";
        UserIntent result = assistant.analyze(userText);

        // 4. 直接使用结构化数据!
        System.out.println("用户意图:" + result.getIntent());
        System.out.println("关键词:" + result.getKeywords());


    }
}

七、 Prompt 规则

  1. 角色 > 任务 > 格式 > 约束 四段式最稳
  2. 禁止 AI 自由发挥:用 "只输出""禁止""必须"
  3. 变量用 {``{key}},和模板引擎一致
  4. SystemMessage 放第一条,优先级最高(List<ChatMessage>
  5. @SystemMessage@UserMessage 中出现的所有 {``{变量}} 必须用 @V ("变量名") 绑定到方法参数!

八、总结

总结下来提示词一共就两种用法,

一种是对话时放到List<ChatMessage>中的第一条进行定义,

另一种就是使用@SystemMessage 注解进行定义

相关推荐
程序员黑豆7 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
ONE_SIX_MIX10 小时前
llama-server 部署 Qwen3.8-27B:真正开启 512K 上下文,突破 256K 截断
ai·qwen3·llama-cpp
mldong11 小时前
"applicant" 契约:退回发起人的闭环设计
java·架构
月华路11 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
ebok.11 小时前
国产大模型落地业务系统的优选载体:京微智枢信创 AI 业务支撑平台
大数据·人工智能·低代码·ai
gugucoding11 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
wujian831111 小时前
怎么用文心生成word文档?从格式错乱到智能导出,AI导出鸭让创作再无后顾之忧
人工智能·ai·word·豆包·deepseek·ai导出鸭
zww894911112 小时前
校园跑腿系统开发实战指南:从需求分析到上线部署全流程解析
java
Fluxart.ai12 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
雨辰AI13 小时前
RAG 知识库搭建:基于人大金仓构建信创运维问答机器人|全栈国产化落地完整版
运维·ai·机器人·ai编程