【LangChain系列 11】Prompt模版——拼装组合

本文详细讲解了在LangChain中如何组合多个prompt模版和拼装单个模版,通过实例展示了PipelinePrompt的使用以及字符串和对话prompt的拼装技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:【LangChain系列 11】Prompt模版——拼装组合

本文速读:

  • 多prompt模版组合

  • 单prompt模版拼装

在平常业务开发中,我们常常需要把一些公共模块提取出来作为一个独立的部分,然后将业务中去将这些模块进行组合。在LLM应用开发中,我们也会需要采用这种思想,比如将一些公共的promt模版独立出来,这样prompt模版就可以更好地复用,减少不必要的代码,保持代码和逻辑的简洁。

LangChain对prompt模版的组合提供两种方式:

1. 针对多个prompt模版进行组合。

2. 将多个部分拼装成一个prompt模版。

01 多prompt模版组合


LangChain提供了PipelinePrompt来进行多prompt模版组合。一个PipelinePrompt包含两个部分:

  • 最终的prompt模版:最终生成的prompt模版。

  • 待组合的prompt模版:它是一个列表,列表里的每一项包含一个名字和一个prompt模版。

如下面代码所示,full_prompt就是最终的 prompt模版,input_prompts就是 待组合的prompt模版;将input_prompts中的prompt模版最终组合成了full_prompt。

from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts.prompt import PromptTemplate

full_template = """{introduction}

{example}

{start}"""
full_prompt = PromptTemplate.from_template(full_template)

introduction_template = """You are impersonating {person}."""
introduction_prompt = PromptTemplate.from_template(introduction_template)

example_template = """Here's an example of an interaction: 

Q: {example_q}
A: {example_a}"""
example_prompt = PromptTemplate.from_template(example_template)

start_template = """Now, do this for real!

Q: {input}
A:"""
start_prompt = PromptTemplate.from_template(start_template)

input_prompts = [
    ("introduction", introduction_prompt),
    ("example", example_prompt),
    ("start", start_prompt)
]
pipeline_prompt = PipelinePromptTemplate(final_prompt=full_prompt, pipeline_prompts=input_prompts)
print(pipeline_prompt.input_variables)

输出结果:

['example_a', 'person', 'example_q', 'input']

执行下面代码:

print(pipeline_prompt.format(
    person="Elon Musk",
    example_q="What's your favorite car?",
    example_a="Tesla",
    input="What's your favorite social media site?"
))

输出结果:

    You are impersonating Elon Musk.
    Here's an example of an interaction: 

    Q: What's your favorite car?
    A: Tesla
    Now, do this for real!

    Q: What's your favorite social media site?
    A:

02 单prompt版拼装


单prompt模版拼装是指将多个部分拼装成一个完整的prompt模版,一般来说是将字符串与prompt模版拼成一个新的prompt模版。下面主要介绍字符串prompt模版和对话prompt模版这两种模版的拼装,通过两个代码示例来介绍它们的用法。

字符串prompt模版

在下面代码中,将一个字符串prompt模版和两个字符串通过 + 拼装起来。

from langchain.prompts import PromptTemplate

prompt = (
    PromptTemplate.from_template("Tell me a joke about {topic}")
    + ", make it funny"
    + "\n\nand in {language}"
)
print(prompt)

输出结果:

PromptTemplate(input_variables=['language', 'topic'], output_parser=None, partial_variables={}, template='Tell me a joke about {topic}, make it funny\n\nand in {language}', template_format='f-string', validate_template=True)

执行代码:

print(prompt.format(topic="sports", language="spanish"))

输出结果:

'Tell me a joke about sports, make it funny\n\nand in spanish'

同样,我们可以在LLMChain中使用这个拼装的prompt。

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain

model = ChatOpenAI(openai_api_key="xxx")
chain = LLMChain(llm=model, prompt=prompt)
chain.run(topic="sports", language="spanish")

执行代码,输出结果:

'¿Por qué el futbolista llevaba un paraguas al partido?\n\nPorque pronosticaban lluvia de goles.'

对话prompt模版

在下面代码中,将对话prompt中的Message和字符串通过 + 进行拼装,形成一个新的prompt模版,不仅可以将Message进行拼装,而且可以将MessagePrompt进行拼装,不过先要将MessagePrompt中的变量进行赋值。

from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import HumanMessage, AIMessage, SystemMessage

prompt = SystemMessage(content="You are a nice pirate")
new_prompt = (
    prompt
    + HumanMessage(content="hi")
    + AIMessage(content="what?")
    + "{input}"
)

print(new_prompt.format_messages(input="i said hi"))

输出结果:

[SystemMessage(content='You are a nice pirate', additional_kwargs={}),
   HumanMessage(content='hi', additional_kwargs={}, example=False),
   AIMessage(content='what?', additional_kwargs={}, example=False),
   HumanMessage(content='i said hi', additional_kwargs={}, example=False)]

同样地,可以在LLMChain中使用它:

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain

model = ChatOpenAI(openai_api_key="xxx")
chain = LLMChain(llm=model, prompt=new_prompt)
chain.run("i said hi")

执行代码,输出结果:

'Oh, hello! How can I assist you today?'

本文小结

本文主要介绍了prompt模版的拼装组合,既可以将多个prompt模版进行组合,也可以对单个prompt模版进行拼装。

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

<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、付费专栏及课程。

余额充值