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%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

### RAG与MCP的核心机制 RAG(Retrieval-Augmented Generation)是一种结合了信息检索和文本生成的方法,其核心思想是通过检索器(Retriever)从大规模语料库中找到与用户查询相关的文档,并将这些文档作为上下文提供给生成模型(Generator),以生成更准确的回答。RAG通常需要复杂的向量数据库和检索流程,涉及数百行代码的集成工作,且在数据安全性和查询效率方面存在一定的挑战[^1]。 MCP(Model-Context Processing)则是一种基于数据库驱动的AI精准检索方法,它通过直接查询结构化数据库来获取上下文信息,从而避免了向量检索的复杂性。MCP的优势在于开发效率的显著提升,仅需约50行代码即可完成集成。此外,MCP支持本地化部署和HTTPS加密,有效增强了数据安全性。MCP还具备良好的生态扩展性,能够兼容MySQL、PostgreSQL、MongoDB等主流数据库系统。 ### RAG到MCP的技术流程演进 在RAG框架中,技术流程通常包括以下步骤: 1. **文档索引构建**:将语料库中的文档转换为向量表示,并存储在向量数据库中。 2. **检索阶段**:当用户提出查询时,使用编码器将查询转换为向量,并在向量数据库中进行相似性搜索以找到相关文档。 3. **生成阶段**:将检索到的文档与用户查询一起输入生成模型,以生成最终的回答。 RAG流程虽然能够提升模型的知识广度,但由于向量检索的计算成本较高,导致查询成本增加。此外,RAG的部署通常需要依赖外部向量数据库,这在某些场景下可能来数据隐私问题。 MCP则通过直接查询结构化数据库来简化流程: 1. **数据库查询**:用户查询被转换为SQL语句,直接在关系型数据库中执行。 2. **上下文获取**:从数据库中提取与查询相关的记录。 3. **模型推理**:将数据库返回的结果作为上下文输入给生成模型,以生成回答。 MCP的这种设计不仅降低了查询成本,还提高了数据安全性,同时简化了系统架构,使得维护和扩展更加便捷。 ### RAG与MCP的性能对比 | 特性 | RAG | MCP | |--------------------|------------------------------------------|------------------------------------------| | 开发效率 | 需要300+行代码集成 | 仅需50行代码即可完成 | | 数据安全性 | 依赖外部向量数据库,存在数据外传风险 | 支持本地化部署和HTTPS加密 | | 查询成本 | 向量检索成本较高 | 单次查询成本降低80% | | 生态扩展性 | 通常依赖特定向量数据库 | 支持MySQL/PostgreSQL/MongoDB等主流数据库 | | 适用场景 | 需要大规模非结构化数据检索 | 适用于结构化数据驱动的精准检索场景 | ### 实现MCP的代码示例 以下是一个使用Python实现MCP的简化示例,展示了如何通过数据库查询获取上下文并输入给生成模型: ```python import sqlite3 from transformers import pipeline # 初始化生成模型 generator = pipeline('text-generation', model='gpt2') # 连接数据库 conn = sqlite3.connect('knowledge.db') cursor = conn.cursor() def mcp_query(user_input): # 构造SQL查询语句(根据实际需求调整) sql_query = f"SELECT context FROM knowledge_table WHERE keyword MATCH '{user_input}'" # 执行数据库查询 cursor.execute(sql_query) results = cursor.fetchall() # 提取上下文 context = ' '.join([row[0] for row in results]) # 生成回答 response = generator(f"User: {user_input}\nContext: {context}\nAnswer:", max_length=150) return response[0]['generated_text'] # 示例调用 user_question = "如何配置数据库连接?" answer = mcp_query(user_question) print(answer) ``` 上述代码展示了MCP的基本流程:首先通过SQL查询从数据库中获取上下文信息,然后将上下文与用户查询一起输入生成模型以生成回答。这种方式不仅简化了检索流程,还提升了系统的响应速度和安全性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值