← 返回博客
·AI技术

RAG 落地踩坑记:从「听起来很美」到「能用但别指望太多」

做 RAG 半年,踩了无数坑。向量数据库怎么选、chunk 怎么切、retrieval 不准怎么办——把真实的血泪经验写出来,省得你再走一遍弯路。

#RAG#LLM#向量数据库#生产实践

写在前面

去年年底老板说要搞 RAG,我心想:不就是把文档向量化然后 similarity search 吗,能有多难?

半年过去了,我们的 RAG 系统跑在生产环境,回答准确率大概 72%——比随机猜强,但离「可用」还有距离。这篇文章把踩过的坑写出来,供各位参考。


Chunk 切分:你以为的聪明做法全是坑

固定长度切分是最蠢的默认选项

很多人第一反应是:「每 500 个 token 切一刀」。听起来合理,实际操作起来一地鸡毛。

# 别这么做

def dumb_chunk(text, size=500):

return [text[i:i+size] for i in range(0, len(text), size)]

我们试过按段落切、按标题切、按语义边界切。最终发现**按 Markdown 标题层级切 + 重叠窗口**是最稳的。核心思路是保留文档的层级结构,让每个 chunk 本身就是一个有意义的语义单元。用户问「如何配置 OAuth」,retrieval 回来的不应该是一段从中间截断的残篇。

Overlap 不是玄学,是必须的

没有 overlap 的 chunk 切分,相当于把一本书每页撕掉最后一行再装订——前后文衔接处必丢信息。我们用的 overlap 是 10-15% 的 chunk 长度,效果比没有 overlap 好不少。


向量数据库选型:别想太多,先用简单的

我们试过三个方案:FAISS(适合原型)、Pinecone(托管省心但贵)、Chroma(开源够用)。

说实话,在数据量 < 100万向量的时候,选哪个差异不大。别在选型上浪费两周,挑一个能跑起来的先用着。我们最终用的 Chroma,API 简单,本地持久化也没什么坑。

import chromadb

client = chromadb.PersistentClient(path="./chroma_db")

collection = client.get_or_create_collection(

name="docs",

metadata={"hnsw:space": "cosine"}

)


Embedding 模型:中文场景下别用 OpenAI 的

OpenAI text-embedding-3-small 英文确实强,但中文效果被国内模型吊打。我们最终用的 **bge-large-zh-v1.5**(智源),本地部署,延迟低,效果够用。

一个小坑:bge 模型要求在 query 前面加「为这个句子生成表示以用来检索相关文章:」,否则效果会差很多。这个设计挺蠢的,但确实有用。


Retrieval 不准?问题可能不在向量搜索

这是最大的坑:**向量相似度搜索找到的 top-K 结果,和「能回答用户问题」根本不是一回事**。

我们遇到的情况:用户问「怎么配置 SSL」→ 向量搜索返回了「SSL 证书原理介绍」那段,而不是「配置步骤」。

解法一:Hybrid Search

向量搜索 + 关键词搜索(BM25)结合,效果比纯向量好很多。RRF(Reciprocal Rank Fusion)把两个排名合并,简单有效。

解法二:Rerank

Retrieval 阶段用快速但粗糙的方法(ANN),然后用一个更小的 cross-encoder 做 rerank。加了 rerank 之后,我们的 top-3 准确率从 58% 提升到 74%。代价是多了一次模型推理,延迟增加约 200ms——值得。


提示词工程:别把文档直接塞给 LLM

早期我们的 prompt 长这样:「根据以下文档回答问题:{docs} 问题:{query}」。然后 LLM 经常忽略文档,自己瞎编。

后来改成明确告诉模型「如果文档中没有相关信息,明确说不知道,不要编造」。这个比任何 fancy 的 prompt 技巧都管用。


评估:你怎么知道 RAG 有没有用?

这是我们做得最差的部分。直到上线两个月后,我们才认真做了评估框架。推荐用 RAGAS 或者自己写简单的评估——有评估框架之后,每次改 chunk 策略或者换 embedding 模型,都能立刻看到影响。没有评估的 RAG 优化,基本是在撞大运。


总结

值得做,但别指望它解决所有问题。如果我现在重新开始一个 RAG 项目:

  • **第一周**:用最简单的方案跑通链路(Chroma + bge + GPT-4o)
  • 2. **第二周**:搭评估框架,建立 baseline

    3. **第三周开始**:针对评估结果,逐个优化

    别在选型上浪费时间,别在没有评估的情况下瞎优化。

    *有问题欢迎留言,知无不言。*