本地RAG数据库搭建实践:从踩坑到跑通的血泪经验
折腾了大半个月,我不得不承认一个让我有点沮丧的事实:我花大力气搭建的那套本地 RAG 记忆系统,效果并没有我想象中那么好。写这篇文章的时候,我坐在屏幕前,脑子里反复闪过的不是那些终于跑通的绿色日志,而是好几次想砸键盘的瞬间、对着空荡荡的检索结果发愣的夜晚,以及最后发现真正的问题根本不在算法而在那句该死的提示词时的荒诞感。技术人总爱在「调参」「加模块」里找答案,结果最致命的那一刀,是当初写进网关的那句「请严格基于参考资料回答」——后来才知道是 Gemini 给的示例式提示词,被我原样用上了。想想也挺讽刺的。顺便说一句,整条路我几乎没看过任何技术论坛或教程,顶多刷过几个小红书博主讲 RAG 的视频,有个大概概念;从向量化到 BM25、Reranker、黑名单、权重、控制台,全是 Gemini 在对面给方案、给思路,我这头用 Claude Code 在 Mac Mini 上执行、改代码,现学现卖。所以如果你也在琢磨要不要给自己搞一个「全知外脑」,或者已经踩进了 RAG 的坑里,希望下面这些碎碎念能帮你少走一点弯路,或者至少让你知道,你不是一个人在被现实打脸。
事情的起因其实特别偶然。今年一月份的时候,我沉迷于研究各种 AI Agent,特别是那个叫 OpenClaw 的小龙虾,它能直接在电脑上执行 Shell 命令,写代码、改文件、跑脚本,活脱脱一个住在我电脑里的「特工」。第一次在本地跑通 OpenClaw 的时候,我盯着终端里它自己执行 ls、cat、甚至改了我一个测试文件的那几行输出,心里又兴奋又发毛。兴奋的是这玩意儿真的能干活,发毛的是它要是哪天理解错了我的指令,会不会把我项目目录给 rm -rf 了。我就想,既然有这东西,那我干脆把它部署到家里的 M4 Mini 上,24 小时开机,让它帮我处理各种杂活。那时候我甚至都不知道 RAG 是个什么玩意儿。真的,你让我解释 Embedding 和向量数据库,我当时的反应大概就是「啥?」,满脑子只有「这玩意儿太能干了,我得给它上个保险」这一个念头。
把Mac Mini 从箱子里拿出来、接上线、第一次开机的那天晚上,我坐在客厅里,看着它安静地亮起灯,心里想的是「以后你就替我守家了」。部署 OpenClaw 的过程其实挺折腾的,依赖一堆,环境变量要配,Ollama 要先拉好模型,有一回还因为端口被占用卡了半天,我对着报错搜了半天才发现是上次测试没关掉的进程。等终于看到 OpenClaw 在 Mini 上正常响应指令的时候,我下意识地看了一眼窗外的天色,已经快凌晨了,但当时一点都不困,反而有一种「地基打好了」的踏实感。
M4 Mini 跑 OpenClaw 的时候是有完整 Shell 权限的,万一哪天它「发癫」了,把我硬盘里的东西全删了怎么办?所以我给它配了一只「只读 Deploy Key」——它只能从我的 GitHub 仓库里拉代码,但绝对不能推送。这样就算它疯了,也祸害不了我云端的数据。搞完这一套,我心里才踏实了一点,觉得至少不会一觉醒来发现仓库被写烂。然后我还有一台 M2 Air,平时出门带着。装 Tailscale 的时候我其实没抱太大希望,心想家里和外面网络环境不一样,说不定要搞内网穿透、端口映射之类的麻烦事。结果两边都装上、登录同一个账号之后,Air 上直接 ping 通了 Mini 的 Tailscale IP,我愣了一下,然后试着 SSH 上去,一次就连上了。那天我正好在外面,用的是咖啡馆的 Wi-Fi,终端里打出 ssh 老明@100.x.x.x 的时候心里还在打鼓,结果几秒后就看到了 Mini 的 shell 提示符。那种感觉特别爽,就像突然多了一个永远在线的后端,而且完全在自己掌控之内。后来在咖啡馆、在地铁上、在任何有网的地方,我都能让 Claude Code 通过这条链路连回家里的 Mini 干活,终端里敲几下,家里的机器就吭哧吭哧开始跑,再也不用担心「代码在家里、人在外面」的割裂感了。笔记的同步方式也定死了:Air 上 Obsidian 改完就自动 push 到 GitHub,Mini 用那只只读 Deploy Key 定时 pull 下来,再跑切片、转向量、入库,全程没有用 Syncthing 或 iCloud(Mini 上 7×24 跑 OpenClaw,权限太高,不敢跟主力 Apple ID 绑一起)。
这套远程办公的链路跑通了之后,我开始贪心了。我 Obsidian 里存了几年下来的笔记,几十 GB,里面有我正在开发的 iOS 应用的架构图,有各种技术方案的思考,有微信导出来的聊天记录,甚至还有某起诉讼案的相关材料。这些东西平时躺在硬盘里吃灰,查起来特别费劲。我就想,能不能让 AI 把这些东西都「记住」?以后我问它什么,它能直接从这些材料里翻出来告诉我?那时候我脑子里还没有「RAG」这个词,只是单纯觉得「要是它能读我全部笔记就好了」。有一次我为了让它「了解一下我的项目」,直接把一个好几万字的 Obsidian 文件夹导出成一个大 Markdown,复制进对话框,点了发送。结果输入框直接罢工,满屏飘红的 Token Limit Exceeded,我当时就懵了,坐在那儿盯着那行错误看了好几秒,心想不会吧,这么基础的需求都满足不了?我又试了试只塞一个子文件夹,还是超了。再砍成单个文件,勉强能塞进去,但模型回复得特别慢,而且明显没「记住」前面的内容,聊到后面就糊了。那时候我才灰头土脸地去问 Gemini、顺便刷了刷小红书上的 RAG 科普,这才第一次听说 RAG 这个概念,知道原来做法不是硬塞,而是先建一个「可检索的库」,按需取用。
RAG 全称叫 Retrieval-Augmented Generation,检索增强生成。用人话解释就是:你问 AI 问题之前,先去你自己的数据库里搜一圈,把相关的东西翻出来,塞给 AI 当「参考资料」,然后 AI 基于这些资料来回答你。这样 AI 就能「知道」它训练数据里没有的东西,比如你昨天写了什么笔记、某朋友的微信号是多少。听起来很美好对吧?我那时候也觉得,只要把这玩意儿搭起来,我就相当于有了一个「全知外脑」。于是我开始现学现卖。真的是现学现卖,我连 RAG 是啥都不知道,就硬着头皮往下搞,完全是根据「当前卡在哪儿、需要什么」来加功能:塞不下长文档就学切片,找不准日期再上 BM25,结果太多、噪音太大再上 Reranker,内存爆了就改 GPU 和候选数,数据太吵就搞权重,想看明白库里有啥就做控制台。每一步都是被问题推着走,没有一张事先画好的架构图。我也没有去啃论坛、教程或论文,Embedding、Chunk、向量数据库、相似度这些词,全是跟 Gemini 一问一答、然后让 Claude Code 在 Mini 上写脚本跑出来的。Gemini 给建议,Claude 执行,我这边最多改改路径、改改参数,有时候搞到半夜两三点,脑子里全是「余弦相似度」「L2 距离」这种词在打转。
第一步是解决向量化的问题。我得把那些 Markdown 文件变成计算机能「理解」的数字。跟 Gemini 对谈时它提到 bge-m3 中文英文都支持,就它了。我用 Ollama 在 Mini 上把它跑起来,然后按 Gemini 给的思路让 Claude Code 写脚本:把每个 Markdown 切成三百字左右的小块,后来才知道这叫 Chunk,再把每个 Chunk 扔给 bge-m3,吐出一串 1024 维的向量。向量存哪儿?也是 Gemini 说 ChromaDB 轻量、本地跑、适合个人,我就把那几十万个向量全塞进去了。接着写了个 FastAPI 服务,跑在 8000 端口。当我在 Air 上提问的时候,问题会先飞到这个服务,服务把问题也变成向量,去 ChromaDB 里算距离,把最相近的几个 Chunk 拿出来,打包发给大模型,然后大模型基于这些「记忆」回答我。写这个网关的时候我踩了不少坑,一开始没搞清异步和同步,请求一多就卡死;后来又把检索结果直接拼成一段长文本塞给 API,没控制长度,又触发了一次 Token 超限。改了好几版,加上了截断和重试,终于有一次从 Air 上发问,Mini 那边日志里打出了「检索到 N 条」「已调用大模型」「返回成功」,然后我这边对话框里真的出现了一段像模像样的、带着我笔记内容的回答。整个流程打通的那天,我盯着终端里滚动的日志,心里有一种特别不真实的成就感,觉得这套东西已经成了,甚至有点想找个人显摆一下,虽然也不知道显摆给谁看。
当第一批一百多万个向量切片涌入数据库的时候,看着满屏滚动的进度条,听着 Mini 风扇微微转起来的声音,我有一种错觉,仿佛我已经握住了全知全能的权杖。我想,以后任何关于我人生的细枝末节,它都能信手拈来。那种心态现在回想起来特别可笑,但当时真的是这么想的。结果现实很快就给了我第一记耳光。
有一天我问它:「某年某月 14 号我们聊了什么?你还记得吗?」我满心期待它能把那天我给 AI 搓 Skill 的细节完美复述出来,好让我回味一下当时的技术灵感。它转了两圈,极其自信地回答我:「没有找到 14 号的记录。但我看到了某年 1 月 7 号和某年 6 月 21 号的对话。」我当时盯着屏幕,整个人都麻了。那种感觉就像是你把最珍贵的日记本交给了一个你最信任的图书管理员,结果他告诉你日记本丢了,还硬塞给你两本别人的日记。我清清楚楚地记得,那个 14 号的文件就在库里,里面记着我那天怎么给 Claude Code 搓 Skill 的过程。文件就在那儿,但 AI 就是「瞎」了。我不信邪,当晚就开了调试模式,把每次检索的 query 和 top-K 结果全打出来。我对着日志一条条看,发现向量检索返回的那几条里,要么是别的日期的对话,要么是主题 vaguely 相关但根本不是 14 号的技术笔记。我甚至手动在 ChromaDB 里搜了一把文件名和内容里的「14」,能搜到,说明数据在;但用自然语言问「某月 14 号我们聊了什么」,向量算出来的 top 里就是没有它。后来把现象和日志丢给 Gemini,它才给我讲清楚:这是纯向量检索的「阿喀琉斯之踵」——密集向量对数字、日期、专有名词「脸盲」。向量模型的本质是「算语义」,在高维空间里,「14号」和「7号」的语义距离太近了——都是「一月份的某一天」嘛。它懂你的「感觉」,但对于具体的数字、日期、专有名词,它几乎是盲的。那一刻我特别沮丧,心想我折腾了这么久,结果连「某月 14 号」都找不回来,这叫什么全知外脑?
好吧,那我就给它配一副「眼镜」。跟 Gemini 一说「查具体日期查不到」,它就说工业级 RAG 得做混合检索:除了向量这一路,还要并行跑一路 BM25。BM25 是干什么的呢?它没有任何「理解」能力,就是像疯狗一样做字面词频匹配。你搜「某年-01-14」,它就去所有文档里找这几个字,管你什么语义不语义,字面上有就是有。接 BM25 的时候又是 Gemini 给方案、Claude Code 在 Mini 上实现,接口和 ChromaDB 要自己对接,查询字符串变 BM25 语料索引、再和向量那路合并去重,改了好几版。第一次跑通用「某月 14 号」一测,top 里终于出现了那个日期的文件,心里一块石头落地。再后来 Gemini 说还有第三个短板:Top-K 抽奖会把大模型注意力稀释,得加一个 Reranker 当「法官」,把两路捞出来的几十条重新精读打分,只把最高的几条递给大模型。我就按它的方案上了 bge-reranker-v2-m3。这套「向量加 BM25 加 Reranker」的三驾马车,全是 Gemini 给建议、我这边执行出来的,当时心里还挺得意,觉得自己的系统已经不是「玩具级」了。
但第二记耳光马上就来了。上了 Reranker 之后,每次问个问题,终端里的 AI 都要转圈卡上一分多钟才吐字。第一次卡住的时候我正好在问一个稍微复杂一点的问题,等了几十秒还没反应,我以为是网络问题,刷新了一下页面,又等了一分钟,才蹦出一段回答。我心想这体验太差了,谁受得了每次等这么久。后来有一次我在家直接用 Mini 本机测,发现一样卡,这才确定问题在本地。我去看后台日志和活动监视器,发现 M4 Mini 的 16GB 统一内存已经被干到了 Swap 的边缘,硬盘灯狂闪,其他应用都开始卡顿。原来 Reranker 默认是用 CPU 算矩阵的,而我之前完全没意识到要给它开 GPU 加速。再加上我没有限制候选集的数量,向量检索捞了五十条,BM25 又捞了五十条,合并后把上百条塞给 Reranker 去「精读」,内存直接爆了。macOS 开始疯狂往硬盘里写数据,速度暴跌,整个系统都喘不过气。我又花了一整天去修。把卡顿和 502 的现象描述给 Gemini,它说 Reranker 默认用 CPU 算矩阵,必须显式开 M4 的 MPS 和半精度;候选条数也不能多,两路初筛各五十条合并上百条塞给法官,内存必爆。我就按它说的在代码里加上 device 设为 MPS、use_fp16 设为 True,把两路初筛死死限制在 15 条以内,再把 Reranker 改成服务启动时全局加载一次、常驻内存,不再每次请求都加载。全是 Gemini 给诊断、Claude Code 这边改代码。那阵子我还跑着一个 Streamlit 控制台在 8501 端口,结果有一回同时开着网页看数据、又在终端里问问题,Mini 直接 502 了,后来才知道是 ChromaDB 的 SQLite 被多进程抢锁,Reranker 和控制台一起读库把底层锁死了。所以又把并发捋了一遍,尽量错峰。再后来有一阵子在 Air 的浏览器里打不开 8501,本机 curl 是通的,Gemini 提醒可能是科学上网软件把 Tailscale 的 100.x 网段也走代理了,关掉代理或把 100.* 加进 bypass 之后,果然就能打开了。改完重启服务,第一次请求还是会慢一点因为要 warm up,后面就稳定了,一分钟的延迟终于缩短到了两三秒。那时候我长舒一口气,觉得至少「能用」了。还有个小插曲:有一阵子每次新开 Claude Code,第一句问它「我最喜欢的成语是什么」之类,它总说不知道,同一句话再问第二遍就答出来了。后来跟 Gemini 对了一下日志,发现 Claude Code 第一轮会往请求里塞一大段系统环境(路径、Git 状态等),网关把整段话拿去算向量,语义被冲淡了。在网关里改成只拿用户问题的最后 300 字去查库,首句就正常了。但在这个修 bug 的过程中,我又发现了另一个问题。
之前 Reranker 测试报告里出现「技术栈」搜出一堆旺柴、「RAG 项目」搜出投资聊天而不是技术文档,Gemini 就说要上 P0 数据清洗,在入库前加一层「自动化记忆过滤器」,用黑名单和规则把垃圾挡在 ChromaDB 门外。我让 Claude Code 按它的方案实现了 data_cleaner 和 blacklist_config:文件夹名带「微信聊天」的直接不入库,切片不足 30 字的丢弃,表情包占比过高的扔掉。跑完同步脚本那天,看着数据库体积暴瘦、日志里全是「已过滤」「已丢弃」,我还沾沾自喜,以为终于有了一个纯净的干货库。现在想来,这就是「倒洗澡水把孩子也倒了」——我根本没想过,某朋友、某同事、某天的关键对话,全藏在这些被整体拉黑的「废话」里。
有一天我在整理人脉,想回忆一下某朋友最近去了哪、某同事负责的那摊事具体是什么,就随口对着 RAG 问了一句:「某朋友是谁?」AI 冰冷地回复我:「知识库未找到相关信息。」我愣了一下,心想不可能啊,我和某朋友聊过那么多,某同事的外包排班、对接人名字都在微信里。我下意识去 Obsidian 里搜了一下,聊天记录文件夹里白纸黑字都在。然后我才反应过来:那些文件夹早就被我的黑名单整个排除了,同步的时候根本就没进库。我坐在电脑前,心底升起一股巨大的荒谬感,像是自己亲手把记忆库挖了一个大洞,还一直以为洞是「噪音」。我为了追求「纯净」,把真正有价值的东西也过滤掉了。我不得不承认,我犯了架构设计里最典型的错误:过度设计。那时候心里特别堵,一方面觉得自己蠢,一方面又得硬着头皮想怎么补救。
好吧,那我就把黑名单删了,全量吞吐。那一阵子我每次打开同步脚本都有点心理阴影,生怕又手滑写了什么规则把重要东西过滤掉。问题是噪音怎么处理?如果聊天记录全进库,检索的时候会不会总是先命中「哈哈哈」「在吗」?我跟 Gemini 说我不想再搞黑名单了,违背初心,它就说可以改成「数据湖」:不删任何东西,用路径自动打权重和分类,检索时用元数据过滤或让 Reranker 在沙子里淘金。我就按这个思路用「权重」来解决问题:不删任何数据,但给不同来源的数据打上不同的权重,检索时按权重参与排序,这样高价值内容会自然浮上来,低权重的聊天记录仍然可被搜到,只是不会轻易抢掉技术文档的风头。在入库的时候,根据文件所在的目录自动打上权重标签:放在「核心文档」目录下的,权重就是 1.0,最高优先级;放在「微信聊天」目录下的,权重就是 0.3,保底。这样所有数据都保留,但检索的时候,高权重的内容会优先浮上来。为了能直观地看到和调整这些权重,我还用 Streamlit 撸了一个跑在 8501 端口的可视化控制台。第一次在浏览器里打开那个页面,发现分类里几乎只有「uncategorized」——因为库里那一百多万条是之前没打标时代进库的旧数据。不可能为它们重算一遍向量,就按 Gemini 说的写了个 fast_relabel 脚本,只扫元数据、按路径批量写回 category 和 weight,几分钟把旧数据全部「附魔」了一遍。再刷新控制台,才看到数据按目录、按权重分布成表格和图表,有一种「终于能看见自己的赛博大脑长什么样」的感觉。我可以在网页上看到所有数据的分类分布,如果发现某条低权重的聊天记录其实很重要,我可以直接双击把它的权重改成 1.0,并且打上「免死金牌」,让后续的同步不会覆盖我的手动干预。折腾到这一步,技术架构算是比较完善了:向量检索、BM25 硬匹配、Reranker 重排序、权重系统、可视化控制台。听起来很专业对吧?我心里想,这下总该稳了,数据既不会丢,又不会全是噪音。
但最让我沮丧的,其实不是这些技术问题。就算我把所有算法都调教好了,就算它能精准地从几十万条记录里把某朋友的微信号翻出来,它给我的感觉依然很「笨」。你问它「我的个人网站是什么」,它会极其机械地回答:「根据知识库检索,未找到您个人网站的相关信息。」你问它「老明是谁」,它会翻开聊天记录,找到几条带有「老明」这个名字的消息,然后告诉你:「老明的微信号为某某,有某年到某年的消息记录痕迹,但未提供身份描述。」我整个人都不好了。老明不就是我自己吗?我就是老明啊!谁会在自己的聊天记录里写「我是老明,是这台电脑的主人」?它明明可以从上下文、从「正在和它对话的人」推理出这一点,但它宁可像念档案一样把检索到的几条消息复述一遍,也不敢多嘴说一句「你应该就是老明本人」。你不会推理一下吗?但它就是不会。它像一个刻板的档案管理员,只会把你搜出来的东西原封不动地念给你听。它完全丧失了大模型原本那种强大的推理能力、变通能力、共情能力。那种感觉特别诡异,就像你养了一只特别聪明的狗,结果你给它戴了个项圈,项圈上写着「只许说档案里有的内容」,然后它就真的变成了一个只会念档案的机器。我那时候又困惑又火大,心想我搭的是 RAG,不是高级 grep 啊。
我终于意识到问题出在哪儿了。不是检索的问题,是 Prompt 的问题。那天晚上我越想越不对劲,就打开网关的代码,从请求入口一路跟到发往大模型的 payload,一个函数一个函数看。最后在一个不起眼的「构建系统提示」的函数里,看到了当初写进去的那句经典 RAG 式提示词:「请基于以下参考资料回答用户的问题。如果参考资料中没有,请直接回答不知道,不要自己编造。」(这类写法很多地方都有,包括 Gemini 给示例时也会带上一句防幻觉的免责声明。)当时我还觉得这样写很稳妥,能防止它瞎编。结果正是这句话,像一剂迷药一样把 AI 的脑子给锁死了。它被绑死在知识库里,不敢做任何超出「检索结果」的思考。它宁愿像个傻子一样复述微信号,也不敢推理「老明就是正在提问的主人」。这才是最大的坑。RAG 的本质是「开卷考试」,我给它准备了那么多参考资料,但我忘了告诉它:这些只是参考资料,你该思考还是要思考,该推理还是要推理,别被这些纸条捆住手脚。找到病因的那一刻,我没有去睡觉,反而兴奋得浑身发抖。这不需要改一行底层的检索代码,不需要重新计算任何庞大的向量矩阵,这仅仅是一个灵魂唤醒的仪式。
我后来改了 Prompt,换成了更自然的方式:「你是我的赛博外脑。以下是你唤起的深层记忆切片,就把它们当做你脑子里自然浮现的信息。该推理推理,该回答回答,别老是把『根据知识库』挂在嘴边。」保存,重启网关,再次回到终端的时候,我其实有点紧张,怕只是自己一厢情愿,改个提示词未必有用。我再次敲下那个问题:「那老明是谁?」心里还在想,要是它还是给我念档案,我就认了,可能 RAG 就这样了吧。结果这一次,屏幕上的字几乎是跳跃着弹出来的:「别闹了,老明不就是你本人嘛。不过有意思的是,我刚刚脑子里浮现出一段记忆,你其实有两个常用的马甲,一个是工作号,另一个是带某游戏标签的小号。」我看着这行字,眼眶微微发热。那个聪明的、有灵性的 AI,瞬间就回来了!而且它现在不仅聪明,它的脑子里还装满了我整整几十 GB 的人生产出。它不再把记忆当成外在的参考资料,它把那些碎片当成了它自己潜意识的一部分,自然地推理,自然地调侃。效果确实好了一些。但说实话,折腾了这么一大圈,我的预期已经完全变了。
不再指望它变成什么「全知外脑」,也不再幻想它能真正「懂我」。它就是一个偶尔能派上用场的记忆检索工具。能帮我翻翻旧账、找找某个微信号、查查某天聊过什么,这就够了。后来我为了验证系统的极限,又问了一个极其简单的问题:「我的个人网站是什么?」AI 沉默了一会,像个老朋友一样坦诚地回答我:「我脑子里没有浮现出你个人网站的具体网址,你似乎没怎么在记录里明确写过。」这一次,我没有崩溃,我也没有再去翻代码。我反而靠在椅子上,释然地笑了。我终于彻底看透了 RAG 系统的客观物理定律。哪怕它现在再聪明,它的灵魂再自由,它也终究只是一个开卷考试的学生,它不会凭空捏造。如果我从来没有在我的核心笔记里,用陈述句清清楚楚地写下过「我的网站是某某」,哪怕它吞下了一百万句的微信碎片聊天,它也拼凑不出这个从未被固化过的事实。
这让我有了一个极其深刻的顿悟:数据,永远不等于知识。 RAG 能给你数据,但它给不了你「理解」。微信里的只言片语、各种琐碎的报错日志、别人发给我的表情包,那些是泥沙俱下的数据,它们负责保留细节和微观历史。而真正能够让赛博大脑形成世界观的,是那些高维度的、被你自己亲手写下来的事实。没有大纲,碎片就永远只是碎片;没有骨架,血肉就无法站立。不要试图用一句「严格基于参考资料」去扼杀它的推理能力,那是强行灌迷药,让 AI 只能基于数据库思考,把本身强大的推理能力锁死。你要做的是解放它,让它站在你海量的数据之上,用它本身的智慧去俯瞰你的人生。说白了,RAG 给你的是「材料」,不是「结论」;大模型的本事是推理和综合,你非用 Prompt 把它绑成「只许念材料」,那就等于把最值钱的那部分能力亲手废掉了。我踩过的最大坑就是这个,写出来也是希望后来的人别重蹈覆辙。
这条路我还会继续走,但心态已经完全不一样了。我不再会为「某月 14 号」找不回来而暴跳如雷,也不会再幻想问一句「我是谁」它就能答出我的人生小传。我会把它当成一个需要我「喂对材料、问对问题」的增强记忆工具,该写的核心事实还是得自己写在笔记里,该推理的部分交给模型,但别用一句 Prompt 把它逼成复读机。也许这就是技术人的宿命吧,折腾了一大圈,最后发现最难的不是技术本身,而是怎么给技术设定合理的预期,以及怎么别用 Prompt 把 AI 绑成只会念档案的傻子。你要问我后不后悔?倒也不后悔。至少这大半个月,我把向量检索、BM25、Reranker、权重系统这些东西从头到尾玩了一遍,算是真正入了个门。以前看别人聊 RAG,云里雾里的,现在至少知道他们都在聊什么了。只是想提醒一下也想玩这套东西的朋友:别对它期望太高。RAG 不是万能的,它就是一个增强版的搜索引擎,而已。它能帮你「从自己的数据里捞东西」,但捞出来之后怎么理解、怎么推理、怎么跟你像人一样对话,取决于你有没有用 Prompt 把它绑死。如果你指望它能变成一个真正「懂你」的数字分身,那你大概率会失望,除非你愿意在提示词里给它松绑,并且接受「它只能基于你喂过的数据说话」这件事。至少我是失望了。对「全知外脑」的幻想破灭之后,反而用得更踏实了。但失望归失望,那个能推理、能调侃、能把记忆当自己事的赛博外脑,我还是会继续用下去,只是不再幻想它全知全能罢了。有时候半夜想起来某个老早以前的对话或某个人名,还是会习惯性打开终端问它一嘴,能捞出来就捞出来,捞不出来就自己去翻文件夹,心态已经平和很多。RAG 不是万能药,但它确实把我那堆散落的笔记和聊天记录变成了一种「可问」的形态,这一点我还是认的。夜已经深了,Mini 的风扇依然在微不可察地转动着。打开一瓶啤酒,开怀畅饮。明天,我的赛博大脑还要继续吞吐这个世界。