news 2026/10/6 7:27:32

Data-Juicer 智能体轨迹连贯性评估:agent_trace_coherence_mapper 算子深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Data-Juicer 智能体轨迹连贯性评估:agent_trace_coherence_mapper 算子深度解析
  • 人工智能
  • 大模型
  • 数据工程
  • 数据清洗
  • 数据增强
  • 数据质检

【免费下载链接】data-juicer

Data processing for and with foundation models! 🍎 🍋 🌽 ➡️ ➡️🍸 🍹 🍷

项目地址:https://gitcode.com/gh_mirrors/da/data-juicer
点击查看免费下载

本文基于仓库文档 agent_trace_coherence_mapper 算子说明,并结合其源码实现、单元测试与真实配置示例,系统讲解 Data-Juicer 中该 LLM 评估算子的定位、参数、工作原理与实战用法。

agent_trace_coherence_mapper是 Data-Juicer 中面向Agent 交互日志的 LLM 评估类 mapper 算子,用于对展平后的会话轨迹text进行1–5 分的连贯性打分(聚焦目标、少有偏题),并将score、reason、eval_kind写入样本的meta字段。它通常与agent_dialog_normalize_mapper等算子搭配,构成 Agent 数据质检流水线中“轨迹质量”维度的关键一环。读完本文,你将掌握该算子的全部参数语义、底层评分流程、输出元数据格式,以及如何在真实配置中启用并验证它。

算子定位:评估什么、在什么场景使用

依据文档与源码 agent_trace_coherence_mapper.py,该算子属于mapper类型,标签为cpu, api, text——即纯 CPU 推理编排、依赖外部 LLM API、作用于文本字段。

其核心职责是:

Coherence of the flattened sessiontext(goal focus, few detours). 展平后的会话text的连贯性(聚焦目标,少有偏题)。

也就是说,它评判的是一整段 Agent 会话轨迹(而非单轮对话)是否始终围绕用户目标推进:目标是否清晰、是否频繁绕路/偏题、是否在合理推进子目标。其设计灵感来自 OpenJudge 的 trajectory 风格评测(源码 docstring 中注明了参考TrajectoryAccuracyGrader,但 Data-Juicer 统一采用 1–5 分制,并对摘录长度做了封顶截断)。

典型应用场景:

  • Agent 数据质量筛选:在 Agent 交互日志数据集中,把轨迹连贯性作为质量轴,配合阈值过滤低质量样本;
  • Bad-case 归因分析:将分数写入meta后,可与 demos/agent 中的 bad-case 报告、洞察分析流程联动,定位“偏题/兜圈子”类问题;
  • 数据洞察与可视化:与其他dialog_*评分轴一同构成 Agent 交互质量的量化画像。

输入与输出约定

输入字段

算子默认读取样本的text字段(由text_key指定),该字段应为已展平的会话轨迹文本。最直接的来源是前置算子agent_dialog_normalize_mapper(见 agent_dialog_normalize_mapper.py),它会把原始messages/choices结构归一化为text、dialog_history、query、response四个字段,其中text即“用户/助手交替的扁平化会话文本”,可能包含工具调用摘要与工具结果。

输出:写入 meta 的评分对象

算子为每个样本执行一次 LLM API 调用,然后把结果写入meta[MetaKeys.agent_trace_coherence],即meta["agent_trace_coherence"](键名定义见 constant.py)。写入对象包含:

字段说明
score1–5 的浮点分数(越高效用越好)
reason简短理由(默认英文,可通过preferred_output_lang切换为简体中文,最长 2000 字符)
eval_kind固定为"agent_trace",标识该评分属于轨迹评估轴

特殊情况下还会写入:

  • 输入为空文本:{"skipped": True, "reason": "empty_input"}
  • LLM 连续多次返回空响应:{"error": "empty_llm_response"}
  • 无法解析出合法 JSON:{"error": "json_parse_failed", "raw": raw[:8000]}

(以上逻辑见基类 dialog_quality_llm_base.py 的process_single。)

参数配置详解

原文档列出的全部参数如下表,下面结合源码逐一说明语义与注意事项(基类实现见 dialog_quality_llm_base.py):

name 参数名type 类型default 默认值desc 说明
api_modelstr'qwen-turbo'调用的 LLM 模型名,通过prepare_model(model_type="api", ...)注册 API 模型
api_endpointOptional[str]None自定义 API endpoint;为空时使用api_model对应的默认服务地址
response_pathOptional[str]None从 API 返回结构中提取文本的路径(适配不同厂商的响应格式)
history_keystr'dialog_history'对话历史字段名(本算子为轨迹评估,该字段主要用于与同类算子保持一致的接口约定)
query_keystr'query'最后一轮用户消息字段名
response_keystr'response'最后一轮助手回复字段名
text_keystr'text'本算子实际打分的展平会话字段名
max_roundNonNegativeInt8参与评估的最大对话轮数(供轮级评估用,本算子主要受trajectory_text_max_chars约束)
max_query_chars_for_promptNonNegativeInt6000单条用户消息进 prompt 的最大字符数
max_response_chars_for_promptNonNegativeInt8000单条助手回复进 prompt 的最大字符数
trajectory_text_max_charsNonNegativeInt12000轨迹文本进 prompt 的最大字符数,超过则截断,是控制该算子 token 开销的核心参数
tool_types_keystr'agent_tool_types'工具类型列表在 meta 中的键名(工具相关性评估用)
primary_tool_keystr'primary_tool_type'主要工具类型在 meta 中的键名(工具相关性评估用)
try_numPositiveInt2API 调用的最大尝试次数;某次返回空串即重试
overwriteboolFalse为True时即使meta中已有该键也重新评估;默认保留已有结果
model_paramsOptional[Dict]None传给prepare_model的额外模型参数(如密钥配置、额外 header 等)
sampling_paramsOptional[Dict]None采样参数;未指定时默认{"max_tokens": 384, "temperature": 0.2},也可显式覆盖
preferred_output_langstr'en'reason输出语言:'en'输出英文,'zh'(或'zh-CN'等 zh 前缀)输出简体中文;JSON 键名始终为英文
kwargs``透传给基类 Mapper 的其它关键字参数

要点解读:

  • trajectory_text_max_chars是成本与质量的平衡点:轨迹越长信息越全,但 token 开销越大。真实配置中常下调,例如 agent_interaction_quality_analysis.yaml 中设置为10000。
  • sampling_params默认低温度:基类会setdefault("max_tokens", 384)与setdefault("temperature", 0.2),保证评分输出的稳定性;配置示例中也常显式给出{ max_tokens: 320, temperature: 0.15 }。
  • overwrite用于重复实验:流水线断点续跑时,若某样本meta已含agent_trace_coherence,默认直接跳过,避免重复烧钱;需要强制重评时置True。
  • 语言参数只影响自由文本:由 agent_output_locale.py 可知,无论preferred_output_lang取值如何,要求 LLM 输出的 JSON键名(score/reason)始终保持英文以利于解析,仅reason的书写语言随设置切换。

工作原理:评分标准与提示词构造

1–5 分评分标准(系统提示词)

源码中_system_prompt()(agent_trace_coherence_mapper.py)定义了如下评分标准,直接透传给 LLM:

  • 5 分:轨迹紧密贴合、清晰服务于用户目标;
  • 3 分:完成了任务,但存在冗余或轻微偏离;
  • 1 分:严重偏题、原地打转,或未能推进合理的子目标;
  • 截断补偿规则:如果摘录看起来被截断或不完整,默认给出4–5 分(除非看到明确的不连贯证据),并在reason中说明;不能仅因为信息缺失就给 3 分。

这条“截断补偿”规则是该算子的关键设计:由于输入是有限长度摘录,LLM 不应因“看不到后续内容”而误判为低质量。

用户内容构造

_build_user_content()调用工具函数build_agent_trace_eval_user_content(见 dialog_quality_llm_utils.py):

  1. 读取sample[text_key],若非字符串或空白则返回空串(触发skipped分支);
  2. 超过max_chars(即trajectory_text_max_chars)时调用clip_text_for_dialog_prompt做截断,并标注"text truncated";
  3. 最终 prompt 用户块格式为:
### Session trace excerpt (may include tool output) <截断后的会话轨迹文本>

完整调用链

基类process_single(dialog_quality_llm_base.py)的执行流程:

  1. 若not overwrite且meta已有目标键 → 直接返回样本;
  2. 构造用户块;为空则写skipped;
  3. 拼接系统提示词 =_system_prompt()+ JSON 输出指令(dialog_score_json_instruction)+ 语言约束子句(rubric_reason_language_clause);
  4. 通过get_model(self.model_key, rank=rank)拿到客户端,最多尝试try_num次调用;
  5. extract_json_object从回复中提取{...}并json.loads(兼容 ```json 代码围栏,见 dialog_quality_llm_utils.py);
  6. normalize_score_1_5将分数强制钳位到[1.0, 5.0]、reason截断到 2000 字符,并写入eval_kind = "agent_trace";
  7. 写回meta[agent_trace_coherence]。

值得注意:该算子被同时注册到TAGGING_OPS与OPERATORS两个注册表(装饰器@TAGGING_OPS.register_module(OP_NAME)、@OPERATORS.register_module(OP_NAME)),因此既可当作普通 mapper 执行,也可参与 tagging 类流程。

在真实流水线中的用法与配置示例

最小可运行链路

Agent 轨迹评估通常的链路是:agent_dialog_normalize_mapper(把原始 messages 展平成text)→agent_trace_coherence_mapper(评分)。参考 minimal_configs/06_one_dialog_mapper.yaml 的 normalize 写法:

project_name: agent-minimal-06 dataset_path: demos/local/demo-agent-data-content.jsonl np: 2 export_path: ./outputs/agent_minimal/06_one_dialog_mapper.jsonl text_keys: "id" process: - agent_dialog_normalize_mapper: messages_key: "messages" choices_key: "response_choices" text_key: "text" history_key: "dialog_history" query_key: "query" response_key: "response" extract_tool_skill_tags: true

官方示例中的轨迹连贯性配置

在 demos/agent/agent_interaction_quality_analysis.yaml 中,该算子与dialog_coreference_mapper、dialog_topic_shift_mapper、agent_tool_relevance_mapper等一组质量轴并列配置:

- agent_trace_coherence_mapper: api_model: "qwen-turbo" preferred_output_lang: zh trajectory_text_max_chars: 10000 try_num: 2 sampling_params: { max_tokens: 320, temperature: 0.15 } text_key: "text"

运行方式与 Data-Juicer 其它流水线一致,例如通过 tools/process_data.py 执行--config指向上述 YAML 即可。输出样本的meta中会出现"agent_trace_coherence": {"score": x, "reason": "...", "eval_kind": "agent_trace"},后续可被llm_analysis_filter、bad-case 信号分析等下游算子消费(参见 demos/agent/scripts/bad_case_signal_support.py 中对agent_trace_coherence键的引用)。

测试验证

仓库单元测试 tests/ops/mapper/test_dialog_quality_llm.py 覆盖了该算子的核心行为:

  • test_agent_trace_coherence_mapper:mock LLM 客户端返回{"score": 4, "reason": "ok"},断言process_single后meta[agent_trace_coherence]的score == 4.0、eval_kind == "agent_trace",验证“评分写入 meta”的主链路;
  • test_agent_trace_skips_empty_text:对text为空白字符串的样本,断言 meta 中写入skipped,验证空输入短路逻辑;
  • 同一测试文件还验证了分数归一化(normalize_score_1_5将 10 钳位为 5.0)与 JSON 提取(extract_json_object)等底层工具函数。

这些测试可在本地通过pytest tests/ops/mapper/test_dialog_quality_llm.py运行复现。

实践建议与注意事项

  1. 务必先做 normalize:text必须是展平的完整会话轨迹,否则评分对象缺失。agent_dialog_normalize_mapper会把同一用户回合内的多段 assistant(含 tool 调用摘要与 tool 结果)拼接保留,避免下游只见最后一段助手回复而误判“没干活/偏题”(见 demos/agent/BAD_CASE_INSIGHTS_ZH.md 的说明)。
  2. 合理设置trajectory_text_max_chars:默认 12000 字符;实际项目中可依据轨迹平均长度与成本预算下调(官方示例用 10000)。截断不会导致误判——评分标准明确要求截断摘录偏向 4–5 分。
  3. 善用overwrite与try_num:断点续跑时保持overwrite: False避免重复调用;网络不稳时可适当提高try_num(默认 2)。
  4. 控制采样随机性:评分类任务建议保持低temperature(默认 0.2),必要时显式覆盖sampling_params。
  5. 语言参数:若下游报告面向中文团队,设preferred_output_lang: zh让reason输出简体中文,JSON 键名不受影响,解析逻辑无需改动。
  6. 分数语义:score是 1–5 的连续浮点(模型输出整数也会被规范化),与dialog_*各质量轴口径一致,可统一用于阈值过滤与群体对比。
  • 人工智能
  • 大模型
  • 数据工程
  • 数据清洗
  • 数据增强
  • 数据质检

【免费下载链接】data-juicer

Data processing for and with foundation models! 🍎 🍋 🌽 ➡️ ➡️🍸 🍹 🍷

项目地址:https://gitcode.com/gh_mirrors/da/data-juicer
点击查看免费下载

相关推荐

上一篇:抖音批量下载教程:无水印视频、整站主页与直播录制,一份配置全部搞定
下一篇:Magisk Root 安装实战:3 步修补 boot 分区拿最高权限,OTA 升级不丢 Root

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 7:23:26

23国赛linux笔记

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:23:06

五端口千兆无管理交换机硬件设计实战:RTL8367RB方案全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:21:58

零售客流统计实战:YOLOv11多目标跟踪与热力图生成技术详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华