跳到内容

查询和过滤记录

本指南概述了如何在 Argilla 中查询和过滤数据集。

您可以通过**查询**或**过滤**在数据集中搜索记录。查询侧重于文本字段的内容,而过滤器用于根据条件过滤记录。您可以独立使用它们,也可以组合多个过滤器来创建复杂的搜索查询。您还可以将数据集中的记录导出为单个字典或字典列表。

主要类

rg.Query(
    query="query",
    filter=filter
)

查看 查询 - Python 参考 以详细了解 Query 类的属性、参数和方法。

rg.Filter(
    [
        ("field", "==", "value"),
    ]
)

查看 过滤器 - Python 参考 以详细了解 Filter 类的属性、参数和方法。

rg.Similar(
    name="vector",
    value=[0.1, 0.2, 0.3],
)

查看 相似 - Python 参考 以详细了解 Similar 类的属性、参数和方法。

使用搜索词查询

要使用词语搜索记录,您可以使用带有查询字符串的 Dataset.records 属性。搜索词用于搜索文本字段中包含这些词语的记录。您可以搜索单个词语或多个词语,在后一种情况下,所有词语都应出现在要检索的记录中。

import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

query = rg.Query(query="my_term")

queried_records = dataset.records(query=query).to_list(flatten=True)
import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

query = rg.Query(query="my_term1 my_term2")

queried_records = dataset.records(query=query).to_list(flatten=True)

高级查询

如果您需要更复杂的搜索,可以使用 Elasticsearch 的简单查询字符串语法。以下是不同可用运算符的摘要

运算符 描述 示例
+space **AND**:搜索两个 term argilla + distilabelargilla distilabel
返回包含 term “argilla” 和 “distilabel” 的记录
| **OR**:搜索任一 term argilla | distilabel
返回包含 term “argilla” 或 “distilabel” 的记录
- **否定**:排除 term argilla -distilabel
返回包含 term “argilla” 且不包含 term “distilabel” 的记录
* **前缀**:搜索前缀 arg*
返回以 “arg-” 开头的任何单词的记录
" **短语**:搜索短语 "argilla and distilabel"
返回包含短语 “argilla and distilabel” 的记录
() **优先级**:分组 term (argilla | distilabel) rules
返回包含 “argilla” 或 “distilabel” 以及 “rules” 的记录
~N **编辑距离**:搜索具有编辑距离的 term 或短语 argilla~1
返回包含 term “argilla” 且编辑距离为 1 的记录,例如 “argila”

提示

要按字面意思使用这些字符之一,请使用前导反斜杠 \ 对其进行转义,例如 "1 \+ 2" 将匹配找到短语 “1 + 2” 的记录。

按条件过滤

您可以使用 Filter 类来定义条件,并将它们传递给 Dataset.records 属性以根据条件获取记录。条件包括 “==”、“>=”、“<=” 或 “in”。条件可以与点表示法结合使用,以根据元数据、建议或响应来过滤记录。您可以使用单个条件或多个条件来过滤记录。

运算符 描述
== field 值等于 value
>= field 值大于或等于 value
<= field 值小于或等于 value
in field 值包含在值列表中
import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

filter_label = rg.Filter(("label", "==", "positive"))

filtered_records = dataset.records(query=rg.Query(filter=filter_label)).to_list(
    flatten=True
)
import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

filters = rg.Filter(
    [
        ("label.suggestion", "==", "positive"),
        ("metadata.count", ">=", 10),
        ("metadata.count", "<=", 20),
        ("label", "in", ["positive", "negative"])
    ]
)

filtered_records = dataset.records(
    query=rg.Query(filter=filters), with_suggestions=True
).to_list(flatten=True)

可用字段

您可以根据以下字段过滤记录

字段 描述 示例
id 记录 id ("id", "in", ["1","2","3"])
_server_id 内部记录 id。此值必须是有效的 UUID ("_server_id", "==", "ba69a996-85c2-4af0-a473-23138929641b")
inserted_at 记录插入的日期和时间。您可以传递 datetime 或字符串 ("inserted_at" ">=", "2024-10-10")
updated_at 记录更新的日期和时间。 ("updated_at" ">=", "2024-10-10")
status 记录状态,可以是 pendingcompleted ("status", "==", "completed")
response.status 响应状态,可以是 draftsubmitteddiscarded ("response.status", "==", "submitted")
metadata.<name> 按元数据属性过滤 ("metadata.split", "==", "train")
<question>.suggestion 按问题建议值过滤 ("label.sugggestion", "==", "positive")
<question>.score 按建议分数过滤 ("label.score", "<=", "0.9")
<question>.agent 按建议代理过滤 ("label.agent", "<=", "ChatGPT4.0")
<question>.response 按问题响应过滤 ("label.response", "==", "negative")

按状态过滤

您可以根据记录或响应状态过滤记录。记录状态可以是 pendingcompleted,响应状态可以是 draftsubmitteddiscarded

import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

status_filter = rg.Query(
    filter=rg.Filter(
        [
            ("status", "==", "completed"),
            ("response.status", "==", "discarded")
        ]
    )
)

filtered_records = dataset.records(status_filter).to_list(flatten=True)

您可以搜索与给定向量相似的记录。您可以使用 Similar 类来定义向量,并将其作为查询参数的一部分传递给 Dataset.records

import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")


similar_filter = rg.Query(
    similar=rg.Similar(
        name="vector", value=[0.1, 0.2, 0.3],
    )
)

filtered_records = dataset.records(similar_filter).to_list(flatten=True)

注意

Similar 搜索需要向量字段定义作为数据集设置的一部分。如果数据集没有向量字段,搜索将返回错误。请访问 向量 部分,了解有关如何定义向量字段的更多详细信息。

查询和过滤数据集

如前所述,您可以使用带有搜索词的查询以及过滤器或各种过滤器来创建复杂的搜索查询。

import argilla as rg

client = rg.Argilla(api_url="<api_url>", api_key="<api_key>")

dataset = client.datasets(name="my_dataset", workspace="my_workspace")

query_filter = rg.Query(
    query="my_term",
    filter=rg.Filter(
        [
            ("label.suggestion", "==", "positive"),
            ("metadata.count", ">=", 10),
        ]
    )
)

queried_filtered_records = dataset.records(
    query=query_filter,
    with_metadata=True,
    with_suggestions=True
).to_list(flatten=True)