推荐使用 SDK 中的 list_runs 方法,或 API 中的 /runs/query 端点,来查询 运行(LangSmith 追踪中的跨度数据)。LangSmith 以 运行(跨度)数据格式 中规定的简单格式存储追踪数据。 本页面介绍:
如果你要导出大量追踪数据,建议使用批量数据导出功能。该功能更适合处理大量数据,并支持自动重试以及跨分区并行处理。

使用过滤参数

对于简单查询,不必依赖查询语法。你可以使用过滤参数参考中指定的过滤参数。
前提条件运行以下代码片段之前,请先初始化客户端。
下面是一些使用关键字参数列出运行的示例:

列出项目中的所有运行

列出过去 24 小时内的 LLM 和聊天运行

列出项目中的根运行

根运行是没有父运行的运行。它们的 is_root 值为 True。你可以使用此字段筛选根运行。

列出没有错误的运行

按运行 ID 列出运行

忽略其他参数如果按照上述方式提供运行 ID 列表,系统将忽略其他过滤参数(例如 project_name、run_type 等),并直接返回与给定 ID 匹配的运行。
如果你有运行 ID 列表,可以直接列出这些运行:

按 ID 获取单个运行

要按 ID 获取单个运行(追踪),请使用 read_run 方法。当你有特定的追踪 ID(例如来自 LangSmith 分享链接 https://smith.langchain.com/public/<trace-id>/r),并希望获取其完整数据时,此方法非常有用。
使用 LangGraph 在本地重放追踪如果你在使用带检查点功能的 LangGraph,可以从 LangSmith 获取追踪,并在本地重放以进行调试。详情请参阅 LangGraph 的时间旅行与重放文档,了解如何从检查点恢复执行。

使用过滤查询语言

对于更复杂的查询,可以使用过滤查询语言。以下示例涵盖最常见的模式。有关完整的运算符和字段参考(包括所有比较器、可过滤字段、值格式规则以及快速参考示例表),请参阅追踪查询语法:过滤查询语言。

列出对话线程中的所有根运行

这是获取对话线程中运行的方式。有关如何设置线程的更多信息,请参阅设置线程操作指南。 线程通过设置共享线程 ID 进行分组。LangSmith UI 支持使用以下任一元数据键:session_id 或 thread_id。会话 ID 也称为追踪项目 ID。以下查询会匹配其中任意一个键。

列出所有名为 “extractor” 且其追踪根运行被赋予 “user_score” 反馈、分数为 1 的运行

列出具有 “star_rating” 键且分数大于 4 的运行

列出完成耗时超过 5 秒的运行

列出所有状态不是 “error” 的运行

列出所有 start_time 大于特定时间戳的运行

列出包含字符串 “substring” 的所有运行

列出所有带有 Git 哈希值 “2aa1cf4” 标签的运行

列出所有在特定时间戳之后开始,且状态不为错误或 “Correctness” 反馈分数等于 0 的运行

复杂查询:列出标签包含 “experimental” 或 “beta” 且延迟超过 2 秒的所有运行

通过全文搜索查找追踪树

你可以在不指定具体字段的情况下使用 search() 函数,对运行中的所有字符串字段执行全文搜索。这样可以快速找到匹配搜索词的追踪。

检查元数据是否存在

如果想检查元数据是否存在,可以使用 eq 运算符,也可以选择搭配 and 语句按值进行匹配。当你希望为运行记录更结构化的信息时,这种方式非常有用。

检查元数据中的环境详情

一种常见模式是通过元数据向追踪中添加环境信息。如果想筛选包含环境元数据的运行,可以使用与上面相同的模式:

检查元数据中的线程 ID

将同一对话中的追踪关联起来的一种常见方式是使用共享线程 ID。如果想根据这种方式存储的线程 ID 筛选运行,可以在元数据中搜索该 ID。

对键值对执行否定过滤

你可以对元数据、输入和输出键值对执行否定过滤,从结果中排除特定运行。下面是针对元数据键值对的示例,同样的逻辑也适用于输入和输出键值对。

组合多个过滤条件

如果想组合多个条件来细化搜索,可以使用 and 运算符以及其他过滤函数。下面展示如何搜索名称为 “ChatOpenAI” 且元数据中包含特定 thread_id 的运行:

树过滤

列出所有名为 “RetrieveDocs” 的运行,这些运行的根运行具有分数为 1 的 “user_score” 反馈,并且完整追踪中的任意运行名为 “ExpandQuery”。 如果希望根据追踪中是否达到各种状态或步骤,有条件地提取特定运行,这类查询非常有用。

使用子运行谓词查询追踪树

使用 trace_filter 匹配根运行中的字段,使用 tree_filter 匹配追踪树中任意运行的受支持可搜索字段。对于任意返回的子运行字段(例如嵌套的 inputs、outputs 或 extra 数据)上的谓词,请执行以下步骤:
  1. 使用 filter、trace_filter、tree_filter、run_type、元数据过滤器、parent_run_id 以及 ls_run_depth系统元数据键,在服务端缩小候选根追踪的范围。
  2. 在 Python 中调用 read_run(..., load_child_runs=True),或在 TypeScript 中调用 readRun(..., { loadChildRuns: true }),为每个候选根追踪加载子运行。
  3. 在本地遍历已加载的 child_runs 树,并对无法作为服务端过滤字段使用的字段应用谓词。
以下示例(Python 0.8 和 JS 0.7)返回包含某个工具运行且该工具运行输出包含特定值的根追踪。服务端的 tree_filter 会将候选范围缩小到包含相关工具运行的追踪,而本地谓词则检查已加载的 outputs 数据。

高级用法:导出包含子工具使用情况的扁平化追踪视图

以下 Python 示例演示如何导出扁平化的追踪视图,其中包括代理在每条追踪中使用的工具信息(来自嵌套运行)。 你可以使用此方法分析代理在多条追踪中的行为。 此示例查询指定天数内的所有工具运行,并根据其父运行(根运行)ID 对它们进行分组。随后,示例会获取每个根运行的相关信息,例如运行名称、输入和输出,并将这些信息与子运行信息合并。 为了优化查询,示例:
  1. 查询工具运行时只选择必要字段,以减少查询时间。
  2. 在并发处理工具运行的同时,分批获取根运行。

高级用法:导出包含反馈的追踪中的检索器输入输出

如果希望根据检索器行为微调嵌入,或诊断端到端系统性能问题,此查询非常有用。 以下 Python 示例演示如何导出具有特定反馈分数的追踪中的检索器输入和输出。

速率限制

POST /runs/query 端点(Python 中的 list_runs,JavaScript 中的 listRuns)具有每个租户的速率限制,具体限制取决于查询参数: 时间窗口由 end_time - start_time 确定。如果未提供 end_time,LangSmith 将使用当前时间。不包含 start_time 的查询会被视为大时间窗口查询。

最佳实践

为了避免触发速率限制并减少查询时间,尤其是对于输入输出较大的运行,请遵循以下建议:
  • 设置 start_time:省略该参数会触发大时间窗口速率限制层级(每 10 秒 3 个请求,而不是 10 个)。如果可能,请使用 7 天或更短的时间窗口。
  • 使用 select:默认情况下会返回所有字段。只指定所需字段(例如 select=["inputs", "outputs"])可以显著减少响应大小和查询时间,尤其适用于输入输出较大的运行。
  • 设置 limit:如果不需要分页获取全部结果,请限制结果数量。
  • 避免全文搜索:filter='search("...")' 具有最严格的速率限制;请尽可能使用结构化过滤器(例如 eq()、has())。
  • 避免选择 child_run_ids:选择该字段同样会触发更严格的速率限制层级。
超过这些限制时,API 会返回 429 Too Many Requests 响应。有关速率限制的一般信息,请参阅管理概览。