既然博客写了十年,我就用向量数据库做个语义检索版

敲下最后一行 Commit 信息,把项目推上服务器,这个折腾了快一个月的博客语义检索版总算能见人了。十年前我写第一篇博客的时候,打死也想不到有一天会亲手给自己的文字建个“向量索引库”,这感觉就像给自己的记忆装了个搜索引擎,只不过搜索的不是关键词,是“意思”。

2016年那会儿,我满脑子都是怎么用 Python 爬虫给博客刷流量,研究百度 SEO 算法,琢磨怎么用多线程批量发外链。那时候的“搜索”是给别人看的,是流量生意。现在这个搜索是给我自己用的,是效率工具。十年写了快两千篇,别说找某篇具体文章,就连模糊记得的某个技术点、某次踩坑的细节,用传统的关键词搜索基本等于大海捞针。标题记不清,标签也没打全,翻历史记录能翻到眼瞎。这就是数字资产的尴尬:你攒得越多,它越是一团乱麻。

所以这次我决定动真格的,用向量数据库彻底解决这个问题。技术栈选的是 LangChain + ChromaDB + OpenAI 的 Embeddings API。第一步就是数据清洗,把十年里所有 Markdown 文件扒出来,用正则表达式去掉 Front Matter 和代码块,只留纯文本内容。这里就踩了第一个坑:早期博客图片用的是七牛云,链接早就失效了,文本里一堆破碎的 URL,预处理脚本写得我头皮发麻。

然后就是分块(Chunking)。直接整篇文档扔进去效果很差,检索精度低。我试了按固定字符数切分、按段落切分,最后用了递归字符文本分割器,设置重叠字符,保证一个技术点不会被生硬地切断。比如我2018年写微信小程序云开发那篇,涉及到前后端交互和数据库设计,如果切碎了,检索“云函数调用优化”可能就只返回半句话,上下文全丢。重叠字符就像给碎片之间搭了座桥。

核心是生成向量。调用 OpenAI 的 text-embedding-ada-002 模型,把每一块文本转换成 1536 维的向量。这个过程烧钱,也烧时间。两千篇文章,切分后得到上万个文本块,API 调用有频率限制,得写重试和延迟逻辑,跑一次全量嵌入花了好几个小时。看着账单心里一抽,但想想这玩意一旦建好,就是永久性的知识图谱基础,忍了。

向量存进 ChromaDB,检索就简单了。前端一个极简的输入框,背后是把查询语句同样转换成向量,然后在向量空间里做相似度计算(用的余弦相似度),返回最匹配的 Top K 个文本块。效果立竿见影。我试着搜“如何应对甲方频繁改需求”,传统搜索可能只返回标题里有“甲方”的文章。但向量检索把我2020年吐槽项目管理、2022年写敏捷沟通、甚至2023年用 ChatGPT 写需求文档的片段都找出来了,它们都没提“甲方”这个词,但语义高度相关。

这项目的意义远不止于技术实现。它标志着我从“内容生产者”转向“知识架构师”。过去十年,我生产了信息;未来十年,我得能驾驭这些信息。超级个体不是靠堆工作量,是靠系统效率。我的博客不再是一堆按时间排列的日志,它成了一个活的、可交互的知识库。下次再写新文章,我可以先“问”我的历史博客:“我以前对低代码平台是怎么看的?” 它能给我脉络,而不是碎片。

当然,问题还有一堆。ChromaDB 是轻量,但持久化和备份策略还得琢磨。嵌入模型会不会有更新?增量更新怎么设计?检索结果的可解释性怎么增强?这些都是下一步要啃的骨头。但今晚,看着那个简陋的搜索框能吐出我十年前某个深夜写的、自己都忘了的代码片段时,感觉值了。这十年没白写,它们终于不再是硬盘里沉默的字节,开始互相说话了。

© 版权声明
THE END
喜欢就支持一下吧
点赞37 分享