RAG是什么?RAG综述,从原理到实战一篇搞懂!

1、什么是RAG

RAG(Retrieval Augmented Generation)顾名思义,通过检索外部数据,增强⼤模型的⽣成效果。 RAG即检索增强⽣成,为LLM提供了从某些数据源检索到的信息,并基于此修正⽣成的答案。RAG 基本上是Search + LLM 提示,可以通过⼤模型回答查询,并将搜索算法所找到的信息作为⼤模型的上下⽂。查询和检索到的上下⽂都会被注⼊到发送到 LLM 的提示语中。

2、RAG系统⼯作流程图解

img

3、RAG能干什么,解决什么问题

大模型的问题

将⼤模型应⽤于实际业务场景时会发现,通⽤的基础⼤模型基本⽆法满⾜我们的实际业务需求,主要有以下⼏⽅⾯原因:

  • LLM的知识不是实时的,不具备知识更新
  • LLM可能不知道你私有的领域/业务知识
  • LLM有时会在回答中⽣成看似合理但实际上是错误的信息

用RAG解决上面的问题

  1. 提⾼准确性: 通过检索相关的信息,RAG可以提⾼⽣成⽂本的准确性。

  2. 减少训练成本 :与需要⼤量数据来训练的⼤型⽣成模型相⽐,RAG可以通过检 索机制来减少所需的训练数据量,从⽽降低训练成本。

  3. 适应性强 :RAG模型可以适应新的或不断变化的数据。由于它们能够检索最新 的信息,因此在新数据和事件出现时,它们能够快速适应并⽣成相关的⽂本。

4、RAG系统怎么搭建

搭建流程图

img

流程图拆解

第一步是要索引数据

img

1、加载数据

清理和提取各种格式的原始数据,如 PDF、 HTML、 Word 和 Markdown,然后将其转换为统⼀的纯⽂本格式。

2、切块

为了适应语⾔模型的上下⽂限制,⽂本被分割成更⼩的、可消化的块(chunk)。

3、嵌入和保存

使⽤嵌⼊模型将块编码成向量表示,并存储在向量数据库中。这⼀步对于在随后的检索阶段实现⾼效的相似性搜索⾄关重要。知识库分割成 chunks,并将 chunks 向量化⾄向量库中

第二步是要查询索引数据

img

1、 检索(Retrieval)

在收到⽤户查询(Query)后,RAG 系统采⽤与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。

2、 检索返回Top-K的块

该系统优先级和检索最⾼ k (Top-K)块,显示最⼤的相似性查询。这些块随后被⽤作 prompt 中的扩展上下⽂。

第三步就是返回答案了

img

到这我想你已经了解和明白为什么要有RAG,RAG能能够解决大模型在商业化落地过程中面临的挑战:1、数据泄露,隐私问题,2、幻觉问题,3、效果问题,结果不稳定,确定性不强,4、数据更新不及时 等问题。

总结一下RAG具体实现流程:加载⽂件 => 读取⽂本 => ⽂本分割 =>⽂本向量化 =>输⼊问 题向量化 =>在⽂本向量中匹配出与问题向量最相似的 top k 个 =>匹配出的⽂本作 为上下⽂和问题⼀起添加到 prompt 中 =>提交给 LLM ⽣成回答

代码实现

from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
import chromadb
from chromadb.config import Settings
import os
import json

client = OpenAI()

prompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。

已知信息:
__INFO__

用户问:
__QUERY__

请用中文回答用户问题。
"""

# train_zh.json这是一个json文件,格式是这样的:{"instruction": "这段时间去上厕所本来想小便的可是每次都会拉大便", "input": "", "output": "这可能是因为你的饮食习惯或者消化系统的问题导致的。建议你试着调整一下饮食,增加膳食纤维的摄入量,多喝水,避免过度依赖泻药。同时,如果问题持续存在,建议去医院检查一下,排除肠道疾病等可能性。"}
withopen('train_zh.json', 'r', encoding='utf-8') as f:
    data = [json.loads(line) for line in f]


#data[0:1000],加载1000条数据进行向量化
instructions = [entry['instruction'] for entry in data[0:1000]]
outputs = [entry['output'] for entry in data[0:1000]]

defget_completion(prompt, model="gpt-3.5-turbo"):
'''封装 openai 接口'''
    messages = [{"role": "user", "content": prompt}]
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,  # 模型输出的随机性,0 表示随机性最小
    )
return response.choices[0].message.content

defbuild_prompt(prompt_template, **kwargs):
'''将 Prompt 模板赋值'''
    prompt = prompt_template
for k, v in kwargs.items():
ifisinstance(v, str):
            val = v
elifisinstance(v, list) andall(isinstance(elem, str) for elem in v):
            val = '\n'.join(v)
else:
            val = str(v)
        prompt = prompt.replace(f"__{k.upper()}__", val)
return prompt

classMyVectorDBConnector:
def__init__(self, collection_name, embedding_fn):
        chroma_client = chromadb.Client(Settings(allow_reset=True))

# 为了演示,实际不需要每次 reset()
        chroma_client.reset()

# 创建一个 collection
self.collection = chroma_client.get_or_create_collection(name=collection_name)
self.embedding_fn = embedding_fn

defadd_documents(self, instructions, outputs):
'''向 collection 中添加文档与向量'''
        embeddings = self.embedding_fn(instructions)

iflen(embeddings) != len(instructions) orlen(instructions) != len(outputs):
raise ValueError("嵌入向量、instructions 和 outputs 数量不一致")

self.collection.add(
            embeddings=embeddings,  # 每个文档的向量
            documents=outputs,  # 文档的原文
            ids=[f"id{i}"for i inrange(len(outputs))]  # 每个文档的 id
        )

defsearch(self, query, top_n):
'''检索向量数据库'''
        results = self.collection.query(
            query_embeddings=self.embedding_fn([query]),
            n_results=top_n
        )
return results

defget_embeddings(texts, model="text-embedding-3-large"):
'''封装 OpenAI 的 Embedding 模型接口'''
    data = client.embeddings.create(input=texts, model=model).data
return [x.embedding for x in data]

# 创建一个向量数据库对象
vector_db = MyVectorDBConnector("demo", get_embeddings)

# 向向量数据库中添加文档
vector_db.add_documents(instructions, outputs)

classRAG_Bot:
def__init__(self, vector_db, llm_api, n_results=2):
self.vector_db = vector_db
self.llm_api = llm_api
self.n_results = n_results

defchat(self, user_query):
# 1. 检索
        search_results = self.vector_db.search(user_query, self.n_results)

# 2. 构建 Prompt
        prompt = build_prompt(
            prompt_template, info=search_results['documents'][0], query=user_query)
# print("="*50)
# print(prompt)
# print("="*50)
# 3. 调用 LLM
        response = self.llm_api(prompt)
return response

# 创建一个RAG机器人
bot = RAG_Bot(
    vector_db,
    llm_api=get_completion
)

user_query = "拉肚子怎么办?"

response = bot.chat(user_query)

print(response)

5、总结

RAG 作为人工智能领域极具创新性的技术,通过检索增强生成的独特架构,有效弥补了大语言模型在知识更新和特定领域知识储备上的不足。从基础的索引构建、检索和生成原理,到不断发展演进的不同阶段,再到查询优化、嵌入技术等关键技术细节,RAG 形成了一套完整且不断完善的技术体系。在实际应用中,无论是智能客服系统提升客户服务效率,还是医疗知识问答系统辅助专业决策,RAG 都展现出强大的实用价值和广阔的应用前景。随着技术的持续发展和创新,RAG 有望在更多领域发挥重要作用,推动人工智能应用向更高水平迈进,为解决复杂的实际问题提供更高效、精准的智能解决方案。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

<think>嗯,用户问的是RAG是什么,我需要先回忆一下相关知识。RAG是Retrieval-Augmented Generation的缩写,对吧?那它的基本概念应该是结合了检索和生成的技术。不过我得确认一下,不能搞错了。 首先,得解释RAG的全称,Retrieval-Augmented Generation,检索增强生成。然后说明它的作用,用来提升生成模型的效果,特别是在需要外部知识的任务上,比如问答或者事实核查。这时候可能需要提到传统生成模型的局限性,比如GPT有时候会产生幻觉,生成不准确的信息,而RAG通过检索相关文档来补充信息,让生成的内容更准确可靠。 接下来,要分解RAG的工作流程,分步骤说明。第一步是检索,当用户输入问题后,系统会从外部数据库或文档集合中找到相关的信息。这里可能需要提到嵌入向量和相似度计算,比如将问题和文档都转换成向量,然后用余弦相似度之类的算法找到最相关的部分。 第二步是增强,把检索到的相关信息和原始问题一起输入生成模型,这样模型在生成回答时就有更多的上下文和依据。这样生成的答案不仅基于模型本身的参数,还结合了实际的外部数据,提高了准确性和相关性。 然后需要举一些应用场景,比如智能问答系统、客服机器人、知识库辅助工具等。这些场景下,RAG能够有效利用已有信息,提供更精确的回答。另外,可能还要提到它的优势,比如减少生成错误、支持动态更新知识库,不需要重新训练整个模型。 不过,可能用户对技术细节不太了解,需要用比较通俗的语言解释。比如,可以比喻成写论文时的查资料和综合整理的过程,先查找相关资料,再结合自己的理解写出内容。这样用户更容易理解。 同时,要确保提到的技术点准确,比如使用的检索机制、生成模型的结构,但不需要太深入。还要注意区分RAG和其他技术,比如微调(fine-tuning),说明RAG的不同之处在于动态检索而非静态的参数调整。 最后,可能需要提到RAG的挑战,比如检索的准确性、计算资源的消耗,以及如何处理实时性要求高的场景。但用户的问题主要是介绍,所以这部分可以简略带过,或者根据情况决定是否包含。 总结起来,回答的结构应该是:定义、工作流程(分步骤)、应用场景、优势,可能加上挑战。确保用中文,结构清晰,不用专业术语过多,让用户容易理解。</think>### RAG(检索增强生成)简介 **RAG**(Retrieval-Augmented Generation,检索增强生成)是一种结合**信息检索**与**文本生成**的技术,旨在提升生成模型在知识密集型任务中的准确性和可靠性。其核心思想是:通过动态检索外部知识库中的相关信息,辅助生成模型输出更符合事实的答案。 --- ### RAG 的核心原理 1. **检索(Retrieval)** - 当用户输入问题或请求时,系统会从**外部知识库**(如文档、数据库、网页等)中检索与问题最相关的片段。 - 检索过程通常基于**语义相似度**(例如使用嵌入向量模型计算相似性),而非简单的关键词匹配。 2. **增强(Augmentation)** - 将检索到的相关文本片段与原始问题**拼接**,形成增强后的输入。 - 例如: > 原始问题:*“量子计算的主要优势是什么?”* 检索结果:*“量子计算利用量子比特的叠加态,可并行处理大量数据...”* 增强输入:*“根据以下内容回答问题:量子计算利用量子比特的叠加态... 问题:量子计算的主要优势是什么?”* 3. **生成(Generation)** - 将增强后的输入交给生成模型(如 GPT、T5 等),输出最终答案。 - 生成模型不仅依赖自身参数中的知识,还基于检索到的外部信息,从而减少“虚构”或错误内容。 --- ### RAG 的优势 1. **准确性高** - 通过检索外部知识库,补充生成模型的内部知识盲区,减少“幻觉”(即编造事实)。 - 例如回答“2023 年诺贝尔奖得主”时,RAG 可直接检索最新数据,而传统模型可能依赖过时参数。 2. **动态更新** - 仅需更新外部知识库(如添加新文档),无需重新训练生成模型,成本低且灵活。 3. **可解释性强** - 生成答案时附带检索到的依据,方便用户验证来源(类似论文引用)。 --- ### 典型应用场景 1. **智能问答系统** - 结合企业知识库或行业文档,提供精准的客服或技术支持(如医疗、法律领域)。 2. **事实核查** - 检索权威信息,验证生成内容的真实性。 3. **学术研究辅助** - 快速定位相关文献片段,辅助撰写综述或报告。 --- ### 技术挑战 1. **检索质量依赖** - 若检索结果不相关,生成答案可能被误导。 2. **实时性要求** - 对高频更新的知识库(如新闻),需保证检索与生成的效率。 3. **长文本处理** - 检索到的长文档需有效压缩或分段,避免输入超出模型限制。 --- ### 总结 RAG 通过“先检索,再生成”的机制,将生成模型与外部知识库结合,显著提升了生成内容的准确性和可信度。它特别适用于需要**动态知识**或**专业领域**的任务,是当前大模型落地应用的重要技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值