LangChain 1.0 提示词(Prompt)系统详解:从基础到实战

5 阅读8分钟

标签:LangChain、提示工程、大模型应用、Prompt模板、Few-shot学习

随着大语言模型(LLM)的广泛应用,如何高效、准确地构造输入提示(Prompt)成为构建智能应用的关键。LangChain 作为最流行的 LLM 应用开发框架之一,在其 1.0 正式版本中对提示词系统进行了全面重构和优化,提供了更加模块化、可复用和可调试的提示管理能力。

本文将深入介绍 LangChain 1.0 中与提示词相关的核心组件和使用方法,结合实际代码案例,帮助你快速掌握提示工程的最佳实践。


目录


1. 提示词在 LangChain 中的核心地位

在 LangChain 架构中,提示词是连接用户输入与大模型推理的桥梁。无论是简单的文本补全,还是复杂的 Agent 决策流程,都依赖于精心设计的提示模板。

LangChain 1.0 的提示系统具有以下特点:

  • 结构化定义:支持 JSON/YAML 式的结构化模板。
  • 类型安全:明确区分 text 模型与 chat 模型的提示格式。
  • 可组合性:多个模板可以拼接、嵌套,形成复杂逻辑。
  • 易于测试:可独立渲染提示内容,便于调试和版本控制。

2. 核心概念与组件

2.1 PromptTemplate(提示模板)

PromptTemplate 是最基本的提示构造工具,适用于传统的文本补全类模型(如 text-davinci-003),但在 LangChain 1.0 中也广泛用于非对话场景的预处理。

主要参数:

  • template: 字符串模板,使用 {} 占位符
  • input_variables: 输入变量列表
  • partial_variables: 部分固定变量(可用于后续绑定)

示例代码:

from langchain.prompts import PromptTemplate

# 定义一个生成产品描述的模板
template = """
为以下商品生成一段吸引人的营销文案:

商品名称:{product_name}
目标人群:{target_audience}
主要卖点:{selling_points}
"""

prompt_template = PromptTemplate(
    input_variables=["product_name", "target_audience", "selling_points"],
    template=template
)

# 渲染提示
final_prompt = prompt_template.format(
    product_name="无线降噪耳机",
    target_audience="年轻上班族",
    selling_points="续航长达40小时,支持快充"
)

print(final_prompt)

输出:

为以下商品生成一段吸引人的营销文案:

商品名称:无线降噪耳机
目标人群:年轻上班族
主要卖点:续航长达40小时,支持快充

⚠️ 注意:虽然 PromptTemplate 仍可用,但官方推荐在与 chat 模型交互时优先使用 ChatPromptTemplate


2.2 ChatPromptTemplate(聊天提示模板)

针对现代聊天模型(如 GPT-3.5-turbo、GPT-4)设计,支持多角色消息序列(system, human, ai)。

核心优势:

  • 支持多种消息类型
  • 可自动转换为 BaseMessage 对象列表
  • ChatModel 完美集成

示例代码:

from langchain.prompts import ChatPromptTemplate

# 创建一个多角色聊天模板
chat_template = ChatPromptTemplate.from_messages([
    ("system", "你是一位专业的营养师,回答要简洁科学。"),
    ("human", "我每天吃 {calories} 卡路里,是否超标?"),
    ("ai", "根据你的性别和体重,这个摄入量{analysis}。"),
    ("human", "那我应该如何调整饮食?")
])

# 渲染为消息列表
messages = chat_template.format_messages(
    calories=3500,
    analysis="偏高,建议减少油脂摄入"
)

for msg in messages:
    print(f"{msg.type}: {msg.content}")

输出:

system: 你是一位专业的营养师,回答要简洁科学。
human: 我每天吃 3500 卡路里,是否超标?
ai: 根据你的性别和体重,这个摄入量偏高,建议减少油脂摄入。
human: 那我应该如何调整饮食?

2.3 SystemMessagePromptTemplate 与 HumanMessagePromptTemplate

更细粒度地控制每条消息的构建方式,适合需要动态逻辑的场景。

示例:条件式系统提示

from langchain.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    ChatPromptTemplate
)

# 动态系统提示
def get_system_prompt(lang="zh"):
    if lang == "en":
        return "You are a helpful assistant. Respond in English."
    else:
        return "你是一个乐于助人的助手。请用中文回答。"

system_template = SystemMessagePromptTemplate.from_template(get_system_prompt("zh"))
human_template = HumanMessagePromptTemplate.from_template("问题:{question}")

chat_prompt = ChatPromptTemplate.from_messages([
    system_template,
    human_template
])

final_messages = chat_prompt.format_messages(question="如何学习Python?")
print(final_messages)

2.4 FewShotPromptTemplate(少样本提示模板)

通过提供少量示例(few-shot examples),引导模型学习特定格式或任务逻辑,显著提升输出质量。

经典应用场景:

  • 格式化输出(JSON、XML)
  • 分类任务
  • 推理链(Chain-of-Thought)

示例:情感分类 + CoT 推理

from langchain.prompts import FewShotPromptTemplate, PromptTemplate

# 定义示例
examples = [
    {
        "input": "这家餐厅的服务太慢了,等了一个小时才上菜。",
        "output": "负面",
        "reason": "提到服务慢、等待时间长,表达不满情绪。"
    },
    {
        "input": "电影特效非常震撼,剧情也很紧凑。",
        "output": "正面",
        "reason": "使用‘非常震撼’‘很紧凑’等积极词汇。"
    }
]

# 示例模板
example_template = """
输入:{input}
思考过程:{reason}
输出:{output}
"""

example_prompt = PromptTemplate(
    input_variables=["input", "reason", "output"],
    template=example_template
)

# 少样本模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="请根据以下示例进行情感分类。先分析原因,再给出判断。",
    suffix="输入:{input}\n思考过程:",
    input_variables=["input"],
    example_separator="\n\n"  # 示例之间用两个换行分隔
)

# 使用
result_prompt = few_shot_prompt.format(input="这本书内容枯燥,完全不推荐。")
print(result_prompt)

输出片段:

请根据以下示例进行情感分类。先分析原因,再给出判断。

输入:这家餐厅的服务太慢了,等了一个小时才上菜。
思考过程:提到服务慢、等待时间长,表达不满情绪。
输出:负面

...

输入:这本书内容枯燥,完全不推荐。
思考过程:

2.5 PromptValue(提示值对象)

PromptValue 是 LangChain 中表示“已格式化提示”的抽象类,统一了不同提示类型的输出接口。

常见子类:

  • StringPromptValue:对应字符串提示
  • ChatPromptValue:对应消息列表提示

使用场景:跨组件传递

prompt_value = chat_prompt.format_prompt(name="张三")  # 返回 PromptValue 实例

# 可以直接传给 LLM
# llm.invoke(prompt_value)

# 或转为字符串查看
print(prompt_value.to_string())

3. 实战案例

3.1 基础文本生成:个性化邮件撰写

from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

llm = OpenAI(model="text-davinci-003", temperature=0.7)

email_template = PromptTemplate(
    input_variables=["name", "product", "benefit"],
    template="""
亲爱的{name},

感谢您关注我们的新产品:{product}!它能为您带来{benefit}。

现在购买可享8折优惠,期待您的光临!

祝好,
AI营销团队
    """
)

prompt = email_template.format(
    name="李女士",
    product="智能家居套装",
    benefit="远程控制家电、节能省电的便捷生活"
)

response = llm.invoke(prompt)
print(response)

3.2 多轮对话构建:客服助手

from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(model="gpt-3.5-turbo")

template = ChatPromptTemplate.from_messages([
    ("system", "你是电商平台的客服机器人,回答要礼貌、准确。"),
    ("human", "你好,我昨天买的手机还没发货。"),
    ("ai", "非常抱歉给您带来不便,请提供订单号以便查询。"),
    ("human", "{user_query}")
])

messages = template.format_messages(user_query="订单号是 ORD20250405001")
response = chat_model.invoke(messages)
print(response.content)

3.3 少样本学习:情感分类任务

我们将扩展之前的 FewShotPromptTemplate 示例,接入模型执行。

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# (前面的 few_shot_prompt 定义略)

final_prompt = few_shot_prompt.format(input="界面设计很丑,操作也不流畅。")

# 调用模型
result = llm.invoke([{"role": "user", "content": final_prompt}])
print("模型输出:", result.content)
# 输出可能为:
# 思考过程:使用“很丑”“不流畅”等负面评价词汇,表达对产品的不满。
# 输出:负面

3.4 动态提示注入:基于用户画像的推荐

from langchain.prompts import ChatPromptTemplate
from datetime import datetime

# 模拟用户画像
user_profile = {
    "age_group": "25-30",
    "interests": ["科技", "运动"],
    "last_purchase": "智能手表"
}

time_of_day = "晚上" if 18 <= datetime.now().hour < 24 else "白天"

dynamic_template = ChatPromptTemplate.from_template(
    """当前时间段:{time}
用户兴趣:{interests}
最近购买:{last_purchase}

请推荐一款符合该用户特征的新产品,并说明理由。
"""
)

prompt = dynamic_template.format(
    time=time_of_day,
    interests="、".join(user_profile["interests"]),
    last_purchase=user_profile["last_purchase"]
)

print(prompt)
# 可进一步送入 LLM 生成推荐结果

4. 最佳实践建议

实践说明
✅ 使用 ChatPromptTemplate 替代旧版 PromptTemplate更符合现代 chat 模型的输入规范
✅ 利用 FewShotPromptTemplate 提升任务准确性特别适用于格式控制和分类任务
✅ 将提示模板保存为 .yaml.json 文件便于版本管理和团队协作
✅ 添加清晰的 system 消息定义角色显著改善输出一致性
✅ 对提示进行单元测试使用 format() 验证输出结构

5. 总结

LangChain 1.0 的提示系统不再是简单的字符串拼接,而是一套模块化、可编程的提示工程体系。通过合理运用 PromptTemplateChatPromptTemplateFewShotPromptTemplate 等组件,我们可以:

  • 快速构建高质量的 LLM 输入
  • 实现复杂任务的零样本/少样本学习
  • 提升应用的可维护性和可测试性

掌握这些提示技巧,是你构建专业级 AI 应用的第一步。未来我们还将探讨 提示自动化优化(Prompt Optimization)提示版本管理(Prompt Versioning) 等进阶主题,敬请期待!

📚 延伸阅读