标签: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 的提示系统不再是简单的字符串拼接,而是一套模块化、可编程的提示工程体系。通过合理运用 PromptTemplate、ChatPromptTemplate 和 FewShotPromptTemplate 等组件,我们可以:
- 快速构建高质量的 LLM 输入
- 实现复杂任务的零样本/少样本学习
- 提升应用的可维护性和可测试性
掌握这些提示技巧,是你构建专业级 AI 应用的第一步。未来我们还将探讨 提示自动化优化(Prompt Optimization) 和 提示版本管理(Prompt Versioning) 等进阶主题,敬请期待!
📚 延伸阅读:
- LangChain 官方文档 - Prompts
- 如何使用 LangSmith 调试提示链