langchain学习总结-prompt组件

16 阅读4分钟

Prompt组件及使用技巧

本目录涵盖LangChain中Prompt组件的核心使用方法,包括基础用法、拼接技巧和模板复用。 方便后续开发agent的时候,记住用户和大模型直接的对话,langchain涵盖多个大模型处理输入处理。

1. Prompt组件基础用法

核心组件

组件说明
PromptTemplate基础字符串提示模板
ChatPromptTemplate聊天对话提示模板
MessagesPlaceholder消息占位符,用于动态插入历史消息
HumanMessagePromptTemplate人类消息模板

示例代码


from langchain_core.prompts import (
    PromptTemplate,
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)

# 基础PromptTemplate
prompt = PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
prompt_value = prompt.invoke({"subject": "程序员"})

# 输出方式
print(prompt.format(subject="喜剧演员"))  # 格式化字符串
print(prompt_value.to_string())          # 转为字符串
print(prompt_value.to_messages())        # 转为消息列表

输出

请讲一个关于喜剧演员的冷笑话
请讲一个关于程序员的冷笑话
[HumanMessage(content='请讲一个关于程序员的冷笑话', additional_kwargs={}, response_metadata={})]

ChatPromptTemplate 完整示例

from langchain_core.messages import AIMessage
from langchain_core.prompts import (
    PromptTemplate,
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)
from datetime import datetime

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是OpenAI开发的聊天机器人,当前时间:{now}"),
    MessagesPlaceholder("chat_history"),  # 动态历史消息
    HumanMessagePromptTemplate.from_template("请讲一个关于{subject}的冷笑话"),
]).partial(now=datetime.now())  # 预填充部分参数

chat_prompt_value = chat_prompt.invoke({
    "chat_history": [
        ("human", "我叫慕小课"),
        AIMessage("你好,我是ChatGPT"),
    ],
    "subject": "程序员",
})

print(chat_prompt_value.to_string(), 'toString')
print(chat_prompt_value.to_messages(), 'toMessages')

输出

System: 你是OpenAI开发的聊天机器人,当前时间:2025-12-30 17:47:29.512705
Human: 我叫慕小课
AI: 你好,我是ChatGPT
Human: 请讲一个关于程序员的冷笑话 toString
[SystemMessage(content='你是OpenAI开发的聊天机器人,当前时间:2025-12-30 17:47:29.512705', additional_kwargs={}, response_metadata={}), HumanMessage(content='我叫慕小课', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,我是ChatGPT', additional_kwargs={}, response_metadata={}), HumanMessage(content='请讲一个关于程序员的冷笑话', additional_kwargs={}, response_metadata={})] toMessages

关键方法

方法说明
from_template()从字符串模板创建
invoke()传入参数生成PromptValue
format()格式化为字符串
partial()预填充部分参数

2. 字符串提示拼接

使用 + 运算符直接拼接多个PromptTemplate。

from langchain_core.prompts import PromptTemplate

prompt = (
    PromptTemplate.from_template("请讲一个关于{subject}的冷笑话")
    + ",让我开心下" +
    "\n使用{language}语言"
)

result = prompt.invoke({"subject": "程序员", "language": "中文"}).to_string()

输出结果:

请讲一个关于程序员的冷笑话,让我开心下
使用中文语言

3. 消息提示模板拼接

拼接多个ChatPromptTemplate,构建复杂对话结构。

from langchain_core.prompts import ChatPromptTemplate

# 系统消息模板
system_chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是OpenAI开发的聊天机器人,我叫{username}"),
])

# 人类消息模板
human_chat_prompt = ChatPromptTemplate.from_messages([
    ("human", "{query}")
])

# 拼接
chat_prompt = system_chat_prompt + human_chat_prompt

result = chat_prompt.invoke({
    "username": "慕小课",
    "query": "你好,你是?"
})
print(result.to_string(), 'toString')
print(result.to_messages(), 'toMessages')

输出

System: 你是OpenAI开发的聊天机器人,我叫慕小课
Human: 你好,你是? toString
[SystemMessage(content='你是OpenAI开发的聊天机器人,我叫慕小课', additional_kwargs={}, response_metadata={}), HumanMessage(content='你好,你是?', additional_kwargs={}, response_metadata={})] toMessages

4. 复用提示模板(PipelinePromptTemplate) 低版本才有,高版本去除了

通过管道组合多个子模板,实现模块化和复用。

结构示意

┌─────────────────────────────────────┐
│         full_template               │
│  ┌─────────────────────────────┐    │
│  │ {instruction}                │    │
│  │ {example}                    │    │
│  │ {start}                      │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘
              ↓
┌─────────────────────────────────────┐
│      pipeline_prompts               │
│  instruction → instruction_prompt   │
│  example     → example_prompt       │
│  start       → start_prompt         │
└─────────────────────────────────────┘

示例代码

from langchain_core.prompts import PromptTemplate, PipelinePromptTemplate

# 最终模板框架
full_template = PromptTemplate.from_template("""{instruction}

{example}

{start}""")

# 子模板1: 指令
instruction_prompt = PromptTemplate.from_template("你正在模拟{person}")

# 子模板2: 示例
example_prompt = PromptTemplate.from_template("""下面是一个交互例子:

Q: {example_q}
A: {example_a}""")

# 子模板3: 开始
start_prompt = PromptTemplate.from_template("""现在,你是一个真实的人,请回答用户的问题:

Q: {input}
A:"""")

# 组装管道
pipeline_prompts = [
    ("instruction", instruction_prompt),
    ("example", example_prompt),
    ("start", start_prompt)
]

pipeline_prompt = PipelinePromptTemplate(
    final_prompt=full_template,
    pipeline_prompts=pipeline_prompts,
)

# 调用
result = pipeline_prompt.invoke({
    "person": "雷军",
    "example_q": "你最喜欢的汽车是什么?",
    "example_a": "小米su7",
    "input": "你最喜欢的手机是什么?"
}).to_string()

输出结果:

你正在模拟雷军

下面是一个交互例子:

Q: 你最喜欢的汽车是什么?
A: 小米su7

现在,你是一个真实的人,请回答用户的问题:

Q: 你最喜欢的手机是什么?
A:

优势

  • 模块化:每个子模板独立维护
  • 复用性:子模板可在多个Pipeline中复用
  • 可读性:复杂提示的结构更清晰

总结

技巧适用场景
PromptTemplate简单字符串提示
ChatPromptTemplate对话场景,含多种消息类型
MessagesPlaceholder动态插入历史消息