前置文章

【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

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐