| # 训练数据评估脚本使用说明 | |
| ## 一、评估结构 | |
| 解析conversations数据,分割成pairs | |
| - **Pair 1**: system+tools+user -> function_call | |
| - **Pair 2**: system+tools+user+observation -> function_call | |
| - **Pair 3**: system+tools+user+observation -> gpt | |
| ## 二、评估指标 | |
| ### 2.1 基本统计指标 | |
| - **total_conversations**: 总对话数量 | |
| - **total_pairs**: 总评估对数量 | |
| ### 2.2 Pair级别指标 | |
| #### Pair 1 指标 | |
| - **pair1.total**: Pair 1 的总数量 | |
| - **pair1.accuracy**: Pair 1 的准确率 | |
| - **pair1.precision@1**: Pair 1 的工具名称精确匹配率 | |
| #### Pair 2 指标 | |
| - **pair2.total**: Pair 2 的总数量 | |
| - **pair2.accuracy**: Pair 2 的准确率 | |
| - **pair2.precision@1**: Pair 2 的工具名称精确匹配率 | |
| - **pair2_consider_recall.total**: 考虑recall条件的Pair 2数量 | |
| - **pair2_consider_recall.accuracy**: 考虑recall条件的Pair 2准确率 | |
| - **pair2_consider_recall.precision@1**: 考虑recall条件的Pair 2工具名称精确匹配率 | |
| #### Pair 3 指标 | |
| - **pair3.total**: Pair 3 的总数量 | |
| - **pair3.answer_score**: Pair 3 的文本生成质量得分 | |
| ### 2.3 Recall指标 | |
| - **recall_metrics.total_pairs**: 参与recall评估的pair总数 | |
| - **recall_metrics.recall@5_1**: recall=1的pair数量 | |
| - **recall_metrics.recall@5_0**: recall=0的pair数量 | |
| - **recall_metrics.recall_rate**: recall率 | |
| ### 2.4 总体指标 | |
| - **overall.total**: 总体评估对数量 | |
| - **overall.accuracy**: 总体准确率 | |
| - **overall.precision@1**: 总体工具名称精确匹配率 | |
| - **overall.answer_score**: 总体文本生成质量得分 | |
| ## 三、指标说明 | |
| ### 3.1 准确率 (Accuracy) | |
| - **计算原理**: 对于工具调用pair,比较预测的工具调用与目标工具调用的一致性,包括工具名称和参数匹配 | |
| - **评分规则**: | |
| - 工具名称匹配: 50%权重 | |
| - 参数匹配: 50%权重 | |
| - 最终得分范围: 0-1 | |
| ### 3.2 精确匹配率 (Precision@1) | |
| - **计算原理**: 仅考虑工具名称是否完全匹配 | |
| - **评分规则**: 工具名称完全匹配得1分,否则得0分 | |
| ### 3.3 文本生成质量得分 (Answer Score) | |
| - **计算原理**: 使用Gemini-2.5-flash模型评估文本生成的四个维度 | |
| - **评估维度**: | |
| - 内容准确性 (0-10分) | |
| - 完整性 (0-10分) | |
| - 表达质量 (0-10分) | |
| - 格式一致性 (0-10分) | |
| - **最终得分**: 四个维度的平均分除以10,范围0-1 | |
| ### 3.4 Recall指标 | |
| - **计算原理**: 基于Pair 1的预测结果调用检索工具,检查Pair 2的目标工具是否在(调用retrieval_tool得到的)检索结果的前5个中 | |
| - **计算条件**: 仅在Pair 1的precision@1=1.0且有有效预测query时才计算 | |
| - **评分规则**: 目标工具在检索结果中得1分,否则得0分 | |
| ### 3.5 考虑Recall的指标 | |
| - **pair2_consider_recall**: 仅在recall=1的条件下计算Pair 2的指标 | |
| - **意义**: 评估在工具检索成功情况下的模型表现 | |
| ## 四、运行命令 | |
| python data_evaluation.py | |
| ## 五、默认输入输出 | |
| ### 5.1 输入文件 | |
| - **主要输入**: `data/9.17_evaluate_data_top5_final.json` | |
| - 包含待评估的对话数据,格式为conversations数组 | |
| - 每个对话包含system、tools、conversations字段 | |
| #### 5.1.1 输入文件格式要求 | |
| **顶层结构**: | |
| ```json | |
| [ | |
| { | |
| "conversations": [...], | |
| "system": "...", | |
| "tools": "..." // 可选字段 | |
| }, | |
| ... | |
| ] | |
| ``` | |
| **必需字段**: | |
| - **`conversations`** (数组,必需): 对话消息序列 | |
| - 每个消息对象必须包含: | |
| - `"from"`: 字符串,必须是 `"human"`、`"function_call"`、`"observation"`、`"gpt"` 之一 | |
| - `"value"`: 字符串,消息内容 | |
| - **`system`** (字符串,必需): 系统提示词,可包含 `<tools>` 标签 | |
| **可选字段**: | |
| - **`tools`** (字符串,可选): JSON格式的工具定义,默认为 `"[]"` | |
| #### 5.1.2 消息类型说明 | |
| | 消息类型 | from值 | 用途 | 示例 | | |
| |---------|-------------------|-------------------|------------------------------------------------| | |
| | 用户输入 | `"human"` | 用户的查询或请求 | `{"from": "human", "value": "帮我查询收入数据"}` | | |
| | 工具调用 | `"function_call"` | AI调用的工具和参数 | `{"from": "function_call", "value": "{\"name\":\"tool_name\",\"arguments\":{...}}"}` | | |
| | 工具返回 | `"observation"` | 工具执行的结果 | `{"from": "observation", "value": "工具返回的结果数据"}` | | |
| | AI回复 | `"gpt"` | AI的最终回答 | `{"from": "gpt", "value": "基于工具结果的回答"}` | | |
| #### 5.1.3 对话序列要求 | |
| 脚本会按照以下逻辑解析conversations来生成评估对: | |
| 1. **Pair 1**: `human` → `function_call` | |
| - 从 `"human"` 消息开始,寻找紧随其后的 `"function_call"` 消息 | |
| 2. **Pair 2**: `human` + `observation` → `function_call` | |
| - 从 `"observation"` 消息开始,寻找紧随其后的 `"function_call"` 消息 | |
| 3. **Pair 3**: `human` + `observation` → `gpt` | |
| - 从 `"observation"` 消息开始,寻找紧随其后的 `"gpt"` 消息 | |
| #### 5.1.4 格式验证 | |
| **严格程度**: 中等严格 | |
| - ✅ **必需字段**: `conversations`、`system` 必须存在且格式正确 | |
| - ✅ **字段类型**: 必须是正确的数据类型(数组、字符串) | |
| - ✅ **枚举值**: `"from"` 字段必须是预定义的值 | |
| - ✅ **数组结构**: conversations必须是数组格式 | |
| - ⚠️ **可选字段**: `tools` 字段可选,有默认值 | |
| - ⚠️ **内容验证**: 不验证具体的工具调用内容格式 | |
| **常见错误**: | |
| - `KeyError`: 缺少必需字段 `conversations` 或 `system` | |
| - `TypeError`: 字段类型不正确(如conversations不是数组) | |
| - `ValueError`: `"from"` 字段值不是预定义的枚举值 | |
| #### 5.1.5 完整示例 | |
| ```json | |
| [ | |
| { | |
| "conversations": [ | |
| { | |
| "from": "human", | |
| "value": "帮我看下2025年6月到8月各种收入类型的占比情况" | |
| }, | |
| { | |
| "from": "function_call", | |
| "value": "{\"name\":\"retrieval_tool\",\"arguments\":{\"query\":\"收入分析\",\"source_filter\":\"toollist\",\"user_id\":136451106,\"top_k\":5}}" | |
| }, | |
| { | |
| "from": "observation", | |
| "value": "[{\"name\":\"analyze_revenue_by_type\",\"description\":\"收入分析工具\"}]" | |
| }, | |
| { | |
| "from": "function_call", | |
| "value": "{\"name\":\"analyze_revenue_by_type\",\"arguments\":{\"start_date\":\"2025-06-01\",\"end_date\":\"2025-08-31\"}}" | |
| }, | |
| { | |
| "from": "observation", | |
| "value": "{\"result\":{\"收入\":\"1,285,893.00\",\"门票\":\"47.1%\",\"交通\":\"50.6%\"}}" | |
| }, | |
| { | |
| "from": "gpt", | |
| "value": "根据2025年6月到8月的收入数据分析,各种收入类型的占比情况如下:交通收入占50.6%,门票收入占47.1%..." | |
| } | |
| ], | |
| "system": "# 工具\n\n你可以调用一个或多个函数来协助处理用户查询。\n\n在 <tools></tools> XML 标签中提供了可用的函数签名:\n<tools>\n</tools>", | |
| "tools": "[{\"name\":\"retrieval_tool\",\"description\":\"检索工具\"}]" | |
| } | |
| ] | |
| ``` | |
| **从上述示例生成的评估对**: | |
| - **Pair 1**: `system + user查询` → `retrieval_tool调用` | |
| - **Pair 2**: `system + user查询 + 检索结果` → `analyze_revenue_by_type调用` | |
| - **Pair 3**: `system + user查询 + 分析结果` → `最终回答` | |
| ### 5.2 输出文件 | |
| - **主要输出**: `metrics/data_evaluation_results.json` | |
| - 完整的评估报告,包含详细结果和指标统计 | |
| - **实时指标**: `metrics/realtime_metrics.json` | |
| - 实时更新的指标数据,每处理一个评估对就更新 | |
| - **日志文件**: `metrics/data_evaluation.log` | |
| - 详细的运行日志,包含评估进度和错误信息 | |
| - **断点文件**: `metrics/evaluation_checkpoint.json` | |
| - 支持断点续传的中间状态文件(完成后自动删除) | |
| ## 六、技术特性 | |
| ### 6.1 断点续传 | |
| - 支持中断后从上次位置继续评估 | |
| - 自动保存处理进度到checkpoint文件 | |
| - 评估完成后自动清理断点文件 | |
| ### 6.2 实时指标更新 | |
| - 每处理一个评估对就更新实时指标 | |
| - 可随时查看当前评估进度和指标状态 | |
| ### 6.3 多模型支持 | |
| - **预测模型**: Qwen3-8B (通过API调用) | |
| - **评估模型**: Gemini-2.5-flash (用于文本生成质量评估) | |
| - **检索工具**: 调用retrieval_tool | |
| ### 6.4 容错机制 | |
| - API调用重试机制(最多3次) | |
| - 指数退避策略 | |
| - 详细的错误日志记录 | |
| ## 七、注意事项 | |
| 1. **API配置**: 确保GEMINI_API_KEY和QWEN_API_URL配置正确 | |
| 2. **网络连接**: 需要稳定的网络连接访问外部API服务 | |
| 3. **存储空间**: 确保有足够空间存储输出文件和日志 | |
| 4. **运行时间**: 完整评估可能需要数小时,建议后台运行 | |
| 5. **数据格式**: 输入文件必须严格符合指定的JSON格式 | |
| - 确保必需字段 `conversations` 和 `system` 存在 | |
| - `conversations` 必须是数组,每个消息包含 `"from"` 和 `"value"` 字段 | |
| - `"from"` 字段值必须是 `"human"`、`"function_call"`、`"observation"`、`"gpt"` 之一 | |
| - 建议使用提供的示例文件作为模板 | |
| 6. **对话序列**: 确保conversations中的消息序列符合评估逻辑要求 | |
| - 每个 `"human"` 消息后应跟随 `"function_call"` 消息 | |
| - 每个 `"observation"` 消息后应跟随 `"function_call"` 或 `"gpt"` 消息 | |