|
1 | 1 | # 评测 |
2 | 2 |
|
3 | | -VeADK构建一套完整的自动化Evaluation流程,主要能力包括: |
| 3 | +VeADK 构建一套完整的自动化评测(Evaluation)流程,其主要功能包括: |
4 | 4 |
|
5 | | -- 运行时数据采集:通过collect_runtime_data开启 |
6 | | -- 测试集文件生成:开启后自动dump到本地 |
7 | | -- 评测:通过不同的evaluator或adk eval命令进行测试 |
8 | | -- 反馈优化:自动根据评测结果(score reason等属性)优化prompts |
| 5 | +- 运行时数据采集:自动捕获 Agent 的运行时数据 |
| 6 | +- 测试集文件生成:Agent 运行后自动将运行时数据作为测试数据集(Eval Set)导出到本地 |
| 7 | +- 评测:通过多种评测器(Evaluator)进行评测 |
| 8 | +- 反馈优化:根据评测结果(如评测得分,原因分析等)自动优化 prompts |
9 | 9 |
|
10 | 10 | ## 运行时数据采集 |
11 | 11 |
|
| 12 | +VeADK 可以通过两种方式采集 Agent 的运行时数据。 |
| 13 | + |
| 14 | +对于 `agent.run()` 方法,在调用时设置 `collect_runtime_data=True` 即可开启数据采集。运行结束后,运行时数据构成的评测集文件将保存在 `agent._dump_path` 指定的路径。 |
| 15 | + |
| 16 | +```python |
| 17 | +await agent.run( |
| 18 | + prompt, |
| 19 | + collect_runtime_data=True, |
| 20 | + eval_set_id=f"eval_demo_set_{get_current_time()}", |
| 21 | +) |
| 22 | +# get expect output |
| 23 | +dump_path = agent._dump_path |
| 24 | +assert dump_path != "", "Dump eval set file failed! Please check runtime logs." |
| 25 | +``` |
| 26 | + |
| 27 | +对于 `Runner` 执行器,在 Agent 运行结束后,通过调用 `runner.save_eval_set()` 将运行时数据构成的评测集文件保存在默认路径。 |
| 28 | + |
12 | 29 | ```python |
13 | | -from veadk.evaluation import EvalSetRecorder |
| 30 | +runner = Runner( |
| 31 | + agent=agent, |
| 32 | + short_term_memory=ShortTermMemory(), |
| 33 | +) |
14 | 34 |
|
15 | | -# 在希望进行数据dump处初始化一个EvalSetRecorder |
16 | | -eval_set_recorder = EvalSetRecorder(session_service, eval_set_id) |
| 35 | +await runner.run(messages=prompts, session_id=session_id) |
17 | 36 |
|
18 | | -# dump数据,为Json格式 |
19 | | -dump_path = await eval_set_recorder.dump(app_name, user_id, session_id) |
| 37 | +dump_path = await runner.save_eval_set(session_id=session_id) |
| 38 | +assert dump_path != "", "Dump eval set file failed! Please check runtime logs." |
20 | 39 | ``` |
21 | 40 |
|
22 | 41 | ## 评测集文件 |
23 | 42 |
|
24 | | -评测集文件格式兼容Google Evaluation,详见[评测集文件格式](https://google.github.io/adk-docs/evaluate/#how-evaluation-works-with-the-adk)。 |
| 43 | +评测集文件格式兼容 Google Evaluation 标准,详见[评测集文件格式](https://google.github.io/adk-docs/evaluate/#how-evaluation-works-with-the-adk)。评测集本地保存过程中,会考虑所有会话。 |
25 | 44 |
|
26 | | -评测集本地保存过程中,均考虑当前会话。下面是一些概念对齐: |
| 45 | +文件结构说明: |
27 | 46 |
|
28 | | -- `test_case`:所有对话轮次 |
29 | | -- `invocation`:一轮对话 |
| 47 | +- `eval_cases`:所有对话轮次 |
| 48 | +- `conversation`:一轮对话 |
| 49 | + - `user_content`:用户的输入 |
| 50 | + - `final_response`:Agent 的最后输出 |
| 51 | + - `intermediate_data`:中间数据 |
| 52 | + - `tool_uses`:Agent 使用的工具 |
| 53 | + - `intermediate_responses`:Agent 的中间会话 |
30 | 54 |
|
31 | | -## 评测器 |
| 55 | +## 评测 |
32 | 56 |
|
33 | | -当前VeADK支持Deepeval评测器,通过如下方式定义: |
| 57 | +VeADK 目前支持 [DeepEval](https://deepeval.com/) 评测器和 [ADKEval](https://google.github.io/adk-docs/evaluate/),通过如下方式定义评测器: |
34 | 58 |
|
35 | 59 | ```python |
36 | 60 | from veadk.evaluation.deepeval_evaluator import DeepevalEvaluator |
| 61 | +from veadk.evaluation.adk_evaluator.adk_evaluator import ADKEvaluator |
37 | 62 |
|
38 | 63 | # 当然,你还可以传入`judge_model`等相关信息 |
39 | 64 | evaluator = DeepevalEvaluator() |
40 | | -``` |
41 | 65 |
|
42 | | -## 评测方法 |
| 66 | +# Alternatively: |
| 67 | +# evaluator = ADKEvaluator() |
| 68 | +``` |
43 | 69 |
|
44 | 70 | 启动标准的评测接口: |
45 | 71 |
|
46 | 72 | ```python |
47 | 73 | await evaluator.eval(eval_set_file_path=dump_path, metrics=metrics) |
48 | 74 | ``` |
49 | 75 |
|
50 | | -其中,输入: |
| 76 | +参数说明: |
51 | 77 |
|
52 | 78 | - `eval_set_file_path`:评测集文件路径 |
53 | | -- `metrics`:评测指标 |
54 | | - |
55 | | -不同的评测指标在不同测试框架中可能不同。 |
| 79 | +- `metrics`:评测指标,不同的评测指标在不同测试框架中可能不同。 |
56 | 80 |
|
57 | 81 | ## 数据上报 |
58 | 82 |
|
59 | | -评测结果可以自动上报至火山引擎的VMP平台,只需要在定义评估器的时候传入Prometheus pushgateway的相关参数: |
| 83 | +评测结果可以自动上报至火山引擎的 [VMP](https://console.volcengine.com/prometheus) 平台,只需要在定义评估器的时候传入 Prometheus pushgateway 等相关参数即可,可在 `config.yaml` 中进行配置并从环境变量中自动读取: |
60 | 84 |
|
61 | 85 | ```python |
62 | 86 | from veadk.evaluation.utils.prometheus import PrometheusPushgatewayConfig |
63 | 87 |
|
64 | | -# 可以自动从环境变量中读取相关配置 |
| 88 | +# Load Prometheus configuration (can be read from environment variables) |
65 | 89 | prometheus_config = PrometheusPushgatewayConfig() |
66 | 90 |
|
67 | | -# 传入到评估器中 |
| 91 | +# Pass config into evaluator |
68 | 92 | evaluator = DeepevalEvaluator( |
69 | 93 | ..., |
70 | 94 | prometheus_config=prometheus_config, |
71 | 95 | ) |
| 96 | +``` |
| 97 | + |
| 98 | +## 完整示例 |
| 99 | + |
| 100 | +以下是使用 DeepEval 评测器的完整例子。其中定义了 [GEval](https://deepeval.com/docs/metrics-llm-evals) 指标和 [ToolCorrectnessMetric](https://deepeval.com/docs/metrics-tool-correctness) 指标,分别用于整体输出质量评估和工具调用正确率评估,并将评测结果上报至火山引擎的 VMP 平台: |
| 101 | + |
| 102 | +```python |
| 103 | +import asyncio |
| 104 | +import os |
| 105 | +from builtin_tools.agent import agent |
| 106 | + |
| 107 | +from deepeval.metrics import GEval, ToolCorrectnessMetric |
| 108 | +from deepeval.test_case import LLMTestCaseParams |
| 109 | +from veadk.config import getenv |
| 110 | +from veadk.evaluation.deepeval_evaluator import DeepevalEvaluator |
| 111 | +from veadk.evaluation.utils.prometheus import PrometheusPushgatewayConfig |
| 112 | +from veadk.prompts.prompt_evaluator import eval_principle_prompt |
| 113 | + |
| 114 | +prometheus_config = PrometheusPushgatewayConfig() |
| 115 | + |
| 116 | +# 1. Rollout, and generate eval set file |
| 117 | +# await agent.run( |
| 118 | +# prompt, |
| 119 | +# collect_runtime_data=True, |
| 120 | +# eval_set_id=f"eval_demo_set_{get_current_time()}", |
| 121 | +# ) |
| 122 | +# # get expect output |
| 123 | +# dump_path = agent._dump_path |
| 124 | +# assert dump_path != "", "Dump eval set file failed! Please check runtime logs." |
| 125 | + |
| 126 | +# 2. Evaluate in terms of eval set file |
| 127 | +evaluator = DeepevalEvaluator( |
| 128 | + agent=agent, |
| 129 | + judge_model_name=getenv("MODEL_JUDGE_NAME"), |
| 130 | + judge_model_api_base=getenv("MODEL_JUDGE_API_BASE"), |
| 131 | + judge_model_api_key=getenv("MODEL_JUDGE_API_KEY"), |
| 132 | + prometheus_config=prometheus_config, |
| 133 | +) |
| 134 | + |
| 135 | +# 3. Define evaluation metrics |
| 136 | +metrics = [ |
| 137 | + GEval( |
| 138 | + threshold=0.8, |
| 139 | + name="Base Evaluation", |
| 140 | + criteria=eval_principle_prompt, |
| 141 | + evaluation_params=[ |
| 142 | + LLMTestCaseParams.INPUT, |
| 143 | + LLMTestCaseParams.ACTUAL_OUTPUT, |
| 144 | + LLMTestCaseParams.EXPECTED_OUTPUT, |
| 145 | + ], |
| 146 | + ), |
| 147 | + ToolCorrectnessMetric( |
| 148 | + threshold=0.5 |
| 149 | + ), |
| 150 | +] |
| 151 | + |
| 152 | +# 4. Run evaluation |
| 153 | +eval_set_file_path = os.path.join( |
| 154 | + os.path.dirname(__file__), "builtin_tools", "evalsetf0aef1.evalset.json" |
| 155 | +) |
| 156 | +await evaluator.eval(eval_set_file_path=eval_set_file_path, metrics=metrics) |
72 | 157 | ``` |
0 commit comments