RAG入门到精通!手把手带你独立搭建一套完整的RAG

一、RAG介绍

1.LLM的缺陷

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

2.为什么会用到RAG

  1. 提高准确性: 通过检索相关的信息,RAG可以提高生成文本的准确性。
  2. 减少训练成本:与需要大量数据来训练的大型生成模型相比,RAG可以通过检索机制来减少所需的训练数据量,从而降低训练成本。
  3. 适应性强:RAG模型可以适应新的或不断变化的数据。由于它们能够检索最新的信息,因此在新数据和事件出现时,它们能够快速适应并生成相关的文本。

3.RAG概念

​ RAG(Retrieval Augmented Generation)顾名思义,通过检索外部数据,增强⼤模型的⽣成效果。

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

4.RAG vs Fine-tuning

​ RAG(检索增强⽣成)是把内部的⽂档数据先进⾏embedding,借助检索先获得⼤致的知识范围答案,再结合prompt给到LLM,让LLM⽣成最终的答案

​ Fine-tuning(微调)是⽤⼀定量的数据集对LLM进⾏局部参数的调整,以期望LLM更加理解我们的业务逻辑,有更好的zero-shot能⼒。

5.RAG工作流程

img

对应的中文版本

img

6.RAG系统的搭建流程

具体的搭建流程图如下:

img

索引(Indexing):索引⾸先清理和提取各种格式的原始数据,如 PDF、HTML、 Word 和 Markdown,然后将其转换为统⼀的纯⽂本格式。为了适应语⾔模型的上下⽂限制,⽂本被分割成更⼩的、可消化的块(chunk)。然后使⽤嵌⼊模型将块编码成向量表示,并存储在向量数据库中。这⼀步对于在随后的检索阶段实现⾼效的相似性搜索⾄关重要。知识库分割成 chunks,并将 chunks 向量化⾄向量库中。

检索(Retrieval):在收到⽤户查询(Query)后,RAG 系统采⽤与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最⾼ k (Top-K)块,显示最⼤的相似性查询。

例如,⼆维空间中的向量可以表示为 (𝑥,𝑦),表示从原点 (0,0) 到点 (𝑥,𝑦) 的有向线段

img

  1. 将⽂本转成⼀组浮点数:每个下标 i ,对应⼀个维度
  2. 整个数组对应⼀个 n 维空间的⼀个点,即⽂本向量⼜叫 Embeddings
  3. 向量之间可以计算距离,距离远近对应语义相似度⼤⼩

img

这些块随后被⽤作 prompt 中的扩展上下⽂。Query 向量化,匹配向量空间中相近的 chunks。

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

二、RAG核心

1.传统VS⼤模型

​ 智能客服系统在没有大模型之前我们也是可以设计完成的只是实现的效果没有大模型那么好。下面是两则设计的原理

img

2.向量与Embeddings的定义

​ 在数学中,向量(也称为欧⼏⾥得向量、⼏何向量),指具有⼤⼩(magnitude)和⽅向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的⽅向;线段⻓度:代表向量的⼤⼩。

img

具体生成向量的代码

from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
import os

client = OpenAI()
def get_embeddings(texts, model="text-embedding-3-large"): 
# texts 是⼀个包含要获取嵌⼊表示的⽂本的列表, 
# model 则是⽤来指定要使⽤的模型的名称 
# ⽣成⽂本的嵌⼊表示。结果存储在data中。
 data = client.embeddings.create(input=texts, model=model).data 
 # print(data) 
 # 返回了⼀个包含所有嵌⼊表示的列表 
 return [x.embedding for x in data]
 test_query = ["⼤模型"]
 vec = get_embeddings(test_query )
 # "⼤模型" ⽂本嵌⼊表示的列表。
 print(vec)
 # "⼤模型" ⽂本的嵌⼊表示。
 print(vec[0])
 # "⼤模型" ⽂本的嵌⼊表示的维度。3072
 print(len(vec[0]))

text-embedding-3-large 是 OpenAI 推出的一个文本嵌入模型,属于 text-embedding-3 系列中的大尺寸版本。是一个功能强大、灵活性高的文本嵌入模型,适合处理复杂的自然语言任务。

3.向量间的相似度计算

img

具体的案例演示代码

from openai import OpenAI
from dotenv import load_dotenv
import numpy as np
from numpy import dot
from numpy.linalg import norm
load_dotenv()
import os

client = OpenAI()
def cos_sim(a, b): 
'''余弦距离 -- 越⼤越相似''' 
return dot(a, b)/(norm(a)*norm(b))
def l2(a, b):
 '''欧式距离 -- 越⼩越相似''' 
 x = np.asarray(a)-np.asarray(b) 
 return norm(x)
 def get_embeddings(texts, model="text-embedding-3-large"): 
 data = client.embeddings.create(input=texts, model=model).data 
 # print(data) 
 # 返回了⼀个包含所有嵌⼊表示的列表
  return [x.embedding for x in data]

# 且能⽀持跨语⾔
query = "global conflicts"
# query = "国际争端"
documents = [ 
"联合国安理会上,俄罗斯与美国,伊朗与以⾊列“吵”起来了", 
"⼟⽿其、芬兰、瑞典与北约代表将继续就瑞典“⼊约”问题进⾏谈判",
 "⽇本岐⾩市陆上⾃卫队射击场内发⽣枪击事件 3⼈受伤", 
 "孙志刚被判死缓 减为⽆期徒刑后终身监禁 不得减刑、假释", 
 "以⾊列⽴法禁联合国机构,美表态担忧,中东局势再⽣波澜",
]
query_vec = get_embeddings([query])[0]
doc_vecs = get_embeddings(documents)
print("Cosine distance:")
print(cos_sim(query_vec, query_vec))
for vec in doc_vecs: 
print(cos_sim(query_vec, vec))
print("\nEuclidean distance:")
print(l2(query_vec, query_vec))
for vec in doc_vecs:
 print(l2(query_vec, vec))

输出的结果

Cosine distance:
1.0
0.26485647419163133
0.17843340536145408
0.1389039336840151
0.029972895954156878
0.349804816400828

Euclidean distance:
0.0
1.212553924472882
1.2818475860144856
1.3123231844462315
1.3928582773078655
1.1403465897787535  

4.文档的加载和分割

4.1 基于文档的LLM回复系统搭建

img

4.2 把⽂本切分成chunks

​ 我们把文本切分成chunks的方式有很多种:

  1. 按照句⼦来切分
  2. 按照字符数来切分
  3. 按固定字符数 结合overlapping window
  4. 递归⽅法 RecursiveCharacterTextSplitter
4.2.1 按照句⼦来切分
# coding=utf-8import re
text = "自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。"

# 正则表达式匹配中文句子结束的标点符号
sentences = re.split(r'(。|?|!|\…\…)', text)

# 重新组合句子和结尾的标点符号
chunks = [sentence + (punctuation if punctuation else '') for sentence, punctuation in zip(sentences[::2], sentences[1::2])]

for i, chunk in enumerate(chunks):
print(f"块 {i+1}: {len(chunk)}: {chunk}")

输出的结果

块 1: 55: 自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。
块 2: 21: 在这个领域,机器学习发挥着至关重要的作用。
块 3: 30: 利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。
块 4: 36: 从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。
块 5: 33: 随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。
块 6: 46: 如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,如问答系统、语音识别和对话系统等。
块 7: 41: NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。
4.2.2 按照字符数来切分
# coding=utf-8
import re

text = "自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。"

def split_by_fixed_char_count(text, count):
return [text[i:i + count] for i in range(0, len(text), count)]

# 假设我们按照每100个字符来切分文本
chunks = split_by_fixed_char_count(text, 100)
for i, chunk in enumerate(chunks):
print(f"块 {i + 1}: {len(chunk)}: {chunk}")
输出结果
块 1: 100: 自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所
块 2: 100: 理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理
块 3: 62: 解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。
4.2.3 按固定字符数加滑动窗口
# coding=utf-8
import re
text = "自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。"

def sliding_window_chunks(text, chunk_size, stride):
return [text[i:i + chunk_size] for i in range(0, len(text), stride)]
chunks = sliding_window_chunks(text, 100, 50)  # 100个字符的块,步长为50
for i, chunk in enumerate(chunks):
print(f"块 {i + 1}: {len(chunk)}: {chunk}")
输出的结果
块 1: 100: 自然语言处理(NLP),作为计算机科学、人工智能与语言学的交融之地,致力于赋予计算机解析和处理人类语言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所
块 2: 100: 言的能力。在这个领域,机器学习发挥着至关重要的作用。利用多样的算法,机器得以分析、领会乃至创造我们所理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术
块 3: 100: 理解的语言。从机器翻译到情感分析,从自动摘要到实体识别,NLP的应用已遍布各个领域。随着深度学习技术的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理
块 4: 100: 的飞速进步,NLP的精确度与效能均实现了巨大飞跃。如今,部分尖端的NLP系统甚至能够处理复杂的语言理解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和
块 5: 62: 解任务,如问答系统、语音识别和对话系统等。NLP的研究推进不仅优化了人机交流,也对提升机器的自主性和智能水平起到了关键作用。
块 6: 12: 智能水平起到了关键作用。

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

### 构建和训练大规模语言模型RAG #### 准备工作 构建和训练像RAG这样的大规模语言模型涉及多个复杂的步骤和技术组件。为了确保成功实现这一目标,前期准备至关重要。这不仅包括硬件资源的选择,还包括软件环境搭建以及数据集的收集与处理。 对于硬件而言,建议使用配备高性能GPU集群来加速计算过程;而对于软件,则需安装PyTorch框架及其依赖库,并配置相应的开发工具链[^1]。 #### 数据获取与预处理 高质量的数据源是训练有效的大规模语言模型的基础。针对特定领域应用时,应优先考虑那些能够反映该领域特征并具有一定规模的真实语料作为训练素材。此外,还需对原始文本执行清洗、分词等一系列操作以便后续用于模型训练。 #### 模型架构设计 RAG(Retrieval-Augmented Generation)是一种结合检索机制与生成式方法于一体的混合型自然语言处理方案。其核心思想是在编码器端引入外部知识库查询功能,使得解码过程中可以充分利用已有信息提高回复质量。具体来说: - **检索模块**:负责从大量文档集合中快速定位最相关的片段; - **生成模块**:基于Transformer结构,接收来自检索部分的结果连同用户提问共同构成上下文输入序列,进而完成最终的回答合成任务[^2]。 #### 实现细节说明 以下是简化版Python代码示例展示如何创建一个简单的RAG实例: ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-base") retriever = RagRetriever.from_pretrained( "facebook/dpr-question_encoder-single-nq-base", index_name="exact", use_dummy_dataset=True, ) model = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-base") input_dict = tokenizer.prepare_seq2seq_batch( ["What is the capital of France?"], return_tensors="pt" ) generated_ids = model.generate(input_ids=input_dict["input_ids"]) print(tokenizer.batch_decode(generated_ids, skip_special_tokens=True)) ``` 此段脚本展示了加载预训练权重文件、定义检索器对象以及调用`generate()`函数生成答案的过程。当然实际项目里还需要进一步调整超参数设置以适应不同场景需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值