周六下午,我正调试自己的 Qdrant 配置,心里还挺得意——一套自托管的 AI 记忆系统,跑在 NAS 上,不花一分钱 API 费用。我随口问了一句:"我最近那些项目跟进是什么状态?"
![]()
它返回了一条笔记:要买鸡蛋、希腊酸奶,还有我太太指定那个牌子的燕麦奶。
不是幻觉,不是 bug。这是一次数学上完美无缺的余弦相似度匹配。
那张买菜清单里用了"事项""待办""需要确认""跟进"这些词——和一条项目状态笔记的词汇指纹一模一样。嵌入模型找到了模式,找到了它在向量空间里的最近邻,然后满怀信心地把结果交给了我。
按它唯一知道的衡量标准,它是对的。那一刻,幻觉破了。
先说清楚我拿它干什么
在建这套东西之前,我的目标很具体:上下文初始化。每次新会话开始,第一件事就是根据我当天在忙什么,去知识库里查相关背景。这一次查询大概 5 秒,替代的是我花 10 分钟重新解释项目历史、做过的决定、试过什么、放弃了什么。
系统构成是这样的:
- Qdrant 跑在 NAS 上
- 嵌入模型用 nomic-embed-text,本地跑在 Ollama 上,无 API 调用、无成本
- 两个集合:个人知识库(数千个点,存会话笔记、任务结果、项目摘要),以及一个研究档案库
- 运行成本:硬件本来就在跑,只多一点点电费
集合是自动填充的。每次会话结束后,后台脚本会从会话记录里抽出关键事实和决定,整理成结构化笔记,生成嵌入,再写入 Qdrant。没有手动整理这一步。整理发生在更上游——会话进行时,我明确说清楚自己决定了什么、为什么。
垃圾进,买菜清单出。结构化的好笔记进,有用的记忆出。
它不记得,它只是检索
嵌入模型把文本转成一串数字——一个向量,意思相近的文本会产生相近的向量。向量搜索找出离你的查询向量最近的已存向量。就这样。这是一个最近邻问题,不是记忆。系统对你的工作任务一无所知,就像谷歌并不"记得"你的搜索历史——它只是找出和你所问在数学上最相似的东西。
余弦相似度衡量的是两个向量之间的夹角,也就是它们在高维空间里的方向有多接近。它非常擅长捕捉语义相似性。它也会在你问项目跟进时,信心十足地返回一张买菜清单——只要这两样东西恰好住在模型概念空间里的相邻位置。
相似不等于相关。这个区别会击垮那些没考虑它的系统。
那次事故的检索结果排名是这样的:买菜清单 0.847,求职申请 0.831,智能体记忆会话笔记 0.802,工作流筛选配置 0.789。买菜清单赢了。
没人告诉你的分块问题
索引文档做向量搜索前,你得先把它切成块。块的大小是你将做出的最重要的决定之一——而网上几乎没人告诉你该怎么选。
太小:一个 64 token 的块可能只有一句话,"项目暂停了"。检索出来几乎没意义——因为什么暂停?哪个项目?谁决定的?
太大:一个 2048 token 的块塞了 15 个不同主题。嵌入试图表示全部,结果哪个都没表示好。检索信号被稀释在塞进去的所有东西里。
我实测出来的数字:事实性笔记和项目摘要用 256 到 512 token,重叠 10%;对话类内容用 512 到 1024 token。重叠不是可选项——它防止相关上下文被切在块边界上丢掉。我的知识库集合在拿真实查询反复测试后,定在 384 token、15% 重叠。你的内容类型会得出不同的数字。拿你自己的真实数据测,别用合成样本。没有通用答案,谁给你一个通用答案,谁就没测过。
修法:先过滤,再搜索
买菜清单事故有一个明确的根因:知识库是一个扁平的单一命名空间。个人提醒、买菜清单、基础设施决策、项目笔记全住在同一个向量空间里,用同一个相似度指标竞争。一张用了任务追踪语言的买菜清单,在查询时和工作笔记无法区分。
修法是给每个存储点加一个 domain 元数据字段——取值比如 jobs、infra、personal、research——然后重写所有查询,在跑向量搜索之前先按 domain 过滤。混合检索:先元数据过滤,再在过滤后的子集里做向量搜索。误报率降到了接近零。
改之前:查询"最近项目任务状态",在全集合上按余弦相似度排名,买菜清单靠词汇重叠胜出。
改之后:查询先过滤到 domain = "jobs",再在这个子集里做向量搜索。候选池里只有工作相关笔记,买菜清单根本不会被评估。正确结果每次都在前三。
教训不是向量搜索有缺陷,而是跨不相关领域的语义相似度,本身就是个错误的检索问题。给你的数据分命名空间。先过滤,再搜索。当向量相似度在一个连贯的领域上运作,而不是在一锅你写过的一切的大杂烩里运作时,它干得很好。
Qdrant 是优秀的软件。我 NAS 上这套自托管配置运行可靠,不额外花钱,而且让每次会话都更高效——它消掉了那种每次对话都悄悄吃掉 10 到 15 分钟的上下文重建开销。
但那张买菜清单是这个项目里发生过的最有用的事。它在我把生产管线建在一个错误假设上之前,先击碎了我的心智模型——那个假设是:向量相似度等于相关性。加一个 domain 字段。搜索前先过滤。存储时写具体、写结构化。做到这三件事,记忆幻觉就足够好用,好用到真的有用。
不做,你就会收到买菜清单。事后想想,能早早抓到一个根本性的设计缺陷,这结局还挺不错。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.