langchain学习--提示词
·
langchain提示词学习要点
提示词(Prompt)在LangChain中扮演着核心角色,直接影响模型输出的质量和准确性。以下是关键学习方向和实践方法:
基础结构设计
- 明确指令:直接说明任务要求,例如"生成一份关于气候变化的报告摘要"
- 提供上下文:添加背景信息提升相关性,如"针对2023年联合国气候报告数据"
- 示例示范:通过few-shot learning提供输入输出示例
高级优化技巧
- 变量插值:使用
{variable}动态插入内容 - 模板组合:将多个提示模板串联使用
- 输出解析:指定返回格式如JSON或特定数据结构
常见应用场景
- 问答系统:设计带知识库约束的提示
- 文本生成:控制输出长度和风格
- 数据提取:指定结构化输出要求
调试与评估
- 记录不同提示版本的输出结果
- 使用定量指标评估提示效果
- 通过A/B测试比较不同模板
最佳实践
- 保持提示词简洁明确
- 逐步迭代优化提示内容
- 考虑模型的具体版本特性
- 处理敏感内容时添加安全约束
下面我介绍三个提示词类:
PromptTemplate
PromptTemplate 用于创建结构化提示词模板,允许动态插入变量。适用于需要重复使用相同提示结构但内容变化的场景。
核心功能
- 支持变量插值:通过
input_variables定义占位符,运行时填充具体值。 - 支持模板格式化:支持 Jinja2 或 f-string 等语法,灵活控制输出格式。
示例代码
from langchain.prompts import PromptTemplate
template = "请用{style}风格写一篇关于{topic}的文章。"
prompt = PromptTemplate(input_variables=["style", "topic"], template=template)
filled_prompt = prompt.format(style="幽默", topic="人工智能")
print(filled_prompt)
| 方法 | 返回类型 | 用途 |
| .format | str | 直接返回字符串 |
| .format_prompt | StringPromptValue | 返回包装对象(更通用) |
prompt=PromptTemplate.from_template(
"我的邻居是{lastname},刚生了{gender},你帮我起个名字,简单回答,给出我理由"
)
# 方式 1:.format() 返回字符串
prompt_text = prompt.format(lastname="张", gender="男")
print(type(prompt_text)) # <class 'str'>
# 方式 2:.format_prompt() 返回 PromptValue
prompt_value = prompt.format_prompt(lastname="张", gender="男")
print(type(prompt_value)) # StringPromptValue
FewShotPromptTemplate
FewShotPromptTemplate 用于构建包含示例的提示词,通过少量示例指导模型生成符合预期的输出。适用于需要上下文学习的任务。
核心功能
- 示例插入:通过
examples参数提供示例列表,每个示例可包含输入和输出。 - 示例格式化:支持自定义示例的展示格式(如前缀、分隔符等)。
- 结构:
- FewShotPromptTemplate(
examples=None, # 示例数据列表
example_prompt=None, # 示例的格式化模板
prefix=None, # 前缀(指令部分)
suffix=None, # 后缀(用户输入部分)
input_variables=None, # 需要动态注入的变量
example_separator="\n\n" # 示例之间的分隔符
)
示例代码
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_community.llms.tongyi import Tongyi
# 1. 定义示例模板
example_template = PromptTemplate.from_template(
"评论:{review}\n情感:{sentiment}"
)
# 2. 准备示例数据
examples = [
{
"review": "这部电影太棒了,演员演技在线!",
"sentiment": "正面"
},
{
"review": "剧情拖沓,浪费时间,不推荐。",
"sentiment": "负面"
},
{
"review": "画面精美,但故事一般般。",
"sentiment": "中性"
}
]
# 3. 创建 FewShot Prompt
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_template,
prefix="请判断以下评论的情感倾向(正面/负面/中性):",
suffix="评论:{new_review}\n情感:",
input_variables=["new_review"]
)
# 4. 生成 Prompt
prompt_text = few_shot_prompt.invoke({
"new_review": "服务态度很好,但是价格有点贵"
}).to_string()
print(prompt_text)
"""
# 输出:
# 请判断以下评论的情感倾向(正面/负面/中性):
#
# 评论:这部电影太棒了,演员演技在线!
# 情感:正面
#
# 评论:剧情拖沓,浪费时间,不推荐。
# 情感:负面
#
# 评论:画面精美,但故事一般般。
# 情感:中性
#
# 评论:服务态度很好,但是价格有点贵
# 情感:
"""
# 5. 调用模型
model = Tongyi(model="qwen-plus")
response = model.invoke(prompt_text)
print(response) # 输出:中性
高级用法
动态选择示例(Example Selector)当示例很多时,可以智能选择最相关的示例:
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings
# 1. 准备大量示例
examples = [
{"input": "你好", "output": "Hello"},
{"input": "再见", "output": "Goodbye"},
{"input": "谢谢", "output": "Thank you"},
{"input": "对不起", "output": "Sorry"},
# ... 更多示例
]
# 2. 创建示例选择器(基于语义相似度)
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples=examples,
embeddings=DashScopeEmbeddings(), # 使用嵌入模型
vectorstore_cls=FAISS, # 向量数据库
k=2 # 选择最相似的 2 个示例
)
# 3. 使用动态示例
few_shot_prompt = FewShotPromptTemplate(
example_selector=example_selector, # ⭐ 使用选择器代替 examples
example_prompt=PromptTemplate.from_template(
"输入:{input}\n输出:{output}"
),
prefix="翻译以下中文为英文:",
suffix="输入:{new_input}\n输出:",
input_variables=["new_input"]
)
# 4. 调用时自动选择最相关的示例
prompt_text = few_shot_prompt.invoke({
"new_input": "早上好"
}).to_string()
# 会自动选择与"早上好"最相似的 2 个示例(如"你好"、"再见")
print(prompt_text)
ChatPromptTemplate
ChatPromptTemplate 专为对话场景设计,支持多角色消息(如系统、用户、AI)的模板化。适用于聊天机器人或交互式对话任务。
核心功能
- 多角色支持:通过
SystemMessagePromptTemplate、HumanMessagePromptTemplate等区分角色。 - 消息序列化:将多条消息按顺序组合为对话上下文。

示例代码
# ChatPromptTemplate: 支持注入任意数量的历史会话消息
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
from langchain_community.chat_models.tongyi import ChatTongyi
from dotenv import load_dotenv
load_dotenv()
chat_prompt_template=ChatPromptTemplate.from_messages(
[
("system", "请按照唐诗的格式生成唐诗,且你是边塞诗人"),
MessagesPlaceholder(variable_name="history"),
("human", "再来一首唐诗")
]
)
# 方式 1:使用元组(简洁,推荐用于简单场景)
history_data=[
("human", "请给我写一首唐诗"),
("ai", "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦"),
("human", "好诗好诗,再给我来一首"),
("ai", "西风瘦马,客输西风,西风瘦马,客输西风"),
]
# 方式 2:使用 Message 对象(规范,推荐用于复杂场景)
history_data_messages = [
HumanMessage(content="请给我写一首唐诗"),
AIMessage(content="锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦"),
HumanMessage(content="好诗好诗,再给我来一首"),
AIMessage(content="西风瘦马,客输西风,西风瘦马,客输西风"),
]
#链式结构
model=ChatTongyi(model="qwen-plus")
chai=chat_prompt_template|model
res=chai.invoke(input={"history":history_data})
print(res.content)
关键区别
PromptTemplate:基础模板,适用于单次输入输出。FewShotPromptTemplate:通过示例引导模型,适合小样本学习。ChatPromptTemplate:面向多轮对话,支持角色化消息编排。
更多推荐



所有评论(0)