🔎 过滤和查询数据集#

反馈数据集#

注意

本节涵盖的数据集类是 FeedbackDataset。这个完全可配置的数据集将取代 Argilla 2.0 中的 DatasetForTextClassificationDatasetForTokenClassificationDatasetForText2Text。不确定使用哪个数据集?请查看我们关于 选择数据集 的章节。

过滤器#

从 Argilla 1.15.0 开始,filter_by 方法已包含在推送到 Argilla 的 FeedbackDataset 中,它允许你根据记录注释的 response_status 过滤数据集中的记录。因此,为了能够使用 filter_by 方法,你需要确保你在 Argilla 中使用 FeedbackDataset

警告

filter_by 方法返回一个新的实例,该实例是一个 FeedbackDataset,其中包含过滤后的记录并与 Argilla 同步,这意味着你将只能访问符合应用过滤器的记录。因此,调用 filter_by 将返回一个包含记录子集的 FeedbackDataset,但记录不会被修改,除非在记录级别专门应用更新或删除。因此,不允许以下方法:deletedelete_recordsadd_recordsrecords.addrecords.delete;虽然你仍然可以执行记录级别的操作,例如 updatedelete

fields 内容#

在 UI 中,你可以使用记录卡顶部的左上角搜索栏,根据字段中的内容过滤记录。例如,你可以通过在搜索栏中简单地输入“John Wick”来阅读或注释所有提及 John Wick 的记录。如果你的记录有多个字段,你将能够选择一个特定字段进行搜索,或者如果你想在所有字段中搜索,则选择“全部”。匹配项以 珊瑚色 显示。

按元数据属性#

在 UI 中,你将找到一个元数据过滤器,可让你轻松设置基于为你的数据集定义的元数据属性的过滤器组合。

注意

请注意,如果将元数据属性设置为 visible_for_annotators=False,则此元数据属性仅在具有 adminowner 角色的用户的元数据过滤器中显示。

在 Python SDK 中,你还可以使用为你的数据集定义的元数据属性的一个或多个元数据过滤器来过滤记录。根据你要过滤的元数据类型,你需要选择以下其中之一:IntegerMetadataFilterFloatMetadataFilterTermsMetadataFilter

以下是你需要为过滤器定义的参数

  • name:你要按其过滤的元数据属性的名称。

  • ge:在 IntegerMetadataFilterFloatMetadataFilter 中,匹配大于或等于提供的值的值。应至少提供 gele 之一。

  • le:在 IntegerMetadataFilterFloatMetadataFilter 中,匹配小于或等于提供的值的值。应至少提供 gele 之一。

  • values:在 TermsMetadataFilter 中,返回至少具有提供的其中一个值的记录。

import argilla as rg

rg.init(api_url="<ARGILLA_API_URL>", api_key="<ARGILLA_API_KEY>")

dataset = rg.FeedbackDataset.from_argilla(name="my-dataset", workspace="my-workspace")

filtered_records = dataset.filter_by(
    metadata_filters=[
        rg.IntegerMetadataFilter(
            name="tokens-length",
            ge=900, # at least one of ge or le should be provided
            le=1000
        ),
        rg.TermsMetadataFilter(
            name="task",
            values=["summarization", "information-extraction"]
        )
    ]
)

按回复#

在 UI 过滤器中,你可以根据 当前用户 给出的回复值过滤记录。

注意

这适用于以下类型问题的回复:LabelQuestionMultiLabelQuestionRatingQuestion

按建议#

在 Argilla UI 中,你可以根据建议过滤记录。当这些建议可用时,可以按建议分数、值和代理进行过滤。

注意

这适用于以下类型问题的建议:LabelQuestionMultiLabelQuestionRatingQuestion

按状态#

在 UI 中,你可以找到一个状态选择器,它允许你根据 当前用户 给出的回复状态选择记录队列。在这里,你可以选择查看具有 PendingDiscardedSubmitted 回复的记录。

在 Python SDK 中,filter_by 方法允许你根据 所有用户 给出的回复的 response_status 过滤数据集中的记录。注释的 response_status 可以是以下之一

  • pending:具有此状态的记录没有回复。在 UI 中,它们将显示在 Pending 队列下。

  • draft:具有此状态的记录具有已保存为草稿但尚未提交或丢弃的回复。在 UI 中,它们将显示在 Draft 队列下。

  • discarded:具有此状态的记录可能具有也可能没有回复,但已被注释者丢弃。在 UI 中,它们将显示在 Discarded 队列下。

  • submitted:具有此状态的记录具有注释者已提交的回复。在 UI 中,它们将显示在 Submitted 队列下。

注意

从 Argilla 1.14.0 开始,调用 from_argilla 将从 Argilla 中拉取 FeedbackDataset,但该实例将是远程的,这意味着记录的添加、更新和删除将在进行时立即推送到 Argilla。这与以前版本的 Argilla 不同,在以前的版本中,你必须再次调用 push_to_argilla 才能将更改推送到 Argilla。

你可以按单个状态或状态列表过滤记录。

例如,要按状态“submitted”过滤记录,你可以执行以下操作

import argilla as rg

rg.init(api_url="<ARGILLA_API_URL>", api_key="<ARGILLA_API_KEY>")

dataset = rg.FeedbackDataset.from_argilla(name="my-dataset", workspace="my-workspace")
filtered_dataset = dataset.filter_by(response_status="submitted")

要按状态列表过滤记录,你可以执行以下操作

import argilla as rg

rg.init(api_url="<ARGILLA_API_URL>", api_key="<ARGILLA_API_KEY>")

dataset = rg.FeedbackDataset.from_argilla(name="my-dataset", workspace="my-workspace")
filtered_dataset = dataset.filter_by(response_status=["submitted", "draft"])

排序#

你还可以根据一个或多个属性对记录进行排序,包括插入和上次更新时间、建议分数、评分问题的回复和建议值以及元数据属性。在 UI 中,你可以使用 Sort 菜单轻松完成此操作。

在 Python SDK 中,你可以使用 sort_by 方法使用以下参数进行排序

  • field:这指的是将用于排序的信息。这可以是记录创建的时间 (created_at)、上次更新的时间 (updated_at) 或为你的数据集配置的任何元数据属性 (metadata.my-metadata-name)。

  • order:顺序应该是升序 (asc) 还是降序 (des)。

sorted_records = remote.sort_by(
    [
        SortBy(field="metadata.my-metadata", order="asc"),
        SortBy(field="updated_at", order="des"),
    ]
)

提示

你还可以组合过滤器和排序:dataset.filter_by(...).sort_by(...)

其他数据集#

注意

本节中涵盖的记录类对应于三个数据集:DatasetForTextClassificationDatasetForTokenClassificationDatasetForText2Text。这些将在 Argilla 2.0 中弃用,并由完全可配置的 FeedbackDataset 类替换。不确定使用哪个数据集?请查看我们关于 选择数据集 的章节。

Argilla 中的搜索由 Elasticsearch 强大的 查询字符串语法 驱动。它允许你执行单词和短语的简单模糊搜索,或充分利用 Argilla 数据模型的复杂查询。

相同的查询可以在 Argilla Web 应用程序的搜索栏中使用,也可以在 Python 客户端中用作可选参数。

import argilla as rg

rg.load("my_dataset", query="text.exact:example")

此外,我们提供了语法的简要摘要,但要获得完整的概述,请深入研究下面的文档。

text 字段使用 Elasticsearch 的 标准分析器,该分析器忽略大小写并删除大多数标点符号;text.exact 字段使用 空格分析器,该分析器区分大小写,并考虑标点符号;

  • text:dog.text:fox:匹配两个记录。

  • text.exact:dogtext.exact:FOX:不匹配任何记录。

  • text.exact:dog.text.exact:fox:仅匹配第一个记录。

  • text.exact:DOGtext.exact:FOX\!:仅匹配第二个记录。

类似的推理适用于 inputs,用于查找 subject 键包含单词 news 的记录,你将搜索

  • inputs.subject:news

同样,与 text 字段一样,你也可以使用空格分析器通过指定 exact 字段来执行更精细的搜索。

  • inputs.subject.exact:NEWS

text2text_record

假设你提供了记录所属的拆分作为元数据,即 metadata={"split": "train"}metadata={"split": "test"}。然后,你可以通过在查询中指定相应的字段来仅搜索你的训练数据

  • metadata.split:train

就像元数据一样,你也可以在查询中使用过滤器字段。以下是一些在查询字符串中模拟过滤器的示例

  • status:Validated

  • annotated_as:HAM

  • predicted_by:Model A

可以为日期、数字或字符串字段指定范围。包含范围用方括号指定,排除范围用大括号指定

  • score:[0.5 TO 0.6]

  • score:{0.9 TO *}

  • event_timestamp:[1984-01-01T01:01:01.000000 TO *]

  • last_updated:{* TO 1984-01-01T01:01:01.000000}

text2text_record

你可以使用熟悉的布尔运算符 ANDORNOT 在搜索中组合任意数量的术语和字段。以下示例展示了这些运算符的强大功能

  • text:(quick AND fox):返回包含单词 quickfox 的记录。AND 运算符是默认运算符,因此 text:(quick fox) 是等效的。

  • text:(quick OR brown):返回包含单词 quickbrown 的记录。

  • text:(quick AND fox AND NOT news):返回包含单词 quickfox 但不包含 news 的记录。

  • metadata.split:train AND text:fox:返回包含单词 fox 并且具有元数据 “split: train” 的记录。

  • NOT _exists_:metadata.split :返回没有元数据 split 的记录。

text2text_record

正则表达式模式可以通过将它们包装在正斜杠“/”中嵌入到查询字符串中

  • text:/joh?n(ath[oa]n)/:匹配 jonathonjonathanjohnathonjohnathan

受支持的正则表达式语法在官方 Elasticsearch 文档 中进行了解释。

text2text_record

你可以使用 模糊 运算符搜索与搜索词相似但不完全相同的术语。这对于涵盖人为拼写错误很有用

  • text:quikc~:匹配 quick 和 quikc。

text2text_record

通配符搜索可以在单个搜索词上运行,使用 ? 替换单个字符,使用 * 替换零个或多个字符

  • text:(qu?ck bro*)

  • text.exact:"Lazy Dog*":例如,匹配 “Lazy Dog”“Lazy Dog.”“Lazy Dogs”

  • inputs.\*:news:在所有输入字段中搜索单词 news

text2text_record

搜索字段#

使用 Elasticsearch 进行搜索时,一个重要的概念是 字段 概念。Argilla 中的每个搜索词都定向到记录底层数据模型的特定字段。例如,在搜索栏中写入 text:fox 将在字段 text 中搜索包含单词 fox 的记录。

如果你在查询字符串中未提供任何字段,则默认情况下 Argilla 将在 text 字段中搜索。有关可用字段及其内容的完整列表,请查看下面的字段词汇表。

注意

在版本 >=0.16.0 中,未在查询字符串中指定任何字段时的默认行为已更改。在此版本之前,Argilla 在已弃用的 wordword.extended 字段的混合中搜索,这些字段允许搜索诸如 !. 之类的特殊字符。如果你现在要搜索特殊字符,则必须指定 text.exact 字段。例如,如果你想搜索末尾带有感叹号的单词,则查询如下:text.exact:*\!

如果在版本更新后未检索到任何结果,则应在旧数据集的搜索查询中使用 wordswords.extended 字段,而不是 texttext.exact 字段。

texttext.exact#

(可以说)最重要的字段是 texttext.exact 字段。它们都包含记录的文本,但以两种不同的形式

  • text 字段使用 Elasticsearch 的 标准分析器,该分析器忽略大小写并删除大多数标点符号;

  • text.exact 字段使用 空格分析器,该分析器区分大小写,并考虑标点符号;

让我们看一些例子。假设我们有 2 条记录,文本如下

  1. The quick brown fox jumped over the lazy dog.

  2. THE LAZY DOG HATED THE QUICK BROWN FOX!

现在考虑以下查询

  • text:dog.text:fox:匹配两个记录。

  • text.exact:dogtext.exact:FOX:不匹配任何记录。

  • text.exact:dog.text.exact:fox:仅匹配第一个记录。

  • text.exact:DOGtext.exact:FOX\!:仅匹配第二个记录。

你可以看到如何使用 text.exact 字段以更精细的方式进行搜索。

TextClassificationRecord 的 inputs#

对于 文本分类记录,你可以在执行搜索时利用多个 inputs。例如,如果我们上传了 inputs={"subject": ..., "body": ...} 的记录,你可以通过在查询中指定 inputs.subjectinputs.body 字段来将搜索定向到这些输入之一。因此,要查找 subject 包含单词 news 的记录,你将搜索

  • inputs.subject:news

同样,与 text 字段一样,你也可以使用空格分析器通过指定 exact 字段来执行更精细的搜索

  • inputs.subject.exact:NEWS

单词和短语#

除了单个单词外,你还可以通过用双引号包围多个单词来搜索 短语。这将搜索短语中的所有单词,并按相同的顺序排列。

如果我们采用上面的两个示例,则以下查询将仅返回第二个示例

  • text:"lazy dog hated"

元数据字段#

在执行搜索时,你还可以使用记录的元数据。假设你提供了记录所属的拆分作为元数据,即 metadata={"split": "train"}metadata={"split": "test"}。然后,你可以通过在查询中指定相应的字段来仅搜索你的训练数据

  • metadata.split:train

元数据被索引为关键字。这意味着你无法在其中搜索单个单词,并且会考虑大小写和标点符号。但是,你可以使用通配符。

警告

默认情况下,元数据字段的最大长度为 128 个字符,字段限制为 50。如果希望更改这些值,可以在服务器环境变量中设置你自己的 ARGILLA_METADATA_FIELD_LENGTH。了解更多 此处 默认情况下,元数据字段的最大长度为 128 个字符,字段限制为 50。如果希望更改这些值,可以在服务器环境变量中设置你自己的 ARGILLA_METADATA_FIELD_LENGTH。了解更多 此处

不可搜索的元数据字段#

如果你只想将元数据与记录一起存储,而不将其用于搜索,则可以通过使用前导下划线定义元数据字段来实现此目的。例如,如果你使用 metadata._my_hidden_field,则该字段将在记录级别可访问,但不会在搜索中使用。

提示

你可以使用此字段通过指向图像的 URL 将图像添加到记录中,如下所示:metadata = {"_image_url": "https://..."}

请注意,URL 不能超过元数据长度限制。

向量字段#

也可以查询向量字段的存在。假设你只想包含具有 vectors={"vector_1": vector_1} 的记录。然后你可以定义查询 vectors.vector_1: *

过滤器作为查询字符串#

就像元数据一样,你也可以在查询中使用过滤器字段。以下是一些在查询字符串中模拟过滤器的示例

  • status:Validated

  • annotated_as:HAM

  • predicted_by:Model A

字段值被视为关键词,也就是说您无法在其中搜索单个词语,并且大小写和标点符号都会被考虑在内。但是,您可以使用通配符。

组合词条和字段#

你可以使用熟悉的布尔运算符 ANDORNOT 在搜索中组合任意数量的术语和字段。以下示例展示了这些运算符的强大功能

  • text:(quick AND fox):返回包含单词 quickfox 的记录。AND 运算符是默认运算符,因此 text:(quick fox) 是等效的。

  • text:(quick OR brown):返回包含单词 quickbrown 的记录。

  • text:(quick AND fox AND NOT news):返回包含单词 quickfox 但不包含 news 的记录。

  • metadata.split:train AND text:fox:返回包含单词 fox 并且元数据为 “split: train” 的记录。

  • NOT _exists_:metadata.split :返回没有元数据 split 的记录。

查询字符串功能#

查询字符串语法具有许多强大的功能,您可以使用它们来创建复杂的搜索。以下只是您可以查阅官方 Elasticsearch 文档 的众多功能中精选的子集。

通配符#

通配符搜索可以在单个搜索词上运行,使用 ? 替换单个字符,使用 * 替换零个或多个字符

  • text:(qu?ck bro*)

  • text.exact:"Lazy Dog*":例如,匹配 “Lazy Dog”“Lazy Dog.”“Lazy Dogs”

  • inputs.\*:news:在所有输入字段中搜索单词 news

正则表达式#

正则表达式模式可以通过将它们包装在正斜杠“/”中嵌入到查询字符串中

  • text:/joh?n(ath[oa]n)/:匹配 jonathonjonathanjohnathonjohnathan

受支持的正则表达式语法在官方 Elasticsearch 文档 中进行了解释。

模糊性#

你可以使用 模糊 运算符搜索与搜索词相似但不完全相同的术语。这对于涵盖人为拼写错误很有用

  • text:quikc~:匹配 quick 和 quikc。

范围#

可以为日期、数字或字符串字段指定范围。包含范围用方括号指定,排除范围用花括号指定

  • score:[0.5 TO 0.6]

  • score:{0.9 TO *}

日期时间范围#

日期时间范围是一种特殊的范围查询,可以为 event_timestamplast_updated 字段定义。格式类似于普通范围查询,但它们需要 iso 格式的日期时间,可以通过 datetime.now().isoformat() 获得,结果为 1984-01-01T01:01:01.000000。请注意,* 可以互换用于表示时间的结束或时间的开始。

  • event_timestamp:[1984-01-01T01:01:01.000000 TO *]

  • last_updated:{* TO 1984-01-01T01:01:01.000000}

转义特殊字符#

查询字符串语法有一些保留字符,如果您想搜索它们,则需要转义。保留字符包括:+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ / 例如,要搜索 “(1+1)=2”,您需要写

  • text:\(1\+1\)\=2

字段词汇表#

这是一个包含可用字段的表格,您可以在查询字符串中使用这些字段

字段名称

描述

TextClass.

TokenClass.

TextGen.

annotated_as

注释

annotated_by

注释代理

event_timestamp

时间戳

id

id

inputs.*

输入

metadata.*

元数据

vectors.*

向量

last_updated

上次更新日期

predicted_as

预测

predicted_by

预测代理

score

预测得分

status

status

text

文本,标准分析器

text.exact

文本,空格分析器

tokens

tokens

-

-

-

-

-

metrics.text_lengt

输入文本长度

metrics.tokens.idx

记录中的 Token 索引

metrics.tokens.value

Token 的文本

metrics.tokens.char_start

Token 的起始字符索引

metrics.tokens.char_end

Token 的结束字符索引

metrics.annotated.mentions.value

提及的文本(注释)

metrics.annotated.mentions.label

提及的标签(注释)

metrics.annotated.mentions.score

提及的得分(注释)

metrics.annotated.mentions.capitalness

提及的首字母大写(注释)

metrics.annotated.mentions.density

局部提及密度(注释)

metrics.annotated.mentions.tokens_length

提及的 token 长度(注释)

metrics.annotated.mentions.chars_length

提及的字符长度(注释)

metrics.annotated.tags.value

Token 的文本(注释)

metrics.annotated.tags.tag

IOB 标签(注释)

metrics.predicted.mentions.value

提及的文本(预测)

metrics.predicted.mentions.label

提及的标签(预测)

metrics.predicted.mentions.score

提及的得分(预测)

metrics.predicted.mentions.capitalness

提及的首字母大写(预测)

metrics.predicted.mentions.density

局部提及密度(预测)

metrics.predicted.mentions.tokens_length

提及的 token 长度(预测)

metrics.predicted.mentions.chars_length

提及的字符长度(预测)

metrics.predicted.tags.value

Token 的文本(预测)

metrics.predicted.tags.tag

IOB 标签(预测)