目录
-
- 前置文章
- 一、LangSmith的提示词工程与管理
-
- [1、Playground 选项卡](#1、Playground 选项卡)
- [2、Prompts 选项卡](#2、Prompts 选项卡)
- 3、完整测试详解
- 二、小结
前置文章
【AI-Agent】LangSmith 使用之Tracing
上一节介绍到 LangSmith 的功能中有一个是提示词工程与管理 (Prompt Engineering),这一节重点记录下它。
一、LangSmith的提示词工程与管理
1、Playground 选项卡
从上一个Tracing中我们直接把prompt导入到playground选项卡中,在playground中进行prompt的调试和管理

在这里可以调试prompt,可以使用不同厂商和模型测试不同的prompt对响应,在这找到最佳平衡(但是需要API key)

可选厂商和模型调用


prompt调试里面支持使用变量,可以在运行的时候填写变量信息动态生成prompt,这样也可以避免变量硬编码在项目代码中,变量使用"{}"声明。
Answer the users question using only the provided information below:
Harrison worked at {country}

prompt调试修改好后可以直接保存到 prompt hub,同时会记录在 Prompts 选项卡中

2、Prompts 选项卡
prompt保存在prompt hub后,支持代码引入动态加载提示词到项目代码中,这样就避免了在代码中硬编码prompt。调用方式会展示样例


如果是使用特定版本的prompt,需要指定prompt的哈希
3、完整测试详解
测试:从 prompt hub上动态拉取prompt进行AI应用开发(不在代码中硬编码prompt)
远端 prompt,有一个country变量:
Answer the users question using only the provided information below:
Harrison worked at {country}
from openai import OpenAI
from langsmith import traceable, Client
from langsmith.wrappers import wrap_openai
import os
# 1. 环境变量配置 (LangSmith 追踪核心开关)
os.environ["LANGSMITH_TRACING"] = "true" # 启用 LangSmith 全局追踪功能
os.environ["LANGCHAIN_API_KEY"] = "xxx" # LangSmith 平台 API Key,用于将追踪数据上报到你的账号
# 可选:设置项目名称,如果不设置默认会记录到 "default" 项目中
os.environ["LANGSMITH_PROJECT"] = "My first App"
# 2. 初始化客户端 (LangSmith & 大模型)
# 初始化 LangSmith 客户端,用于拉取 Prompt 等操作
langsmith_client = Client()
# 使用 wrap_openai 包装原生的 OpenAI 客户端,这样所有的 LLM 调用都会被自动记录(包括 Prompt、耗时、Token 等)
openai_client = wrap_openai(
OpenAI(
api_key="API key", # API key
base_url="https://open.bigmodel.cn/api/paas/v4/chat/completions" # 智谱地址
)
)
# 3. 定义业务逻辑 (使用 @traceable 装饰器)
# @traceable 装饰器会将这个函数标记为一个 "Span" (追踪跨度)
# 在 LangSmith 后台,你能看到这个函数的输入(query)和输出(results)
@traceable(name="Mock Retriever") # 可以自定义在 LangSmith 中显示的节点名称
def retriever(query: str):
"""模拟一个文档检索器 (例如从向量数据库中查询)"""
# 远端 Prompt 变成了 "Harrison worked at {country}"
results = ["China"] # 这里是RAG的内容模拟,修改这里看大模型回复结果
return results
# 这个函数是整个 RAG 流程的入口,它也会作为一个父级 Span
# 它的内部调用了 retriever 和 openai_client,在 LangSmith 中会形成树状的层级结构 (Trace Tree)
@traceable(name="RAG Pipeline")
def rag(question):
"""完整的 RAG (检索增强生成) 流程"""
# 步骤 1: 追踪检索步骤
docs = retriever(question)
# 假设检索器返回的是国家名称列表,我们取第一个
country_name = docs[0] if docs else "Unknown"
# 步骤 2: 从 LangSmith 动态拉取 Prompt
# 这里拉取你在 LangSmith Hub 上创建的 "test_prompt"
prompt_template = langsmith_client.pull_prompt("test_prompt")
# 格式化 Prompt (根据你的 test_prompt,现在只定义了 {country} 变量)
# format_messages 会返回 LangChain 的 Message 对象列表
# 注意:如果你的 Prompt 模板里还有 {question} 变量,请在这里加上 question=question
formatted_messages = prompt_template.format_messages(country=country_name)
# 将 LangChain 的 Message 格式转换为原生 OpenAI 需要的 dict 格式
openai_messages = []
for msg in formatted_messages:
# LangChain 中的 "human" 对应 OpenAI 的 "user"
role = "user" if msg.type == "human" else msg.type
openai_messages.append({"role": role, "content": msg.content})
# 【关键补充】 test_prompt 只是一个 System 提示词,没有包含用户的提问
# 我们需要手动把用户的 question 作为 user 角色追加进去,否则大模型不知道你要问什么
has_user_msg = any(m["role"] == "user" for m in openai_messages)
if not has_user_msg:
openai_messages.append({"role": "user", "content": question})
# 步骤 3: 追踪 LLM 调用步骤
return openai_client.chat.completions.create(
messages=openai_messages,
model="gpt-3.5-turbo", # 指定调用的模型名称,需确保网关支持该模型
)
# 4. 执行主程序
if __name__ == "__main__":
# 整个应用程序流程将被追踪,并上报到 LangSmith
print("开始执行 RAG 流程...")
response = rag("where did harrison work")
print("\n大模型回复结果:")
print(response.choices[0].message.content)
本地运行结果,可以看到已经回复:China 了,说明prompt生效了

追踪一下大模型的输入输出,发现已经拼接好了新的prompt

大模型回复

二、小结
- Prompt Engineering 支持对prompt的工程和管理,可轻松实现对prompt的打磨和调用
- 同时可以实现prompt的动态加载和拼接,避免了prompt泄露
- prompt hub上海量的提示词的价值会被放大
by 久违 2026.4.22