【LangChain系列 9】Prompt模版——MessagePromptTemplate

原文地址:【LangChain系列 9】Prompt模版——MessagePromptTemplate

本文速读:

  • MessagePromptTemplate

  • MessagesPlaceholder

在对话模型(chat model) 中, prompt主要是封装在Message中,LangChain提供了一些MessagePromptTemplate,方便我们直接使用Message生成prompt。

01 MessagePromptTemplate


LangChain提供了几种类别的MessagePromptTemplate,比较常见的有:

  • AIMessagePromptTemplate

  • SystemMessagePromptTemplate

  • HumanMessagePromptTemplate

上面3种分别表示固定某种角色的Message模版,如果你需要自己来指定任意角色的话可以用ChatMessagePromptTemplate,这样就可以指定角色的名称,比如下面的代码,指定了角色名称为 Jedi。

from langchain.prompts import ChatMessagePromptTemplate

prompt = "May the {subject} be with you"

chat_message_prompt = ChatMessagePromptTemplate.from_template(role="Jedi", template=prompt)
chat_message_prompt.format(subject="force")
ChatMessage(content='May the force be with you', additional_kwargs={}, role='Jedi')

02 MessagesPlaceholder


同时,LangChain还为Message提供了占用符,我们可以使用MessagesPlaceholder来作为Message在占位符,这样我们可以根据实际的需要,在格式化prompt的时候动态地插入Message。

from langchain.prompts import MessagesPlaceholder

human_prompt = "Summarize our conversation so far in {word_count} words."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)

chat_prompt = ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="conversation"), human_message_template])

human_message = HumanMessage(content="What is the best way to learn programming?")
ai_message = AIMessage(content="""\
1. Choose a programming language: Decide on a programming language that you want to learn.

2. Start with the basics: Familiarize yourself with the basic programming concepts such as variables, data types and control structures.

3. Practice, practice, practice: The best way to learn programming is through hands-on experience\
""")

chat_prompt.format_prompt(conversation=[human_message, ai_message], word_count="10").to_messages()
[HumanMessage(content='What is the best way to learn programming?', additional_kwargs={}),
 AIMessage(content='1. Choose a programming language: Decide on a programming language that you want to learn. \n\n2. Start with the basics: Familiarize yourself with the basic programming concepts such as variables, data types and control structures.\n\n3. Practice, practice, practice: The best way to learn programming is through hands-on experience', additional_kwargs={}),
 HumanMessage(content='Summarize our conversation so far in 10 words.', additional_kwargs={})]

比如在上述代码中,在chat_prompt中定义了一个名为conversation的Message占位符,然后当chat_prompt调用format方法的时候,动态地将human_message,ai_message插入到占位符位置,从而替换占位符。

本文小结

MessagePromptTemplate在对话模型有着非常重要的作用,可以通过它来生成prompt;同时还可以通过MessagesPlaceholder实现占位符功能。

 更多最新文章,请关注公众号:大白爱爬山

<think>好的,我现在需要帮助用户解决关于LangChain4j中Prompt使用方法的问题。用户之前已经询问过,现在需要更详细的示例和说明。首先,我需要回顾一下之前的回答和相关引用,确保信息的一致性和准确性。 根据用户提供的引用[3],提示词模板是LangChain的核心功能之一,用于构建最终的Prompt。用户现在想了解如何在LangChain4j中使用Prompt,特别是具体的示例和方法。我需要从现有引用中提取相关信息,并结合LangChain4j的文档或常见用法来组织回答。 首先,用户可能需要知道如何创建提示模板。在Java中,可能需要使用类似Mustache的模板引擎,或者通过LangChain4j提供的工具类来定义模板。例如,引用[3]提到提示模板是构建Prompt的关键,所以需要展示如何定义一个带有变量的模板,如{{question}}。 其次,用户可能需要示例代码,所以需要编写一个简单的Java示例,展示如何创建模板、注入变量,并将模板传递给大模型进行处理。引用[2]中提到了使用Spring Boot和Qwen大模型,所以可能可以结合这些技术栈来举例,但用户的问题更关注Prompt本身,因此示例应保持简洁,专注于Prompt的使用。 接下来,用户可能需要了解动态模板和多变量处理。例如,如何处理多个输入参数的情况,或者如何根据不同的场景调整模板结构。这部分需要展示如何扩展模板,使用多个占位符,并说明变量替换的过程。 另外,高级用法如嵌套模板可能也是用户感兴趣的部分。比如,将多个子模板组合成一个主模板,这样可以提高复用性。需要解释如何创建子模板,并在主模板中引用它们,可能通过工具类或方法调用来实现。 然后,结合RAG(检索增强生成)的示例会很有帮助,因为引用[2]提到过如何用LangChain4j搭建RAG系统。可以展示在RAG流程中如何利用Prompt模板整合检索到的上下文和用户问题,生成更准确的回答。这部分需要说明如何将检索到的文档列表插入到Prompt中,并确保变量正确替换。 最后,需要确保所有示例符合用户提出的格式要求,如代码块使用正确的语法高亮,数学公式用$...$包裹等。同时,生成的相关问题要围绕Prompt的使用展开,帮助用户深入理解。 现在要检查是否有遗漏点,例如是否正确引用用户提供的引用,是否覆盖了基本和高级用法,示例是否清晰易懂。可能还需要确认LangChain4j的具体API是否与示例中的代码相符,比如是否存在PromptTemplate类或工具类的方法,必要时参考官方文档或示例进行调整,确保示例的准确性。 总结回答的结构:先介绍Prompt模板的基本用法,给出简单示例;然后动态模板和多变量处理;接着高级用法如嵌套模板;最后结合RAG的示例。相关问题部分则围绕模板设计、变量处理、与RAG整合等提出问题,引导用户进一步探索。</think>以下是如何在LangChain4j中使用Prompt的详细方法和示例: ### 一、Prompt模板基础 LangChain4j通过`PromptTemplate`类实现动态提示词,支持变量注入。基本格式采用类似Mustache的`{{变量}}`语法: ```java String template = "请用中文回答:{{question}}"; PromptTemplate promptTemplate = new PromptTemplate(template); // 变量注入 Map<String, Object> variables = new HashMap<>(); variables.put("question", "量子计算的优势是什么?"); Prompt prompt = promptTemplate.apply(variables); // 生成最终prompt ``` ### 二、动态模板示例 支持多变量和复杂逻辑: ```java String advTemplate = """ 根据以下上下文: {{context}} 回答这个问题: {{question}} 要求: 1. 使用{{language}}回答 2. 包含3个重点"""; PromptTemplate advPromptTemplate = new PromptTemplate(advTemplate); // 多变量注入 Map<String, Object> params = new HashMap<>(); params.put("context", docs); // 文档列表 params.put("question", "如何预防感冒?"); params.put("language", "中文"); ``` ### 三、高级用法 1. **嵌套模板**(通过工具类组合): ```java String styleTemplate = "用{{tone}}语气改写:{{content}}"; String mainTemplate = "首先进行风格化:{{styledText}},然后分析技术要点"; // 组合模板 PromptTemplate finalPrompt = PromptTemplate.combine( new PromptTemplate(styleTemplate), new PromptTemplate(mainTemplate) ); ``` 2. **RAG集成示例**: ```java String ragTemplate = """ 基于以下知识库内容: {{#each documents}} • {{this}} {{/each}} 请回答:{{query}} """; List<String> retrievedDocs = milvusClient.search("气候变化影响"); // 从Milvus获取文档 Prompt ragPrompt = new PromptTemplate(ragTemplate) .apply(Map.of( "documents", retrievedDocs, "query", "北极冰盖融化速度是多少?" )); String answer = qwenModel.generate(ragPrompt); // 调用大模型[^2] ``` ### 四、最佳实践 1. 变量默认值设置: ```java PromptTemplate.withDefault("format", "Markdown"); ``` 2. 模板版本管理(通过JSON配置): ```json { "templateName": "QA", "content": "问题:{{question}}\n要求:{{requirements}}", "defaults": { "requirements": "回答需包含示意图说明" } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值