Pigsty 自托管 Hindsight:PostgreSQL 原生 AI Agent 长期记忆服务的部署实战
Pigsty 自托管 Hindsight:PostgreSQL 原生 AI Agent 长期记忆服务的部署实战
Hindsight 是面向 AI Agent 的 PostgreSQL 原生长期记忆(long-term memory)服务。本文以 Pigsty 仓库中的 hindsight 应用模板 为主线,讲解如何在 Pigsty 上以外部 PostgreSQL 集群方式自托管 Hindsight:从一条命令拉起全栈,到默认设计取舍、接入真实 LLM、再到中文多语检索的进阶调优。读完本文,你将掌握一套「一个 All-in-One 容器 + 一个 Pigsty 托管数据库 + 两个门户入口」的最小可运行 Hindsight 部署方案,并能根据自己的模型与检索需求完成参数级定制。
Hindsight 与 Pigsty 的集成方式
Hindsight 的官方部署路径默认带有一个嵌入式开发数据库 pg0,但在生产或正式使用场景下,人们通常希望把记忆数据托管在真正被管理的 PostgreSQL 实例中。Pigsty 提供的这套模板正是走 Hindsight 官方 external PostgreSQL 部署路径:用 Pigsty 创建并管理独立的 PostgreSQL 集群,Hindsight 容器通过 postgresql:// 连接串访问它,而不是使用容器内嵌的数据库。
整套栈保持最小化,由三部分组成:
- 一个 All-in-One Hindsight 容器(官方镜像
ghcr.io/vectorize-io/hindsight:latest),同时提供控制平面 UI 与 REST API; - 一个由 Pigsty 管理的 PostgreSQL 数据库
hindsight,承载全部记忆数据与向量索引; - 两个 Pigsty 门户入口,分别把域名代理到 UI 与 API 端口。
快速开始:四条命令完成部署
先确保目标节点满足 Pigsty 的安装前提(全新 OS、静态 IP、可执行 root 免密 sudo),然后按以下步骤操作:
curl -fsSL https://repo.pigsty.io/get | bash; cd ~/pigsty
./bootstrap # prepare local repo & ansible
./configure -c app/hindsight # use the hindsight config template
vi pigsty.yml # IMPORTANT: CHANGE CREDENTIALS / DOMAIN / LLM SETTINGS
./deploy.yml # install pigsty & pgsql
./docker.yml # install docker & docker-compose
./app.yml # install hindsight with docker-compose
四个阶段各司其职:
./bootstrap准备本地软件源与 Ansible 运行环境;./configure -c app/hindsight以 conf/app/hindsight.yml 为配置模板生成pigsty.yml(.configure -c指定的是配置文件相对conf/的路径,故写作app/hindsight);./deploy.yml安装 Pigsty 基础设施与 PostgreSQL 集群;./docker.yml在目标节点安装 Docker 与 Docker Compose;./app.yml将 app/hindsight/ 目录中的 Compose 资源部署到目标机并拉起 Hindsight。
部署完成后,你有四个访问入口:
| 入口 | 地址 | 说明 |
|---|---|---|
| UI(门户) | http://hs.pigsty |
Hindsight 控制平面界面,代理到 9999 端口 |
| API(门户) | http://hs-api.pigsty |
Hindsight REST API,代理到 8888 端口 |
| API(直连) | http://<your-ip>:8888 |
不经门户的 API 直连端口 |
| UI(直连) | http://<your-ip>:9999 |
不经门户的 UI 直连端口 |
其中 hs.pigsty / hs-api.pigsty 两个域名来自 infra_portal 配置,详见下文「门户路由」一节。
模板提供了什么
部署完成后,你实际获得的资产包括:
- Pigsty 托管的 PostgreSQL 数据库
hindsight,专属服务用户也叫hindsight; vector扩展:通过 Pigsty 的pgvector扩展默认启用,为记忆检索提供向量索引能力;- 官方 All-in-One 镜像
ghcr.io/vectorize-io/hindsight:latest的 Docker Compose 应用; - 持久化模型缓存目录
/data/hindsight:用于存放下载的 embedding / reranker 本地模型,容器重建后模型无需重新下载; - 两个 Pigsty 门户:
hs.pigsty→ Hindsight 控制平面 UI(9999);hs-api.pigsty→ Hindsight REST API(8888)。
默认设计选择:先求「能跑起来」
模板默认采用一组保守但稳妥的组合:
- 外部 PostgreSQL:由 Pigsty 管理,而非 Hindsight 内嵌的
pg0; pgvector:负责向量检索(vector search);native:PostgreSQL 原生全文检索(text search);HINDSIGHT_API_LLM_PROVIDER=none:不连接任何外部模型服务。
最后一项值得特别说明。none provider 的意图是让整栈在没有任何外部模型依赖的情况下立即可启动——你不必先搭好 Ollama 或申请 OpenAI Key 就能把 UI 和 API 跑起来。代价是:事实抽取(fact extraction)、记忆整合(consolidation)与 reflect 等依赖 LLM 的能力会保持受限,直到你为它接入一个真实的 LLM provider。
这一点在 app/hindsight/.env 中体现得很直白:
# Default to `none` so the stack boots without any external model provider.
# Switch to ollama/openai/groq/... to enable fact extraction, consolidation and reflect.
HINDSIGHT_API_LLM_PROVIDER=none
HINDSIGHT_API_LLM_MODEL=gpt-5-mini
HINDSIGHT_API_LLM_API_KEY=
#HINDSIGHT_API_LLM_BASE_URL=https://api.openai.com/v1
配置模板的源码级拆解
应用组定义:conf/app/hindsight.yml
conf/app/hindsight.yml 是整个部署的核心配置。它定义了四个节点角色组,全部落在同一台主机 10.10.10.10 上:
hindsight 应用组通过 apps 声明应用自身的运行参数:
hindsight:
hosts: { 10.10.10.10: {} }
vars:
app: hindsight # specify app name to be installed (in the apps)
apps:
hindsight:
file:
- { path: /data/hindsight ,state: directory ,mode: 0755 }
conf:
HINDSIGHT_VERSION: latest
HINDSIGHT_API_PUBLISH_PORT: 8888
HINDSIGHT_UI_PUBLISH_PORT: 9999
HINDSIGHT_MODEL_CACHE: /data/hindsight
HINDSIGHT_DB_HOST: 10.10.10.10
HINDSIGHT_DB_PORT: 5432
HINDSIGHT_DB_NAME: hindsight
HINDSIGHT_DB_USER: hindsight
HINDSIGHT_DB_PASSWORD: DBUser.Hindsight
HINDSIGHT_DB_SCHEMA: public
HINDSIGHT_API_VECTOR_EXTENSION: pgvector
HINDSIGHT_API_TEXT_SEARCH_EXTENSION: native
HINDSIGHT_API_LLM_PROVIDER: none
HINDSIGHT_API_LLM_MODEL: gpt-5-mini
HINDSIGHT_API_LLM_API_KEY: ''
file声明需要预创建的目录/data/hindsight(权限0755),这正是模型缓存卷的主机侧目录;conf中所有键会被app.yml逐一写入目标机/opt/hindsight/.env。
pg-meta 集群组定义了记忆数据库的规格:单节点主库 pg-meta,启用 pgvector 扩展;创建服务用户 hindsight(允许 pgbouncer、pool_mode: session、角色 dbrole_readwrite);创建数据库 hindsight(owner 为 hindsight,扩展 vector)。同时专门为 Docker 桥接网段放行访问:
pg_hba_rules:
- { user: hindsight ,db: all ,addr: 172.17.0.0/16 ,auth: pwd ,title: 'allow hindsight access from local docker network' }
这行 HBA 规则是整条链路能连通的关键:Hindsight 容器默认经 172.17.0.0/16 的 Docker 网络访问宿主机 5432 端口,必须显式允许该网段。
模板还顺带配置了每日自动备份:
pg_crontab: [ '00 01 * * * /pg/bin/pg-backup full' ] # make a full backup every 1am
即每天凌晨 1 点对集群执行一次全量备份(Pigsty 的 pg-backup 脚本,参考 files/postgres/pg-backup)。
infra 与 etcd 组提供门户反代与高可用协调所需的依赖组件。infra_portal 是门户路由的定义位置:
infra_portal:
home: { domain: i.pigsty }
hindsight:
domain: hs.pigsty
endpoint: "10.10.10.10:9999"
websocket: false
certbot: hs.pigsty
hindsight-api:
domain: hs-api.pigsty
endpoint: "10.10.10.10:8888"
websocket: false
certbot: hs-api.pigsty
即 Nginx 门户把 hs.pigsty 代理到 10.10.10.10:9999(UI),把 hs-api.pigsty 代理到 10.10.10.10:8888(API),并可为两个域名签发 Let's Encrypt 证书。全局变量中还定义了 docker_enabled: true、node_repo_modules: node,infra,pgsql、pg_version: 18 等基础设施参数;模板顶部注释给出了替换域名的快捷方式:
sed -ie 's/hs.pigsty/hs.yourdomain.com/g; s/hs-api.pigsty/hs-api.yourdomain.com/g' pigsty.yml
安装流程:app.yml 如何工作
应用安装由根目录的 app.yml Playbook 驱动,它按固定顺序完成四件事:
- 拷贝资源:把
app/<appname>/目录(默认src,可用app_def.src覆盖)复制到目标机/opt/<appname>/(默认dest,可用app_def.dest覆盖); - 准备目录:按
app.file列表创建目录/文件; - 写入环境变量:按
app.conf以lineinfile方式更新/opt/<appname>/.env,密钥落盘时文件权限设为0600,并在日志中隐藏取值(no_log: true); - 启动应用:在
/opt/<appname>目录下执行make {{ app_args }}(Hindsight 的app_args为空,即执行默认的make up)。
因此,部署后的实际运行时配置位于目标机的 /opt/hindsight/.env,这也是后续修改 LLM 或检索参数时的第一修改点——原文档也明确提示:编辑 /opt/hindsight/.env,或在 pigsty.yml 的 app.conf 中覆盖相同键后重新执行 ./app.yml。
Compose 编排:docker-compose.yml
app/hindsight/docker-compose.yml 是整个应用的最小编排定义:单一服务 hindsight,使用官方 All-in-One 镜像 ghcr.io/vectorize-io/hindsight:${HINDSIGHT_VERSION:-latest}。其中两个细节值得注意:
extra_hosts:
- host.docker.internal:host-gateway
这行把 host.docker.internal 映射到宿主机网关,使容器内能直接访问宿主机上运行的 Ollama(http://host.docker.internal:11434/v1),也解释了 README 中 Ollama 配置为什么使用该主机名。
ports:
- '${HINDSIGHT_API_PUBLISH_PORT:-8888}:${HINDSIGHT_API_PORT:-8888}'
- '${HINDSIGHT_UI_PUBLISH_PORT:-9999}:9999'
volumes:
- '${HINDSIGHT_MODEL_CACHE:-/data/hindsight}:/home/hindsight/.cache'
端口与模型缓存目录全部通过环境变量可覆盖,默认值与模板一致。
启用真实 LLM
默认 none provider 只能让栈「活着」,要启用记忆抽取与 reflect,需要把 HINDSIGHT_API_LLM_PROVIDER 切换为真实 provider。修改位置是目标机 /opt/hindsight/.env,或在 pigsty.yml 的 app.conf 中覆盖同名键后重跑 ./app.yml。
使用同机 Ollama
如果宿主机已运行 Ollama,用 host.docker.internal 访问即可(Compose 已自动映射该主机名):
HINDSIGHT_API_LLM_PROVIDER=ollama
HINDSIGHT_API_LLM_BASE_URL=http://host.docker.internal:11434/v1
HINDSIGHT_API_LLM_MODEL=qwen3:8b
这是最省事的本地化方案:模型推理不出本机,记忆数据不出本机。
使用 OpenAI 兼容 API
HINDSIGHT_API_LLM_PROVIDER=openai
HINDSIGHT_API_LLM_BASE_URL=https://api.openai.com/v1
HINDSIGHT_API_LLM_API_KEY=sk-xxxxxxxx
HINDSIGHT_API_LLM_MODEL=gpt-5-mini
由于 OpenAI 兼容协议已成为事实标准,HINDSIGHT_API_LLM_BASE_URL 也可以指向任何兼容网关(如本地代理、国产模型服务的 OpenAI 兼容端点)。
中文 / 多语检索的进阶路径
默认的 pgvector + native 组合是「最稳妥的首次部署」:向量检索由 pgvector 提供,全文检索使用 PostgreSQL 内置的 native 实现。但如果你的语料以中文为主、对多语言 BM25 与分词质量有更高要求,模板预留了一条后续调优路径:使用 Pigsty 的 vchord 与 vchord_bm25 扩展。
在 PostgreSQL 中安装这两个扩展后(Pigsty 扩展体系已包含 vchord,参见 conf/app/hindsight.yml 中注释掉的配置项),将 .env 中的两项同时切换:
HINDSIGHT_API_VECTOR_EXTENSION=vchord
HINDSIGHT_API_TEXT_SEARCH_EXTENSION=vchord
.env 中还有一组面向本地模型的选项,适合内网或离线场景:
# Persist downloaded local reranker / embedding models across container restarts
#HINDSIGHT_API_EMBEDDINGS_PROVIDER=local
#HINDSIGHT_API_RERANKER_PROVIDER=local
配合 /data/hindsight 缓存卷,本地 embedding 与 reranker 模型下载一次即可跨容器重建持久复用。
管理命令与日常运维
Hindsight 应用目录自带 Makefile,部署到 /opt/hindsight 后即可直接使用:
| 命令 | 作用 |
|---|---|
make up |
后台启动 Compose 应用(docker compose up -d),是 app.yml 内部调用的启动入口 |
make log |
跟随容器日志(docker compose logs -f) |
make info |
查看容器状态(docker compose ps) |
make down |
停止并移除容器(docker compose down) |
make pull |
拉取最新镜像(docker compose pull) |
make clean |
移除容器(docker compose rm),并提示:如有需要请到 PostgreSQL 中清理 hindsight 数据库 |
make save / make tarball |
把镜像导出为 gzip 压缩的 tgz(默认存 /tmp/docker/hindsight.tgz),便于离线内网分发 |
make load |
从本地 tgz 加载镜像(docker load),离线部署时与 save 配对使用 |
make view 会在启动前打印关键环境变量摘要,方便快速核对配置是否生效:
view:
cat .env | grep -E '^(HINDSIGHT_(API_PUBLISH_PORT|UI_PUBLISH_PORT|DB_NAME|DB_USER|API_LLM_PROVIDER|API_LLM_MODEL|API_VECTOR_EXTENSION|API_TEXT_SEARCH_EXTENSION))='
运维层面,记忆数据库 hindsight 与 Pigsty 托管的其他 PostgreSQL 集群享受同等待遇:每日凌晨 1 点的全量备份(见上文 pg_crontab)、Patroni 高可用、监控面板与告警规则(参考 files/grafana/pgsql/ 系列面板)均可直接复用。
参数速查表
以下环境变量决定了 Hindsight 部署的行为,全部可在 pigsty.yml 的 app.conf 或目标机 /opt/hindsight/.env 中调整:
| 变量 | 默认值 | 说明 |
|---|---|---|
HINDSIGHT_VERSION |
latest |
镜像版本标签 |
HINDSIGHT_API_PUBLISH_PORT |
8888 |
API 宿主端口 |
HINDSIGHT_UI_PUBLISH_PORT |
9999 |
UI 宿主端口 |
HINDSIGHT_MODEL_CACHE |
/data/hindsight |
模型缓存卷(容器内 /home/hindsight/.cache) |
HINDSIGHT_DB_HOST |
10.10.10.10 |
PostgreSQL 主机 |
HINDSIGHT_DB_PORT |
5432 |
PostgreSQL 端口 |
HINDSIGHT_DB_NAME / HINDSIGHT_DB_USER / HINDSIGHT_DB_PASSWORD |
hindsight / hindsight / DBUser.Hindsight |
数据库名、用户、密码(必须与 pg_users 一致) |
HINDSIGHT_DB_SCHEMA |
public |
使用的数据库 schema |
HINDSIGHT_API_VECTOR_EXTENSION |
pgvector |
向量扩展,可切换 vchord |
HINDSIGHT_API_TEXT_SEARCH_EXTENSION |
native |
全文检索扩展,可切换 vchord |
HINDSIGHT_API_LLM_PROVIDER |
none |
LLM provider:none / ollama / openai 等 |
HINDSIGHT_API_LLM_MODEL |
gpt-5-mini |
默认模型名(none 下不生效) |
HINDSIGHT_API_LLM_BASE_URL |
空 | 兼容端点,Ollama 用 http://host.docker.internal:11434/v1 |
HINDSIGHT_API_LLM_API_KEY |
空 | API Key |
HINDSIGHT_API_LOG_LEVEL |
info |
日志级别 |
数据库连接串由 .env 中的片段拼接而成:HINDSIGHT_API_DATABASE_URL 与 HINDSIGHT_API_MIGRATION_DATABASE_URL 都取 postgresql://${HINDSIGHT_DB_USER}:${HINDSIGHT_DB_PASSWORD}@${HINDSIGHT_DB_HOST}:${HINDSIGHT_DB_PORT}/${HINDSIGHT_DB_NAME} 的形式,schema 由 HINDSIGHT_API_DATABASE_SCHEMA 指定。
小结
这套模板的价值在于把「AI Agent 长期记忆」这一前沿能力,落到了 Pigsty 一贯的托管底座上:记忆数据不是散落在容器内嵌库里的孤儿,而是受 Patroni 高可用、每日全量备份、监控告警覆盖的正规 PostgreSQL 集群;向量检索与全文检索由可切换的扩展体系支撑;LLM 接入从 none 起步、按需演进到 Ollama 或任意 OpenAI 兼容端点。对于希望「像管理数据库一样管理 AI 记忆」的团队,这是一条低摩擦、可审计、可演进的实践路径。