不知道大家有没有一种感觉,RAG从诞生之初,就一直处于一种“既生又死”的状态,今天某人宣称有一个新实践可以干掉RAG,结果大家试了试发现还是不能取代RAG。过了一段时间又有人说一种新的实践可以取代RAG,RAG又“死”了,结果没几天,大家还是乖乖的用回RAG。就像是GTA6一样,每隔一段时间就是一个循环。

但是R星现在终于确定了发售日期(希望如此),而skill的出现似乎真的杀死了RAG 吗?

似乎不是的,个人用下来感觉skill看起来和RAG确实很像,都是精简提炼某个领域的最佳实践或者指导,然后喂给大模型,但是但是,skill相对固定,如果是知道自己要做什么,那么skill确实好用。但是遇到一个庞大的企业知识库,skill就显得不那么灵活了。


在前两篇文章中,我和大家讨论了

  • 为什么 Agent 相比单个 LLM 和 Workflow 更强

  • 为什么 Agent 需要 Memory 才能处理长期任务

本篇文章会和大家探讨一下AI内容质量工程,RAG是如何提升生产质量的。我们先从一个问题入手:

即使模型很强,回答依然经常不准确。

例如:

  • 企业内部知识问答

  • 技术文档查询

  • 产品使用说明

  • 公司政策问答

如果直接让大模型回答,大模型往往会:

  • 编造不存在的内容

  • 使用过时的知识

  • 回答与实际文档不一致

这种现象通常被称为 “幻觉(Hallucination)”

而解决这个问题最常见的方法,就是 Retrieval-Augmented Generation(RAG)

一、为什么大模型的回答会不靠谱

1.知识是静态的

虽然模型训练的时候数据量很大,但是这些数据往往都是公开的一些数据,模型训练完成之后无法自动获取新知识,无法更新企业内部数据,无法访问私有数据库。 所以模型在回答涉及到一些企业私有的问题时往往效果很差。

2.知识是模糊的

即使模型知道相关知识,也可能只是模糊理解

例如:

Kafka 如何保证消息不丢失?

模型可能回答:

  • replication

  • ack机制

  • leader follower

但并不一定符合你公司内部的具体配置。

3.模型倾向于“编造答案”

当模型不知道答案时,往往不会直接说:"我不知道"

而是会生成一个看起来合理但实际上错误的回答

这就是所谓的 幻觉

二、RAG解决的核心问题

RAG 的核心思想非常简单:

在生成回答之前,先从外部知识库中检索相关信息,再让模型基于这些信息回答。

基本流程如下:

用户问题
   │
向量化 (Embedding)
   │
向量检索 (Vector Search)
   │
相关文档
   │
拼接到 Prompt
   │
LLM 生成答案

这样做的好处是:

  • 模型回答基于真实文档

  • 可以接入私有知识库

  • 知识可以动态更新

因此 RAG 成为目前企业 AI 系统中最常见的架构之一。

三、为什么很多RAG系统效果依然很差?

1. 用户问题 ≠ 检索 Query

一个经常被忽略的问题是:用户提出的问题,并不一定适合作为检索语句。

例如用户问:

这个系统为什么会 OOM?

但知识库中的文档可能是:

JVM 内存溢出的常见原因

虽然两者语义相关,但表达方式完全不同。

在这种情况下,直接把用户问题进行向量化检索,很可能无法找到真正相关的文档。

因此很多工业级 RAG 系统都会增加一个步骤:

Query Rewrite(查询重写)

也就是在检索之前,通过模型或规则对问题进行改写,例如:

系统OOM原因
JVM OOM原因
Java内存溢出问题

这样可以显著提高检索召回率。


2. 文档切分(Chunking)方式不合理

RAG 系统在构建知识库时,通常需要把长文档拆分成多个小块(chunk)。

很多系统为了简单,直接按照固定长度切分,例如:

每1000 token切一段

这种方式实现起来很简单,但往往会破坏文档的语义结构。

例如一段技术文档可能包含:

函数说明
代码示例
参数解释

如果在切分时把这些内容拆散,就可能出现这样的情况:

  • 检索到了代码,但没有说明

  • 检索到了说明,但没有代码

最终导致模型获得的上下文是 不完整的

更合理的做法通常包括:

  • 按章节或标题切分

  • 按语义段落切分

  • 对代码块进行完整保留

这样可以保证每个 chunk 本身就是一个相对完整的信息单元。


3. TopK结果不一定是最相关的

向量检索的结果通常是:

TopK 相似度文档

但需要注意的是,embedding 相似度只是一个粗粒度的语义相似度判断,并不能完全等同于“相关性”。

在实际系统中,经常会出现这样的情况:

  • Top5 中只有 1~2 篇文档真正相关

  • 其他文档只是语义相似,但内容并不匹配

因此在企业 RAG 系统中,通常会增加 Rerank(重排序) 阶段。

整体流程会变成:

Vector Search(向量搜索) → Top50
        ↓
      Rerank(重排序)
        ↓
       Top5

Rerank 模型会重新评估:

query 与 document 的相关性

从而筛选出真正最有价值的文档。


4. 上下文噪声污染

很多初级 RAG 系统在拿到检索结果之后,会直接把所有文档拼接进 Prompt,例如:

Top5 文档 → 全部加入上下文

但这样做往往会带来新的问题。

如果上下文中包含:

  • 弱相关信息

  • 重复信息

  • 甚至相互矛盾的内容

模型在生成回答时就可能产生混乱。

因此在成熟的 RAG 系统中,还会增加一个重要步骤:

Context Filtering / Context Compression

也就是对检索到的文档进行筛选和压缩,只保留真正有价值的信息。

这样既可以减少 token 消耗,也能提升模型的理解效率。

5.知识库本来的质量就不高

出现这种问题,赶紧把文档复杂人揪出来打一顿吧。

四、目前我自己实践的RAG架构

                  用户问题(User Query)
                       │
                       ▼
                提示词改写(Query Rewrite)
                       │
                       ▼
              混合搜索(Hybrid Retrieval)
         (Vector + Keyword Search)
                       │
                       ▼
                Top 50 Documents
                       │
                       ▼
                     重排序(Rerank)
                       │
                       ▼
                 Top 5 Documents
                       │
                       ▼
              上下文压缩(Context Compression)
                       │
                       ▼
                       LLM
                       │
                       ▼
                     Answer

五、Agentic RAG

之前的文章中我向大家介绍了为什么Agent能够比LLM有更好的生成效果,其中Agent有一个重要的能力就是会搜集补充信息,和RAG相结合流程变成:

User Question
      │
      ▼
     Agent
      │
      ├─ Retrieval
      │
      ├─ Reasoning
      │
      ├─ Retrieval
      │
      ▼
    Final Answer

这种方式支持:

复杂问题拆解
动态检索

Agent自主搜集信息的能力再加上RAG就能产生更好的生成结果。


本文是本系列的第三篇内容,后端我会和大家分享内容安全,多模态Agent构建,文件系统等领域的实践,感兴趣点个赞吧。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐