LangChain 中文教程LangChain 中文教程
首页
  • 什么是 LangChain
  • 环境搭建
  • 第一个应用
  • 模型调用
  • 提示词模板
  • 链式调用
  • 记忆功能
  • 工具使用
  • 检索增强生成(RAG)
  • Agent 智能体
  • LangGraph 入门
  • LangSmith 监控
  • 部署与优化
LangChain 官网
首页
  • 什么是 LangChain
  • 环境搭建
  • 第一个应用
  • 模型调用
  • 提示词模板
  • 链式调用
  • 记忆功能
  • 工具使用
  • 检索增强生成(RAG)
  • Agent 智能体
  • LangGraph 入门
  • LangSmith 监控
  • 部署与优化
LangChain 官网
  • 基础篇

    • 什么是 LangChain
    • 环境搭建
    • 第一个应用
    • 模型调用
    • 提示词模板

提示词模板

提示词(Prompt)是与大语言模型交互的核心。好的提示词能让模型产出更准确、更有用的回答。本章将介绍 LangChain 中的提示词模板系统。

为什么需要提示词模板

直接拼接字符串存在的问题:

# ❌ 不推荐
prompt = f"你是一个{role},请回答:{question}"

# 问题:
# 1. 难以维护和复用
# 2. 没有参数验证
# 3. 无法追踪版本
# 4. 特殊字符处理麻烦

使用模板的好处:

# ✅ 推荐
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template(
    "你是一个{role},请回答:{question}"
)

# 好处:
# 1. 参数自动验证
# 2. 易于复用和组合
# 3. 与 LangChain 组件无缝集成
# 4. 支持模板继承和扩展

基础提示词模板

PromptTemplate

最基础的字符串模板:

from langchain_core.prompts import PromptTemplate

# 方式一:from_template
prompt = PromptTemplate.from_template(
    "请用{language}写一个{task}的程序"
)

# 方式二:显式指定变量
prompt = PromptTemplate(
    template="请用{language}写一个{task}的程序",
    input_variables=["language", "task"]
)

# 格式化
result = prompt.format(language="Python", task="冒泡排序")
print(result)
# 输出: 请用Python写一个冒泡排序的程序

ChatPromptTemplate

用于对话模型的模板:

from langchain_core.prompts import ChatPromptTemplate

# 方式一:使用元组
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个{role}"),
    ("human", "{input}")
])

# 方式二:使用消息类
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("你是一个{role}"),
    HumanMessagePromptTemplate.from_template("{input}")
])

# 格式化
messages = prompt.format_messages(role="翻译官", input="Hello")

消息占位符

使用 MessagesPlaceholder 插入动态消息列表:

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}")
])

# 使用
history = [
    HumanMessage(content="我叫小明"),
    AIMessage(content="你好小明!"),
]

messages = prompt.format_messages(
    history=history,
    input="你还记得我的名字吗?"
)

可选占位符

# 可选的历史消息
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是助手"),
    MessagesPlaceholder(variable_name="history", optional=True),
    ("human", "{input}")
])

# 不传 history 也可以
messages = prompt.format_messages(input="你好")

部分变量

预先填充部分变量:

from langchain_core.prompts import PromptTemplate
from datetime import datetime

prompt = PromptTemplate(
    template="今天是{date},{name}你好!请回答:{question}",
    input_variables=["name", "question"],
    partial_variables={"date": datetime.now().strftime("%Y年%m月%d日")}
)

# 只需要提供剩余变量
result = prompt.format(name="小明", question="什么是AI?")

使用函数动态生成

def get_current_time():
    return datetime.now().strftime("%H:%M:%S")

prompt = PromptTemplate(
    template="当前时间:{time}。{question}",
    input_variables=["question"],
    partial_variables={"time": get_current_time}
)

Few-Shot 提示词

提供示例让模型学习:

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 定义示例
examples = [
    {"input": "高兴", "output": "😊"},
    {"input": "悲伤", "output": "😢"},
    {"input": "愤怒", "output": "😠"},
]

# 示例格式模板
example_prompt = PromptTemplate(
    template="输入: {input}\n输出: {output}",
    input_variables=["input", "output"]
)

# Few-Shot 模板
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="将情绪词转换为表情符号:",
    suffix="输入: {input}\n输出:",
    input_variables=["input"]
)

result = prompt.format(input="惊讶")
print(result)

输出:

将情绪词转换为表情符号:

输入: 高兴
输出: 😊

输入: 悲伤
输出: 😢

输入: 愤怒
输出: 😠

输入: 惊讶
输出:

动态示例选择

根据输入选择最相关的示例:

from langchain_core.prompts import FewShotPromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# 示例库
examples = [
    {"input": "我今天很开心", "output": "正面"},
    {"input": "这太糟糕了", "output": "负面"},
    {"input": "天气不错", "output": "正面"},
    {"input": "我很失望", "output": "负面"},
    {"input": "产品质量很好", "output": "正面"},
]

# 创建示例选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples,
    OpenAIEmbeddings(),
    Chroma,
    k=2  # 选择最相关的2个示例
)

# 创建 Few-Shot 模板
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=PromptTemplate(
        template="文本: {input}\n情感: {output}",
        input_variables=["input", "output"]
    ),
    prefix="判断以下文本的情感倾向:",
    suffix="文本: {input}\n情感:",
    input_variables=["input"]
)

提示词组合

使用管道操作符

from langchain_core.prompts import PromptTemplate

# 基础模板
base = PromptTemplate.from_template("回答以下问题:{question}")

# 添加前缀
with_role = PromptTemplate.from_template(
    "你是一个{role}。"
) + base

# 添加后缀
full = with_role + PromptTemplate.from_template(
    "\n请用{language}回答。"
)

result = full.format(
    role="Python专家",
    question="什么是装饰器?",
    language="简体中文"
)

PipelinePrompt

组合多个提示词:

from langchain_core.prompts import PipelinePromptTemplate, PromptTemplate

# 完整模板
full_template = PromptTemplate.from_template(
    """{introduction}

{example}

{question}"""
)

# 子模板
intro_template = PromptTemplate.from_template(
    "你是一个{role},专门负责{task}。"
)

example_template = PromptTemplate.from_template(
    "示例输入:{example_input}\n示例输出:{example_output}"
)

question_template = PromptTemplate.from_template(
    "现在请处理:{user_input}"
)

# 组合
pipeline_prompt = PipelinePromptTemplate(
    final_prompt=full_template,
    pipeline_prompts=[
        ("introduction", intro_template),
        ("example", example_template),
        ("question", question_template),
    ]
)

result = pipeline_prompt.format(
    role="代码审查员",
    task="发现代码中的问题",
    example_input="for i in range(10): print(i)",
    example_output="代码正确,但建议添加注释",
    user_input="x = 1/0"
)

提示词最佳实践

1. 角色设定

prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个专业的{domain}专家。
你的特点:
- 回答准确、专业
- 使用通俗易懂的语言
- 适当举例说明
- 如果不确定,会明确说明"""),
    ("human", "{question}")
])

2. 输出格式指定

prompt = ChatPromptTemplate.from_template(
    """分析以下文本的情感。

文本:{text}

请按以下 JSON 格式输出:
{{
    "sentiment": "正面/负面/中性",
    "confidence": 0.0-1.0,
    "keywords": ["关键词1", "关键词2"]
}}"""
)

3. 思维链(Chain of Thought)

prompt = ChatPromptTemplate.from_template(
    """请解决以下数学问题。

问题:{problem}

请按以下步骤思考:
1. 首先,理解问题要求什么
2. 然后,列出已知条件
3. 接着,确定解题方法
4. 最后,逐步计算并得出答案

让我们一步一步来:"""
)

4. 示例引导

prompt = ChatPromptTemplate.from_template(
    """将用户的描述转换为 SQL 查询。

示例1:
描述:查找所有年龄大于18岁的用户
SQL:SELECT * FROM users WHERE age > 18

示例2:
描述:统计每个部门的员工数量
SQL:SELECT department, COUNT(*) FROM employees GROUP BY department

现在请转换:
描述:{description}
SQL:"""
)

提示词保存与加载

保存到文件

from langchain_core.prompts import PromptTemplate
import json

prompt = PromptTemplate(
    template="你是{role},请回答:{question}",
    input_variables=["role", "question"]
)

# 保存为 JSON
prompt.save("my_prompt.json")

# 保存为 YAML
prompt.save("my_prompt.yaml")

从文件加载

from langchain_core.prompts import load_prompt

# 从 JSON 加载
prompt = load_prompt("my_prompt.json")

# 从 YAML 加载
prompt = load_prompt("my_prompt.yaml")

完整示例:智能写作助手

"""
智能写作助手 - 提示词模板示例
"""

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

load_dotenv()

# 写作风格示例
style_examples = {
    "正式": [
        {"input": "产品很好", "output": "该产品在各方面均表现出色,充分满足了用户的需求。"},
        {"input": "我不同意", "output": "对于上述观点,本人持有不同意见,理由如下..."},
    ],
    "轻松": [
        {"input": "产品很好", "output": "这产品绝了!用过都说好~"},
        {"input": "我不同意", "output": "emm...这个嘛,我有不同的看法哦~"},
    ],
    "学术": [
        {"input": "产品很好", "output": "经实证研究表明,该产品在多维度评估中均达到优良水平。"},
        {"input": "我不同意", "output": "基于现有文献及研究数据,笔者对此观点持保留态度。"},
    ],
}

def create_writing_assistant(style: str = "正式"):
    """创建特定风格的写作助手"""
    
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
    
    # 获取风格示例
    examples = style_examples.get(style, style_examples["正式"])
    
    # 创建示例模板
    example_prompt = ChatPromptTemplate.from_messages([
        ("human", "{input}"),
        ("ai", "{output}")
    ])
    
    # Few-Shot 模板
    few_shot_prompt = FewShotChatMessagePromptTemplate(
        examples=examples,
        example_prompt=example_prompt,
    )
    
    # 完整模板
    prompt = ChatPromptTemplate.from_messages([
        ("system", f"你是一个专业的写作助手,擅长{style}风格的文字表达。请根据用户的简短描述,扩写成{style}风格的完整句子或段落。"),
        few_shot_prompt,
        ("human", "{input}")
    ])
    
    return prompt | llm | StrOutputParser()

def main():
    print("=== 智能写作助手 ===\n")
    
    user_input = "这个方案有问题"
    
    for style in ["正式", "轻松", "学术"]:
        chain = create_writing_assistant(style)
        result = chain.invoke({"input": user_input})
        print(f"【{style}风格】")
        print(f"原文:{user_input}")
        print(f"改写:{result}\n")

if __name__ == "__main__":
    main()

小结

本章介绍了:

✅ 提示词模板的基本使用
✅ ChatPromptTemplate 和 MessagesPlaceholder
✅ 部分变量和动态变量
✅ Few-Shot 提示词和示例选择
✅ 提示词组合和管道
✅ 提示词设计最佳实践
✅ 提示词保存与加载

下一步

基础篇到此结束!接下来进入进阶篇,学习如何使用链式调用构建更复杂的应用。

练习

  1. 设计一个用于代码生成的提示词模板
  2. 实现一个支持多语言的翻译提示词
  3. 创建一个带有示例选择的问答系统
  4. 尝试使用思维链提示词解决复杂问题
Prev
模型调用