在应用中过滤追踪
在深入阅读本文档之前,阅读以下内容可能有助于熟悉此处提及的概念
本页包含一系列关于如何在应用中过滤运行的指南。有关如何以编程方式实现类似操作的指南,请参阅本指南。能够准确地过滤运行对于手动检查和设置自动化都非常重要。
创建过滤器
创建过滤器有两种方法。首先,您可以从顶层导航栏创建过滤器。默认情况下,应用了一个过滤器:IsRoot
为 true
。这会将所有运行限制为顶层追踪。
您还可以从侧边栏的“过滤器快捷方式
”中定义过滤器。其中包含常用过滤器。
过滤中间运行(span)
为了过滤中间运行(span),您首先需要删除默认过滤器 IsRoot
为 true
。之后,您可以应用任何您想要的过滤器。一种常见的方法是按名称过滤子运行。这依赖于对管道的所有部分进行良好的命名或标记。要了解更多信息,您可以查看本指南
高级:基于根属性过滤中间运行(span)
一个常见的概念是过滤作为追踪一部分的中间运行,该追踪的根运行具有某些属性。一个例子是过滤特定类型的中间运行,其根运行具有与之关联的正面(或负面)反馈。
为了做到这一点,首先设置一个中间运行的过滤器(按照上面的章节)。之后,您可以添加另一个过滤器规则。然后,您可以点击过滤器底部的 Advanced Filters
链接。这将打开一个新的模态框,您可以在其中添加 Trace filters
。这些过滤器将应用于您已过滤的各个运行的所有父运行的追踪。
高级:过滤子运行具有某些属性的运行(span)
这与上面相反。您可能想要搜索具有特定类型子运行的运行。一个例子可能是搜索所有具有名为 Foo
的子运行的追踪。当 Foo
并非总是被调用,但您想分析调用它的情况时,这很有用。
为了做到这一点,您可以点击过滤器底部的 Advanced Filters
链接。这将打开一个新的模态框,您可以在其中添加 Tree filters
。这将使您指定的规则应用于您已过滤的各个运行的所有子运行。
基于输入和输出过滤
您可以根据运行的输入和输出中的内容过滤运行。
要过滤输入或输出,您可以使用 Full-Text Search
过滤器,它将匹配任一字段中的关键字。对于更有针对性的搜索,您可以使用 Input
或 Output
过滤器,它们将仅匹配基于各自字段的内容。
您还可以指定多个匹配项,可以通过包含以空格分隔的多个术语,或添加多个过滤器来实现 - 这将尝试匹配所有提供的术语。
请注意,关键字搜索是通过拆分文本并在搜索关键字中查找任何部分匹配项来完成的,因此它不是按特定顺序完成的。我们从搜索中排除常见的停用词(来自 nltk 停用词列表以及其他一些常见的 json 关键字)。
基于以上过滤器,系统将在输入或输出中搜索 python
和 tensorflow
,并在输入中搜索 embedding
,以及在输出中搜索 fine
和 tune
。
基于输入/输出键值对过滤
除了全文搜索之外,您还可以根据输入和输出中的特定键值对过滤运行。这允许更精确的过滤,尤其是在处理结构化数据时。
要基于键值对过滤,请从“过滤器”下拉列表中选择 Input KV
或 Output KV
过滤器。
例如,要匹配以下输入
{
"input": "What is the capital of France?"
}
选择 Filters
, Add Filter
以调出过滤选项。然后选择 Input KV
,输入 input
作为键,并输入 What is the capital of France?
作为值。
您还可以通过使用点表示法选择嵌套键名来匹配嵌套键。例如,要匹配输出中的嵌套键
{
"documents": [
{
"page_content": "The capital of France is Paris",
"metadata": {},
"type": "Document"
}
]
}
选择 Output KV
,输入 documents.page_content
作为键,并输入 The capital of France is Paris
作为值。这将匹配嵌套键 documents.page_content
和指定的值。
您可以添加多个键值过滤器以创建更复杂的查询。您还可以使用右侧的 Filter Shortcuts
根据常见的键值对快速过滤,如下所示
使用输出键值对过滤的示例:过滤工具调用
作为键值对过滤的一个示例,假设您想要过滤工具调用的追踪。
在这种情况下,让我们假设这是您想要过滤的输出
{
"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 |
要搜索特定的工具调用,您可以在删除根运行过滤器的情况下使用以下输出 KV 搜索
generations.message.kwargs.tool_calls.name
= Plan
这将匹配 tool_calls
名称为 Plan
的根运行和非根运行。
如果您想过滤树中包含工具过滤器调用的所有运行,您可以使用高级过滤器设置中的树过滤器
对键值对进行负向过滤
不同类型的负向过滤可以应用于 Metadata
, Input KV
, 和 Output KV
(KV 是键值的缩写) 字段,以从结果中排除特定运行。
例如,要查找元数据键 phone
不等于 1234567890
的所有运行,请将 Metadata
的 Key
运算符设置为 is
,并将 Key
字段设置为 phone
,然后将 Value
运算符设置为 is not
,并将 Value
字段设置为 1234567890
。这将匹配所有具有元数据键 phone
且值为除 1234567890
之外的任何值的运行。
要查找没有特定元数据键的运行,请将 Key
运算符设置为 is not
。例如,将 Key
运算符设置为 is not
,并将 phone
作为键将匹配所有元数据中没有 phone
字段的运行。
您还可以过滤既没有特定键也没有特定值的运行。要查找元数据既没有键 phone
也没有任何值为 1234567890
的字段的运行,请将 Key
运算符设置为 is not
,键为 phone
,并将 Value
运算符设置为 is not
,值为 1234567890
。
最后,您还可以过滤没有特定键但具有特定值的运行。要查找没有 phone
键但对于某些其他键有值 1234567890
的运行,请将 Key
运算符设置为 is not
,键为 phone
,并将 Value
运算符设置为 is
,值为 1234567890
。
请注意,您可以使用 does not match
运算符而不是 is not
来执行子字符串匹配。
已保存的过滤器
您可以保存过滤器以供将来重用。已保存的过滤器与追踪项目关联,而不是跨所有追踪项目。它们可以帮助您组织追踪并更轻松地找到相关的追踪。
保存过滤器
在过滤器框中,在构建过滤器后单击 Save
按钮。这将弹出一个对话框,用于指定过滤器的名称和描述。
使用已保存的过滤器
保存过滤器后,它将在过滤器栏中作为快速过滤器供您使用。如果您保存了 3 个以上的过滤器,则只会显示 2 个,其余的在同一栏的“更多”菜单中。
更新已保存的过滤器
选择过滤器后,对过滤器参数进行任何更改。然后单击 Save ▼
→ Save
以更新过滤器。
在同一菜单中,您还可以通过单击 Save ▼
→ Save as
来创建新的已保存过滤器。
删除已保存的过滤器
选择过滤器后,单击垃圾桶按钮以删除已保存的过滤器。
复制过滤器
有时您可能想要复制您构建的过滤器。您可能希望这样做以与同事分享、将来重用或在 SDK 中使用。
为了复制过滤器,您可以首先在 UI 中创建它。从那里,您可以单击右上角的复制按钮。如果您构建了树或追踪过滤器,您也可以复制它们。
这将为您提供我们查询语言中的一个字符串,例如 and(eq(is_root, true), and(eq(feedback_key, "user_score"), eq(feedback_score, 1)))
请参阅此参考文档以获取有关查询语言的更多信息。
在追踪视图中过滤运行
您还可以在追踪视图中过滤运行。这将使您能够轻松筛选具有大量运行的追踪。主运行表格视图中可用的相同过滤器也可以在此处应用。
默认情况下,只会显示与过滤器匹配的运行。要在追踪树的上下文中查看匹配的运行,请将视图选项从“Filtered Only”切换到“Show All”或“Most relevant”。
在 LangSmith 查询语言中手动指定原始查询
如果您复制了之前的过滤器(见上文),您可能希望在以后的会话中手动指定该原始查询。您也可能会发现修改此过滤器比使用 UI 更容易。
为了做到这一点,您可以单击底部的 Advanced filters
。从那里,您可以将原始查询粘贴到相应的框中。
请注意,这会将该查询添加到现有查询中,而不是覆盖它。
使用 AI 查询自动生成查询
有时弄清楚要指定的精确查询可能很困难!为了使其更容易,我们添加了 AI Query
功能。使用此功能,您可以以自然语言键入您想要构建的过滤器,它会将其转换为有效的查询。
例如:“所有运行时间超过 10 秒的运行”
请注意,这是一个实验性功能,可能不适用于所有查询。