mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-08-28 05:25:04 +00:00
* feat(benchmark): 添加 LongMemEval 评估功能和内存检索器 - 实现了 LongMemEval 数据集的评估管道 - 添加了 PersonalLongmemevalRetriever 和 PersonalLongmemevalSummarizer - 创建了详细的统计分析工具 compute_stats.py - 实现了完整的答案判断和准确性计算功能 - 集成了 ReMe 内存操作和查询功能 - 添加了性能指标和时间统计功能 * feat(benchmark): 添加内存准确性和完整性评估功能 - 实现了 evaluation_for_memory_accuracy 函数用于评估提取内存的准确性 - 实现了 evaluation_for_memory_integrity 函数用于评估内存完整性 - 创建了 MemoryIntegrityEvaluator 类来评估内存点覆盖情况 - 创建了 MemoryAccuracyEvaluator 类来评估提取内存的准确性 - 添加了 compute_memory_integrity_metrics 和 compute_memory_accuracy_metrics 统计函数 - 在 MetricsAggregator 中集成内存完整性和准确性指标计算 - 更新了命令行参数默认值:top_k 改为 10,batch_size 改为 16 - 重构了个人记忆汇总器中的工具循环逻辑 - 更新了评估提示词模板以支持内存质量评估 - 添加了新的检索配置和模型设置 * feat(memory): 添加个人记忆摘要器配置文件 - 新增 personal_halumem_summarizer_adddraft.yaml 配置文件 - 新增 personal_halumem_summarizer_original_backup.yaml 备份配置文件 - 实现记忆架构师系统提示和用户消息模板 - 实现个人资料代理系统提示和用户消息模板 - 支持生物特征和行为模式记忆存储 - 实现记忆去重和合并功能 - 支持用户个人资料的动态更新和删除操作 * feat(memory): 添加个人记忆摘要器配置文件 - 新增 personal_halumem_summarizer_adddraft.yaml 配置文件 - 新增 personal_halumem_summarizer_original_backup.yaml 备份配置文件 - 实现记忆架构师系统提示和用户消息模板 - 实现个人资料代理系统提示和用户消息模板 - 支持生物特征和行为模式记忆存储 - 实现记忆去重和合并功能 - 支持用户个人资料的动态更新和删除操作 * docs(readme): 添加 ReMe Memory Agent 详细介绍文档 - 创建英文版 README.md 包含核心概念、架构设计和使用指南 - 创建中文版 README_ZH.md 提供完整的本地化文档 - 介绍 Agent 驱动的记忆管理理念和层次化检索机制 - 详述项目架构包括 ReMeSummarizer 和 ReMeRetriever 组件 - 提供快速开始示例和程序化内存操作方法 - 展示 LoCoMo、LongMemEval、HaluMem 基准测试结果 - 包含完整的项目结构说明和配置要求 * chore(config): 移除配置文件中的API密钥 - 从配置文件中删除FLOW_LLM_API_KEY环境变量设置 - 移除相关的API密钥配置项 - 更新配置文档以反映新的安全实践 - 确保敏感信息不再硬编码在配置文件中 - 添加注释说明如何通过环境变量方式配置API密钥 * fix(benchmark): 修复模型调用和配置参数问题 - 修正了reme.get_llm方法的参数传递,移除冗余的name参数 - 添加了qwen3-max模型的配置支持 - 调整了默认并发数从16降至4以提高稳定性 - 修改算法版本默认值从longmemeval和v1统一为default - 减少每类样本数量默认值从16至2以优化测试效率 * feat(benchmark): 添加记忆准确性和完整性评估功能 - 修改了 simple_request_for_json 调用以支持模型名称参数 - 新增 evaluation_for_memory_accuracy 函数用于评估记忆准确性 - 新增 evaluation_for_memory_integrity 函数用于评估记忆完整性 - 将默认模型名称从 qwen3-max 更改为 None - 更新提取记忆逻辑以过滤 time_int 和 when_to_use 字段 - 新增 MemoryIntegrityEvaluator 类用于评估记忆完整性 - 新增 MemoryAccuracyEvaluator 类用于评估记忆准确性 - 添加 compute_memory_integrity_metrics 方法计算记忆完整性指标 - 添加 compute_memory_accuracy_metrics 方法计算记忆准确性指标 - 配置多种新 LLM 模型包括 qwen-plus-t、qwen-max-t、gpt-4o-mini 等 - 初始化完整性评估器和准确性评估器实例 - 在会话数据中添加记忆完整性和准确性评估结果 - 收集记忆完整性记录和准确性记录用于统计 - 在最终结果中包含记忆完整性和准确性指标 - 更新摘要打印方法显示记忆完整性和准确性统计信息 - 更新默认评估模型为 gpt-4o-mini-2024-07-18 * docs(readme): 删除 ReMe Memory Agent 的中英文文档 - 移除英文版 README.md 中关于 ReMe Memory Agent 的详细介绍 - 删除中文版 README_ZH.md 中关于 ReMe Memory Agent 的完整文档 - 清理了包括架构图、功能特性、快速开始和实验数据在内的所有文档内容
232 lines
6.3 KiB
Python
232 lines
6.3 KiB
Python
"""Evaluation tools for ReMe LongMemEval benchmark."""
|
|
|
|
from pathlib import Path
|
|
|
|
import yaml
|
|
|
|
from reme.reme import ReMe
|
|
|
|
|
|
# Load prompts from YAML file
|
|
_YAML_PATH = Path(__file__).parent / "eval_reme.yaml"
|
|
with open(_YAML_PATH, "r", encoding="utf-8") as f:
|
|
_PROMPTS = yaml.safe_load(f)
|
|
|
|
|
|
async def evaluation_for_memory_integrity(
|
|
reme: ReMe,
|
|
extract_memories: str,
|
|
target_memory: str,
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Memory Integrity Evaluation
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
extract_memories: A formatted string concatenating all memory points extracted by the memory system.
|
|
target_memory: The target key memory point.
|
|
model_name: Model name for evaluation
|
|
|
|
Returns:
|
|
dict with 'reasoning' and 'score' fields
|
|
"""
|
|
prompt = _PROMPTS["EVALUATION_PROMPT_FOR_MEMORY_INTEGRITY"].format(
|
|
memories=extract_memories,
|
|
expected_memory_point=target_memory,
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
async def evaluation_for_memory_accuracy(
|
|
reme: ReMe,
|
|
dialogue: str,
|
|
golden_memories: str,
|
|
candidate_memory: str,
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Memory Accuracy Evaluation
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
dialogue: The complete human-machine dialogue record.
|
|
golden_memories: The core memory points for this dialogue segment in the evaluation set .
|
|
candidate_memory: A specific memory point extracted by the memory system being evaluated.
|
|
model_name: Model name for evaluation
|
|
|
|
Returns:
|
|
dict with 'accuracy_score', 'is_included_in_golden_memories', and 'reason' fields
|
|
"""
|
|
prompt = _PROMPTS["EVALUATION_PROMPT_FOR_MEMORY_ACCURACY"].format(
|
|
dialogue=dialogue,
|
|
golden_memories=golden_memories,
|
|
candidate_memory=candidate_memory,
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
async def evaluation_for_update_memory(
|
|
reme: ReMe,
|
|
extract_memories: str,
|
|
target_update_memory: str,
|
|
original_memory: str,
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Memory Update Evaluation
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
extract_memories: A formatted string concatenating all memory points extracted by the memory system .
|
|
target_update_memory: The target updated memory point.
|
|
original_memory: A formatted string concatenating all original memory points corresponding.
|
|
model_name: Model name for evaluation
|
|
|
|
Returns:
|
|
dict with 'reason' and 'evaluation_result' fields
|
|
"""
|
|
prompt = _PROMPTS["EVALUATION_PROMPT_FOR_UPDATE_MEMORY"].format(
|
|
memories=extract_memories,
|
|
updated_memory=target_update_memory,
|
|
original_memory=original_memory,
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
async def evaluation_for_question(
|
|
reme: ReMe,
|
|
question: str,
|
|
reference_answer: str,
|
|
key_memory_points: str,
|
|
response: str,
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Question-Answering Evaluation
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
question: The question string to be evaluated.
|
|
reference_answer: The reference (gold-standard) answer.
|
|
key_memory_points: The memory points used to derive the reference answer.
|
|
response: The answer produced by the memory system.
|
|
model_name: Model name for evaluation
|
|
|
|
Returns:
|
|
dict with 'reasoning' and 'evaluation_result' fields
|
|
"""
|
|
prompt = _PROMPTS["EVALUATION_PROMPT_FOR_QUESTION"].format(
|
|
question=question,
|
|
reference_answer=reference_answer,
|
|
key_memory_points=key_memory_points,
|
|
response=response,
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
async def evaluation_for_question2(
|
|
reme: ReMe,
|
|
question: str,
|
|
reference_answer: str,
|
|
key_memory_points: str,
|
|
response: str,
|
|
dialogue: str = "",
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Question-Answering Evaluation with Dialogue Context (Version 2)
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
question: The question string to be evaluated.
|
|
reference_answer: The reference (gold-standard) answer.
|
|
key_memory_points: The memory points used to derive the reference answer.
|
|
response: The answer produced by the memory system.
|
|
dialogue: The formatted dialogue history (role, content, time_created).
|
|
model_name: Model name for evaluation
|
|
|
|
Returns:
|
|
dict with 'reasoning' and 'evaluation_result' fields
|
|
"""
|
|
prompt = _PROMPTS["EVALUATION_PROMPT_FOR_QUESTION2"].format(
|
|
question=question,
|
|
reference_answer=reference_answer,
|
|
key_memory_points=key_memory_points,
|
|
response=response,
|
|
dialogue=dialogue if dialogue else "",
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|
|
|
|
|
|
async def answer_question_with_memories(
|
|
reme: ReMe,
|
|
question: str,
|
|
memories: str,
|
|
user_id: str = None,
|
|
model_name: str = "qwen3-max",
|
|
) -> dict:
|
|
"""
|
|
Answer a question using retrieved memories with PROMPT_MEMZERO_JSON template.
|
|
|
|
Args:
|
|
reme: ReMe instance
|
|
question: The question to answer
|
|
memories: The retrieved memories (formatted as context)
|
|
user_id: Optional user ID for context formatting
|
|
model_name: Model name for LLM request
|
|
|
|
Returns:
|
|
dict with 'reasoning' and 'answer' fields
|
|
"""
|
|
# Format context with memories
|
|
if user_id:
|
|
context = _PROMPTS["TEMPLATE_MEMOS"].format(
|
|
user_id=user_id,
|
|
memories=memories,
|
|
)
|
|
else:
|
|
context = f"Memories:\n{memories}"
|
|
|
|
# Use PROMPT_MEMZERO_JSON template for structured JSON response
|
|
prompt = _PROMPTS["PROMPT_MEMZERO_JSON"].format(
|
|
context=context,
|
|
question=question,
|
|
)
|
|
|
|
result = await reme.llm.simple_request_for_json(
|
|
prompt=prompt,
|
|
model_name=model_name,
|
|
)
|
|
|
|
return result
|