1. 为什么要在 NAS 上跑 Hindsight 并接入 Hermes
如果你手里有一台常年开机的 NAS,又刚好在用 Hermes 这类本地 AI 工具链,那 Hindsight 值得你花一个晚上折腾一下。Hindsight 是一个专门做「长期记忆」的服务:它把对话里值得留存的信息抽出来,存进本地向量库,下次开新会话时再按语义召回。Hermes 本身是 Agent 框架,负责调度模型和工具,但它默认的会话记忆是短期的,关掉窗口就忘。把两者接起来,等于给 Hermes 挂了一个永不离线的「外挂大脑」。
这套组合适合谁?一类是自建服务玩家,NAS 上已经跑了 Docker、Home Assistant、Immich 这类容器,多一个 Hindsight 只是多一段 compose;另一类是本地 AI 工具链用户,平时用 Hermes 写代码、整理笔记、做知识问答,希望跨会话记住偏好和上下文。核心检索词就三个:Hindsight 负责记忆抽取与检索,NAS 提供 7x24 的宿主环境,Hermes 通过 API 消费记忆。
我试过把这套跑在一台 4GB 内存的 x86 NAS 上,Hindsight 容器稳态占用大约 1GB,加上 Hermes 和系统本身,内存还剩一些余量。整个落地路径分四段:NAS 上用 Docker 起 Hindsight、拿到可用的 API 端点、在 Hermes 里配置 memory provider、最后做连通性和记忆召回验证。下面按这个顺序拆开讲,配置都能直接复制。
需要提前说明的是,Hindsight 提取记忆需要调用一个外部大模型来做语义理解,所以你得准备一个 LLM 的 API Key。这个模型不参与日常对话,只做记忆抽取,选便宜快速的就行。如果你还没有稳定的 API 入口,可以先用 TaoToken 这类聚合服务把 Key 跑通,后面再换模型也方便。
2. TaoToken 前置准备:把模型 API 先跑通
Hindsight 的容器配置里有一组HINDSIGHT_API_LLM_*环境变量,指向的就是记忆抽取用的模型。在填这些变量之前,建议先把模型 API 单独验证一遍,避免后面容器起来了却因为 Key 或地址问题一直报错。
TaoToken 的定位是模型 API 聚合入口,兼容 OpenAI 风格的接口,所以 Hindsight 里HINDSIGHT_API_LLM_PROVIDER=openai这一套可以直接用。你需要做两件事:拿到 API Key,确认 base_url 和模型名。
先到控制台创建 Key。打开 https://taotoken.net/api-keys ,登录后新建一个密钥,复制出来保存好。这个 Key 后面会填进 compose 的HINDSIGHT_API_LLM_API_KEY。
然后确认接入地址。TaoToken 的 API 根地址是 https://taotoken.net/api ,OpenAI 兼容模式下,base_url 通常写成https://taotoken.net/api/v1。模型名以你控制台里实际可用的为准,比如常见的对话模型。如果你不确定该选哪个模型,可以先在模型对话页面发一条测试消息,确认这个模型能正常返回,再把它写进 Hindsight 配置。
这里有个细节:Hindsight 只拿这个模型做记忆抽取,不做长对话,所以不需要选最贵的。便宜、响应快、中文理解过得去就够了。把 Key、base_url、模型名三样记下来,下一步直接填。
3. 在 NAS 上用 Docker 部署 Hindsight
3.1 确认 NAS 环境
动手前先确认三件事。第一,NAS 是 x86 架构且支持 Docker,ARM 机型镜像可能不兼容。第二,Docker 服务已开启,SSH 能登进去执行docker version。第三,内存建议 4GB 以上,Hindsight 稳态约 1GB,首次启动拉镜像和加载模型时会更高。
Hermes 这边要求 v0.7.0 或更高,终端里执行hermes --version确认。低于这个版本,hermes memory setup里可能没有 hindsight 选项。
3.2 编写 docker-compose.yml
在 NAS 上建一个项目目录,比如/volume1/docker/hindsight,在里面新建docker-compose.yml。下面这份配置可以直接用,把<>占位符替换成你自己的信息:
version: "3.8" services: hindsight: image: ghcr.io/vectorize-io/hindsight:latest container_name: hindsight restart: unless-stopped ports: - "8888:8888" # API 端口,Hermes 通过它通信 - "9999:9999" # WebUI 端口,浏览器里管理记忆 environment: # --- 1. 记忆抽取用的大模型 --- - HINDSIGHT_API_LLM_PROVIDER=openai - HINDSIGHT_API_LLM_BASE_URL=https://taotoken.net/api/v1 - HINDSIGHT_API_LLM_API_KEY=sk-你的Key - HINDSIGHT_API_LLM_MODEL=你的模型名 # 国内下载 HuggingFace 模型加速(可选) - HF_ENDPOINT=https://hf-mirror.com - HF_HUB_ENABLE_HF_TRANSFER=1 # --- 2. 启用 WebUI --- - HINDSIGHT_CONTROL_PLANE_ENABLED=true volumes: - ./data:/home/hindsight/.pg0 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8888/health"] interval: 30s timeout: 10s retries: 3几个关键点解释一下。ports里 8888 是 API,Hermes 连的就是它;9999 是 WebUI,方便你在浏览器里看记忆条目。volumes把数据挂到本地./data,容器删了重建数据还在,这点很重要,别省。healthcheck用来自动判断服务是否健康,NAS 上跑长期服务建议保留。
如果你的 NAS 拉 ghcr.io 很慢,可以换成国内镜像源,比如把 image 改成ghcr.nju.edu.cn/vectorize-io/hindsight:latest。这只是加速拉取,不影响功能。
3.3 启动并确认容器状态
在 compose 文件所在目录执行:
docker compose up -d首次启动会拉取约 6.2GB 的镜像,耐心等。拉完后容器会自动起来。用下面命令看状态:
docker compose ps看到hindsight状态是Up或healthy就对了。如果一直是starting,等 healthcheck 跑完再看。想看日志用:
docker compose logs -f hindsight日志里如果出现模型加载完成、API 监听 8888 之类的信息,说明服务正常。
4. 验证 Hindsight API 连通性
容器起来不等于 API 可用,先单独验证一遍,再让 Hermes 去连。
最直接的是健康检查接口:
curl http://你的NAS_IP:8888/health正常会返回类似{"status":"ok"}的 JSON。如果连不上,先确认 NAS 防火墙放行了 8888,再确认容器端口映射没写错。
再验证一下 WebUI,浏览器打开http://你的NAS_IP:9999,能看到 Hindsight 的管理界面就说明控制面也起来了。在 WebUI 里你可以手动查看、删除记忆条目,调试阶段很有用。
如果你想让验证更彻底一点,可以调一次记忆写入接口。Hindsight 的 API 路径以实际版本为准,一般形如POST /v1/memories,带上 JSON body。用 curl 测试:
curl -X POST http://你的NAS_IP:8888/v1/memories \ -H "Content-Type: application/json" \ -d '{"content":"测试记忆:我喜欢用 Python"}'返回 2xx 且 WebUI 里能看到这条记录,说明写入链路通了。这一步不是必须,但能帮你提前排除模型 Key 配错导致的抽取失败。
5. 配置 Hermes 接入 Hindsight
5.1 运行配置向导
在运行 Hermes 的终端里执行:
hermes memory setup向导会问你几个问题。第一步选记忆提供商,用方向键选hindsight - API key/local,回车。
第二步选部署模式,这里务必选local External。注意别选成Local Embedded,那是把记忆进程直接跑在主机上的模式,和我们的 Docker 部署对不上。
第三步填连接信息:
- API 地址:
http://你的NAS_IP:8888 - API Key:本地部署留空即可
- Profile 名字:用默认的
hermes,或自定义
向导会自动装依赖并写好配置。完成后 Hermes 就指向你 NAS 上的 Hindsight 了。
5.2 settings.json 片段参考
如果你习惯直接改配置文件,Hermes 的 memory 配置大致长这样,可以对照检查:
{ "memory": { "provider": "hindsight", "deployment": "local_external", "endpoint": "http://你的NAS_IP:8888", "apiKey": "", "profile": "hermes" } }字段名以你实际版本为准,重点是provider是 hindsight、deployment是 local_external、endpoint指向 NAS 的 8888。改完保存,重启 Hermes 生效。
5.3 检查连接状态
执行:
hermes memory status输出里 Provider 显示 Hindsight、状态正常,就说明接入成功。如果显示未连接或超时,回到第 4 节确认 API 从 Hermes 所在机器能访问到。
6. 记忆功能实测与常见报错排查
6.1 端到端验证记忆召回
开一个新会话,告诉 Hermes 一些个人信息,比如「我的名字是张三,我喜欢用 Python 写脚本」。然后结束会话。再开一个全新会话,直接问「我的名字是什么?我喜欢用什么编程语言?」如果 Hermes 能答出张三和 Python,说明记忆写入和召回都通了。
这个测试的关键是「全新会话」,只有跨会话还能记住,才证明 Hindsight 在起作用。如果同一会话里记得,那可能只是短期上下文。
6.2 常见报错与排查
容器起不来,日志报模型相关错误。多半是HINDSIGHT_API_LLM_BASE_URL或HINDSIGHT_API_LLM_API_KEY填错。先用 curl 单独测一下模型接口能不能通,确认 base_url 结尾是/v1,Key 没有多余空格。
Hermes 连不上 Hindsight。先确认curl http://你的NAS_IP:8888/health在 Hermes 所在机器上能返回。如果 NAS 和 Hermes 不在同一台机器,检查 NAS 防火墙是否放行 8888,以及 IP 是否写对。别用localhost,那指向的是 Hermes 本机。
端口被占用。8888 或 9999 被别的容器占了,docker compose up会报 bind 错误。改 compose 里的宿主机端口,比如18888:8888,同时 Hermes 的 endpoint 也要跟着改。
选了 Local Embedded 模式。症状是 Hermes 试图在本地起记忆进程,和 Docker 里的服务冲突。重新跑hermes memory setup,选local External。
记忆写入了但召回不准。中文场景下,默认向量模型可能效果一般。可以在 compose 里启用可选的 embeddings 和 reranker 配置,换成中文优化模型,比如 bge-large-zh 系列。这部分是可选项,先跑通基础链路再优化。
数据丢失。检查 compose 的 volumes 是否挂到了./data,以及这个目录有没有被误删。只要挂载在,容器重建数据就在。
整套跑下来,你就在 NAS 上有了一个私有、常驻的 AI 记忆服务,Hermes 跨会话记住你的偏好和上下文。后续想换模型、加中文检索优化,改 compose 里的环境变量重启即可。如果接入过程中卡在 Key 或模型验证,可以到 https://taotoken.net/api-keys 重新确认密钥,接入细节参考 https://taotoken.net/doc ;想先试模型效果就去模型对话页面发一条消息;长期用 Hermes 做编码和 Agent 任务的话,Coding Plan 会更省心。