追踪项目可能积累大量数据,跨越 线程, 追踪,以及 运行。LangSmith 的筛选工具让您精确地浏览和分析这些数据。
本页面涵盖:
- - 从筛选栏应用筛选条件 和 **筛选快捷方式** 面板
- - 按属性、全文内容和键值对进行筛选
- - 保存和复制筛选配置
- - 在详情视图中筛选
- - 高级筛选 用于筛选根运行或子运行的属性
如果您要通过以下方式以编程方式导出数据进行分析 API or SDK,请参阅 导出追踪指南 instead.
创建并应用筛选条件
按运行属性筛选
在追踪项目中筛选数据有两种方式:
1. **筛选条件**:位于 **追踪** 项目页面左上方。这是您构建和管理筛选条件的位置。 - 第一个下拉菜单用于筛选默认视图和 已保存视图. - 快速筛选 **线程**, **追踪**, or **运行**. - **添加筛选条件** to 基于属性或全文搜索配置筛选条件。 根据属性或全文搜索配置筛选条件。
- **筛选快捷方式**:位于 **追踪** 项目页面的右侧边栏。筛选快捷方式栏提供对基于项目运行中最常出现属性的筛选条件的快速访问。
筛选运算符
可用的筛选运算符取决于您正在筛选的属性的数据类型。以下是常见运算符的概述:
- is:精确匹配筛选值
- 不是:筛选值的否定匹配
- 包含:筛选值的部分匹配
- 不包含:筛选值的否定部分匹配
- 是其中之一:匹配列表中的任何值
- -
>/<:适用于数字字段
特定筛选技术
筛选运行(跨度)
要筛选运行(跨度),请将默认值从 **追踪** to **运行**改为。例如,如果您想按以下方式筛选 **运行名称** 来筛选运行,或按 **运行类型**.
运行元数据和标签也有助于筛选。这些依赖于管道各部分的良好标记。要了解更多信息,请参阅 向追踪添加元数据和标签.
当您指定更多筛选条件时,可以单独点击每个筛选条件来更新您正在搜索的属性。
根据输入和输出进行筛选
您可以根据线程、追踪或运行的输入和输出内容来筛选追踪数据。
要筛选输入或输出,您可以使用 ** 全文搜索** 筛选,它将匹配任一字段中的关键词。如需更精准的搜索,您可以使用 **{} 输入** or ** 输出** 筛选,它们只会根据相应字段匹配内容。
您还可以指定多个条件来匹配所有提供的词,方法如下:
- - 使用空格分隔多个词与 **全文搜索**.
- - 添加多个筛选条件,请使用 按钮,在您添加第一个筛选条件之后。
LangSmith 会拆分文本并匹配任意顺序的部分关键词。LangSmith 会从搜索中排除常见的停用词(来自 nltk 停用词列表以及一些其他常见的 JSON 关键词)。
根据图片中的筛选条件,系统将搜索 python 和 tensorflow ,在输入或输出中查找,并 embedding 在输入中查找,同时 fine 和 tune 在输出中查找。
您可以根据需要从筛选路径中移除筛选条件,这会扩大搜索范围至剩余的筛选条件。
Filter based on input / output key-value pairs
除了全文搜索之外,您还可以根据输入和输出中的特定键值对进行筛选。这可以实现更精确的筛选,特别是在处理结构化数据时。
要基于键值对进行筛选,例如,要匹配以下输入:
{
"input": "What is the capital of France?"
}
- 选择 **添加筛选条件**.
- 选择 **输入** 从第一个下拉菜单中选择并保留 **键** 作为第二个下拉菜单并选择 **输入** 作为键。
- 点击 **+ 值** 并输入值:
What is the capital of France?作为值。
您还可以使用点符号来匹配嵌套键以选择嵌套键名称。例如,要匹配输出中的嵌套键:
{
"documents": [
{
"page_content": "The capital of France is Paris",
"metadata": {},
"type": "Document"
}
]
}
选择 **输出键**,输入 documents.page_content 作为键并输入 The capital of France is Paris 作为值。这将匹配嵌套键 documents.page_content 与指定的值。
您可以添加多个键值过滤器来创建更复杂的查询。您还可以使用 **筛选器快捷方式** 在右侧根据常见的键值对快速筛选:
示例:筛选工具调用
搜索包含特定工具调用的追踪记录是很常见的。工具调用通常在LLM运行的输出中指示。要筛选工具调用,您可以使用 **输出键** filter.
虽然此示例将向您展示如何筛选工具调用,但您可以应用相同的逻辑来筛选输出中的任何键值对。
在这种情况下,我们假设这是您要筛选的输出:
{
"generations": [
[
{
"text": "",
"type": "ChatGeneration",
"message": {
"lc": 1,
"type": "constructor",
"id": [],
"kwargs": {
"type": "ai",
"id": "run-ca7f7531-f4de-4790-9c3e-960be7f8b109",
"tool_calls": [
{
"name": "Plan",
"args": {
"steps": [
"Research LangGraph's node configuration capabilities",
"Investigate how to add a Python code execution node",
"Find an example or create a sample implementation of a code execution node"
]
},
"id": "toolu_01XexPzAVknT3gRmUB5PK5BP",
"type": "tool_call"
}
]
}
}
}
]
],
"llm_output": null,
"run": null,
"type": "LLMResult"
}
使用此示例,KV搜索会将每个嵌套的JSON路径映射为可用来搜索和筛选的键值对。
LangSmith会将其分解为以下可搜索的键值对集合:
| 键 | 值 |
|---|---|
generations.type | ChatGeneration |
generations.message.type | constructor |
generations.message.kwargs.type | ai |
generations.message.kwargs.id | run-ca7f7531-f4de-4790-9c3e-960be7f8b109 |
generations.message.kwargs.tool_calls.name | Plan |
generations.message.kwargs.tool_calls.args.steps | Research LangGraph's node configuration capabilities |
generations.message.kwargs.tool_calls.args.steps | Investigate how to add a Python code execution node |
generations.message.kwargs.tool_calls.args.steps | Find an example or create a sample implementation of a code execution node |
generations.message.kwargs.tool_calls.id | toolu_01XexPzAVknT3gRmUB5PK5BP |
generations.message.kwargs.tool_calls.type | tool_call |
type | LLMResult |
要搜索特定的工具调用,您可以使用以下 **输出键** 搜索,同时移除根运行筛选器:
generations.message.kwargs.tool_calls.name = Plan
这将匹配 tool_calls 名称为 Plan.
键值对的负向筛选
可以对 **\{x} 元数据**, ** 输入**和 ** 输出** 字段应用不同类型的负向筛选,以从结果中排除特定的运行。
例如,要查找所有元数据键 phone 不等于 1234567890:
- 设置 **元数据键** 运算符为
is和 **键** 字段设为phone. - 将 **值** 运算符设为
is not和 **值** 字段设为1234567890.
这将匹配所有具有元数据键 phone 且值不等于 1234567890.
要查找没有特定元数据键的运行,请设置 **键** 运算符设为 is not。例如,将 Key 运算符设为 is not 且键为 phone 将匹配所有没有 phone 字段的运行。
您还可以筛选既没有特定键也没有特定值的运行。要查找元数据既没有键 phone 也没有任何值为 1234567890的运行,请设置 **键** 运算符设为 is not 且键为 phone,然后将 **值** 运算符设为 is not 且值为 1234567890.
最后,您还可以筛选没有特定键但有特定值的运行。要查找没有 phone 键但有值为 1234567890 的其他键,请设置 **键** 运算符设为 is not 且键为 phone,然后将 **值** 运算符设为 is 且值为 1234567890.
保存筛选器
保存筛选器可以让您存储和重用常用的筛选器配置。保存的筛选器特定于某个跟踪项目。
构建筛选器后,点击 **另存为** 按钮进行保存。这将弹出对话框让您指定筛选器的名称和描述。
保存筛选器后,它将在视图下拉菜单中显示为快速筛选器供您使用。
更新已保存的筛选器
在下拉菜单中选择筛选器后,您可以更改筛选器参数。然后点击 **保存** 来更新筛选器。
删除已保存的筛选器
点击下拉菜单中已保存筛选器旁边的 图标,然后使用垃圾桶 icon.
复制筛选器
您可以复制已构建的过滤器,与同事分享、稍后重用,或在以下位置以编程方式查询运行: API or SDK.
复制过滤器:
- 在用户界面中创建它。
- 点击 图标在过滤器栏中。如果您已构建树或跟踪过滤器,也可以复制它们。
- 这将为您提供以 LangSmith 查询语言表示过滤器的字符串。例如:
and(eq(is_root, true), and(eq(feedback_key, "user_score"), eq(feedback_score, 1))).
有关查询语言语法的更多信息,请参阅 跟踪查询语法.
在详情视图中过滤运行
您也可以直接在 详情视图中应用过滤器,这对于筛选具有大量运行的跟踪非常有用。主要运行表视图中提供的相同过滤器也可以在此处应用。
默认情况下,仅显示与过滤器匹配的运行。要在跟踪树的更广泛上下文中查看匹配的运行,请将视图选项从"仅显示筛选结果"切换到"显示全部"或"最相关"。
在 LangSmith 查询语言中手动指定原始查询
如果您已 复制了之前构建的过滤器,您可能希望在以后的会话中手动应用此原始查询。
为此,您可以点击详情视图中过滤器弹出框底部的 **切换到原始查询** 。然后您可以将原始查询粘贴到文本框中。
高级过滤器
根据根的属性过滤运行(跨度)
一个常见需求是过滤属于具有某些属性的根运行的运行。例如,过滤具有特定类型的运行,其根运行具有正面(或负面)反馈关联。为此:
- 点击 **运行** in the Threads/Traces/Runs toggle.
- 添加另一个过滤器规则。然后您可以点击过滤器下拉菜单底部的 **高级** 过滤器链接。
- 将打开一个模态框,您可以在其中添加 **跟踪** 过滤器。这些过滤器将应用于您已过滤的所有单独运行的父级运行的跟踪。
过滤具有某些属性子运行的运行(跨度)
您可能希望搜索具有特定类型子运行的运行。例如,这可以是搜索所有具有名称为 Foo的子运行的跟踪。当 Foo 并不总是被调用,但您想分析它被调用的案例时,这很有用。
- 点击 **运行** in the Threads/Traces/Runs toggle.
- 添加另一个筛选规则。然后您可以点击 **高级** 筛选下拉列表底部的"高级筛选"链接。
- 将打开一个模态框,您可以在其中添加 **树** 筛选。这将使您指定的规则应用到您已筛选出的各个运行的所有子运行上。
示例:筛选所有树包含工具调用筛选条件的运行
扩展 工具调用筛选示例,如果您想筛选所有运行 _其树包含_ 工具筛选调用,您可以在 **高级** 筛选设置中使用树筛选。