跳转至

LangChain提示词模板

提示词模板(Prompt Template)是 LangChain 的核心概念之一。它允许你将提示词中的固定部分动态变量分离开来,写出可复用的提示词。

1. ChatPromptTemplate

ChatPromptTemplate 是最常用的模板类型,对应聊天模型的消息格式。

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位专业的{role},请用简洁的语言回答问题。"),
    ("human", "{question}"),
])

# 填入变量,生成最终的消息列表
messages = prompt.invoke({
    "role": "Python 程序员",
    "question": "什么是列表推导式?",
})

print(messages)

花括号 {变量名} 是占位符,调用 invoke() 时传入对应的值替换它们。

2. 与模型结合使用

将模板和模型用管道符 | 连接起来,形成一个处理链:

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

load_dotenv()

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位{language}编程专家。"),
    ("human", "请解释一下:{concept}"),
])

llm = ChatOpenAI(model="gpt-4o-mini")

chain = prompt | llm

response = chain.invoke({
    "language": "Python",
    "concept": "生成器(Generator)",
})

print(response.content)

prompt | llm 创建了一个链:先由模板生成消息,再传给模型处理。这是 LangChain 表达式语言(LCEL)的基础用法。

3. 多轮对话模板

可以在模板中加入历史消息,实现多轮对话效果:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位友善的助手。"),
    MessagesPlaceholder(variable_name="history"),  # 历史消息占位符
    ("human", "{input}"),
])

messages = prompt.invoke({
    "history": [
        HumanMessage(content="我叫小明"),
        AIMessage(content="你好,小明!很高兴认识你。"),
    ],
    "input": "你还记得我叫什么吗?",
})

print(messages)

MessagesPlaceholder 是一个特殊占位符,用于插入一组消息(通常是对话历史)。

4. PromptTemplate(纯文本模板)

如果用的是纯文本类型的模型(非聊天格式),可以使用 PromptTemplate

from langchain_core.prompts import PromptTemplate

template = PromptTemplate.from_template(
    "将下面的文字从{source_lang}翻译成{target_lang}\n\n{text}"
)

prompt = template.invoke({
    "source_lang": "中文",
    "target_lang": "英文",
    "text": "你好,世界!",
})

print(prompt.text)
# 将下面的文字从中文翻译成英文:
#
# 你好,世界!

5. 部分填充(Partial)

有时某些变量是已知的固定值,可以提前填入,生成一个新的"部分模板":

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位{language}专家。"),
    ("human", "{question}"),
])

# 固定 language,得到一个只需要填 question 的新模板
python_prompt = prompt.partial(language="Python")

chain_response = python_prompt.invoke({"question": "什么是 GIL?"})
print(chain_response)

6. 示例选择器(Few-shot)

Few-shot 是指给模型提供几个示例,帮助它更好地理解你的需求:

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

load_dotenv()

examples = [
    {"input": "开心", "output": "😊"},
    {"input": "悲伤", "output": "😢"},
    {"input": "愤怒", "output": "😡"},
]

example_prompt = ChatPromptTemplate.from_messages([
    ("human", "{input}"),
    ("ai", "{output}"),
])

few_shot_prompt = FewShotChatMessagePromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
)

final_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个将情绪转换为表情符号的助手。"),
    few_shot_prompt,
    ("human", "{input}"),
])

llm = ChatOpenAI(model="gpt-4o-mini")
chain = final_prompt | llm

response = chain.invoke({"input": "惊讶"})
print(response.content)  # 输出类似 😮

总结

  • ChatPromptTemplate 用于聊天模型,PromptTemplate 用于纯文本模型
  • {变量名} 定义占位符,invoke() 时传入字典填充
  • MessagesPlaceholder 用来插入动态消息列表(如对话历史)
  • partial() 可以提前固定部分变量,得到更专用的模板
  • Few-shot 示例模板帮助模型理解输出格式

评论