LangChain4j 提示词完全指南:SystemMessage、UserMessage 与 PromptTemplate 📅 2026/6/29 22:17:53 LangChain4j 提示词完全指南SystemMessage、UserMessage 与 PromptTemplate学会用好提示词让你的 AI 助手既专业又听话 提示词分类ChatMessageType中定义了五种消息类型理解它们是掌握 LangChain4j 的第一步 SYSTEM—— 通常由开发者定义给 AI 设定角色和边界USER—— 用户发来的消息AI—— AI 的回复TOOL_EXECUTION_RESULT—— 工具执行结果CUSTOM—— 自定义消息 不同类型的消息各司其职组合使用才能发挥最大威力。️ SystemMessage 的限定边界SystemMessage是给 AI 设定人设的关键。它决定了 AI 知道自己是谁、能做什么、不能做什么。️ 新建模块新建一个prompt模块作为我们实验提示词的 playground pom 引入核心依赖一览 projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.whc/groupIdartifactIdlangChain4j-whc/artifactIdversion1.0-SNAPSHOT/version/parentartifactIdlangchain4j-whc-prompt/artifactIdpackagingjar/packagingnamelangchain4j-whc-prompt/namepropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!-- Spring Boot Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- LangChain4j 核心 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-open-ai/artifactId/dependencydependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j/artifactId/dependencydependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-reactor/artifactId/dependency!-- 阿里百炼平台 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-community-dashscope-spring-boot-starter/artifactId/dependency!-- Lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- Hutool --dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.22/version/dependency!-- Spring Boot Starter --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-spring-boot-starter/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project⚙️ yaml 配置server:port:9006servlet:encoding:enabled:trueforce:truecharset:UTF-8spring:application:name:langchain_whc_promptai:dashScope:apiKey:${AI_DASHSCOPE_API_KEY}modelName:${AI_DASHSCOPE_MODEL_NAME}baseUrl:${AI_DASHSCOPE_BASE_URL} 通过环境变量注入敏感配置安全又灵活。 Config 配置Slf4jConfigurationpublicclassLlmConfig{Value(${ai.dashScope.apiKey})privateStringdashScopeApiKey;Value(${ai.dashScope.modelName})privateStringdashScopeModelName;Value(${ai.dashScope.baseUrl})privateStringdashScopeBaseUrl;BeanpublicStreamingChatModelstreamingChatModel(){returnOpenAiStreamingChatModel.builder().apiKey(dashScopeApiKey).modelName(dashScopeModelName).baseUrl(dashScopeBaseUrl).logRequests(true).logResponses(true).build();}} 开启日志方便调试开发阶段强烈推荐。 Assistant 接口在接口上加上SystemMessage注解给 AI 划定行为边界 AiServicepublicinterfaceDoctorAssistant{/** * 医生小助手测试 system message 的边界限制 * * param prompt 提示词 * return 响应 */SystemMessage(你是一位专业的医生小助手只回答医学方面的问题。输出限制对于其他领域的问题请返回抱歉我只是个弱小的医生小助手)FluxStringchat(Stringprompt);} ControllerSlf4jRestControllerRequiredArgsConstructorpublicclassPromptController{privatefinalDoctorAssistantdoctorAssistant;GetMapping(/system/prompt)publicFluxStringprompt(RequestParamStringprompt){returndoctorAssistant.chat(prompt);}} 测试验证测试 1问一个非医学问题请求宫保鸡丁是什么菜✅ AI 乖乖回答“抱歉我只是个弱小的医生小助手”测试 2问一个医学问题请求介绍下破伤风✅ AI 开始认真科普破伤风的致病机制和临床表现结论SystemMessage成功限定了 AI 的行为边界——只有医学相关问题才会得到回答。 UserMessage 占位符光有 SystemMessage 还不够我们还需要灵活地传递用户输入。这时候UserMessage占位符就派上用场了 ✨ 接口定义在DoctorAssistant中增加接口使用UserMessage来发送请求模板用{{}}进行占位配合V进行参数匹配 SystemMessage(你是一位专业的医生小助手只回答医学方面的问题。输出限制对于其他领域的问题请返回抱歉我只是个弱小的医生小助手)UserMessage(请回答以下医学问题{{question}})FluxStringchatUser(V(question)Stringprompt); ControllerGetMapping(/user/prompt)publicFluxStringpromptUser(RequestParamStringprompt){returndoctorAssistant.chatUser(prompt);} 测试验证请求带状疱疹是什么病✅ AI 详细回答了带状疱疹的病因与发病机制、临床表现。查看实际发送的请求结论占位符{{question}}被正确替换为用户输入测试成功 UserMessage 传递对象参数上面的占位方式可以进一步抽象为对象代码更优雅、更易维护 用户信息参数模板对象使用StructuredPrompt进行模板参数定义 DataStructuredPrompt(请回答:{{question}}并且返回加上前缀:{{responsePrefix}})publicclassUserPrompt{privateStringquestion;privateStringresponsePrefix;} 接口定义在DoctorAssistant中增加接口 SystemMessage(你是一位专业的医生小助手只回答医学方面的问题。输出限制对于其他领域的问题请返回抱歉我只是个弱小的医生小助手)FluxStringchatUserPrompt(UserPromptprompt); ControllerGetMapping(/user/user-prompt)publicFluxStringpromptUserPrompt(RequestParamStringquestion,RequestParamStringresponsePrefix){UserPromptpromptnewUserPrompt();prompt.setQuestion(question);prompt.setResponsePrefix(responsePrefix);returndoctorAssistant.chatUserPrompt(prompt);} 测试验证请求牙疼怎么办 前缀亲爱的主人小医为你解答✅ AI 返回的回复已经带上了我们指定的前缀查看实际发送的请求结论通过对象传递多个参数返回结果中已成功加入前缀参数。 PromptTemplate 形式除了使用对象形式LangChain4j 还提供了更灵活的PromptTemplate方式适合动态构建提示词的场景 ControllerGetMapping(/user/template)publicFluxStringpromptUserTemplate(RequestParamStringquestion,RequestParamStringresponsePrefix){PromptTemplatetemplatePromptTemplate.from(请回答:{{question}}并且返回加上前缀:{{responsePrefix}});Promptprompttemplate.apply(Map.of(question,question,responsePrefix,responsePrefix));Stringtextprompt.text();returndoctorAssistant.chat(text);} 测试验证请求上班太累牛马精神压力大怎么办 前缀苦逼的我只能说✅ AI 返回的回复带上了我们指定的前缀并且给出了合理的建议结论PromptTemplate方式测试成功适合需要动态拼接提示词的场景。 四种方式对比总结方式适用场景优点缺点SystemMessage固定角色设定简单直接无法动态传参UserMessage 占位符单个参数传递简洁易用多参数时代码冗长StructuredPrompt 对象多参数传递类型安全、易维护需要额外定义类PromptTemplate动态提示词构建最灵活需要手动拼接建议简单场景用占位符复杂场景用对象或 Template根据实际需求选择最合适的方式。 恭喜你已经掌握了 LangChain4j 提示词的四种核心方式。牛马下课✨Qdrant 向量数据库安装与入门指南langchain4j 工具调用让大模型从“会说”走向“会做”LangChain4j 提示词完全指南SystemMessage、UserMessage 与 PromptTemplateLangChain4j 实战ChatMemory 聊天记忆完全指南手把手教你用 LangChain4j 集成图片理解与图片生成LangChain4j 流式模式实战指南LangChain4j 与 Spring Boot集成指南