一、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 规则
角色>任务>格式>约束四段式最稳- 禁止 AI 自由发挥:用 "只输出""
禁止""必须" - 变量用
{``{key}},和模板引擎一致 SystemMessage放第一条,优先级最高(List<ChatMessage>)- 在
@SystemMessage、@UserMessage中出现的所有{``{变量}}必须用@V ("变量名")绑定到方法参数!
八、总结
总结下来提示词一共就两种用法,
一种是对话时放到List<ChatMessage>中的第一条进行定义,
另一种就是使用@SystemMessage 注解进行定义