ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Data-Juicer in_context_influence_filter 算子实战:基于上下文影响的验证集数据筛选

Data-Juicer in_context_influence_filter 算子实战:基于上下文影响的验证集数据筛选 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载导读in_context_influence_filter是 Data-Juicer 中一个基于 LLM 的 filter 算子用于评估每条文本样本作为上下文in-context时对验证集困惑度的影响并据此保留对验证集有正面帮助的样本。它的核心思想是如果一个样本被拼接到验证样本的 prompt 之前时能显著降低验证样本的损失困惑度说明它提供了有价值的上下文信息应当保留反之则应被过滤。本文将以 in_context_influence_filter 算子文档 为主体结合 算子源码、父类 llm_perplexity_filter.py、基础 Filter 框架 以及 config_all.yaml 中的完整配置示例深入讲解该算子的原理、参数、使用方式与源码实现帮助你在数据处理流水线中正确接入这一算子。算子概览与定位在 Data-Juicer 的算子体系中in_context_influence_filter属于filter过滤器类型注册名为in_context_influence_filter标签为gpu、hf即需要 GPU 与 Hugging Face 模型推理。在 config_all.yaml 中它的注册注释为filter to keep texts whose in-context influence upon validation set within a specific range.即保留对验证集上下文影响落在指定范围内的文本。它被同时注册到OPERATORS与ATTRIBUTION_FILTERS两个模块见 in_context_influence_filter.py其中ATTRIBUTION_FILTERS用于在流水线中将过滤结果归因到具体样本配合 tracer/归因分析使用。该算子与llm_perplexity_filter关系紧密它直接继承自 LLMPerplexityFilter复用父类的模型加载、_loss损失计算与sample_with_messages消息构造能力自身则实现带/不带候选样本作为上下文时的损失对比这一核心逻辑。注源码 in_context_influence_filter.py 中注明该算子目前仍处于研发与评估阶段currently under development and evaluation as part of an ongoing research projectData-Juicer 团队保留对该算子的完整版权。在生产流水线中使用时建议先行充分验证。核心原理什么是上下文影响该算子的目标是回答一个数据质量问题把某条样本当作 few-shot 示例demo塞进 prompt 后模型在验证集上的表现是变好还是变差实现上以损失/困惑度作为可计算代理指标其公式如下见 in_context_influence_filter.py当valid_as_demoTrue时把验证样本当作 demo 拼到候选样本之前分数为score L(A|Q) / L(A|task_desc, Q_v, A_v, Q)当valid_as_demoFalse时把候选样本当作 demo 拼到验证样本之前分数为score L(A_v|Q_v) / L(A_v|task_desc, Q, A, Q_v)其中Q/A表示候选样本的 query/answerQ_v/A_v表示验证样本的 query/answerL(...)表示模型在该序列上的损失。核心直觉分子是没有上下文辅助时的基准损失分母是加入上下文后的损失若分母显著小于分子说明加入该上下文降低了损失即提升了模型对该验证样本的预测能力影响分数大于 1该样本是有益的若加入上下文反而使损失升高影响分数小于 1该样本可能是干扰信息。在源码实现中compute_stats_singlein_context_influence_filter.py会遍历验证集中的每个样本为候选样本计算一组分数然后取所有分数的算术平均作为该样本最终的in_context_influence分数# TODO: aggregation strategies in_context_influence sum(scores) / len(scores) sample[Fields.stats][StatsKeys.in_context_influence] in_context_influence从代码结构看目前仅实现了平均聚合策略源码中保留了TODO: aggregation strategies注释in_context_influence_filter.py后续可能扩展其他聚合方式。平均后的分数写入样本统计字段in_context_influence该字段在 constant.py 中定义为StatsKeys.in_context_influence in_context_influence。与 LLM 困惑度计算的衔接分数的计算完全建立在父类 LLMPerplexityFilter._loss 之上。_loss的核心流程通过prepare_model(model_typehuggingface, pretrained_model_name_or_pathhf_model, **model_params)加载 Hugging Face 模型与 tokenizer并缓存到self.model_key用get_model(self.model_key, rank, self.use_cuda())获取指定 rankGPU 卡号上的模型tokenizer.padding_side/truncation_side均设为left保证长序列从左侧截断将pre_msgs前置上下文与example[messages]拼接把所有 message 的content用空格连接为full_text取最后一条 message 作为response_text对其 token 数计算response_len构造 labels将非 response 部分的 token 置为-100不参与 loss 计算仅对 response 部分计算损失返回.loss.item()。因此该算子度量的是给定 query 的上下文后模型预测 answer 的损失即严格的生成任务损失而非整个序列的自回归困惑度。参数配置详解下表完整列出算子文档中的参数in_context_influence_filter.md并补充说明各参数在源码中的实际作用name 参数名type 类型default 默认值desc 说明valid_datasettyping.Optional[typing.List[typing.Dict]]None用于验证的数据集。若为 None则必须在应用过滤前手动调用prepare_valid_feature方法准备验证特征。task_descclass strNone验证任务的描述作为 system prompt 注入每条消息。valid_as_democlass boolFalse若为 True分数 L(A|Q) / L(A|task_desc, Q_v, A_v, Q)若为 False分数 L(A_v|Q) / L(A_v|task_desc, Q, A, Q_v)。n_shottyping.Optional[int]None验证时使用的 shot 数量。args透传给父类 LLMPerplexityFilter 的额外位置参数。kwargs透传给父类的额外关键字参数如hf_model、min_score、max_score、query_template、response_template、model_params等。关键参数语义valid_dataset/task_desc/n_shot这三个参数共同决定验证集特征的构建。在init中若valid_dataset不为 None则立即调用prepare_valid_feature(Dataset.from_list(valid_dataset), task_desc, n_shot)否则打印 warning要求用户后续手动调用prepare_valid_feature。n_shot的语义是最多取验证集前 n_shot 条作为验证样本——在 prepare_valid_feature 中n_shot n_shot or len(dataset)即不传则默认用整个验证集。valid_as_demo决定谁作为 demo、谁作为被评估对象。True 表示把验证样本当作 few-shot demo 去评估候选样本的生成损失False 表示把候选样本当作 demo 去评估验证样本的生成损失。两者的评估视角互补前者衡量候选样本是否从验证样本中受益后者衡量候选样本能否帮助模型回答验证样本。task_desc作为 system prompt 注入。在 sample_with_messages 中若system_prompt非 None消息列表会变成[{role: system, content: task_desc}, user_msg, assistant_msg]。继承自父类的过滤参数通过kwargs传入hf_model默认Qwen/Qwen2.5-0.5B、model_params、min_score默认 1.0、max_score默认 100.0、query_template、response_template。这些参数与llm_perplexity_filter完全一致语义见 LLMPerplexityFilter.init。验证集准备prepare_valid_feature当初始化时未提供valid_dataset或需要动态更换验证集时必须在使用算子前手动调用prepare_valid_feature。其流程in_context_influence_filter.pydef prepare_valid_feature(self, datasetNone, task_descNone, n_shotNone, *args, **kwargs): n_shot n_shot or len(dataset) self.valid_feature[valid_samples] [] self.valid_feature[valid_losses] [] for i, sample in enumerate(dataset): if i n_shot: break sample_w_msgs self.sample_with_messages(sample, system_prompttask_desc) self.valid_feature[valid_samples].append(sample_w_msgs) loss self._loss(sample_w_msgs) self.valid_feature[valid_losses].append(loss)该方法做两件事遍历验证集最多n_shot条通过sample_with_messages(sample, system_prompttask_desc)将每条验证样本转换为带 system prompt 的对话消息格式存入valid_samples用_loss预先计算每条验证样本的基准损失存入valid_losses。这些基准损失在valid_as_demoFalse分支中被直接复用为分子loss_wo_demo避免重复推理。准备完成后valid_feature中同时存在valid_samples与valid_losses此时valid_feature_ready属性返回 Truein_context_influence_filter.py。在compute_stats_single开头算子会检查该属性assert self.valid_feature_ready, Validation feature not ready yet. Call prepare_valid_feature first.若未准备验证集就执行统计计算会直接抛出断言错误。影响分数的两种计算分支在 compute_stats_single 中根据valid_as_demo走两条路径分支一valid_as_demoTrue——评估候选样本在验证样本作为 demo 时的表现loss_wo_demo self._loss(sample_w_msgs, rankrank) for valid_sample in self.valid_feature[valid_samples]: loss_w_demo self._loss(sample_w_msgs, pre_examplevalid_sample, rankrank) scores.append(loss_wo_demo / loss_w_demo)对每个验证样本将验证样本消息作为pre_example拼在候选样本消息之前计算带 demo 的损失与不带 demo 的基准损失求比值。分支二valid_as_demoFalse——评估候选样本作为 demo 时对验证样本的影响for valid_sample, loss_wo_demo in zip( self.valid_feature[valid_samples], self.valid_feature[valid_losses] ): loss_w_demo self._loss(valid_sample, pre_examplesample_w_msgs, rankrank) scores.append(loss_wo_demo / loss_w_demo)复用prepare_valid_feature预计算的基准损失仅需额外计算候选样本作为 pre_example 时的带 demo 损失推理开销更小。两种分支最终都对分数列表取平均并写入sample[Fields.stats][in_context_influence]。过滤判定逻辑与所有 Data-Juicer filter 一样该算子遵循先 compute_stats 后 process的两阶段执行模型见 Filter.run先通过dataset.map(self.compute_stats, ...)为每个样本计算统计量再通过dataset.filter(self.process, ...)决定保留与否。process_singlein_context_influence_filter.py实现非常简单def process_single(self, sample): score sample[Fields.stats][StatsKeys.in_context_influence] if score is None: return True return self.get_keep_boolean(score, self.min_score, self.max_score)即读取in_context_influence分数调用父类 get_keep_boolean 判断分数是否落在[min_score, max_score]区间内若分数为 None统计计算失败/未完成则默认保留。get_keep_boolean还支持三个父类级的区间控制参数min_closed_interval默认 True最小值是否为闭区间vsmax_closed_interval默认 True最大值是否为闭区间vsreversed_range默认 False为 True 时取反保留区间之外的样本。完整配置示例在 config_all.yaml 中给出了该算子的完整默认配置- in_context_influence_filter: # filter to keep texts whose in-context influence upon validation set within a specific range. hf_model: Qwen/Qwen2.5-0.5B # Huggingface embedding model name. model_params: null # Parameters for initializing the API model. min_score: 1.0 # Minimum perplexity score. max_score: 100.0 # Maximum perplexity score. query_template: null # Template for building the query string. response_template: mull # Template for building the response string. valid_dataset: null # The dataset to use for validation task_desc: null # The description of the validation task. valid_as_demo: True # If true, score L(A|Q) / L(A|task_desc, Q_v, A_v, Q); If false, score L(A_v|Q) L(A_v|task_desc, Q, A, Q_v) . n_shot: null # The number of shots in validation.一个可直接落地的 YAML 示例在 pipeline 中与其他算子并列使用process: - in_context_influence_filter: hf_model: Qwen/Qwen2.5-0.5B # 也可换成任意 Hugging Face 因果语言模型 model_params: max_length: 2048 # 通过 model_params 传入 max_length控制截断长度 min_score: 1.0 # 影响分数下限闭区间 max_score: 100.0 # 影响分数上限闭区间 query_template: {text} # query 模板用样本字段格式化 response_template: {answer} # response 模板用样本字段格式化 valid_dataset: null # 若为 null则需在代码中手动 prepare_valid_feature task_desc: Answer the question based on the given context. # 作为 system prompt valid_as_demo: False # False评估候选样本作为 demo 时对验证集的影响 n_shot: 5 # 最多使用验证集前 5 条要点说明query_template/response_template支持用样本字段做str.format占位符。若样本本身已含messages字段sample_with_messages会直接返回原样本llm_perplexity_filter.py。若valid_dataset为 null则需要在调用流水线前于代码中手动执行from data_juicer.ops.filter.in_context_influence_filter import InContextInfluenceFilter op InContextInfluenceFilter( hf_modelQwen/Qwen2.5-0.5B, min_score1.0, max_score100.0, query_template{text}, response_template{answer}, valid_as_demoFalse, ) op.prepare_valid_feature(valid_dataset_list_or_dataset, task_descNone, n_shotNone)单元测试与运行前提仓库提供了对应的单元测试 test_in_context_influence_filter.py其中InContextInfluenceFilterTest使用 Hugging Face 模型Qwen/Qwen2.5-0.5B也支持替换为本地路径见测试中注释掉的行# _hf_model /your/local/path/to/Qwen2.5-0.5B。测试样例模拟了一个 QA 数据集两条候选样本What is the capital of France? / Explain gravity.与一条验证样本法国首都问题构造InContextInfluenceFiltermin_score1.0, max_score100.0, valid_as_demoFalse手动调用prepare_valid_feature(valid_dataset)后期望结果保留法国首都这条样本、过滤掉 Explain gravity 这条。测试流程完整复现了该算子的标准用法op InContextInfluenceFilter( hf_modelself._hf_model, min_score1.0, max_score100.0, query_template{text}, response_template{answer}, valid_as_demoFalse, ) op.prepare_valid_feature(valid_dataset) # dataset 需先补 stats 列再 map(op.compute_stats) 后 filter(op.process)运行前提与限制GPU 必需算子_accelerator cudain_context_influence_filter.py与父类一致模型推理依赖 CUDAuse_cuda()返回 False 时无法正常执行base_op.py。Hugging Face 模型下载需要可访问 HF Hub或预先将模型下载到本地路径获取hf_model对应的模型与 tokenizer。模型按 rank 分片加载多卡场景下_loss(..., rankrank)中的rank由Filter.run中with_rankself.use_cuda()传入base_op.py确保每个进程/卡使用对应的模型实例。推理开销大每个候选样本需对验证集每条样本各做一次前向推理valid_as_demoFalse分支可复用预计算的基准损失整体代价与验证集大小 × 候选样本数成正比建议控制n_shot与验证集规模。与其他算子的关系与适用场景该算子与 llm_perplexity_filter 共享相同的模型加载、损失计算与过滤区间机制区别仅在于统计量前者是样本自身的困惑度后者是样本作为上下文时对验证集的影响分数。若你的目标是对齐验证集分布、挑选对下游任务最有信息量的 few-shot 示例或训练样本in_context_influence_filter更为贴切若仅需衡量样本自身语言流畅度则应使用llm_perplexity_filter。从源码结构可以推断该算子适合用于数据混合data mixture或指令数据精选场景——通过一个小型验证集评估候选指令样本作为 in-context demo 时的贡献度再结合min_score/max_score区间筛选出正向影响的数据。目前算子仍标注为研发评估阶段聚合策略仅支持平均实际落地时建议先在小规模验证集上评估分数分布再确定过滤阈值。小结in_context_influence_filter通过有无上下文时验证集损失之比量化单条样本的上下文影响分数写入样本 stats 的in_context_influence字段valid_as_demo决定评估方向True 评估候选样本受益于验证样本False 评估候选样本帮助验证样本验证集可在初始化时通过valid_dataset提供也可在初始化后手动调用prepare_valid_feature准备内部预计算验证样本基准损失并缓存过滤判定复用父类get_keep_boolean支持min_score/max_score闭开区间与reversed_range取反完整可运行的配置与测试分别见 config_all.yaml 与 test_in_context_influence_filter.py。如需在流水线中使用可直接参照 Operators 算子总览 中 filter 类算子的通用接入方式将上述 YAML 片段并入process列表即可。赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Celery 异常序列化工具链深度解析celery.utils.serialization 模块源码与实战Celery 异常序列化工具链深度解析celery.utils.serialization 模块源码与实战 Celery 作为分布式任务队列必须把任务执行中人工智能大模型数据工程数据清洗数据增强数据质检data-juicer 算子实战LLMAnalysisFilterllm_analysis_filter用大模型多维评分与筛选训练数据data juicer 算子实战LLMAnalysisFilterllm_analysis_filter用大模型多维评分与筛选训练数据 LLMAnalys人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 视频帧-文本相似度过滤算子 video_frames_text_similarity_filter 完整指南CLIP 驱动的多模态数据筛选实战Data Juicer 视频帧 文本相似度过滤算子 video_frames_text_similarity_filter 完整指南CLIP 驱动的多模态数据人工智能大模型数据工程数据清洗数据增强数据质检上一篇VisualCppRedist AIO 完整使用指南免费一键修复Visual C运行库缺失问题下一篇VisualCppRedist AIO 一键安装告别 DLL 缺失3 分钟完成运行库修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表