一文读懂 RAG(检索增强生成):让AI学会“先查资料再回答问题”
想让大模型回答你公司文档里的问题?想让AI帮你总结最新论文、产品资料?那你就得了解今天的主角 —— RAG(Retrieval-Augmented Generation)。本文带你从0开始,用通俗的语言彻底弄懂RAG是什么、怎么用、为什么它正在改变AI应用的未来附练习代码
RAG 是什么?
检索增强生成(Retrieval Augmented Generation),简称 RAG,已经成为当前最热门的 LLM 应用方案。理解起来其实不难:RAG 的核心思想就是 先检索,再生成。它会从自有的垂直领域数据库中检索相关信息,然后把这些信息整合进提示模板中,让大模型生成更精准、更有依据的回答。经历了 2023 年初的大模型热潮,大家对基础大模型的能力有了一定的了解。然而,当我们尝试将通用大模型应用到实际业务场景时,会发现它们往往无法满足需求,主要体现在以下几个方面:
-
知识局限性:大模型的知识主要来源于训练数据,而现有主流大模型(如 ChatGPT、文心一言、通义千问等)的训练集大多来自公开网络数据。对于实时更新的、非公开或企业内部的数据,它们是无法获取的,这类知识自然也无法生成。
-
幻觉问题:所有 AI 模型底层都是基于数学概率运算,因此模型有时会“自信满满地胡说八道”。尤其在模型自身缺乏某一方面知识时,幻觉问题更明显,而且要区分真假答案需要使用者具备一定领域知识。
-
数据安全性:对于企业来说,数据安全至关重要,没有公司愿意将内部敏感数据上传第三方平台进行训练。依赖通用大模型的方案在数据安全和效果之间往往需要做权衡。
而 RAG 的出现,正是为了解决这些问题。
一句话总结:
RAG(检索增强生成) = 检索技术 + LLM 提示

具体来说,当用户向 LLM 提出问题时,RAG 会先从各种数据源检索相关信息,然后将这些信息和用户问题一起注入到大模型提示中,最后模型生成高质量、可参考的答案。
RAG 自 2023 年以来成为 LLM 系统中最受欢迎的架构。许多产品都基于 RAG 构建,从结合 Web 搜索引擎和大模型的问答服务,到使用私有数据的企业内部聊天机器人。
虽然早在 2019 年,Faiss 就实现了基于嵌入的向量搜索,但 RAG 的流行进一步推动了向量搜索技术的发展。像 Chroma、Weaviate.io 和 Pinecone 这些向量数据库初创公司,基于开源搜索引擎(如 Faiss、NMSLIB),在 RAG 流行后不断增强功能,例如支持文本额外存储、检索优化和工具集成。
RAG 的实现过程与技术原理
RAG(检索增强生成)通过将 检索技术 和 生成模型 结合在一起,使得大语言模型不仅依赖于静态的训练数据,还能 动态地检索外部知识,从而生成更加精准、相关的回答。它的核心思想可以分为几个步骤:文档向量化、语义检索、上下文拼接 和 生成回答。
首先,RAG 的第一步是 文档向量化。在这一阶段,系统将大量文本数据转换为大模型可以理解的数字形式,通常通过 嵌入(Embedding) 技术实现。每一段文本都会被转化为一个向量,这个向量保留了文本的语义信息。相似的语义会有相似的向量。例如,“RAG 是一个结合检索和生成的框架”和“RAG 帮助模型实时获取最新知识”在语义上是相似的,通过嵌入,它们的向量表示会接近。
接下来,当用户提出问题时,RAG 会将这个问题进行 向量化(即 Query Embedding),然后与数据库中所有文档的向量进行比对,通过计算相似度来找到最相关的文档。这一过程就像是在大海捞针,通过计算余弦相似度等方法,RAG 能快速检索出与问题最相关的文本片段。此时,RAG 使用的是 稠密检索(Dense Retrieval) 方法,利用嵌入向量的相似性来进行高效检索。
在检索到相关文档之后,RAG 将 检索到的文档片段与用户的问题一起拼接,生成一个新的“提示”(Prompt),这个过程称为 上下文拼接。通过这种方式,RAG 能提供足够的背景信息给生成模型,从而使其生成更加精准和上下文相关的答案。比如,如果用户问“RAG 在实际应用中能解决哪些问题?”,检索到的文档片段会包括 “RAG 结合了检索和生成” 以及 “RAG 适用于企业知识问答”,这些信息会被拼接到问题中,作为上下文提供给模型。
最后,拼接后的输入被传递给 生成模型(如 GPT-4、T5 等),模型基于这个组合信息生成最终的回答。这一过程充分利用了生成模型强大的语言理解与表达能力,确保回答既贴合问题,又基于最新的、相关的文献或数据。通过这种方式,RAG 能避免传统大模型的“幻觉”问题(即模型有时会自信地给出错误答案),因为生成的答案有了实时检索到的相关知识作为支持。

总结来说,RAG 的技术原理是通过 检索技术 和 生成模型 的结合,先从大量外部文档中检索出相关信息,再利用这些信息生成精准的回答。这样,RAG 不仅扩展了大语言模型的知识边界,还能保证生成结果更加可靠,尤其适用于需要实时更新知识和处理专业领域数据的应用场景。
RAG 的优势
RAG 架构由于有内置检索机制,因而能够利用大语言模型常规训练之外的额外数据源。通过 RAG 将大语言模型建立在外部的一系列可验证的事实上,可实现以下几个有益目标:
1准确性
RAG 为大语言模型提供了引用来源,因此,用户可以加以验证。您还可以将 RAG 架构设计为在问题超出其知识范围时将“我不知道”作为回答。总体而言,RAG 可以减少大语言模型在输出结果中分享错误或误导性信息的几率,进而可能会提高用户的信任度。
2成本效益
对大语言模型进行重新训练和微调既昂贵又耗时,就像从头开始创建一个基础模型(例如构建一个聊天机器人)并添加特定领域的信息一样。借助 RAG,用户可以将新数据引入大语言模型,还可以通过上传文档或文件来轻松替换或更新信息源。
RAG 还可以降低推理成本。大语言模型查询的成本很高,如果您在本地运行模型,您自己的硬件需要能够满足需求,如果您通过应用编程接口(API)使用外部服务,则会产生计费账单。RAG 可以只发送参考资料中最相关的部分,而非一次将整个参考文档发给 LLM,因此,可减小查询规模并提高效率。
3开发人员控制
与传统的微调方法相比,RAG 提供了一种更方便、更直接的方式来获取反馈、进行故障排除以及修复应用。对开发人员而言,RAG 架构的最大优势在于他们可以利用特定域的最新信息流。
RAG 的应用场景
RAG 技术凭借其强大的检索与生成结合能力,已经在多个领域得到了广泛应用,尤其是在需要实时获取知识和处理大量非结构化数据的场景中表现出色。通过将 检索 和 生成 融合,RAG 使得大语言模型能够动态地从外部资源中获取最新信息,从而生成更为准确和有针对性的回答。以下是一个具体的应用例子:
1. 企业知识问答 - 实例
假设一家大型企业,拥有海量的内部文档,包括公司政策、产品手册、财务报表、项目进展等。这些文档中包含了大量员工可能在工作中遇到的问题解答,但是由于文档数量庞大,员工无法轻松查找所需信息。传统的搜索引擎无法理解问题的上下文,导致检索结果不够精确,员工可能浪费大量时间在无关的文档中寻找答案。

在这种情况下,RAG 可以通过以下方式帮助企业解决问题:
-
文档向量化:首先,RAG 会将企业的所有文档转化为向量,确保每个文档都可以通过相似度计算来进行有效检索。
-
语义检索:当员工向企业的智能问答系统提出问题时,系统会将问题转化为向量,并在已向量化的文档中进行语义检索,找出最相关的文档片段。例如,员工可能问:“公司最新的假期政策是什么?”。
-
上下文拼接与生成:检索到的相关文档(如“2023年假期政策更新”)将与问题一起拼接,生成最终的提示输入给生成模型。系统会根据上下文生成一个清晰且准确的答案:“根据公司最新政策,2023年员工的年假为10天,具体安排如下……”。
-
生成回答:通过结合检索到的最新政策信息,RAG 可以为员工提供精准的回答,避免了他们在成千上万的文档中浪费时间查找信息。
通过这种方式,RAG 不仅提高了企业内部知识管理的效率,还能确保员工得到的答案是最新、最相关的,减少了人工干预和错误的可能性。
代码例子:我这里用的是jupyter 这个可以看到每一步的运行结构
读取文本内容
from typing import List
def split_into_chunks(doc_file: str) -> List[str]:
with open(doc_file, 'r', encoding="utf-8") as file:
content = file.read()
return [chunk for chunk in content.split("\n\n")]
chunks = split_into_chunks("doc.md")
for i, chunk in enumerate(chunks):
print(f"[{i}] {chunk}\n")
将文本向量化
from sentence_transformers import SentenceTransformer
embedding_model = SentenceTransformer("shibing624/text2vec-base-chinese")
def embed_chunk(chunk: str) -> List[float]:
embedding = embedding_model.encode(chunk, normalize_embeddings=True)
return embedding.tolist()
embedding = embed_chunk("测试内容")
print(len(embedding))
print(embedding)
取出10条与用户相关的的文本,排序
embeddings = [embed_chunk(chunk) for chunk in chunks]
print(len(embeddings))
print(embeddings[0])
import chromadb
chromadb_client = chromadb.EphemeralClient()
chromadb_collection = chromadb_client.get_or_create_collection(name="default")
def save_embeddings(chunks: List[str], embeddings: List[List[float]]) -> None:
for i, (chunk, embedding) in enumerate(zip(chunks, embeddings)):
chromadb_collection.add(
documents=[chunk],
embeddings=[embedding],
ids=[str(i)]
)
save_embeddings(chunks, embeddings)
跟模型提问
def retrieve(query: str, top_k: int) -> List[str]:
query_embedding = embed_chunk(query)
results = chromadb_collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
return results['documents'][0]
query = "哆啦A梦使用的3个秘密道具分别是什么?"
query1 = "大雄在精神与时光屋便携版里发生了怎样的变化?"
query2 = "谁在最后一击中击败了黑暗赛亚人?他是怎么做到的?"
retrieved_chunks = retrieve(query, 5)
for i, chunk in enumerate(retrieved_chunks):
print(f"[{i}] {chunk}\n")
其他应用场景
除了企业知识问答,RAG 还广泛应用于其他领域,如:
-
智能客服:为客户提供个性化的产品推荐或服务解答。
-
学术研究助手:帮助研究人员快速查阅相关文献并生成总结报告。
-
行业知识问答:如医疗、法律、金融等专业领域的实时问答和分析。
总结与前瞻
总结
RAG(检索增强生成)技术通过结合 检索技术 和 生成模型,为大语言模型带来了更强的实际应用能力。它不仅打破了传统大模型的局限性,避免了知识更新滞后和幻觉问题,还使得模型能够在更广泛的领域中提供精准和时效性强的答案。
通过 文档向量化、语义检索 和 上下文拼接 等步骤,RAG 实现了对大量外部数据的高效检索,并通过生成模型提供了个性化、具体化的答案。这使得 RAG 技术在 企业知识问答、智能客服、学术研究 等领域具有巨大的应用潜力。与传统的基于规则或关键词的检索方法相比,RAG 结合了语义理解和生成能力,能够提供更加精准、上下文相关的解答。
总的来说,RAG 技术是一种解决实际业务需求的有效方案,它突破了大语言模型固有的限制,使得AI系统能够实时获取外部知识并做出智能的推理和生成。随着技术的不断发展,RAG 的应用将变得更加广泛,涵盖更多领域,助力企业和行业实现智能化转型。
前瞻
未来,RAG 的发展将朝着更加智能、灵活和高效的方向进化。以下是几个值得关注的 发展趋势:
-
自适应 RAG(Self-RAG)
自适应 RAG 将使得系统能够根据上下文和实时情况动态调整检索策略。例如,在用户提出问题后,系统不仅会检索文档,还能够自动判断哪些知识更具权威性,甚至能够处理跨领域的信息整合,提供更深层次的回答。 -
长期记忆与 RAG(Memory-RAG)
未来的 RAG 系统可能会具备 长期记忆 功能。即使在多次对话或不同场景下,系统也能记住用户的偏好、历史问题或特定领域知识,从而使回答更加个性化和持续改进。 -
图谱增强 RAG(Graph-RAG)
与知识图谱结合的 RAG 将进一步增强模型的推理能力。通过知识图谱,系统能够理解不同知识点之间的关系,并在生成答案时进行逻辑推理。例如,在法律、医疗等领域,系统可以根据图谱推断案件之间的关联或不同治疗方法的适用场景。 -
混合模型与多模态 RAG
未来的 RAG 技术可能不仅仅局限于文本,还会与 图像、音频 等其他模态的数据结合。例如,在医学影像分析中,RAG 可以检索医学文献并结合患者的影像数据,生成更为准确的诊断结果。 -
实时反馈与迭代优化
随着技术的成熟,RAG 系统将能够根据 用户反馈 和 实际使用情况 进行 动态优化。通过实时数据流和用户反馈,系统会自动学习并改进检索与生成的策略,持续提升回答的准确性和相关性。
结语
RAG 技术不仅是大语言模型的一个重要拓展,它在实际应用中的创新性和灵活性让它成为了未来 AI 系统的重要组成部分。随着计算力的提升、数据的丰富以及算法的进步,RAG 技术将不断进化,变得更加智能、灵活,并能够应对更多复杂的业务场景。在未来,RAG 可能会成为各行各业数字化转型的核心驱动力之一,为企业和用户带来更高效、更精确的智能服务。
更多推荐


所有评论(0)