纲要
- 提示词模板核心知识回顾
PromptTemplate与ChatPromptTemplate:面向文本生成与对话交互的两种基础模板FewShotPromptTemplate与FewShotChatMessagePromptTemplate:基于示例驱动的提示结构- 静态示例与动态示例的差异及适用场景
- 示例选择器三大类型:
LengthBasedExampleSelector、SemanticSimilarityExampleSelector、MaxMarginalRelevanceExampleSelector Partial部分格式化:支持静态值预设与动态函数生成- LangSmith Hub:提示词的版本化管理与团队协作平台
- 动手实践任务
- 注册 LangSmith 并获取 API Key
- 从 Hub 拉取社区模板
- 修改提示词并推送至个人 Hub 仓库
- 版本管理与协作测试
- 完整可运行示例脚本:涵盖拉取、调用、推送与版本迭代的端到端流程
引言
在前序系列文章中,我们系统性地探讨了 LangChain 提示词模板的各个核心维度:从基础的字符串模板与对话模板,到 Few Shot 示例的动态选择机制,再到部分格式化与基于 LangSmith Hub 的工程化管理。本文旨在对该知识体系进行系统性总结,同时提供一份可操作的实践指南,帮助开发者将理论认知转化为可复用的工程能力。
提示词模板知识体系
整个提示词模板体系围绕“如何高效构建、管理和演进提示词”这一核心目标展开,可按照以下层次进行梳理。
基础模板
PromptTemplate:最基础的字符串模板,通过format()方法替换占位符变量,适用于传统文本生成型 LLM。ChatPromptTemplate:结构化消息列表模板,通过format_messages()生成SystemMessage、HumanMessage、AIMessage等角色消息序列,专为 Chat Model 设计。
Few Shot 示例机制
FewShotPromptTemplate/FewShotChatMessagePromptTemplate:将一组输入-输出示例注入提示词上下文,引导模型进行模仿学习(In-Context Learning)。- 静态示例:示例集合在模板定义时固定,无法根据输入动态调整。
- 动态示例选择器:根据当前输入内容,从示例池中自动筛选最相关或最合适的示例。
示例选择器对比
| 选择器类型 | 选择依据 | 优势 | 局限性 |
|---|---|---|---|
LengthBasedExampleSelector | 控制最终提示词总长度,从头部开始依次选取 | 计算高效,无需额外依赖 | 选取策略机械,缺乏语义匹配能力 |
SemanticSimilarityExampleSelector | 基于余弦相似度,选取与输入语义最接近的示例 | 语义匹配精准 | 需要向量数据库与嵌入模型支持 |
MaxMarginalRelevanceExampleSelector | 采用 MMR 算法,兼顾相关性(Relevance)与多样性(Diversity) | 避免示例同质化,提升泛化能力 | 计算开销相对较高 |
部分格式化
PromptTemplate.partial():允许分步填充模板变量,支持静态值预设与动态函数绑定。动态函数在format()调用时实时执行,特别适用于注入当前时间戳、用户 ID 等运行时上下文信息。
LangSmith Hub
- 云端提示词仓库:提供
hub.pull()接口拉取公共模板,Client.push_prompt()与Client.pull_prompt()实现团队内部的提示词共享与分发。 - 版本管理:每次推送自动记录版本历史,支持通过标签(Tag)或版本号引用特定历史版本。
- 可观测性与评估:Hub 深度集成于 LangSmith 平台,支持提示词的在线监控、调试与性能评估。
动手实践:从 Hub 到本地,再回到 Hub
以下实践练习将引导你完整体验提示词从拉取、修改、推送到版本迭代的完整生命周期。
环境准备
第一步:注册 LangSmith 并获取 API Key
访问 LangSmith 官网 注册账号,进入 Settings 页面创建 API Key,并将其配置为环境变量:
export LANGCHAIN_API_KEY="your_langsmith_api_key"
export OPENAI_API_KEY="your_openai_api_key" # 如需调用模型
第二步:安装依赖
pip install langchain langchain-core langsmith langchain-openai
核心操作流程
第三步:拉取社区提示词模板
from langchain import hub
prompt = hub.pull("langchain-ai/text-to-sql")
print(prompt.format(question="查询所有订单数量大于5的客户"))
第四步:创建并推送自定义提示词
from langsmith import Client
from langchain_core.prompts import ChatPromptTemplate
client = Client()
my_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个精通唐诗宋词的助手,请使用中文回答。"),
("human", "{query}")
])
client.push_prompt("my-poetry-assistant", prompt=my_prompt)
print("提示词已成功推送至 LangSmith Hub")
第五步:拉取自定义提示词并调用模型
from langsmith import Client
from langchain_openai import ChatOpenAI
client = Client()
prompt = client.pull_prompt("my-poetry-assistant")
model = ChatOpenAI(model="gpt-3.5-turbo")
chain = prompt | model
response = chain.invoke({"query": "写一首关于秋天的七言绝句"})
print(response.content)
第六步:版本迭代与回滚
修改提示词内容,添加版本标签后再次推送,并演示如何拉取特定历史版本。
v2_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位风趣幽默的唐诗专家,每次回答均以“古人云”作为开头。"),
("human", "{query}")
])
client.push_prompt("my-poetry-assistant", prompt=v2_prompt, tags=["v2", "funny"])
old_prompt = client.pull_prompt("my-poetry-assistant:v1")
print("v1 版本系统消息:", old_prompt.messages[0].content)
通过上述流程,开发者可以在本地开发环境与云端 Hub 之间自由切换,实现提示词的完整生命周期管理。
完整可运行示例脚本
以下脚本整合了从拉取公共模板、创建自定义提示词、推送到 Hub、调用模型以及版本迭代的完整流程。配置好 API Key 后即可直接运行。
import os
import sys
from langchain import hub
from langsmith import Client
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
def check_env():
"""检查必要的环境变量是否已配置"""
if not os.getenv("LANGCHAIN_API_KEY"):
sys.exit("错误:请先设置 LANGCHAIN_API_KEY 环境变量")
if not os.getenv("OPENAI_API_KEY"):
print("警告:未设置 OPENAI_API_KEY,将跳过模型调用环节")
def main():
check_env()
client = Client()
# 1. 拉取公共模板
print(">>> 拉取公共模板:langchain-ai/text-to-sql")
public_prompt = hub.pull("langchain-ai/text-to-sql")
print("模板变量列表:", public_prompt.input_variables)
# 2. 创建并推送自定义模板
print("\n>>> 创建并推送自定义提示词")
my_template = ChatPromptTemplate.from_messages([
("system", "你是一位精通古诗词的助手,请使用中文回答。"),
("human", "{question}")
])
try:
client.push_prompt("my-chinese-poet", prompt=my_template)
print("推送成功")
except Exception as e:
print(f"推送失败: {e},可能该名称已存在,将直接尝试拉取")
# 3. 拉取自定义模板并调用模型
print("\n>>> 拉取自定义提示词并执行测试")
custom_prompt = client.pull_prompt("my-chinese-poet")
print("提示词结构:")
for msg in custom_prompt.messages:
print(f" [{msg.type}] {msg.content}")
if os.getenv("OPENAI_API_KEY"):
model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7)
chain = custom_prompt | model
response = chain.invoke({"question": "写一首关于月亮的五言绝句"})
print("\n模型回答:")
print(response.content)
else:
print("\n跳过模型调用(OPENAI_API_KEY 未设置)")
# 4. 创建新版本并推送
print("\n>>> 创建 v2 版本并推送至 Hub")
v2_template = ChatPromptTemplate.from_messages([
("system", "你是一位风趣幽默的唐诗助手,每次回答以“古人云”开头。"),
("human", "{question}")
])
client.push_prompt("my-chinese-poet", prompt=v2_template, tags=["v2", "funny"])
print("v2 版本已成功推送")
# 5. 验证版本差异
v1 = client.pull_prompt("my-chinese-poet:v1")
v2 = client.pull_prompt("my-chinese-poet:v2")
print("\n版本对比:")
print("v1 系统消息:", v1.messages[0].content)
print("v2 系统消息:", v2.messages[0].content)
if __name__ == "__main__":
main()
执行该脚本将完整覆盖提示词模板从社区学习、自主创作到版本迭代的全链路流程。
API 速览
本节汇总博客中涉及的核心 API,便于开发者快速查阅与参考。
langchain.hub.pull
- 所属库:
langchain - 方法签名:
hub.pull(repo_path: str) -> PromptTemplate - 参数说明:
repo_path为 Hub 上的模板路径,格式为owner/repo_name - 返回值:对应的提示词模板对象
- 适用版本:
langchain >= 0.1.0
from langchain import hub
prompt = hub.pull("langchain-ai/text-to-sql")
langsmith.Client.push_prompt
- 所属库:
langsmith - 方法签名:
client.push_prompt(prompt_name: str, prompt: BasePromptTemplate, tags: Optional[List[str]] = None) - 参数说明:
prompt_name:提示词在 Hub 中的唯一名称prompt:提示词模板实例tags:可选,版本标签列表
- 返回值:无
- 适用版本:
langsmith >= 0.1.0
from langsmith import Client
from langchain_core.prompts import ChatPromptTemplate
client = Client()
prompt = ChatPromptTemplate.from_messages([("system", "你是助手"), ("human", "{q}")])
client.push_prompt("my-assistant", prompt=prompt, tags=["v1"])
langsmith.Client.pull_prompt
- 所属库:
langsmith - 方法签名:
client.pull_prompt(prompt_name: str) -> BasePromptTemplate - 参数说明:
prompt_name支持name或name:version格式,如my-assistant:v1 - 返回值:提示词模板实例
- 适用版本:
langsmith >= 0.1.0
from langsmith import Client
client = Client()
prompt = client.pull_prompt("my-assistant:v1")
参考文档
官方文档
参考链接
总结
本文系统梳理了 LangChain 提示词模板体系的完整知识图谱,涵盖基础模板(PromptTemplate、ChatPromptTemplate)、Few Shot 示例机制、三大动态示例选择器(LengthBasedExampleSelector、SemanticSimilarityExampleSelector、MaxMarginalRelevanceExampleSelector)、部分格式化(partial())以及 LangSmith Hub 的工程化管理能力。
通过从 Hub 拉取社区模板、自定义推送、模型调用与版本迭代的端到端实践,展示了提示词从开发到运维的全生命周期管理方案。这些能力是构建生产级 AI Agent 的关键基础设施,提示词不再是一段静态文本,而是演进为一套可复用、可协作、可度量的软件资产。
620



被折叠的 条评论
为什么被折叠?



