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

相关推荐
拾薪2 小时前
Brainstorming 深度分析
ai·superpower·brainstorming
StarShip2 小时前
JVM堆栈溢出监测原理
android·java
爱分享的阿Q2 小时前
4月AI大模型全景GPT6国产模型MoE浪潮开发者解读
人工智能·ai
CodeCaptain2 小时前
【三】OpenClaw给飞书添加24小时工作的AI助理
windows·ubuntu·ai·飞书·openclaw
薛纪克2 小时前
前端自动化测试的 Spec 模式:用 Kiro Power 实现从需求到脚本的全链路自动化
前端·自动化测试·ai·kiro
北极的代码2 小时前
2026年Java后端热点科普:Java 26新特性+Java 21落地实战,解锁后端开发新范式
java·后端
敖正炀2 小时前
深入对比 Java 并发工具:CyclicBarrier、CountDownLatch 与 Semaphore
java
橘子编程2 小时前
Tomcat全栈指南:从入门到精通
java·tomcat
hrhcode2 小时前
【java工程师快速上手go】三.Go Web开发(Gin框架)
java·spring boot·golang