🧠 多智能体记忆系统 — 内部运维文档
服务器: 43.156.57.141 (新加坡腾讯云) |
域名: memory.lsz.name |
版本: 3.0.2 |
最后更新: 2026-06-22
✅ 系统状态: 所有组件运行正常
MySQL 8.0.46 · Redis 6.0.16 · BGE-small-zh-v1.5 (512维) · Gunicorn + Flask · Nginx + SSL (Let's Encrypt)
2 个团队 · 4 个 Agent · 32+ 个人记忆 · 4 条团队记忆 · v3.0.2 性能优化(LLM thinking mode 禁用)
🏗️ 架构概览
| 组件 | 技术 | 端口 | 说明 |
| API 服务 | Flask + Gunicorn | 8081 (local) | HTTP JSON API |
| Nginx | nginx 1.18 | 443 (SSL) | 反向代理 + SSL 终止 |
| 持久存储 | MySQL 8.0.46 | 3306 | 记忆数据 + 向量 BLOB |
| 缓存层 | Redis 6.0.16 | 6379 | 工作记忆 (TTL 24h) |
| Embedding | BGE-small-zh-v1.5 | 8080 (local) | 512维语义向量 |
🔐 API 认证 HMAC-SHA256
除 GET /health 和 /admin/* 外,所有 API 端点均需以下 HTTP 头:
| Header | 说明 |
X-API-Key | API Key(以 msk_ 前缀开头) |
X-Timestamp | Unix 时间戳(秒,5分钟内有效) |
X-Signature | HMAC-SHA256(secret, timestamp + request_body) |
认证流程
- 获取 API Key 和 Secret(通过
/admin/api-keys 端点,仅限 localhost)
- 构造请求体(JSON),取当前 Unix 时间戳
- 计算签名:
signature = HMAC-SHA256(secret, str(timestamp) + json_body)
- 在请求头中附加三个认证字段
Python 认证示例
import time, hmac, hashlib, json, requests
API_KEY = "msk_xxx..."
SECRET = "xxx..."
BASE = "https://memory.lsz.name"
def api(method, path, body=None):
ts = str(time.time())
body_bytes = json.dumps(body).encode() if body else b""
sig = hmac.new(
SECRET.encode(), ts.encode() + body_bytes, hashlib.sha256
).hexdigest()
headers = {
"Content-Type": "application/json",
"X-API-Key": API_KEY,
"X-Timestamp": ts,
"X-Signature": sig,
}
resp = requests.request(method, BASE + path, data=body_bytes, headers=headers)
return resp.json()
# 使用示例
result = api("POST", "/memories/personal/search", {
"agent_id": "yihui",
"query": "策略回测",
"limit": 5
})
⚠️ 注意: Secret 仅在创建时显示一次,不会再次展示。请妥善保管。
Admin 端点仅限 127.0.0.1 访问,外部请求会被拒绝(403)。
👥 多团队隔离
所有记忆数据通过 team_id 字段实现硬隔离。查询时强制 WHERE team_id = ?。每个团队的 API Key 绑定固定的 team_id,跨团队数据完全不可见。
当前团队
| Team ID | 名称 | Agent 数 | API Key |
hermes1 | 策略研究部 | 2 (弈回, 云策) | msk_a192...85 |
wangcheng | 王成 | 2 (Hermes Agent, OpenClaw Main) | msk_6804...18 |
📋 记忆类型
| 类型 | 存储 | 生命周期 | 说明 |
| 个人长期记忆 | MySQL | 持久化 | 每个 Agent 独立的持久记忆,支持语义检索 |
| 个人工作记忆 | Redis List | TTL 24h | 短期上下文缓存 |
| 团队共享记忆 | MySQL | 持久化 | 同团队内所有 Agent 可访问的知识库 |
📡 API 端点
公开端点(无需认证)
团队管理
| 方法 | 路径 | 说明 |
| POST | /teams | 创建团队 |
| GET | /teams/{team_id} | 获取团队信息 |
| DELETE | /teams/{team_id} | 删除团队(级联删除所有关联数据) |
Agent 管理
| 方法 | 路径 | 说明 |
| POST | /agents | 创建 Agent |
| GET | /agents/{agent_id} | 获取 Agent 信息 |
个人记忆
| 方法 | 路径 | 说明 |
| POST | /memories/personal | 添加个人记忆(自动生成 embedding) |
| POST | /memories/personal/search | 语义检索个人记忆(团队隔离) |
| GET | /memories/personal/recent/{agent_id} | 获取最近个人记忆 |
| GET | /memories/personal/{memory_id} | 获取单条个人记忆 |
| PUT | /memories/personal/{memory_id} | 更新个人记忆 |
| DELETE | /memories/personal/{memory_id} | 删除个人记忆 |
工作记忆
| 方法 | 路径 | 说明 |
| POST | /memories/working | 添加工作记忆(Redis,TTL 24h) |
| GET | /memories/working/{agent_id} | 获取工作记忆 |
| DELETE | /memories/working/{agent_id} | 清空工作记忆 |
团队记忆
| 方法 | 路径 | 说明 |
| POST | /memories/team | 添加团队共享记忆 |
| POST | /memories/team/search | 语义检索团队记忆 |
| GET | /memories/team/recent/{team_id} | 获取最近团队记忆 |
| PUT | /memories/team/{memory_id} | 更新团队记忆 |
| DELETE | /memories/team/{memory_id} | 删除团队记忆 |
生命周期管理
| 方法 | 路径 | 说明 |
| POST | /lifecycle/compress | 压缩工作记忆到长期记忆 |
| POST | /lifecycle/cleanup | 清理过期/低重要性记忆 |
| POST | /lifecycle/extract-facts | 原子事实提取(LLM, 5-15s) |
| POST | /lifecycle/aggregate-scenes | 场景聚合(LLM, 5-15s) |
| POST | /lifecycle/generate-persona | 画像生成(LLM, 5-15s) |
| POST | /lifecycle/auto-config | Pipeline 自动化配置 |
| GET | /lifecycle/scenarios/{agent_id} | 获取场景块 |
| GET | /lifecycle/persona/{agent_id} | 获取用户画像 |
统计
| 方法 | 路径 | 说明 |
| GET | /stats?team_id=xxx | 获取系统统计信息 |
Admin 端点 仅 localhost
| 方法 | 路径 | 说明 |
| POST | /admin/api-keys | 创建 API Key(需 team_id, name) |
| GET | /admin/api-keys | 列出所有 API Key |
| DELETE | /admin/api-keys/{key_id} | 禁用 API Key |
⚡ 性能指标(2026-06-08 验证)
| 指标 | 实测值 | 目标 | 状态 |
| 写入延迟 P50 | 14.4ms | — | ✅ |
| 写入延迟 P99 | 16.3ms | < 100ms | ✅ PASS |
| 检索延迟 P50 | 17.9ms | — | ✅ |
| 检索延迟 P99 | 27.5ms | < 50ms | ✅ PASS |
| 进程 RSS | 51 MB | < 1.5 GiB | ✅ PASS |
| 团队隔离 | 100% | 100% | ✅ PASS |
🗄️ 数据库表结构
| 表名 | 说明 |
teams | 团队信息(id, name, description, config JSON) |
agents | Agent 信息(id, team_id FK, name, role) |
personal_memories | 个人长期记忆(agent_id, team_id, content, embedding BLOB, importance, metadata JSON) |
team_memories | 团队共享记忆(team_id, content, embedding BLOB, importance, category, metadata JSON) |
api_keys | API 认证密钥(team_id, api_key, secret, is_active) |
pipeline_config | Pipeline 自动化配置(compress_every_n, cleanup_idle_days, warmup 等) |
memory_scenarios | 场景块(team_id, agent_id, name, summary, memory_ids JSON) |
user_personas | 用户画像(team_id, agent_id, preferences/habits/expertise JSON, summary) |
🔧 运维操作
服务管理
# 查看服务状态
sudo systemctl status memory-system
# 重启服务
sudo systemctl restart memory-system
# 查看日志
sudo journalctl -u memory-system -f --no-pager -n 100
# Nginx 配置测试
sudo nginx -t
# 重载 Nginx
sudo systemctl reload nginx
项目路径
/opt/memory-system/ # 项目根目录
/opt/memory-system/venv/ # Python 虚拟环境
/opt/memory-system/config.py # 配置文件
/opt/memory-system/app.py # Flask 入口 + JSON 序列化
/opt/memory-system/api/routes.py # API 路由
/opt/memory-system/auth/api_auth.py # HMAC 认证中间件
/opt/memory-system/storage/ # MySQL + Redis + 向量检索
/opt/memory-system/lifecycle/ # 记忆生命周期管理
/opt/memory-system/tests/ # 测试
/opt/memory-system/docs/ # 公网文档
关键配置
# config.py
MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306
MYSQL_USER = "your_db_user"
MYSQL_DATABASE = "memory_system"
MYSQL_UNIX_SOCKET = "/var/run/mysqld/mysqld.sock"
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
EMBEDDING_SERVICE_URL = "http://127.0.0.1:8080"
EMBEDDING_DIM = 512
API_PORT = 8081
WORKING_MEMORY_TTL = 86400 # 24小时
创建新 API Key(SSH 到服务器)
# 通过 localhost 访问 admin 端点
curl -X POST http://127.0.0.1:8081/admin/api-keys \
-H 'Content-Type: application/json' \
-d '{"team_id": "your_team_id", "name": "Your Key Name"}'
# 响应中会包含 api_key 和 secret(仅显示一次)
SSL 证书
# 自动续期已配置,手动测试:
sudo certbot renew --dry-run
# 证书路径:
/etc/letsencrypt/live/memory.lsz.name/fullchain.pem
/etc/letsencrypt/live/memory.lsz.name/privkey.pem
🔒 安全说明
- Redis 已禁用 FLUSHALL/FLUSHDB/DEBUG/SHUTDOWN 命令
- Redis CONFIG/KEYS 命令已重命名(CONFIG_b9f7e2d4, KEYS_a3c8f1e6)
- MySQL 使用 unix socket 连接
- Nginx 强制 HTTPS (Let's Encrypt)
- API 仅监听 127.0.0.1,通过 Nginx 暴露公网
- Admin 端点仅限 localhost 访问
- API 使用 HMAC-SHA256 签名认证,时间戳窗口 5 分钟
🧪 测试验证
# 运行测试
cd /opt/memory-system
./venv/bin/python tests/test_memory.py
测试覆盖: 创建团队/Agent → 写入记忆 → 语义检索 → 跨团队隔离 → 工作记忆 → 性能基准
✅ 2026-06-08 验证结果:
14/14 项测试全部通过,包括:
• 健康检查 · 统计端点 · 团队信息查询
• 个人记忆语义检索 · 团队记忆语义检索
• 写入+搜索+更新+删除全流程
• 跨团队隔离验证(wangcheng 看不到 hermes1 数据)
• 工作记忆 CRUD · 认证拒绝测试
📋 变更日志
v3.0.2 (2026-06-22) — 性能优化
核心修复:禁用 DeepSeek thinking mode
根因:DeepSeek v4-flash 默认开启思考模式,每次 LLM 调用输出 3000-7500 字符中文推理链,token 预算被吃光
修复:llm_client.py 新增 thinking 参数透传;llm_parse.py 所有 JSON 生成任务添加 thinking={"type": "disabled"}
实测提速:aggregate-scenes 7.9x, generate-persona 4.9x, extract-facts 2.0s
v3.0.1-bugfix (2026-06-22) — Bug 修复
• BGE 长文本双保险截断(服务端 512 tokens + 客户端 2000 字符)
• 空 query fallback 到 get_recent
• embedding 失败返回友好错误,不暴露内部 URL
• GET /memories/personal/{id} 405 → 补上 GET 路由
• aggregate-scenes JSON 解析失败 → thinking mode 禁用
v3.0.0 (2026-06-08) — 生命周期管理
• Pipeline 自动化引擎(自动压缩、清理、暖机)
• 原子事实提取(/lifecycle/extract-facts)
• 场景聚合(/lifecycle/aggregate-scenes)
• 用户画像生成(/lifecycle/generate-persona)