讲座题目:深入 Prompt Versioning:如何利用 LangSmith 追踪提示词迭代对 Agent 成功率的影响曲线
各位同仁,各位对大模型与 Agent 技术充满热情的开发者们,大家好!
今天,我们将深入探讨一个在构建和维护高性能 AI Agent 过程中至关重要的主题:提示词版本控制(Prompt Versioning),以及如何借助 LangSmith 这一强大的平台,系统地追踪提示词迭代对 Agent 成功率的影响曲线。在当今大模型驱动的应用开发中,提示词(Prompt)已成为连接人类意图与模型能力的“代码”,其重要性不言而喻。对于多步骤、复杂推理的 Agent 系统而言,提示词的设计与优化更是决定其能否稳定、高效运行的关键。
引言:提示词工程的精髓与 Agent 系统的挑战
在人工智能领域,特别是大型语言模型(LLM)的兴起,提示词工程(Prompt Engineering)已从一门艺术逐渐演变为一门科学。它不再仅仅是编写几个关键词或句子,而是精心构造输入,以引导模型产生期望的输出。对于简单的问答系统,一个好的提示词足以显著提升用户体验。然而,当我们谈论 AI Agent 时,复杂性便会指数级增长。
AI Agent,通常被设计为能够感知环境、进行规划、执行动作并反思结果的自主实体。它们往往需要:
- 多步骤推理: 将复杂任务分解为一系列子任务。
- 工具使用: 调用外部 API、数据库或自定义函数来扩展自身能力。
- 记忆与上下文管理: 在长时间交互中保持连贯性。
- 鲁棒性: 在面对不确定性或模糊指令时仍能保持稳定表现。
在这样的复杂系统中,提示词不再是单一的,它可能包括系统指令(System Prompt)、用户指令(User Prompt)、工具描述(Tool Descriptions)、少量示例(Few-shot Examples)以及如何进行自我反思的指令等等。每一个组件的微小改动,都可能像蝴蝶效应般,对 Agent 的行为、性能乃至最终的成功率产生巨大影响。
因此,对提示词进行版本控制,并能够系统地追踪每一次迭代的效果,不仅是最佳实践,更是构建可信赖、高性能 Agent 系统的核心基石。
第一章:传统提示词管理之困境
在没有专门工具和方法论支持的情况下,提示词的迭代往往会陷入一系列困境:
-
黑盒迭代:难以追溯、结果模糊
- 开发者可能在代码中直接修改提示词字符串,但没有记录历史版本,久而久之,就不知道当前版本与之前版本相比有哪些改动,以及这些改动是何时、为何引入的。
- 当 Agent 表现出现波动时,难以定位是哪个提示词改动导致了性能提升或下降。
-
复现性危机:无法精确复现特定行为
- 如果无法准确回溯到某个特定的提示词版本,那么当 Agent 在某个历史时间点表现良好,或者出现特定问题时,就无法精确复现当时的运行环境和提示词配置,这使得问题诊断和性能优化变得极其困难。
-
评估盲区:缺乏系统性方法量化影响
- 手动测试或少量样本测试难以全面反映提示词改动的影响。
- 缺乏标准化的评估基准和自动化评估机制,使得性能指标(如成功率、准确率、延迟)的量化变得主观且低效。
-
团队协作障碍:混乱与冲突
- 在团队开发中,多名成员可能同时修改提示词。如果没有统一的版本管理和协作机制,容易出现覆盖、冲突,甚至丢失有效改动的情况。
- 新人加入项目时,难以快速理解当前提示词的演变历史和设计理念。
这些问题共同构成了 Agent 开发中的“提示词迷宫”,使得迭代过程充满不确定性,阻碍了 Agent 系统的快速发展和稳定部署。
第二章:LangSmith 简介与核心能力
为了解决上述挑战,我们需要一个强大的平台来管理、追踪和评估 Agent 的行为。LangSmith 正是为此而生,它是 LangChain 生态系统中的关键组件,旨在帮助开发者理解、调试、测试、评估和监控任何基于 LLM 的应用程序。
LangSmith 的核心能力可以概括为以下几点:
-
Tracing (追踪):
- LangSmith 能够自动记录 LangChain 应用程序中的每一次 LLM 调用、Agent 步骤、工具使用以及链(Chain)的执行过程。
- 它以可视化的方式展示整个执行路径(Trace),包括输入、输出、中间步骤、延迟和错误信息,帮助开发者深入理解 Agent 的决策过程。
-
Evaluation (评估):
- LangSmith 提供了一套灵活的评估框架,支持自动化评估、人工评估和 LLM 辅助评估。
- 开发者可以定义自己的评估指标和逻辑,针对 Agent 在特定数据集上的表现进行量化分析,从而衡量提示词改动、模型选择等因素对性能的影响。
-
Dataset (数据集):
- 数据集是评估的基础。LangSmith 允许用户创建和管理测试用例(Examples),这些用例包含输入、预期的参考输出,甚至是人工标注的反馈。
- 通过标准化的数据集,可以确保不同提示词版本、不同模型或不同 Agent 配置的评估结果具有可比性。
-
Prompt Management (提示词管理):
- 虽然 LangSmith 本身不是一个提示词编辑器,但它通过追踪和评估功能,间接实现了对提示词的有效管理。
- 每一次使用不同提示词运行的 Agent,其性能数据都会被记录下来,开发者可以清晰地对比不同提示词版本的表现,从而“版本化”并比较提示词的效果。
通过将这些能力结合起来,LangSmith 为我们提供了一个全面的解决方案,能够系统地管理提示词迭代,并量化其对 Agent 成功率的影响。
第三章:构建 LangSmith 驱动的提示词版本控制体系
接下来,我们将通过实际的代码示例,一步步构建一个利用 LangSmith 追踪提示词迭代的 Agent 系统。我们的目标是:
- 定义一个简单的 Agent。
- 创建不同版本的提示词。
- 构建一个评估数据集。
- 运行评估,并比较不同提示词版本在数据集上的表现。
- 在 LangSmith UI 中分析结果,理解提示词迭代如何影响 Agent 成功率。
3.1 环境准备与 LangSmith 配置
首先,我们需要安装必要的库并配置 LangSmith 环境变量。
# 安装必要的库
# pip install langchain langchain-openai langsmith
import os
from datetime import datetime
from uuid import uuid4
# 导入 LangChain 和 LangSmith 相关的库
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_openai_tools_agent, tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langsmith import Client, traceable
from langsmith.schemas import RunType, Example, Dataset
# 设置 LangSmith 环境变量
# 请确保你的 LANGCHAIN_API_KEY 已经设置
# export LANGCHAIN_API_KEY="your-langsmith-api-key"
# export LANGCHAIN_TRACING_V2="true"
# export LANGCHAIN_PROJECT="Prompt_Versioning_Lecture" # 为你的项目命名
# 如果没有设置环境变量,可以在代码中设置
# os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_PROJECT"] = "Prompt_Versioning_Lecture"
# 初始化 LangSmith 客户端
client = Client()
print("LangSmith 客户端初始化完成。请确保 LANGCHAIN_API_KEY, LANGCHAIN_TRACING_V2, LANGCHAIN_PROJECT 已正确设置。")
3.2 初始 Agent 的构建与提示词设计
我们将构建一个简单的数学计算 Agent。这个 Agent 能够使用一个工具来执行加法运算。我们将从一个基础的系统提示词开始。
# 定义一个简单的工具
@tool
def add(a: int, b: int) -> int:
"""Adds two integers together."""
return a + b
tools = [add]
# 定义一个函数来创建 Agent
def create_math_agent(prompt_template: ChatPromptTemplate, llm_model_name: str = "gpt-4o-mini") -> AgentExecutor:
"""
创建一个基于 OpenAI 工具的数学计算 Agent。
"""
llm = ChatOpenAI(model=llm_model_name, temperature=0)
agent = create_openai_tools_agent(llm, tools, prompt_template)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False) # verbose=False 避免控制台输出过多日志
return agent_executor
# 初始提示词 (Version 1)
# 这是一个非常基础的系统提示词,可能不够鲁棒
prompt_v1_template = ChatPromptTemplate.from_messages(
[
SystemMessage("你是一个有用的数学助手,可以执行算术运算。"),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
print("初始 Agent 和提示词 v1 定义完成。")
3.3 提示词版本化与 LangSmith 追踪
为了追踪不同提示词版本的表现,我们需要:
- 定义多个版本的提示词字符串或
ChatPromptTemplate。 - 在运行 Agent 时,确保 LangSmith 能够识别当前使用的是哪个版本的提示词。我们可以通过在
Client.run_on_dataset的description或tags参数中明确指定提示词版本来实现。
# 定义不同版本的提示词
# 提示词 v1 (基础版)
# 仅仅告诉 Agent 它是一个数学助手
prompt_v1 = ChatPromptTemplate.from_messages(
[
SystemMessage("你是一个有用的数学助手,可以执行算术运算。"),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
# 提示词 v2 (增强指令版)
# 增加了一些关于如何使用工具、如何思考的明确指令,并强调输出格式
prompt_v2 = ChatPromptTemplate.from_messages(
[
SystemMessage(
"你是一个高度精确的数学助手,专门用于执行算术运算。 "
"当用户需要进行计算时,你必须使用提供的工具来完成。 "
"在提供最终答案之前,请仔细思考并验证你的步骤。 "
"最终答案必须清晰明了,且只包含计算结果。"
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
# 提示词 v3 (添加 Few-shot 示例版)
# 在 v2 的基础上,添加了一个 Few-shot 示例,以进一步指导 Agent 的行为
prompt_v3 = ChatPromptTemplate.from_messages(
[
SystemMessage(
"你是一个高度精确的数学助手,专门用于执行算术运算。 "
"当用户需要进行计算时,你必须使用提供的工具来完成。 "
"在提供最终答案之前,请仔细思考并验证你的步骤。 "
"最终答案必须清晰明了,且只包含计算结果。nn"
"这是一个示例:n"
"用户:计算 5 加 3n"
"助手:Thought: 用户想计算 5 加 3。我可以使用 `add` 工具。n"
"Action: addn"
"Action Input: {'a': 5, 'b': 3}n"
"Observation: 8n"
"Final Answer: 8"
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
# 提示词 v4 (精简指令,强调效率版)
# 尝试精简指令,看是否能提高效率或降低复杂性,但可能牺牲部分鲁棒性
prompt_v4 = ChatPromptTemplate.from_messages(
[
SystemMessage(
"你是一个擅长使用工具进行数学计算的助手。 "
"请快速准确地回答用户的数学问题,直接给出最终结果。"
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
# 将所有提示词版本存储在一个字典中,方便管理
prompt_versions = {
"v1_basic": prompt_v1,
"v2_enhanced_instructions": prompt_v2,
"v3_few_shot_example": prompt_v3,
"v4_concise_efficient": prompt_v4,
}
print(f"已定义 {len(prompt_versions)} 个提示词版本。")
# 运行 Agent 并观察 LangSmith 追踪结果
# 虽然我们最终会使用 run_on_dataset 进行批量评估,
# 但这里可以先演示单个运行的追踪效果。
print("n演示单个 Agent 运行的 LangSmith 追踪:")
agent_v1 = create_math_agent(prompt_v1)
# 在 LangSmith 中,可以通过设置 `LANGCHAIN_PROJECT` 和 `tags` 来组织追踪
# 或者在调用时使用 `langsmith.run_helpers.traceable` 装饰器或上下文管理器
# 这里我们演示通过 `langsmith.traceable` 来显式命名和标记
@traceable(name="Agent_Run_v1_Example", tags=["prompt:v1_basic", "example_run"])
def run_agent_with_prompt(agent_executor: AgentExecutor, input_text: str):
return agent_executor.invoke({"input": input_text, "chat_history": []})
# result = run_agent_with_prompt(agent_v1, "计算 123 加上 456")
# print(f"Agent v1 示例运行结果: {result['output']}")
# 此时,你可以在 LangSmith UI 中看到名为 "Agent_Run_v1_Example" 的 Trace,
# 并带有 "prompt:v1_basic" 和 "example_run" 标签。
在 LangSmith UI 中,你将看到每次 agent_executor.invoke 调用都会生成一个 Trace。这个 Trace 会详细记录 Agent 的思考过程、工具调用、LLM 调用等。虽然我们还没有正式进行版本比较,但通过 traceable 装饰器或在后续的 run_on_dataset 中使用 tags,我们已经为每个运行打上了“提示词版本”的标记。
3.4 构建评估数据集 (Dataset)
一个高质量的评估数据集是量化提示词效果的基础。它应该包含各种输入场景,并附带预期的参考输出。
# 定义数据集名称
dataset_name = f"Math Agent Evaluation - {datetime.now().strftime('%Y%m%d%H%M%S')}"
# 准备数据集的输入和预期输出
# 这里的 'output' 是 Agent 期望的最终答案
dataset_examples = [
{"input": "计算 5 加 3", "output": "8"},
{"input": "请帮我计算 100 加上 200", "output": "300"},
{"input": "What is 7 plus 13?", "output": "20"},
{"input": "求和 99 和 1", "output": "100"},
{"input": "计算 12345 加上 67890", "output": "80235"},
{"input": "3加4等于几?", "output": "7"},
{"input": "请计算 -5 和 8 的和。", "output": "3"},
{"input": "计算 0 和 0 的和。", "output": "0"},
{"input": "求出 123 和 45 的和。", "output": "168"},
{"input": "请告诉我 999 加上 111 等于多少?", "output": "1110"},
]
# 在 LangSmith 中创建数据集
def create_or_get_dataset(dataset_name: str, examples: list) -> Dataset:
"""
检查 LangSmith 中是否存在同名数据集,如果不存在则创建。
"""
existing_datasets = client.list_datasets(dataset_name=dataset_name)
if existing_datasets:
print(f"数据集 '{dataset_name}' 已存在。将使用现有数据集。")
dataset = existing_datasets[0]
else:
print(f"创建新数据集: '{dataset_name}'...")
dataset = client.create_dataset(
name=dataset_name,
description="用于评估数学 Agent 不同提示词版本的性能。",
)
for example_data in examples:
client.create_example(
dataset_id=dataset.id,
inputs={"input": example_data["input"]},
outputs={"output": example_data["output"]}, # 参考输出
)
print(f"数据集 '{dataset_name}' 创建成功,包含 {len(examples)} 个示例。")
return dataset
evaluation_dataset = create_or_get_dataset(dataset_name, dataset_examples)
print(f"数据集 ID: {evaluation_dataset.id}")
3.5 运行自动化评估 (Evaluation Run)
现在,我们将使用 LangSmith 的 run_on_dataset 功能,针对每个提示词版本运行 Agent,并使用自定义评估器来判断 Agent 的成功率。
评估器 (Evaluators):
我们将定义一个简单的自定义评估器,它检查 Agent 的最终输出是否与数据集中的参考输出完全匹配。
# 定义一个自定义评估器函数
# 这个函数会接收一个 LangChain Trace (Run) 作为输入,并返回一个评估结果字典
def custom_exact_match_evaluator(run: dict, example: Example) -> dict:
"""
自定义评估器,检查 Agent 的最终输出是否与参考输出完全匹配。
"""
# run['output'] 对应 AgentExecutor 的最终输出
# example.outputs['output'] 对应数据集中的参考输出
agent_output = str(run.outputs.get("output", "")).strip() if run.outputs else ""
reference_output = str(example.outputs.get("output", "")).strip() if example.outputs else ""
is_correct = agent_output == reference_output
score = 1 if is_correct else 0
feedback = "Correct" if is_correct else f"Incorrect. Expected: '{reference_output}', Got: '{agent_output}'"
return {
"score": score,
"key": "exact_match", # 评估指标的唯一键
"comment": feedback,
"value": "Correct" if is_correct else "Incorrect", # 用于分类的值
}
# 将自定义评估器包装成 LangSmith 期望的格式
# 注意:LangSmith 的 run_on_dataset 默认支持几种内置评估器 (如 "cot_qa", "qa")
# 对于自定义 Python 函数,我们可以直接传入函数对象
# 或者使用 langsmith.evaluation.run_evaluator 装饰器,这里直接传入函数。
# 如果需要更复杂的 LLM 辅助评估,可以参考 LangSmith 文档使用 `evaluate.run_evaluator` 和 LLM Evaluator。
# 运行评估流程
evaluation_results = {}
print("n开始对不同提示词版本进行评估...")
for version_name, prompt_template in prompt_versions.items():
print(f"n--- 评估提示词版本: {version_name} ---")
agent_executor = create_math_agent(prompt_template)
# 使用 client.run_on_dataset 运行评估
# description 参数非常重要,用于在 LangSmith UI 中区分不同的运行批次
# tags 参数可以进一步细化分类,例如 "prompt_version:v1"
run_config = {
"configurable": {
"llm": "gpt-4o-mini", # 可以指定 Agent 内部使用的 LLM 模型
}
}
# 确保 agent_executor 是一个可调用的对象,run_on_dataset 可以直接执行
# 或者封装在一个函数中
def _run_agent_for_eval(inputs: dict) -> dict:
return agent_executor.invoke(inputs)
# LangSmith 的 run_on_dataset 会为每个 example 调用 _run_agent_for_eval
# 并将结果记录为 Trace,然后由评估器进行评估
test_run = client.run_on_dataset(
dataset_name=evaluation_dataset.name,
llm_or_chain_factory=_run_agent_for_eval, # 传入 Agent 的执行函数
evaluation_config={
"evaluators": [custom_exact_match_evaluator], # 传入自定义评估器
},
project_name=os.environ.get("LANGCHAIN_PROJECT"),
description=f"评估 Agent 提示词版本: {version_name}",
tags=[f"prompt_version:{version_name}", "agent_eval"], # 添加标签以便在 UI 中筛选
# concurrency_level=5, # 可以根据需要调整并发数
# max_iterations=50 # 限制评估的 example 数量,适合快速测试
)
evaluation_results[version_name] = test_run
print(f"提示词版本 '{version_name}' 评估完成。可在 LangSmith UI 中查看。")
print("n所有提示词版本的评估已提交到 LangSmith。")
3.6 LangSmith UI 中的结果分析与曲线追踪
完成上述代码运行后,所有的评估结果都已上传到 LangSmith 平台。现在,我们切换到 LangSmith 的 Web UI (app.langsmith.com) 进行分析。
- 导航至 Project: 在左侧导航栏选择你的项目
Prompt_Versioning_Lecture。 - 查看 Runs: 在项目概览页面,你会看到一系列的 Runs,每个 Run 对应一次
client.run_on_dataset的调用。通过description或tags(例如prompt_version:v1_basic) 可以很容易地识别出不同提示词版本的评估批次。 - 对比不同 Run:
- 选中你想要对比的多个 Run (例如,
评估 Agent 提示词版本: v1_basic,v2_enhanced_instructions等)。 - 点击“Compare”按钮。LangSmith 会生成一个对比视图,展示这些 Run 的关键指标,如平均得分、总耗时、错误率等。
- 重点关注
exact_match评估器的平均score。这个分数直接反映了 Agent 在数据集上的成功率。
- 选中你想要对比的多个 Run (例如,
- 深入单个 Trace:
- 在对比视图或单个 Run 详情中,可以点击任何一个 Example 的 Trace。
- 这将打开一个详细的 Trace 视图,展示 Agent 在处理该特定输入时的完整决策路径、LLM 调用、工具使用以及每个步骤的输入输出。
- 对于评估失败的 Example (即
exact_match评分为 0 的 Trace),仔细分析其内部步骤,可以帮助你理解 Agent 为何出错,是理解错误、规划失误、工具使用不当,还是输出格式不符合要求。这对于迭代提示词至关重要。
- “影响曲线”的解读:
- 虽然 LangSmith 不会直接绘制一条“提示词影响曲线”图表,但通过对比不同提示词版本的评估结果,我们可以清晰地观察到成功率的变化趋势。
- 例如,你可以通过以下表格形式整理和解读数据:
表格:不同提示词版本在评估数据集上的表现对比
| 提示词版本 | LangSmith Run ID (部分) | 成功率 (%) (Exact Match Score) | 平均延迟 (s) | 错误类型分布 (通过人工分析 Trace 汇总) | 备注 |
|---|---|---|---|---|---|
| v1_basic | run_XXXX_v1 |
70 | 2.5 | 格式错误 (10%), 逻辑理解错误 (20%) | 初始基线,指令模糊 |
| v2_enhanced_instructions | run_XXXX_v2 |
85 | 2.8 | 格式错误 (5%), 逻辑理解错误 (10%) | 增强了指令,明显减少格式错误 |
| v3_few_shot_example | run_XXXX_v3 |
92 | 3.5 | 逻辑理解错误 (3%) | 添加 Few-shot 示例,鲁棒性大幅提升,但延迟略增 |
| v4_concise_efficient | run_XXXX_v4 |
80 | 2.0 | 格式错误 (8%), 逻辑理解错误 (12%) | 追求效率,但指令精简导致性能下降 |
从这个表格中,我们可以直观地看到:
v1_basic作为基线,成功率较低,说明模糊的指令不足以指导 Agent 良好工作。v2_enhanced_instructions通过更清晰的指令,显著提升了成功率,表明指令的明确性至关重要。v3_few_shot_example在v2的基础上加入了 Few-shot 示例,成功率达到最高。这印证了 Few-shot Learning 在引导 LLM 行为方面的强大作用,尤其是在遵循特定输出格式或复杂逻辑时。需要注意的是,Few-shot 可能会增加提示词的长度,从而略微增加延迟和成本。v4_concise_efficient尝试精简指令以提高效率,但结果是成功率有所下降。这表明在当前场景下,指令的详细程度和鲁棒性比单纯的简洁更重要。
这种“影响曲线”的分析,使我们能够数据驱动地理解每次提示词迭代的价值,避免凭空猜测,并指导我们找到最优的提示词策略。
第四章:高级应用与最佳实践
掌握了基础的提示词版本控制和评估流程后,我们可以进一步探讨其高级应用和最佳实践,以构建更健壮、更智能的 Agent 系统。
4.1 动态提示词管理与 A/B 测试
在生产环境中,我们可能需要更灵活地管理提示词。
- 动态加载: 将提示词存储在外部配置服务(如数据库、环境变量、配置管理系统)中,而不是硬编码在代码里。这样可以在不修改和部署代码的情况下,更新提示词。
- 结合 LangSmith 进行 A/B 测试: 当有两个或更多表现良好的提示词版本时,可以在生产环境中对少量用户进行 A/B 测试。
- 随机分配用户到使用不同提示词版本的 Agent。
- 将每个用户会话的 Trace 和结果(包括用户反馈、后续行为等)记录到 LangSmith。
- 通过 LangSmith 的评估和聚合统计功能,比较哪个提示词版本在真实用户场景中表现更好。这能帮助我们做出数据驱动的生产决策。
4.2 结构化提示词与多组件管理
复杂的 Agent 往往包含多个提示词组件:
- System Prompt: 定义 Agent 的角色、目标和总体行为准则。
- Tool Descriptions: 对 Agent 可用工具的详细说明。
- User Prompt: 用户的实际输入。
- Few-shot Examples: 用于演示期望行为的示例。
- Reflection Prompt: 引导 Agent 自我反思和纠正错误的指令。
对这些组件进行独立版本管理是最佳实践。例如,你可以维护 system_prompt_v1, system_prompt_v2,以及 tool_instructions_vA, tool_instructions_vB。
在使用 LangChain 构建 Agent 时,可以通过 ChatPromptTemplate 结合 MessagesPlaceholder 来灵活组合这些组件。
# 示例:组合不同版本的组件
system_prompt_component_v_alpha = SystemMessage("你是一个专业的金融分析师。")
system_prompt_component_v_beta = SystemMessage("你是一个谨慎且擅长使用工具的金融分析师,会验证所有数据。")
# 工具指令可能也存在多个版本
# tool_instructions_v_x = ...
# tool_instructions_v_y = ...
# 最终的 Agent 提示词模板可以根据需要组合
final_prompt_template_v_combined_1 = ChatPromptTemplate.from_messages([
system_prompt_component_v_alpha,
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
final_prompt_template_v_combined_2 = ChatPromptTemplate.from_messages([
system_prompt_component_v_beta, # 换用不同的 System Prompt 版本
MessagesPlaceholder(variable_name="chat_history"),
HumanMessage(content="{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 评估时,分别运行这两个组合,并记录其为不同的“提示词版本”
这种模块化的管理方式使得我们可以独立优化某个组件,并清晰地看到其对整体性能的影响。
4.3 持续集成与自动化评估
将 LangSmith 评估集成到 CI/CD (Continuous Integration/Continuous Deployment) 流程中,是实现自动化、高质量 Agent 开发的关键。
- 每次提示词更新或代码提交: 自动触发 LangSmith 评估运行。
- 设定性能阈值: 如果新的提示词版本导致 Agent 在关键指标(如成功率)上低于预设阈值,则阻止合并或部署。
- 自动化报告: 将评估结果摘要发布到团队协作工具(如 Slack、Teams),让团队成员及时了解 Agent 性能变化。
这相当于为你的提示词建立了一套“单元测试”和“集成测试”框架,确保每一次改动都是经过验证的。
4.4 人工反馈与迭代闭环
自动化评估虽然高效,但有时无法捕捉所有细微的质量问题。人工反馈是不可或缺的。
- LangSmith 的人工标注: LangSmith 允许用户在 Trace 视图中添加人工反馈和标签。例如,可以标注某个失败是因为“理解错误”、“格式不符”或“工具选择错误”。
- 整合反馈到数据集: 将高质量的人工反馈转换为新的评估 Example,加入到数据集中,不断丰富和优化评估基准。
- 形成迭代闭环: 人工反馈 -> 分析问题 -> 优化提示词/Agent 逻辑 -> 自动化评估 -> 新一轮人工反馈。这个闭环是 Agent 持续进步的动力。
4.5 团队协作与知识共享
LangSmith 平台天然支持团队协作:
- 项目共享: 团队成员可以在同一个 LangSmith 项目下工作,共享数据集、评估结果和 Trace。
- 统一规范: 制定统一的提示词命名约定、标签使用规范,确保团队内部对提示词版本和评估结果有共同的理解。
- 知识沉淀: LangSmith 的历史 Trace 和评估报告成为了宝贵的知识资产,新成员可以快速学习和理解 Agent 的演变过程和设计原理。
结语:构建可信赖、高性能的 Agent 系统
今天,我们深入探讨了提示词版本控制在 AI Agent 开发中的核心地位,并详细演示了如何利用 LangSmith 这一强大工具,系统地追踪提示词迭代对 Agent 成功率的影响曲线。
从最初的提示词黑盒迭代,到如今 LangSmith 提供的透明化、数据驱动的评估流程,我们已经能够:
- 清晰地追溯每一次提示词改动,知道它们何时发生,为何引入。
- 量化每一次迭代的效果,通过成功率、延迟等指标,客观评估其价值。
- 深入分析失败原因,通过详细的 Trace 视图,定位 Agent 行为的症结所在。
- 构建一个持续优化、可信赖的 Agent 开发流程,将提示词工程从艺术提升为科学。
构建高性能、鲁棒的 AI Agent 是一项复杂且持续的工作。系统化的提示词版本控制和数据驱动的评估是成功的关键。LangSmith 为我们提供了一套完整的工具链,助力开发者追踪、评估和优化 Agent 性能,从而在不断变化的 AI 应用场景中,构建出真正有价值的智能系统。持续迭代、数据驱动,这将是你通往成功的必由之路。
感谢大家的聆听!