零丢失!DeepEval评测数据持久化全攻略:从缓存到备份的完整方案
你是否曾因意外中断丢失数小时的LLM评测结果?是否在多设备协作时难以同步测试数据?DeepEval作为LLM评测框架(Evaluation Framework for LLMs),提供了完善的数据持久化机制,确保你的评测工作万无一失。本文将系统讲解DeepEval的数据备份策略,从缓存机制到手动备份,帮你构建可靠的数据安全网。
评测数据为什么会丢失?
在LLM评测过程中,数据丢失可能来自多种场景:
- 程序意外崩溃或强制退出
- 缓存文件被误删或损坏
- 多轮测试中的临时数据未及时保存
- 环境变量配置错误导致持久化失败
DeepEval的持久化方案通过三级防护机制解决这些问题:内存缓存→临时文件→持久化存储,形成完整的数据安全闭环。
缓存机制:自动保护的第一道防线
DeepEval的缓存系统自动保存评测中间结果,避免重复计算。核心实现位于deepeval/test_run/cache.py,采用双文件缓存策略:
CACHE_FILE_NAME = f"{HIDDEN_DIR}/.deepeval-cache.json" # 主缓存文件
TEMP_CACHE_FILE_NAME = f"{HIDDEN_DIR}/.temp-deepeval-cache.json" # 临时缓存
缓存工作原理
-
写入流程:
- 测试运行时数据先写入临时缓存(.temp-deepeval-cache.json)
- 测试完成后合并到主缓存(.deepeval-cache.json)
- 使用文件锁确保并发安全(portalocker库实现)
-
缓存内容:
- 测试用例参数(输入、输出、上下文等)
- 评测指标配置(阈值、模型、严格模式等)
- 计算结果(分数、通过状态、耗时等)
-
缓存键生成:
cache_dict = { LLMTestCaseParams.INPUT.value: test_case.input, LLMTestCaseParams.ACTUAL_OUTPUT.value: test_case.actual_output, # 其他参数... "hyperparameters": hyperparameters, } test_case_cache_key = serialize(cache_dict) # 生成唯一键
缓存配置与控制
通过环境变量或配置文件调整缓存行为:
# 在.env文件中配置
ENABLE_DEEPEVAL_CACHE=False # 禁用缓存
DEEPEVAL_DEFAULT_SAVE=dotenv:/path/to/custom.env # 自定义缓存路径
缓存管理接口允许高级操作:
from deepeval.test_run.cache import global_test_run_cache_manager
# 清除所有缓存
global_test_run_cache_manager.wrap_up_cached_test_run()
# 禁用缓存写入
global_test_run_cache_manager.disable_write_cache = True
结果持久化:主动备份策略
缓存主要用于临时存储,DeepEval还提供了多种主动持久化方案,确保重要评测数据长期保存。
结果文件夹配置
通过设置DEEPEVAL_RESULTS_FOLDER指定评测结果存储目录,系统会自动生成时间戳命名的JSON文件:
# deepeval/config/settings.py 中的配置
class Settings(BaseSettings):
# 当设置此参数时,DeepEval会将最新测试运行的带时间戳JSON导出到此目录
DEEPEVAL_RESULTS_FOLDER: Optional[Path] = None
配置方法(三选一):
- 环境变量:
export DEEPEVAL_RESULTS_FOLDER=./evaluation_results - .env文件:
DEEPEVAL_RESULTS_FOLDER=./evaluation_results - 代码设置:
from deepeval.config import get_settings with get_settings().edit() as settings: settings.DEEPEVAL_RESULTS_FOLDER = "./evaluation_results"
数据集导入导出
DeepEval支持将测试数据集导出为JSON/CSV文件,实现人工备份和共享:
# 导出数据集示例 (deepeval/dataset/dataset.py)
dataset = EvaluationDataset(goldens=your_goldens)
# 保存为JSON
with open("evaluation_dataset.json", "w") as f:
json.dump([g.dict() for g in dataset.goldens], f, indent=2)
# 从JSON加载
with open("evaluation_dataset.json", "r") as f:
goldens = [Golden(**item) for item in json.load(f)]
dataset = EvaluationDataset(goldens=goldens)
批量导入方法:
# 从CSV文件导入测试用例
dataset.add_test_cases_from_csv_file(
file_path="test_cases.csv",
input_col_name="query",
actual_output_col_name="response",
expected_output_col_name="expected_response",
context_col_name="context"
)
最佳备份实践
推荐的评测数据备份策略:
- 实时缓存:默认启用,保护单次测试过程
- 定期导出:关键节点调用
save()方法保存完整结果 - 版本控制:将重要数据集纳入Git管理(排除缓存文件)
- 异地备份:定期将结果文件夹同步到云存储
自动化备份脚本示例:
#!/bin/bash
# backup_evaluation.sh
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backups/$TIMESTAMP"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 复制结果文件
cp -r ${DEEPEVAL_RESULTS_FOLDER:-./results} $BACKUP_DIR
# 导出当前数据集
python -c "from your_script import dataset; dataset.export('$BACKUP_DIR/dataset.json')"
# 压缩备份
tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR
rm -rf $BACKUP_DIR
echo "Backup completed: $BACKUP_DIR.tar.gz"
配置持久化:环境与参数的安全存储
DeepEval使用dotenv管理环境变量,确保配置的持久化和版本隔离。核心实现位于deepeval/config/settings.py。
配置文件加载顺序
DeepEval按以下优先级加载配置(高优先级覆盖低优先级):
- 系统环境变量
- .env.local(本地覆盖,不纳入版本控制)
- .env.{APP_ENV}(环境特定配置,如.env.production)
- .env(基础配置,可提交到版本控制)
加载逻辑:
def autoload_dotenv() -> None:
"""
加载.env文件中的环境变量,不覆盖现有进程环境变量
优先级(从低到高):.env -> .env.{APP_ENV} -> .env.local
进程环境变量始终优先于文件值
"""
if parse_bool(os.getenv("DEEPEVAL_DISABLE_DOTENV"), default=False):
return
# 加载逻辑实现...
配置持久化方法
使用edit()上下文管理器安全修改和保存配置:
from deepeval.config import get_settings
with get_settings().edit(save="dotenv") as settings:
settings.OPENAI_API_KEY = "sk-..." # 会自动保存到.env文件
settings.DEEPEVAL_RESULTS_FOLDER = "./evaluation_results"
settings.LOG_LEVEL = "DEBUG"
修改会同时更新:
- 内存中的配置对象
- .env文件(非敏感配置)
- 密钥文件(仅敏感配置,如API密钥)
故障恢复:当数据丢失发生时
即使有完善的预防措施,数据丢失仍可能发生。DeepEval提供了多种恢复机制:
从缓存文件恢复
如果主缓存文件损坏或丢失,尝试从临时缓存恢复:
from deepeval.test_run.cache import global_test_run_cache_manager
# 加载临时缓存
global_test_run_cache_manager.get_cached_test_run(from_temp=True)
# 保存为正式缓存
global_test_run_cache_manager.save_cached_test_run(to_temp=False)
结果文件恢复
如果配置了DEEPEVAL_RESULTS_FOLDER,可以直接加载历史结果文件:
from deepeval.dataset.dataset import EvaluationDataset
# 从结果文件加载测试用例
with open("./results/20231115_143022_test_results.json", "r") as f:
results = json.load(f)
dataset = EvaluationDataset()
for test_case_data in results["test_cases"]:
test_case = LLMTestCase(**test_case_data)
dataset.add_test_case(test_case)
数据恢复工具
DeepEval CLI提供了数据恢复命令(开发中):
# 列出所有可恢复的缓存和结果文件
deepeval recovery list
# 恢复最近的测试数据
deepeval recovery restore --latest
# 恢复指定日期的结果
deepeval recovery restore --date 2023-11-15
完整备份方案总结
为确保LLM评测数据安全,建议实施以下综合策略:
基础配置(必选)
1.** 启用结果持久化 **:
echo "DEEPEVAL_RESULTS_FOLDER=./deepeval_results" >> .env
2.** 配置版本控制 **:
# .gitignore配置
echo ".env.local" >> .gitignore
echo ".deepeval/" >> .gitignore # 排除缓存目录
echo "!/.env" >> .gitignore # 但保留基础.env文件
进阶保护(推荐)
1.** 定期自动备份**:设置crontab任务执行备份脚本 2.** 多环境隔离 :为开发/测试/生产环境使用不同配置文件 3. 关键数据加密 **:对包含敏感信息的评测结果进行加密存储
数据安全检查表
在部署评测系统前,确认以下事项:
- 已配置
DEEPEVAL_RESULTS_FOLDER持久化结果 - 缓存文件位于安全位置且定期清理
- 敏感配置使用
.env.local并排除在Git外 - 定期测试数据恢复流程
- 备份文件有明确的命名规范(包含时间戳)
通过实施这些策略,你可以确保LLM评测数据的完整性和可用性,为模型迭代和优化提供可靠的数据支持。DeepEval的缓存、配置和结果持久化机制共同构成了一个健壮的数据安全体系,让你专注于评测本身而非数据管理。
上图:DeepEval评测数据流程示意图,展示了从测试执行到结果持久化的完整路径(图片来源:docs/assets/dashboard-screenshot.png)
完整的备份策略不仅保护你的工作成果,还能实现评测过程的可追溯性和可复现性,这对于LLM模型的持续优化至关重要。通过本文介绍的方法,你可以构建一个既自动化又可靠的数据持久化系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



