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 注解进行定义

相关推荐
灵性(๑>ڡ<)☆9 小时前
Java学习笔记 --面向对象进阶
java·笔记·学习
weigangwin9 小时前
DSPy 采用笔记:先证明 LLM 程序合同,再谈 Prompt 优化
笔记·prompt
写了20年代码的老程序员9 小时前
Java Lambda 类型安全查询是怎么实现的?从字节码层面拆一遍
java·开源
_冷眸_9 小时前
用 OpenAI SDK 统一调用 Claude、Gemini、DeepSeek:聊聊 AI API 聚合网关的实践
人工智能·ai·llm·agent
唐青枫9 小时前
Java RabbitMQ 实战指南:从交换机、队列到可靠消息处理
java
卓怡学长9 小时前
w272基于springboot便民医疗服务小程序
java·spring boot·spring·小程序·intellij-idea
一方~9 小时前
权限系统设计
java
盐焗鹌鹑蛋9 小时前
【C++】多态
java·jvm·c++
rebibabo9 小时前
Java高并发底层原理(七)volatile 到底解决了什么问题
java·学习笔记·volatile·可见性·有序性·指令重排
名字还没想好☜10 小时前
Go 并发实战:用 channel 实现 worker pool
java·数据库·后端·golang·go