资讯动态

Argilla FeedbackDataset 回答统一策略实战:用 compute_unified_responses 把多人标注聚合为训练数据

发布时间:2026/9/18 23:37:10 来源:尧图企业网站定制
Argilla FeedbackDataset 回答统一策略实战用 compute_unified_responses 把多人标注聚合为训练数据【免费下载链接】argillaArgilla is a collaboration tool for AI engineers and domain experts to build high-quality datasets项目地址: https://gitcode.com/GitHub_Trending/ar/argilla当你让多名标注员对同一条记录重复作答后FeedbackDataset里的每条记录会挂上多份responses这些数据不能直接喂给训练流程——必须先决定“哪一份答案代表这条记录”。本文基于 Argilla 仓库中的统一策略文档docs/_source/_common/tabs/unfication_strategies.md与其源码实现完整讲解compute_unified_responses的四种题目类型用法、各策略的可选值与判定规则并结合argilla-v1的源码和测试用例说明每种策略在底层究竟如何计算帮助你在标注后处理阶段做出可复制、可验证的聚合方案。为什么需要回答统一UnificationArgilla 支持多条记录分配给多名标注员annotation overlap以便交叉校验标注质量。此时同一条FeedbackRecord会携带多份statussubmitted的responses。仓库文档docs/_source/practical_guides/collect_responses.md在 Unifying Disagreements 一节明确当记录存在多个已提交回答时在用于训练前必须先把回答统一起来。FeedbackDataset为此内置了开箱即用的支持为每种题目类型LabelQuestion、MultiLabelQuestion、RankingQuestion、RatingQuestion、TextQuestion提供对应的*QuestionStrategy通过compute_unified_responses方法一次调用即可把多份回答聚合成unified_responses。需要特别注意从 Argilla 1.21.0 起旧方法unify_responses已被弃用应改用compute_unified_responses见docs/_source/practical_guides/collect_responses.md中的 warning 提示以及argilla-v1/src/argilla_v1/client/feedback/dataset/mixins.py中unify_responses发出的DeprecationWarning。快速上手四种题目类型的统一调用以下示例继承自原始文档docs/_source/_common/tabs/unfication_strategies.md均使用 Hugging Face 上的演示数据集argilla/stackoverflow_feedback_demo可直接复制运行。LabelQuestion单选标签题from argilla import LabelQuestionStrategy, FeedbackDataset dataset FeedbackDataset.from_huggingface( repo_idargilla/stackoverflow_feedback_demo ) strategy LabelQuestionStrategy(majority) # disagreement, majority_weighted (WIP) dataset.compute_unified_responses( questiondataset.question_by_name(title_question_fit), strategystrategy, ) dataset.records[0].unified_responses单选标签题的典型场景是标题与问题是否匹配这类二选一问题majority策略会取出现次数最多的标签作为该记录的唯一答案。MultiLabelQuestion多选标签题from argilla import MultiLabelQuestionStrategy, FeedbackDataset dataset FeedbackDataset.from_huggingface( repo_idargilla/stackoverflow_feedback_demo ) strategy MultiLabelQuestionStrategy(majority) # disagreement, majority_weighted (WIP) dataset.compute_unified_responses( questiondataset.question_by_name(tags), strategystrategy, ) dataset.records[0].unified_responses与单选题不同多选题的标签之间互相独立因此多数表决需要按标签逐个计算对每个标签单独检查是否有超过半数的标注员选中了它详见下文源码分析。RankingQuestion排序题from argilla import RankingQuestionStrategy, FeedbackDataset dataset FeedbackDataset.from_huggingface( repo_idargilla/stackoverflow_feedback_demo ) strategy RankingQuestionStrategy(majority) # mean, max, min dataset.compute_unified_responses( questiondataset.question_by_name(relevance_ranking), strategystrategy, ) dataset.records[0].unified_responsesRatingQuestion评分题from argilla import RatingQuestionStrategy, FeedbackDataset dataset FeedbackDataset.from_huggingface( repo_idargilla/stackoverflow_feedback_demo ) strategy RatingQuestionStrategy(majority) # mean, max, min dataset.compute_unified_responses( questiondataset.question_by_name(answer_quality), strategystrategy, ) dataset.records[0].unified_responses原始文档还有一条提示question和strategy也可以直接以字符串形式传入。这在argilla-v1/src/argilla_v1/client/feedback/dataset/mixins.py的UnificationMixin.compute_unified_responses约 L127-L166中可以得到印证若question是字符串会通过self.question_by_name(question)解析为对应的题目对象若strategy是字符串则根据题目类型自动实例化为对应的策略枚举若strategy为空默认回退为majority。各策略的可选值与判定规则策略全部定义在argilla-v1/src/argilla_v1/client/feedback/unification.py中都是枚举类Enum可选值如下表策略类适用题目可选值未实现/说明LabelQuestionStrategyLabelQuestionmajority、disagreement、majority_weightedmajority_weighted当前抛NotImplementedError属 WIPMultiLabelQuestionStrategyMultiLabelQuestionmajority、disagreement、majority_weightedmajority_weighted同上WIPRatingQuestionStrategyRatingQuestionmean、majority、max、min四种均已实现RankingQuestionStrategyRankingQuestionmajority、mean、max、min四种均已实现TextQuestionStrategyTextQuestiondisagreement文本题只保留原始分歧不做数值聚合文档docs/_source/practical_guides/collect_responses.md的 Strategies 小节对这些策略给出了选择建议标签类单/多选多数表决至少 3 份已提交回答平票时随机选一个加权多数表决为标注员打 0~1 分后加权求和适合专家标注员训练时保留分歧适合情感分析等主观任务避免稀释少数意见。数值类排序/评分多数表决、加权多数、均值mean、最低/最高分min/max视题目措辞而定。文本题由于文本天然是唯一且主观的官方不建议直接度量分歧推荐的做法包括让团队对文本二次评分/排序、按标注员可信度筛选、或其他问题的答案作为质量信号disagreement策略本质上就是保留每个人的回答。源码级解析每种策略到底怎么算以下分析基于argilla-v1/src/argilla_v1/client/feedback/unification.py的实际实现。通用规则所有策略的计算前都会先过滤出status submitted的回答——被丢弃discarded的回答不参与聚合。计算结果写入FeedbackRecord._unified_responses私有属性声明见argilla-v1/src/argilla_v1/client/feedback/schemas/records.py约 L88通过只读属性record.unified_responses对外暴露约 L100-L103。每条聚合结果都是一个UnifiedValueSchema(value..., strategy...)即统一值 产生它的策略名成对记录方便后续追溯。LabelQuestionStrategyCounter 计数 随机平票_majority约 L472-L508用collections.Counter统计所有已提交回答的标签取值取计数最大者若多个标签并列最多则用random.choice随机选一个。这与文档描述平票时随机打破一致。_disagreementLabelQuestionStrategyMixin中约 L422-L452不做任何折叠把每个已提交回答的原值逐一追加进_unified_responses[question]即一条记录最终保留 N 个统一值。MultiLabelQuestionStrategy逐标签过半数判定多选题的_majority约 L527-L566逻辑明显不同先对所有回答中出现过的每个标签分别计数再计算阈值majority int(len(responses) // 2) 1只有计数达到该阈值的标签才进入最终标签集合——也就是文档所说的对每个标签单独检查是否有多数标注员选中。若没有任何标签过半测试用例test_multi_label_question_strategy_without_overlap即此场景则从候选标签中随机取一个作为兜底这一点在 测试文件 中得到了验证。RatingQuestionStrategymean/majority/max/min评分题的_aggregate约 L106-L145把每个已提交回答的评分转为int后求和/求最值注意mean分支实现为str(int(sum(ratings) / len(ratings)))即均值会直接截断为整数而非四舍五入且统一值以字符串形式存储例如2。_majority约 L147-L169则直接对原始字符串取值做 Counter 统计同样有随机平票逻辑。RankingQuestionStrategy三种不同的聚合语义排序题的实现约 L204-L375是四种策略中最复杂的mean_mean约 L277-L324对每个选项累计所有回答中它被排到第几名的总和与出现次数算出平均名次round四舍五入再按平均名次升序重建最终排序列表max/min_aggregate中经 pandas 处理约 L239-L275把所有已提交回答中每个选项的名次放进 DataFramemax取最大名次对应的那一整份排序min取最小名次对应的那一整份——语义上等价于采用最悲观/最乐观的那一位标注员的完整排序majority_majority约 L326-L375把每份回答的(rank, value)完整顺序打包成元组后做 Counter 计数即只有当整份排序完全一致时才视为相同回答取出现次数最多的那份排序平票时随机。这种整序投票的语义值得注意两名标注员即使前两名相同、仅后两名互换也会被计为两份不同回答。结果结构与测试佐证聚合结果的期望形态可以直接从集成测试 test_unification.py 中读出例如评分题mean[{value: str(int(5/3)), strategy: mean}]验证了整除截断行为排序题mean[{value: [{rank: 2, value: yes}, {rank: 2, value: no}], strategy: mean}]验证了按平均名次重建排序标签题disagreement保留[{value: 1, ...}, {value: 2, ...}, {value: 2, ...}]三份原值验证了不折叠语义majority_weighted调用_majority_weighted会抛出NotImplementedError测试test_label_question_strategy_not_implemented确认其仍为 WIP 状态。与指标计算的联动统一回答不仅是训练前的清洗步骤也是指标计算的输入。FeedbackDataset的compute_model_metricsargilla-v1/src/argilla_v1/client/feedback/dataset/mixins.py中MetricsMixin约 L43-L82支持传入strategy参数一旦提供策略会先调用compute_unified_responses(question_name, strategy)再走UnifiedModelMetric计算模型建议 vs 统一后标注的整体指标而不是按单个标注员分别计算不提供策略时则返回按user_id分组的ModelMetric结果。对应的指标支持矩阵来自docs/_source/practical_guides/collect_responses.md统一回答路径支持LabelQuestion、MultiLabelQuestion、RatingQuestion的 accuracy/precision/recall/f1-score/confusion-matrix 等以及RankingQuestion的 ndcg-scoreTextQuestion不参与统一路径。此外get_unified_responses_and_suggestionsargilla-v1/src/argilla_v1/client/feedback/metrics/utils.py约 L119 起会在读取record.unified_responses为空时抛出提示——Please unify the responses first这也是一个实用的自检信号。实操注意事项小结只统计submitted回答所有策略底层都会过滤非 submitted 状态的回答无需手动处理但做手工分析画图时记得自行过滤文档中也以 note 强调了这一点。字符串与枚举等价compute_unified_responses的question、strategy两个参数既可传对象/枚举也可传字符串混用不会出错strategy缺省为majority。majority_weighted尚未落地文档注释里已标注 WIP当前调用会直接抛NotImplementedError需要加权表决时应自行实现标注员打分 × 回答的加权逻辑。随机平票意味着结果不可完全复现标签/评分/排序的 majority 平票分支都使用random.choice同一数据集多次运行可能得到不同但同样合理的统一结果如需严格复现建议固定随机种子或改用mean/max/min等确定性策略。统一结果是本地内存态_unified_responses是FeedbackRecord的私有属性统一后的数据若要落盘应使用文档 Export a Feedback Datasetdocs/_source/practical_guides/export_dataset.md所述的导出方式保存供后续微调流程使用。参考资料仓库内路径统一策略示例文档unfication_strategies.md回答收集与统一指南collect_responses.md策略实现源码unification.py数据集侧方法入口dataset/mixins.py记录数据结构schemas/records.py集成测试用例test_unification.py【免费下载链接】argillaArgilla is a collaboration tool for AI engineers and domain experts to build high-quality datasets项目地址: https://gitcode.com/GitHub_Trending/ar/argilla创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价