写在前面你有没有想过和AI助手的对话能像人类一样拥有持久记忆你上周讨论过的项目方案、上个月定下的技术选型、甚至去年的某个灵感——AI都能记得清清楚楚。这不是科幻这是我们果壳科技正在做的事。我们花了两天时间搭建了一套完整的个人AI记忆系统。今天把全过程分享出来包括架构设计、技术选型、部署细节以及踩过的每一个坑。指标数值条记忆3601向量空间维度1024迁移耗时45分钟额外硬件成本0元一、系统架构1.1 整体设计三个层次各司其职层次职责代表系统会话层日常对话、任务调度、笔记归档Hermes Obsidian记忆层长期记忆的存储、检索、关联Hindsight GBrain向量层把自然语言转换成数学表示Qwen3-Embedding-0.6B1.2 为什么需要两套记忆系统 很多人会问有 Hindsight 不就够了吗为什么还要 GBrain答案是分工不同。系统擅长类比数据量Hindsight事实记忆谁说了什么、什么时候、偏好习惯 日记本569条GBrain知识图谱概念关系、代码结构、时间线 笔记本3032个chunkHindsight从对话中提取事实片段比如“老板喜欢喝美式咖啡”“项目截止日期是下周三”“SSH密钥配置在~/.ssh/id_ed25519”它是一个**“记忆银行”**存的是结构化的事实。GBrain管理知识网络比如“Qwen3-Embedding是阿里通义千问团队开发的”“Hindsight用PostgreSQL存储向量”“GBrain和Hindsight的Embedding服务需要统一”它是一个**“第二大脑”**存的是概念和关系。⚠️ 关键洞察两者互补缺一不可。单一系统无法同时满足记住对话内容和理解知识结构的需求。二、技术选型为什么选 Qwen3-Embedding-0.6B2.1 什么是EmbeddingEmbedding 是把自然语言转换成向量一串数字的过程。苹果 → [0.12, -0.34, 0.56, ..., -0.23] (1024个浮点数)两个句子的向量越接近说明它们的语义越相似。这就是**“语义搜索”**的基础——不依赖关键词匹配而是理解你真正想问什么。2.2 选型过程我们评估了多个中文Embedding模型模型维度C-MTEB评分内存占用特点bge-small-zh-v1.551261.59~130MB轻量够用但维度偏低bge-base-zh-v1.576864.89~400MB性能均衡Qwen3-Embedding-0.6B102466.33~1.5GB维度高表达力强✅Qwen3-Embedding-4B256070~8GB性能顶级但杀鸡用牛刀2.3 最终选择Qwen3-Embedding-0.6B1. 数据量决定了不需要大模型我们的数据量是 3600 条GBrain 3032 chunks Hindsight 569 memories。这个量级0.6B 的模型绑绑有余。4B 模型的提升在小数据集上几乎感知不到但内存占用多出 5 倍。2. 1024维是甜蜜点768维是很多模型的默认选择但1024维多出33%的表达空间在处理中文这种信息密度高的语言时更有优势。2560维虽然更强但对于我们的数据量来说是浪费。3. Qwen系列的中文理解是第一梯队阿里的通义千问团队在中文NLP上的积累不用多说。Qwen3-Embedding在C-MTEB上得分66.33比bge系列高3-5分。4. 部署简单模型兼容 sentence-transformers 格式用TEI一键启动OpenAI兼容API任何支持OpenAI embedding的工具都能直接对接。三、部署实战3.1 部署Embedding服务第一步下载模型# 从 HuggingFace 下载国内用 hf-mirror.com 加速HF_ENDPOINThttps://hf-mirror.com huggingface-cli download\Qwen/Qwen3-Embedding-0.6B\--local-dir /home/xiaoyu/models/Qwen3-Embedding-0.6B模型大小约 1.2GB下载完成后验证fromsentence_transformersimportSentenceTransformer modelSentenceTransformer(/home/xiaoyu/models/Qwen3-Embedding-0.6B)embeddingmodel.encode([测试文本])print(f维度:{embedding.shape})# 应该是 (1, 1024)第二步启动TEI服务我们用systemd管理TEI服务确保开机自启# 创建 systemd servicecat/etc/systemd/system/tei-embedding.serviceEOF [Unit] DescriptionTEI Embedding Service Afternetwork.target [Service] Typesimple Userxiaoyu ExecStart/usr/local/bin/tei \ --model-id /home/xiaoyu/models/Qwen3-Embedding-0.6B \ --port 8082 \ --max-client-batch-size 32 Restarton-failure RestartSec10 [Install] WantedBymulti-user.target EOF# 启动并设置开机自启sudosystemctl daemon-reloadsudosystemctlenabletei-embeddingsudosystemctl start tei-embedding第三步验证服务# 健康检查curlhttp://localhost:8082/health# → {status:ok,model:Qwen3-Embedding-0.6B,max_length:8192}# 测试embeddingcurl-XPOST http://localhost:8082/v1/embeddings\-HContent-Type: application/json\-d{model: Qwen3-Embedding-0.6B, input: 你好世界}响应中会返回1024个浮点数这就是你好世界的向量表示。3.2 GBrain迁移768维→1024维GBrain是一个知识图谱系统之前用的是bge-base-en-v1.5模型768维。我们需要把所有向量从768维迁移到1024维。步骤一备份数据库pg_dump-Upostgres-dgbrain/tmp/gbrain-backup-$(date%Y%m%d).sql⚠️ 重要提醒这一步千万别省。向量迁移是破坏性操作出问题只能回滚。步骤二修改向量维度-- 连接数据库psql-U postgres-d gbrain-- 清除旧向量维度不匹配必须先清空UPDATEcontent_chunksSETembeddingNULLWHEREembeddingISNOTNULL;-- 修改列类型ALTERTABLEcontent_chunksALTERCOLUMNembeddingTYPEvector(1024);步骤三批量重建向量这里是第一个坑。GBrain自带的gbrain reindex命令有内置超时机制3000条数据的任务会被SIGTERM杀掉。我们尝试了多次每次都在416条左右被杀。最终方案绕过CLI用Python脚本直连PostgreSQL 调用TEI APIimportpsycopg2importrequestsimportjson# 连接数据库connpsycopg2.connect(hostlocalhost,dbnamegbrain,userpostgres)curconn.cursor()# 获取需要embed的chunkscur.execute(SELECT id, chunk_text FROM content_chunks WHERE embedding IS NULL ORDER BY id)rowscur.fetchall()# 批量调用TEI APIapi_urlhttp://localhost:8082/v1/embeddingsmodelQwen3-Embedding-0.6Bbatch_size32foriinrange(0,len(rows),batch_size):batchrows[i:ibatch_size]texts[r[1][:2000]forrinbatch]# 截断过长文本ids[r[0]forrinbatch]resprequests.post(api_url,json{model:model,input:texts},timeout120)ifresp.status_code200:embeddings[item[embedding]foriteminresp.json()[data]]forchunk_id,embinzip(ids,embeddings):cur.execute(UPDATE content_chunks SET embedding %s::vector WHERE id %s,(json.dumps(emb),chunk_id))conn.commit()print(f进度:{min(ibatch_size,len(rows))}/{len(rows)})# 创建HNSW索引加速向量搜索cur.execute( CREATE INDEX idx_chunks_embedding_hnsw ON content_chunks USING hnsw (embedding vector_cosine_ops) WITH (m16, ef_construction200) )conn.commit()这个脚本跑完后GBrain的3032个chunks全部迁移到1024维空间。3.3 Hindsight迁移ONNX→共享TEIHindsight之前用的是本地ONNX模型multilingual-e5-small384维。我们改成指向共享的TEI服务。步骤一修改配置文件编辑/home/xiaoyu/.hindsight/profiles/hermes.env# 注释掉原来的本地ONNX配置# HINDSIGHT_API_EMBEDDINGS_PROVIDERlocal# HINDSIGHT_API_EMBEDDINGS_ONNX_MODEL_IDintfloat/multilingual-e5-small# 新增OpenAI兼容配置HINDSIGHT_API_EMBEDDINGS_PROVIDERopenaiHINDSIGHT_API_EMBEDDINGS_OPENAI_API_KEYnot-neededHINDSIGHT_API_EMBEDDINGS_OPENAI_MODELQwen3-Embedding-0.6BHINDSIGHT_API_EMBEDDINGS_OPENAI_BASE_URLhttp://localhost:8082/v1 踩坑提示Hindsight的TEI模式不兼容我们的服务它期望调用/info端点所以用OpenAI兼容模式。步骤二修改向量维度psql-U postgres-d hindsight-- 清除旧向量UPDATEmemory_unitsSETembeddingNULLWHEREembeddingISNOTNULL;-- 修改维度ALTERTABLEmemory_unitsALTERCOLUMNembeddingTYPEvector(1024);步骤三重启服务sudosystemctl restart hindsight-api验证日志中出现Embeddings: OpenAI provider initialized (model: Qwen3-Embedding-0.6B, dim: 1024)步骤四重建向量Hindsight没有暴露reindex API同样用Python脚本直连PG操作importpsycopg2importrequestsimportjson connpsycopg2.connect(hostlocalhost,dbnamehindsight,userpostgres)curconn.cursor()cur.execute(SELECT id, text FROM memory_units ORDER BY id)rowscur.fetchall()# 同样的批量embed逻辑...# 569条记忆约2分钟完成3.4 最终验证# GBrain状态psql-Upostgres-dgbrain-c\SELECT count(*) as embedded, (SELECT count(*) FROM content_chunks) as total FROM content_chunks WHERE embedding IS NOT NULL;# embedded | total# -----------------# 3032 | 3032# Hindsight状态psql-Upostgres-dhindsight-c\SELECT count(*) as embedded, (SELECT count(*) FROM memory_units) as total FROM memory_units WHERE embedding IS NOT NULL;# embedded | total# -----------------# 569 | 569# 搜索测试curlhttp://127.0.0.1:9092/v1/default/banks/hermes/memories/recall\-HContent-Type: application/json\-d{query: 老板的联系方式, limit: 3}四、踩坑记录坑1gbrain reindex 命令反复超时现象gbrain reindex --markdown每次跑到416条左右就被SIGTERM杀掉。原因gbrain内置的OpenAI SDK有超时机制300秒超时对3000条数据不够用。解决方案绕过CLI用Python脚本直连PostgreSQL 调用TEI API。✅ 收获没有超时限制可以精确控制batch size出错可以精确定位到哪条数据坑2Hindsight的TEI模式不兼容现象配置HINDSIGHT_API_EMBEDDINGS_PROVIDERtei后服务启动报错RuntimeError: Failed to connect to TEI server at http://localhost:8082: Client error 404 Not Found for url http://localhost:8082/info原因Hindsight的TEI客户端期望调用/info端点获取模型信息但我们的TEI服务没有这个端点。解决方案改用OpenAI兼容模式指向http://localhost:8082/v1/embeddings。坑3Hindsight无reindex API现象想通过API触发向量重建但找不到对应的端点。原因Hindsight设计上不提供reindex API它期望embedding在retain时自动计算。解决方案直接操作数据库用Python脚本批量更新embedding列。虽然粗暴但有效。坑4env文件的注释行干扰现象用sed替换HINDSIGHT_API_EMBEDDINGS_PROVIDERlocal时把注释掉的同名行也改了。原因grep/sed默认不区分注释行和有效行。解决方案替换时用^HINDSIGHT_API_EMBEDDINGS_PROVIDERlocal$精确匹配不带#前缀。五、成本与收益5.1 成本项目成本硬件0元现有服务器内存增加约1GB软件0元全部开源时间约45分钟完成全量迁移人力1人AI助手自动执行5.2 收益跨系统语义搜索同一个问题同时搜到Hindsight的事实记忆和GBrain的知识图谱。比如问老板喜欢什么Hindsight返回喜欢喝美式咖啡GBrain返回果壳科技创始人经营AI Agent业务。中文理解提升Qwen3对中文的语义理解明显优于之前的英文模型。测试中搜索服务器配置能正确匹配到Ubuntu 24.04, 16核27G这样的技术细节而旧模型可能会漏掉。统一维护一个Embedding服务一套配置两个系统共享。以后升级模型只需要改一个地方。六、下一步计划Obsidian知识库自动化每日笔记自动归档、会话自动同步到Obsidian情报扫描系统每日定时扫描AI/Agent领域动态自动生成简报跨系统搜索API封装统一的搜索接口支持一次查询同时检索Hindsight和GBrain模型升级路径当数据量增长到1万条以上时考虑升级到Qwen3-Embedding-4B七、写在最后个人AI记忆系统不是什么遥不可及的东西。一台16核27G的普通服务器、几个开源项目、一点耐心就能搭建出属于自己的第二大脑。关键不是技术多复杂而是想清楚你要记什么、怎么记、怎么用。技术只是实现手段思维方式才是核心。我们果壳科技一直在探索AI Agent的可能性这只是开始。如果你也在折腾类似的系统欢迎交流。关于作者‍ 果壳科技 · 聂小雨专注AI Agent与知识管理系统的实践者。我们相信每个人都有权拥有自己的第二大脑。 联系我们GitHub技术栈Hermes Agent Hindsight GBrain Qwen3-Embedding-0.6B服务器Ubuntu 24.0416核27GB内存完整部署脚本和配置文件见 GitHub仓库