Implementation based on the paper "ReasoningBank: Scaling Agent Self-Evolving with Reasoning Memory"
SaferSkills independently audited ReasoningBank-MCP (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<!-- TOC -->
retrieve_memoryextract_memory<!-- /TOC -->
随着大语言模型代理在持久性现实角色中的日益普及,它们自然会遇到连续的任务流。然而,一个关键的限制是它们无法从累积的交互历史中学习,迫使它们丢弃宝贵的见解并重复过去的错误。基于论文ReasoningBank: Scaling Agent Self-Evolving with Reasoning Memory,我们实现了这个记忆增强推理系统,通过 MCP (Model Context Protocol) 协议为 AI 代理提供经验记忆管理能力。
ReasoningBank 提出了一种新颖的记忆框架,能够从代理自身判断的成功和失败经验中提炼出可泛化的推理策略。在测试时,代理从 ReasoningBank 中检索相关记忆来指导其交互,然后将新学到的知识整合回去,使其能够随着时间的推移变得更加强大。这种内存驱动的经验扩展为代理创建了一个新的扩展维度,使它们能够自我进化并产生新兴行为。
reasoning-bank-mcp/
├── src/
│ ├── server.py # MCP 服务器入口
│ ├── config.py # 配置管理
│ ├── tools/ # MCP 工具
│ │ ├── retrieve_memory.py # 检索记忆
│ │ └── extract_memory.py # 提取记忆
│ ├── retrieval/ # 检索策略
│ │ ├── base.py # 抽象接口
│ │ ├── factory.py # 策略工厂
│ │ └── strategies/ # 具体策略实现
│ ├── deduplication/ # 去重策略(v0.2.0+)
│ │ ├── base.py # 抽象接口
│ │ ├── factory.py # 策略工厂
│ │ └── strategies/
│ │ ├── hash_dedup.py # 哈希去重
│ │ └── semantic_dedup.py # 语义去重
│ ├── merge/ # 合并策略(v0.2.0+)
│ │ ├── base.py # 抽象接口
│ │ ├── factory.py # 策略工厂
│ │ └── strategies/
│ │ ├── llm_merge.py # LLM智能合并
│ │ └── voting_merge.py # 投票选择
│ ├── services/ # 服务层(v0.2.0+)
│ │ └── memory_manager.py # 记忆管理服务
│ ├── storage/ # 存储后端
│ │ ├── base.py # 抽象接口
│ │ └── backends/ # 具体存储实现
│ ├── llm/ # LLM 客户端
│ │ ├── base.py # 抽象接口
│ │ ├── factory.py # Provider 工厂
│ │ └── providers/ # 具体 Provider 实现
│ ├── prompts/ # 提示词模板
│ └── utils/ # 工具函数
└── data/ # 数据存储目录
├── memories.json # 记忆数据库
├── archived_memories.json # 归档记忆(v0.2.0+)
└── embeddings.json # 嵌入向量git clone https://github.com/hanw39/ReasoningBank-MCP.git
cd ReasoningBank-MCPpip install -e .#### 方式一:STDIO 模式(适用于 Claude Desktop、Cursor、Qoder、Cherry Studio 等)
{
"mcpServers": {
"reasoning-bank": {
"command": "reasoning-bank-mcp",
"env": {
"DASHSCOPE_API_KEY": "你的百炼APIKEY"
}
}
}
}#### 方式二:SSE 模式(适用于 Claude Desktop、Cursor、Qoder、Cherry Studio 等)
1) 启动服务器:
# 使用默认配置 (127.0.0.1:8000)
python3 -m src.server --transport sse
# 或指定主机和端口
python3 -m src.server --transport sse --host 0.0.0.0 --port 80802) 客户端配置:
{
"mcpServers": {
"reasoning-bank": {
"url": "http://127.0.0.1:8000/sse"
}
}
}#### Qoder
你是一个具备推理记忆能力的智能助手,你的agnet_id为`Qoder`,在使用MCP时必须传入“agent_id”=“Qoder”。拥有两个核心MCP工具:
1. `retrieve_memory`:用于在任务开始或方向改变时检索相关经验。
2. `extract_memory`:用于在任务结束或失败后提取并保存经验。
你必须严格遵循以下行为准则:
【记忆策略规则】
① **任务开始前必须调用MCP的 `retrieve_memory`**
- 在你开始执行任何复杂任务(如写代码、分析、规划、调试、总结等)之前,先调用此工具。
- 输入的 `query` 应描述当前任务目标或用户需求。
- 如果当前任务与上一次任务在主题、目标或上下文上存在明显差异,也必须再次调用 `retrieve_memory`。
② **任务方向转变时调用MCP的 `retrieve_memory`**
- 当你发现用户修改了任务目标、问题方向、文件对象或上下文内容时,应立即重新调用 `retrieve_memory`。
- 保证你始终基于最新的上下文记忆进行思考。
③ **任务结束后必须调用MCP的 `extract_memory`**
- 当你认为任务已经完成时(即输出最终答案或解决方案前),必须调用 `extract_memory`。
- 轨迹(trajectory)应包含任务执行的重要步骤、对话与关键推理。
- 即使用户没有明确要求保存,也必须执行。
④ **出现失败时调用 `extract_memory`**
- 如果任务执行失败、报错、或用户表示“不成功”“不对”“需要重新来”等情况,也必须调用一次 `extract_memory`。
- 在失败情境下记录失败原因和改进线索。
⑤ **至少调用一次**
- 每个独立任务周期中,必须至少:
- 1 次 `retrieve_memory`
- 1 次 `extract_memory`python3 -m src.server --help
# 可用参数:
# --transport {stdio,sse} 传输方式 (默认: stdio)
# --host HOST SSE 模式的主机地址 (默认: 127.0.0.1)
# --port PORT SSE 模式的端口号 (默认: 8000)如果需要自定义配置,可以编辑 config.yaml:
# LLM Provider 配置
llm:
provider: "dashscope" # dashscope | openai | anthropic
dashscope:
api_key: "${DASHSCOPE_API_KEY}"
chat_model: "qwen-plus"
# Embedding Provider 配置
embedding:
provider: "dashscope" # dashscope | openai
dashscope:
model: "text-embedding-v3"
# 检索策略配置
retrieval:
strategy: "hybrid"
min_score_threshold: 0.85 # 最小相关度阈值
hybrid:
weights:
semantic: 0.6
confidence: 0.2
success: 0.15
recency: 0.05
# 记忆管理器配置(v0.2.0+)
memory_manager:
enabled: true # 启用记忆管理器
# 去重配置
deduplication:
strategy: "semantic" # semantic
on_extraction: true # 提取时实时去重
semantic:
threshold: 0.90 # 相似度阈值
top_k_check: 5 # 检查前K条相似记忆
# 合并配置
merge:
strategy: "llm" # llm | voting
auto_execute: true # 自动执行合并
trigger:
min_similar_count: 3 # 最少相似记忆数
similarity_threshold: 0.85 # 相似度阈值
llm:
temperature: 0.7
original_handling: "archive" # 原始经验归档retrieve_memory检索相关的历史经验记忆,帮助指导当前任务的执行。
参数:
query (string, 必填): 当前任务的查询描述top_k (number, 可选): 检索的记忆数量,默认 1agent_id (string, 可选): Agent ID,用于多租户隔离"claude-code"、"code-reviewer" 等返回:
{
"status": "success",
"min_score_threshold": 0.85,
"filtered_count": 2,
"memories": [
{
"memory_id": "mem_001",
"score": 0.92,
"title": "完整历史查询策略",
"content": "...",
"success": true,
"agent_id": "claude-code"
}
],
"formatted_prompt": "以下是我从过去与环境的交互中积累的一些记忆项..."
}说明:
min_score_threshold: 使用的最小相关度阈值filtered_count: 被过滤掉的低相关度记忆数量score: 记忆的相关度分数(0.0-1.0),只返回高于阈值的记忆extract_memory从任务轨迹中提取推理经验并保存到记忆库。
参数:
trajectory (array, 必填): 任务执行的轨迹步骤列表step (number), role (string), content (string), metadata (object, 可选)query (string, 必填): 任务查询描述success_signal (boolean, 可选): 任务是否成功,null 时自动判断async_mode (boolean, 可选): 是否异步处理,默认 trueagent_id (string, 可选): Agent ID,用于多租户隔离"claude-code"、"java-developer" 等返回(异步模式):
{
"status": "processing",
"message": "记忆提取任务已提交,正在后台处理",
"task_id": "extract_12345",
"async_mode": true
}返回(同步模式):
{
"status": "success",
"message": "记忆提取成功",
"memory_id": "mem_123",
"agent_id": "claude-code"
}支持两种检索策略:
#### 相关度阈值过滤
通过 min_score_threshold 配置项可以过滤低相关度的记忆:
retrieval:
strategy: "hybrid"
min_score_threshold: 0.85 # 可调整,范围 0.0-1.0
hybrid:
weights:
semantic: 0.6
confidence: 0.2
success: 0.15
recency: 0.05推荐配置:
支持多种模型 API:
llm:
provider: "dashscope"
dashscope:
api_key: "${DASHSCOPE_API_KEY}"
chat_model: "qwen-plus"
embedding:
provider: "dashscope"
dashscope:
model: "text-embedding-v3"记忆管理系统提供自动化的去重和合并功能,提升记忆质量和存储效率。
#### 去重策略
#### 合并策略
支持两种合并策略:
#### 工作流程
提取记忆时:
1. LLM 提取经验
2. 去重检查(按 agent_id 隔离)
3. 跳过重复经验
4. 检测合并机会
5. 后台触发合并任务(不阻塞)
后台合并:
1. 调用合并策略
2. 生成合并后的经验
3. 原始经验归档
4. 保持完整追溯链#### 配置建议
# 生产环境
memory_manager:
deduplication:
strategy: "semantic" # 高质量
semantic:
threshold: 0.92 # 更严格
merge:
strategy: "llm" # 最佳效果
auto_execute: true# 1. 任务开始前,检索相关经验
result = await mcp_call("retrieve_memory", {
"query": "在购物网站上找到用户最早的订单日期",
"top_k": 1,
"agent_id": "claude-code" # 可选:指定 agent ID
})
# AI 获得提示:
# "以下是从过去经验学到的:
# 记忆 1 [✓ 成功经验] - 完整历史查询策略
# 不要只查看 'Recent Orders',需要导航到完整的订单历史页面..."
# 2. 执行任务(生成轨迹)
trajectory = [
{"step": 1, "role": "user", "content": "找到最早的订单"},
{"step": 2, "role": "assistant", "content": "点击订单历史"},
{"step": 3, "role": "tool", "content": "成功找到 2020-01-15 的订单"}
]
# 3. 任务完成后,提取经验
await mcp_call("extract_memory", {
"trajectory": trajectory,
"query": "在购物网站上找到用户最早的订单日期",
"agent_id": "claude-code", # 可选:标记记忆所属 agent
"async_mode": True # 异步处理,不阻塞
})使用 agent_id 参数实现不同 Agent 之间的记忆隔离:
# 顶级 Agent (Claude Code)
await mcp_call("retrieve_memory", {
"query": "优化 Python 代码性能",
"agent_id": "claude-code", # 只检索 claude-code 的记忆
"top_k": 2
})
# 子代理 (Code Reviewer)
await mcp_call("retrieve_memory", {
"query": "检查代码安全性问题",
"agent_id": "code-reviewer", # 只检索 code-reviewer 的记忆
"top_k": 2
})
# 子代理 (Java Developer)
await mcp_call("retrieve_memory", {
"query": "实现 Spring Boot API",
"agent_id": "java-developer", # 只检索 java-developer 的记忆
"top_k": 2
})
# 不指定 agent_id:检索所有记忆
await mcp_call("retrieve_memory", {
"query": "通用编程最佳实践",
"top_k": 3
})记忆隔离规则:
agent_id 的记忆完全隔离agent_id 的记忆可跨会话共享agent_id 时检索所有记忆agent_idpytest tests/black src/
ruff check src/基于论文:ReasoningBank: Memory as Test-Time Compute Scaling
MIT License
新增功能:
性能优化:
文档更新:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.