benchmark/locomo/README.md
本目录包含 LoCoMo(Long-Term Conversation Memory)评测脚本,用于评估对话记忆系统的性能。
benchmark/locomo/
├── vikingbot/ # VikingBot 评测脚本
│ ├── run_eval.py # 运行 QA 评估
│ ├── judge.py # LLM 裁判打分
│ ├── import_to_ov.py # 导入数据到 OpenViking
│ ├── import_and_eval_one.sh # 单题/批量测试脚本
│ ├── stat_judge_result.py # 统计评分结果
│ ├── run_full_eval.sh # 一键运行完整评测流程
│ ├── data/ # 测试数据目录
│ └── result/ # 评测结果目录
└── openclaw/ # OpenClaw 评测脚本
├── import_to_ov.py # 导入数据到 OpenViking
├── eval.py # OpenClaw 评估脚本 (ingest/qa)
├── judge.py # LLM 裁判打分(适配 OpenClaw)
├── stat_judge_result.py # 统计评分结果和 token 使用
├── run_full_eval.sh # 一键运行完整评测流程
├── data/ # 测试数据目录
└── result/ # 评测结果目录
conv-26作为user_id,存储在OpenViking中。{
"server": {
"root_api_key": "your-key"
}
}
ovcli.conf中的account值,若未配置默认使用default;default,如更改必须与导入OpenViking的account一致,即ovcli.conf中的account值,可通过ov.conf如下配置:{
"bot": {
"ov_server": {
"root_api_key": "your-root-key",
"account_id": "默认default,必须和ovcli.conf中的account_id一致"
}
}
}
使用 run_full_eval.sh 可以一键运行完整评测流程:
cd benchmark/locomo/vikingbot
bash run_full_eval.sh # 完整流程
bash run_full_eval.sh --skip-import # 跳过导入,仅评测
使用 import_and_eval_one.sh 可以快速测试单个问题或批量测试某个 sample:
cd benchmark/locomo/vikingbot
单题测试:
./import_and_eval_one.sh 0 2 # sample 索引 0, question 2
./import_and_eval_one.sh conv-26 2 # sample_id conv-26, question 2
./import_and_eval_one.sh conv-26 2 --skip-import # 跳过导入
批量测试单个 sample:
./import_and_eval_one.sh conv-26 # conv-26 所有问题
./import_and_eval_one.sh conv-26 --skip-import
使用 import_to_ov.py 将 LoCoMo 数据集导入到 OpenViking:
python import_to_ov.py --input <数据文件路径> [选项]
参数说明:
--input: 输入文件路径(JSON 或 TXT 格式),默认 ./data/locomo10.json--sample: 指定样本索引(0-based),默认处理所有样本--sessions: 指定会话范围,例如 1-4 或 3,默认所有会话--parallel: 并发导入数,默认 5--force-ingest: 强制重新导入,即使已导入过--clear-ingest-record: 清除所有导入记录--openviking-url: OpenViking 服务地址,默认 http://localhost:1933--account: 导入时使用的 account,默认 default示例:
# 导入第一个样本的 1-4 会话
python import_to_ov.py --input ./data/locomo10.json --sample 0 --sessions 1-4
# 强制重新导入所有数据
python import_to_ov.py --input ./data/locomo10.json --force-ingest
使用 run_eval.py 运行问答评估:
python run_eval.py <输入数据> [选项]
参数说明:
input: 输入 JSON/CSV 文件路径,默认 ./data/locomo10.json--output: 输出 CSV 文件路径,默认 ./result/locomo_qa_result.csv--sample: 指定样本索引--count: 运行的 QA 问题数量,默认全部--threads: 并发线程数,默认 5示例:
# 使用默认参数运行
python run_eval.py
# 指定输入输出文件,使用 20 线程
python run_eval.py ./data/locomo_qa_1528.csv --output ./result/my_result.csv --threads 20
使用 judge.py 对评估结果进行打分:
python judge.py [选项]
参数说明:
--input: QA 结果 CSV 文件路径,默认 ./result/locomo_qa_result.csv--token: API Token(也可通过 ARK_API_KEY 或 OPENAI_API_KEY 环境变量设置)--base-url: API 基础 URL,默认 https://ark.cn-beijing.volces.com/api/v3--model: 裁判模型名称,默认 doubao-seed-2-0-pro-260215--parallel: 并发请求数,默认 5示例:
python judge.py --input ./result/locomo_qa_result.csv --token <your_token> --parallel 10
使用 stat_judge_result.py 统计评分结果:
python stat_judge_result.py --input <评分结果文件>
参数说明:
--input: 评分结果 CSV 文件路径输出统计信息包括:
使用 openclaw/run_full_eval.sh 可以一键运行完整评测流程:
cd benchmark/locomo/openclaw
bash run_full_eval.sh # 只导入 OpenViking(跳过已导入的)
bash run_full_eval.sh --with-claw-import # 同时导入 OpenViking 和 OpenClaw(并行执行)
bash run_full_eval.sh --skip-import # 跳过导入步骤,直接运行 QA 评估
bash run_full_eval.sh --force-ingest # 强制重新导入所有数据
bash run_full_eval.sh --sample 0 # 只处理第 0 个 sample
脚本参数说明:
| 参数 | 说明 |
|---|---|
--skip-import | 跳过导入步骤,直接运行 QA 评估 |
--with-claw-import | 同时导入 OpenViking 和 OpenClaw(并行执行) |
--force-ingest | 强制重新导入所有数据(忽略已导入记录) |
--sample <index> | 只处理指定的 sample(0-based) |
脚本执行流程:
eval.py qa,输出到 result/qa_results.csv)judge.py,并行度 40)stat_judge_result.py,同时统计 QA 和 Import 的 token 使用)脚本内部配置参数:
在 run_full_eval.sh 脚本顶部可以修改以下配置:
| 变量 | 说明 | 默认值 |
|---|---|---|
INPUT_FILE | 输入数据文件路径 | ../data/locomo10.json |
RESULT_DIR | 结果输出目录 | ./result |
GATEWAY_TOKEN | OpenClaw Gateway Token | 需要设置为实际 openclaw 网关 token |
OpenClaw 评测包含以下脚本:
import_to_ov.py: 导入数据到 OpenVikingeval.py: OpenClaw 评估脚本(ingest/qa 两种模式)judge.py: LLM 裁判打分stat_judge_result.py: 统计评分结果和 token 使用python import_to_ov.py [选项]
参数说明:
--input: 输入文件路径(JSON 或 TXT),默认 ../data/locomo10.json--sample: 指定样本索引(0-based)--sessions: 指定会话范围,如 1-4--question-index: 根据 question 的 evidence 自动推断需要的 session--force-ingest: 强制重新导入--no-user-agent-id: 不传入 user_id 和 agent_id 给 OpenViking 客户端--openviking-url: OpenViking 服务地址,默认 http://localhost:1933--success-csv: 成功记录 CSV 路径,默认 ./result/import_success.csv--error-log: 错误日志路径,默认 ./result/import_errors.log示例:
# 导入所有数据(跳过已导入的)
python import_to_ov.py
# 强制重新导入,不使用 user/agent id
python import_to_ov.py --force-ingest --no-user-agent-id
# 只导入第 0 个 sample
python import_to_ov.py --sample 0
该脚本有两种模式:
python eval.py ingest <输入文件> [选项]
参数说明:
--sample: 指定样本索引--sessions: 指定会话范围,如 1-4--force-ingest: 强制重新导入--agent-id: Agent ID,默认 locomo-eval--token: OpenClaw Gateway Token示例:
# 导入第一个样本的 1-4 会话到 OpenClaw
python eval.py ingest locomo10.json --sample 0 --sessions 1-4 --token <token>
X-OpenClaw-Session-Key,确保每次 OpenClaw 使用相同的 session_idsession.jsonl 文件中的所有 assistant 轮次的 Token 消耗--parallel 参数)python eval.py qa <输入文件> [选项]
参数说明:
--output: 输出文件路径(不含 .csv 后缀)--sample: 指定样本索引--count: 运行的 QA 问题数量--user: 用户 ID,默认 eval-1--parallel: 并发数,默认 10,最大 40--token: OpenClaw Gateway Token(或设置 OPENCLAW_GATEWAY_TOKEN 环境变量)示例:
# 运行所有 sample 的 QA 评估
python eval.py qa locomo10.json --token <token> --parallel 15
# 只运行第 0 个 sample
python eval.py qa locomo10.json --sample 0 --output qa_results_sample0
python judge.py [选项]
参数说明:
--input: QA 结果 CSV 文件路径--parallel: 并发请求数,默认 40示例:
python judge.py --input ./result/qa_results.csv --parallel 40
同时统计 QA 结果和 OpenViking Import 的 token 使用:
python stat_judge_result.py [选项]
参数说明:
--input: QA 结果 CSV 文件路径,默认 ./result/qa_results_sample0.csv--import-csv: Import 成功 CSV 文件路径,默认 ./result/import_success.csv输出统计包括:
示例:
python stat_judge_result.py --input ./result/qa_results_sample0.csv --import-csv ./result/import_success.csv
[
{
"sample_id": "sample_001",
"conversation": {
"speaker_a": "Alice",
"speaker_b": "Bob",
"session_1": [
{
"speaker": "Alice",
"text": "你好,我是 Alice",
"img_url": [],
"blip_caption": ""
}
],
"session_1_date_time": "9:36 am on 2 April, 2023"
},
"qa": [
{
"question": "Alice 叫什么名字?",
"answer": "Alice",
"category": "1",
"evidence": []
}
]
}
]
必须包含字段:
sample_id: 样本 IDquestion: 问题answer: 标准答案| 文件 | 说明 |
|---|---|
result/locomo_qa_result.csv | QA 评估原始结果 |
result/judge_result.csv | 包含裁判打分的结果 |
result/summary.txt | 统计摘要 |
result/import_success.csv | 导入成功记录 |
result/import_errors.log | 导入错误日志 |
| 变量名 | 说明 |
|---|---|
ARK_API_KEY | 火山引擎 API Key(用于 judge.py) |
OPENAI_API_KEY | OpenAI API Key(备选) |
OPENCLAW_GATEWAY_TOKEN | OpenClaw Gateway Token |
A: 所有脚本都支持断点续传,重新运行相同命令会自动跳过已处理的项目。
A: 使用 --force-ingest(导入)或删除结果 CSV 文件。
A: 增加 --threads(run_eval.py)或 --parallel(其他脚本)参数值。
A: 先核对三处是否对齐:ovcli.conf.account(导入 account)、ov.conf.bot.ov_server.account_id(Vikingbot 查询 account)、评测脚本使用的 user(Vikingbot 按 sample_id,OpenClaw 默认 eval-1)。这几项不一致时,常见现象是“导入看起来成功,但评测回答质量明显下降或查不到上下文”。
导入完成后,查看 import_success.csv:
cd benchmark/locomo/openclaw
wc -l result/import_success.csv
result/import_errors.log 查看错误日志--force-ingest 重新导入查看 qa_results.csv 的 response 列:
cd benchmark/locomo/openclaw
# 查看前几行
head -n 5 result/qa_results.csv
# 查看是否有 ERROR
grep -i "error" result/qa_results.csv
检查内容:
response 列不应为空或报错信息result 列(judge 后)应有 CORRECT 或 WRONG如果 QA 回答不正常,可以检查 session 文件确认记忆是否被加载:
从 qa_results.csv 的 jsonl_filename 列获取 session 文件名:
jsonl_filename
5d497c96-9fb6-480c-be06-0c0849e193e9.jsonl.20260408_181433
在 OpenClaw 工作目录查看对应的 session 文件:
ls ~/.openclaw/agents/locomo-eval/sessions/
查看 session 文件内容,确认 query 前是否有记忆内容:
cat ~/.openclaw/agents/locomo-eval/sessions/<jsonl_filename> | grep -A 20 "type.*message"
预期结果:在用户提问(query)之前,应该有从 OpenViking 加载的记忆内容。
如果你感觉“明明导入了,回答还是不对劲”,先按这个顺序看:
~/.openviking/ovcli.conf,看 account 是不是你这次要用的账号。~/.openviking/ov.conf,重点看:
bot.ov_server.account_idserver.host / server.portaccount 和 OpenViking URL,确认和你配置里看到的一致。sample_id 当 user。--user eval-1 --agent-id locomo-eval。--user 或 --agent-id,要保证 ingest 和 qa 两边用的是同一套值。一句话:导入时的 account/user、评测时的 account/user、以及连接的服务地址,这三件事只要有一个没对齐,就很容易出现效果低或“查不到上下文”。
如果 stat_judge_result.py 输出的 token 数量异常:
import_success.csv 是否存在且有数据qa_results.csv 的 input_tokens/output_tokens 列