10KB 的系统提示词记忆区 → 知识图谱驱动的语义检索。从 hermes-agent 出发,一步步搭建自带 GPU 向量检索引擎的长期记忆系统。
一、为什么 AI Agent 需要自己的记忆系统?
LLM 本身是无状态的。每次对话结束,上下文就消失了。AI Agent 框架(hermes-agent、Claude Code、Codex 等)通过两种方式解决这个问题:
1. 系统提示词注入 (hermes-agent 的 memory 工具) 每次新会话,把历史记忆拼进 system prompt。问题是:有 10,000 字符硬限制。跑几天就满了------旧记忆被挤出,新记忆没位置。
2. 外部向量数据库 把记忆存到外部的向量库里,按需检索注入。容量无限,检索精准。
本文讲的是第 2 种------如何给 hermes-agent 挂一个完整的本地记忆系统。
二、选型:Hindsight 对比其他方案
hermes-agent v0.15.0 内置了 8 个 memory provider 插件:Honcho、Mem0、Supermemory、Byterover、Hindsight、Holographic、OpenViking、RetainDB。
为什么选 Hindsight?
| 特性 | Hindsight | 其他 provider |
|---|---|---|
| 部署模式 | Cloud / Local Embedded / Local External | 多数仅云 |
| 本地 GPU | ✅ 支持外部 embedding 服务 | ❌ |
| 知识图谱 | ✅ 实体解析 + 关系图 | 部分支持 |
| 检索方式 | 语义 + 关键词 + 实体图遍历 + 重排序 | 多为纯向量 |
| 自动提取 | ✅ auto_retain 自动结构化事实 | 部分支持 |
| 中文嵌入 | ✅ 可指定 bge-large-zh | 默认英文 |
最关键的:Hindsight 支持 local_external 模式------你可以自己部署 embedding 服务,Hindsight 只负责存储和检索。这意味着你可以用任何兼容 OpenAI API 的 embedding 服务,包括本地 GPU 跑 vLLM。
三、架构:三种部署模式
模式 A:local_embedded(最简,5 分钟)
scss
hermes-agent 本机
┌──────────────────────────┐
│ Hindsight daemon (自动管理)│
│ ├ BGE-small (CPU, 130MB) │
│ ├ PostgreSQL (pg0 内嵌) │
│ └ LLM 提取 → 任何 API │
└──────────────────────────┘
一条命令:
bash
hermes memory setup # 选 hindsight → local_embedded
适合:快速体验。embedding 跑 CPU,个人使用完全够。
模式 B:local_embedded + 外部 GPU embedding
ini
GPU 服务器 (可选) hermes-agent 本机
┌──────────────┐ ┌──────────────────────────┐
│ vLLM / TEI │←────────│ Hindsight daemon │
│ bge-large │ 内网 │ embedding provider=openai │
│ :8000 │ │ → http://gpu-server:8000 │
└──────────────┘ └──────────────────────────┘
配置:
json
{
"mode": "local_embedded",
"llm_provider": "groq",
"llm_api_key": "你的key"
}
bash
# Hindsight 环境变量
HINDSIGHT_API_EMBEDDINGS_PROVIDER=openai
HINDSIGHT_API_EMBEDDINGS_OPENAI_BASE_URL=http://gpu-server:8000/v1
HINDSIGHT_API_EMBEDDINGS_OPENAI_MODEL=BAAI/bge-large-zh-v1.5
适合:已有 GPU 服务器,想加速 embedding。
模式 C:全 Docker 部署(本文重点)
yaml
GPU 节点 (Docker) hermes-agent 本机
┌────────────────────────────┐ ┌────────────────────┐
│ vLLM 容器 :8000 │ │ config.yaml: │
│ + Hindsight 容器 :8888 │←─────│ memory.provider: │
│ ├ LLM → 任何 provider │ HTTP │ hindsight │
│ ├ Embedding → vLLM(GPU) │ │ mode: local_external│
│ └ PG (pg0) │ └────────────────────┘
└────────────────────────────┘
优势:每个组件独立容器,可分别部署到不同机器,升级和排障互不影响。
四、实战:Jetson Orin 上部署 vLLM + Hindsight
4.1 硬件要求
| 组件 | 最低 | 推荐 |
|---|---|---|
| vLLM + bge-large | 4GB 显存 | 8GB+ |
| Hindsight | 512MB RAM | 1GB |
| PostgreSQL | 512MB RAM | 1GB |
| 总计 | ~5GB 显存 + 2GB RAM | --- |
我用的是 NVIDIA Jetson AGX Orin(30GB 统一内存,CUDA 12.6)。普通 Linux 服务器 + NVIDIA GPU 也完全适用。
4.2 关键镜像
vLLM 没有官方 ARM64 镜像。Jetson 用户需要用社区编译版:
bash
ghcr.io/yuyirobotlab/vllm-orin:0.19.0
x86_64 用户直接用官方:
bash
docker pull vllm/vllm-openai:latest
Hindsight 官方支持多架构:
bash
ghcr.io/vectorize-io/hindsight-api:latest # 支持 amd64 + arm64
国内用户拉镜像慢,可用 GHCR 代理:
arduino
docker pull ghcr.1ms.run/vectorize-io/hindsight-api:latest
4.3 启动 vLLM embedding 服务
bash
docker run -d --name vllm \
--network host \
--gpus all \
-e HF_ENDPOINT=https://hf-mirror.com \
vllm/vllm-openai:latest \
--model BAAI/bge-large-zh-v1.5 \
--runner pooling \
--host 0.0.0.0 --port 8000 \
--gpu-memory-utilization 0.3 \
--enforce-eager
几个关键参数说明:
--runner pooling:vLLM 0.19+ 的 embedding 模式(旧版用--task embedding已弃用)--gpu-memory-utilization 0.3:embedding 模型只有 1.3GB,不需要占满显存--enforce-eager:跳过 JIT 编译加速首次启动(Jetson 上编译要 10+ 分钟)HF_ENDPOINT:国内必设,否则模型下载失败
验证:
bash
curl http://localhost:8000/v1/embeddings \
-H "Content-Type: application/json" \
-d '{"model":"BAAI/bge-large-zh-v1.5","input":"你好世界"}'
# 返回 1024 维 embedding
4.4 启动 Hindsight
bash
docker run -d --name hindsight \
--network host \
--restart unless-stopped \
-e HINDSIGHT_API_LLM_PROVIDER=opencode-go \
-e HINDSIGHT_API_LLM_API_KEY=*** \
-e HINDSIGHT_API_LLM_MODEL=deepseek-v4-flash \
-e HINDSIGHT_API_EMBEDDINGS_PROVIDER=openai \
-e HINDSIGHT_API_EMBEDDINGS_OPENAI_BASE_URL=http://localhost:8000/v1 \
-e HINDSIGHT_API_EMBEDDINGS_OPENAI_MODEL=BAAI/bge-large-zh-v1.5 \
-v /data/hindsight:/root/.hindsight/data \
ghcr.io/vectorize-io/hindsight-api:latest
LLM provider 可换成任何平台:
bash
# OpenAI
HINDSIGHT_API_LLM_PROVIDER=openai
# Groq (免费额度)
HINDSIGHT_API_LLM_PROVIDER=groq
# OpenRouter(路由多模型)
HINDSIGHT_API_LLM_PROVIDER=openrouter
# Ollama 本地模型
HINDSIGHT_API_LLM_PROVIDER=ollama
验证:
bash
curl http://localhost:8888/health
# {"status":"healthy","database":"connected"}
4.5 Jetson 特殊注意事项
bash
# 桥接网络不可用,必须 host 模式
--network host
# GPU 通过 CDI 访问(非 --gpus all)
--device nvidia.com/gpu=all
# containerd 数据盘可能不在 /var/lib
ls -la /var/lib/containerd # 如果是软链接,说明已迁移
# 禁用 apt 自动更新(Jetson 内存紧张)
sudo systemctl mask apt-daily.timer
sudo systemctl mask apt-daily-upgrade.timer
五、hermes-agent 接入
本机三步:
1. 安装依赖
bash
pip install hindsight-client==0.6.1
2. 配置 config.yaml
yaml
memory:
provider: hindsight
3. 配置 Hindsight 连接
json
// ~/.hermes/hindsight/config.json
{
"mode": "local_external",
"api_url": "http://你的Hindsight服务器IP:8888",
"memory_mode": "hybrid",
"auto_retain": true,
"auto_recall": true,
"recall_budget": "mid"
}
4. /reset 生效
之后每轮对话:
- 对话前 → Hindsight 自动检索相关记忆,注入上下文
- 对话后 → 自动提取结构化事实,存入知识图谱
- 工具:
hindsight_retain(手动存)、hindsight_recall(手动查)、hindsight_reflect(综合推理)
六、记忆导入策略
hermes-agent 的 session 文件可能有几千个。全量导入没必要------session_search 已经做了 FTS5 全文索引。
建议分层:
| 层 | 内容 | 方式 |
|---|---|---|
| L1 核心 | 系统配置、环境变量、路径 | 手动 hindsight_retain |
| L2 偏好 | 用户画像、工作风格、安全规则 | 手动 |
| L3 流程 | 已验证的工作流、常见 Pitfall | 手动 / 写脚本 |
| L4 历史 | 近期 session 摘要 | 可选,脚本批量 |
| - | 全量 session 原文 | 不需要------session_search 已覆盖 |
七、成本控制
Hindsight 每次自动提取事实都会调一次 LLM(auto_retain)。频繁对话 → 费用高涨。
控制方法:
bash
# 调大提取间隔
HINDSIGHT_API_RETAIN_EVERY_N_TURNS=12
# 或关掉自动提取,只用手动
# auto_retain: false
配合 hermes-agent config 的 flush_min_turns 兜底短 session。
八、常见问题
Q: vLLM 启动报 no kernel image is available? A: 镜像和 GPU 的 CUDA 架构不匹配。Jetson Orin 需要 SM 8.7 编译的镜像。用 yuyirobotlab/vllm-orin 或自己编译。
Q: Hindsight 连不上 vLLM? A: Docker 网络模式问题。如果都用 --network host,确认 vLLM 已完全启动后再启 Hindsight(vLLM 下载模型需要几分钟)。
Q: embedding 模型能换成英文的吗? A: 改成 BAAI/bge-large-en-v1.5 即可。中文用 bge-large-zh-v1.5。
Q: 已有记忆怎么迁移? A: 把旧记忆用 hindsight_retain 逐条写入。MEMORY.md 可以一次喂一整段。
Q: 数据存在哪? A: Hindsight 默认用内嵌 PostgreSQL(pg0),数据在 ~/.hindsight/data/(或你挂载的 volume 目录)。
九、总结
| 维度 | 传统 memory 工具 | Hindsight |
|---|---|---|
| 容量 | 10KB / 系统提示词限制 | 无限制 |
| 检索 | 全文注入(浪费 token) | 语义检索 + 实体图(按需注入) |
| 存储 | 纯文本 key-value | 结构化事实 + 实体关系 |
| LLM 成本 | 零(但每次都要读全文) | 按需提取(可控频率) |
| embedding | 无 | 本地 CPU / GPU / 远程 |
| 部署 | 零 | ~2GB RAM + 可选 GPU |
全程可以用自己的 GPU 跑 embedding,LLM 提取用已有的 API key------零额外固定成本。对个人开发者来说,这是一套「用到退休」的 Agent 记忆方案。