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大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

2024最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2024最新版优快云大礼包:《AGI大模型学习资源包》免费分享

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值