RAG
LLM 在自然语言处理领域展现了卓越的能力,但其固有的知识局限性——即“知识截止日期”和内容不可追溯性——是其在关键业务应用中落地的主要障碍。RAG 作为一种先进的架构范式,通过动态地将外部知识库与LLM的生成过程相结合,有效解决了这些挑战。
大型语言模型的内在局限
自诞生以来,以GPT系列、Llama系列为代表的大型语言模型,凭借其强大的文本理解与生成能力,正在重塑人机交互的未来。然而,这些模型并非完美无瑕。其核心局限在于,模型的知识被静态地“编码”于其庞大的参数之中,这一过程在训练阶段完成。由此导致两大根本性问题:
知识时效性问题(Knowledge Cutoff): 模型的知识停留在其最后一次训练的数据集所处的时间点。对于任何在此之后出现的新信息、新事件或数据更新,模型无法感知,从而在回答相关问题时表现出信息滞后甚至错误。
幻觉与可解释性问题(Hallucination & Interpretability): 当面对其知识范围之外或模糊不清的查询时,LLM有时会生成看似合理但实际上与事实不符的“幻觉”内容。同时,由于其生成过程的“黑箱”特性,我们难以追溯其回答的信息来源,这在要求高准确性和可验证性的场景(如金融、法律、医疗)中是不可接受的。
为了克服这些局限,研究界与工业界探索出多种解决方案,其中,检索增强生成(RAG)被公认为当前最高效、最具扩展性的技术路径之一。
RAG的核心架构与技术组件
RAG的基本思想非常直接:在让LLM回答问题之前,先从一个外部的、可实时更新的知识库中检索出与问题最相关的信息,然后将这些信息作为上下文(Context)连同原始问题(Query)一起提供给LLM,引导其生成一个有据可依的、准确的答案。
一个标准的RAG系统主要由以下三大核心组件构成:
1. 索引(Indexing)
索引是构建RAG系统的第一步,其目标是将原始的非结构化或半结构化文档数据转化为机器可高效检索的格式。该过程包含:
- 数据加载与切分(Loading & Chunking): 从指定数据源(如文档库、数据库、API)加载原始数据。由于LLM处理的上下文长度有限,必须将长文档切分为更小的、逻辑上连贯的文本块(Chunks)。切分策略(如固定大小、按段落切分、递归切分)对最终的检索效果有重要影响。
- 嵌入(Embedding): 利用文本嵌入模型(如Sentence-Transformers, OpenAI Ada-002等)将每个文本块转换为高维向量(Vector Embedding)。这些向量能够捕捉文本的语义信息,使得语义上相近的文本块在向量空间中的距离也更近。
2. 检索(Retrieval)
检索是RAG系统的核心环节,负责根据用户的查询找到最相关的知识片段。
- 查询向量化: 将用户的输入查询同样通过嵌入模型转换为查询向量。
- 向量相似度搜索: 在索引好的向量数据库(Vector Database,如FAISS, Pinecone, Weaviate)中,计算查询向量与所有文本块向量之间的相似度(通常使用余弦相似度或点积)。
- Top-K检索: 返回相似度得分最高的K个文本块,作为后续生成环节的候选上下文。
3. 生成(Generation)
生成是RAG系统的最终输出环节。
- 上下文增强提示(Context-Augmented Prompting): 将检索到的Top-K文本块与用户的原始查询整合到一个精心设计的Prompt模板中。一个典型的模板结构如下:
1
2
3
4
5
6
7
8
9
10
11根据以下提供的上下文信息,请准确回答用户的问题。如果上下文中没有足够信息,请明确指出。
[上下文]:
{retrieved_chunk_1}
{retrieved_chunk_2}
...
[问题]:
{user_query}
[回答]: - LLM推理: 将构建好的增强提示送入LLM。LLM将基于其强大的语言能力,对提供的上下文进行理解、提炼和总结,最终生成一个忠实于上下文信息、逻辑清晰的答案。
前沿RAG优化策略
基础的RAG架构虽然有效,但在处理复杂查询和大规模知识库时仍面临挑战。学术界和工业界已发展出多种高级优化技术。
混合搜索(Hybrid Search): 将基于关键词的稀疏向量检索(如BM25)与基于语义的稠密向量检索相结合。这种方法能够同时利用关键词匹配的精确性和语义搜索的泛化能力,显著提升检索相关性,特别是在处理包含特定术语或实体名称的查询时。
查询转换(Query Transformation): 对用户的原始查询进行重写或扩展,以提升检索质量。例如,HyDE(Hypothetical Document Embeddings)技术会先让LLM针对原始问题生成一个假设性的答案文档,再将该假设性文档进行嵌入用于检索,实践证明这种方法能更有效地匹配到相关的真实文档。
重排(Re-ranking): 在初步检索(Retrieve)之后、送入生成器(Generate)之前增加一个重排环节。使用一个更轻量但更精准的模型(如Cross-Encoder)对初步检索返回的Top-K个文档进行重新打分和排序,筛选出与查询真正最相关的少数几个文档,以降低无关信息对LLM生成过程的干扰。
分层与图RAG(Hierarchical & Graph RAG): 针对大型复杂文档,可以构建文档的摘要或层级索引。检索时首先在高层级的摘要索引中定位相关文档,再在这些文档的原始文本块中进行精细检索。此外,利用知识图谱构建实体和关系索引的图RAG,能够支持更复杂的、需要多步推理的查询。
具体实现
在具体实现中,通常使用 LangChain 封装好的工具进行实现,具体的实现demo待我完成后发布在Github上