File size: 9,635 Bytes
46b244e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# 训练数据评估脚本使用说明

## 一、评估结构
解析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"` 消息