LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

[点晴永久免费OA]学习 AI 系列,初识 RAG:深入分析分块策略和向量的技术实现 02

admin
2026年8月12日 11:34 本文热度 174

上一篇介绍了RAG的由来、角色与作用和工作流程:http://40452.oa22.cn

今天通过代码详细讲一讲RAG的工作流程

学习目标:

  1. 掌握分块策略

  2. 理解向量与Embedding的作用与实现原理

  3. Naive RAG遵循一个传统的处理流程,包括索引Indexing、检索Retrieval和生成Generation三个阶段 。

索引阶段(Indexing)都做什么工作?

流程是:原始文档 → 文档解析 → 文档分块 → 向量化 → 存入向量库

  • 文档分块(Chunking)索引阶段的核心子步骤。作用就是把长文档切成短文本块(chunk),才能向量化、检索。

  • Embedding 是「分块」和「检索」之间的核心桥梁。

1. 文档分块

  • 分块策略:

    • 按照句子来切分

    • 按照字符数来切分

    • 按固定字符数 结合overlapping window

    • 递归方法  RecursiveCharacterTextSplitter

1.1 按照句子来切分

完整句子为最小分割单元,按「句号 / 问号 / 感叹号 / 换行」等句子结束符拆分文本,保证每个分块都是完整的语义句子

  • 关键特点

    • 优点:语义完整性最高,不会把一句话切两半;适合法律、合同、学术论文等对句子完整性要求高的场景。

    • 缺点:句子长度差异大(比如有的句子只有 10 个字,有的长句有 200 字),可能导致分块大小不均;极短 / 极长句子会影响后续向量化效果。

python
代码解读
复制代码
import retext = "检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合检索和生成技术的模型。它通过引用外部知识库的信息来生成答案或内容,具有较强的可解释性和定制能力,适用于问答系统、文档生成、智能助手等多个自然语言处理任务中。RAG模型的优势在于通用性强、可实现即时的知识更新,以及通过端到端评估方法提供更高效和精准的信息服务.RAG 包含三个主要过程:检索、增强和生成.通过这一过程,RAG模型能够在各种自然语言处理任务中发挥作用,如问答系统、文档生成和自动摘要、智能助手和虚拟代理、信息检索以及知识图谱填充等。同时,RAG模型具有及时更新、解释性强、高度定制能力、安全隐私管理以及减少训练成本等优点。与微调相比,RAG是通用的,适用于多种任务,并且能够实现即时的知识更新而无需重新训练模型。整个 RAG 系统由两个核心模块组成:检索器和生成器。检索器从数据存储中搜索相关信息,生成器生成所需内容."# 正则表达式匹配中文句子结束的标点符号sentences = re.split(r'(。|?|!|....)', text)# 重新组合句子和结尾的标点符号chunks = []for sentence, punctuation in zip(sentences[::2], sentences[1::2]):    chunks.append(sentence + (punctuation if punctuation else ''))print(chunks)for i, chunk in enumerate(chunks):    print(f"块 {i + 1}: {len(chunk)}: {chunk}")

1.2 按照字符数来切分

完全按固定字符数量硬切分文本,不考虑语义边界(比如切到一半的句子、单词),是最简单粗暴的切分方式。

  • 关键特点

    • 优点:实现最简单、速度最快;分块大小高度统一,便于控制向量库存储成本。

    • 缺点:严重破坏语义完整性(比如把「我喜欢吃苹果」切成「我喜欢」和「吃苹果」);丢失上下文关联。

python
代码解读
复制代码
text = "检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合检索和生成技术的模型。它通过引用外部知识库的信息来生成答案或内容,具有较强的可解释性和定制能力,适用于问答系统、文档生成、智能助手等多个自然语言处理任务中。RAG模型的优势在于通用性强、可实现即时的知识更新,以及通过端到端评估方法提供更高效和精准的信息服务.RAG 包含三个主要过程:检索、增强和生成.通过这一过程,RAG模型能够在各种自然语言处理任务中发挥作用,如问答系统、文档生成和自动摘要、智能助手和虚拟代理、信息检索以及知识图谱填充等。同时,RAG模型具有及时更新、解释性强、高度定制能力、安全隐私管理以及减少训练成本等优点。与微调相比,RAG是通用的,适用于多种任务,并且能够实现即时的知识更新而无需重新训练模型。整个 RAG 系统由两个核心模块组成:检索器和生成器。检索器从数据存储中搜索相关信息,生成器生成所需内容."def split_by_fixed_char_count(text, count):    chunks = []    for i in range(0, len(text), count):         chunks.append(text[i:i + count])    return chunks# 假设我们按照每100个字符来切分文本chunks = split_by_fixed_char_count(text, 100)for i, chunk in enumerate(chunks):    print(f"块 {i + 1}: {len(chunk)}: {chunk}")

1.3 按固定字符数 结合overlapping window

在「固定字符数切分」的基础上,增加重叠窗口(Overlap) —— 后一个分块会复用前一个分块末尾的 N 个字符,既保证分块大小可控,又减少语义断裂。

-关键参数 -  chunk_size:每个分块的最大字符数(比如 500) -  chunk_overlap:相邻分块的重叠字符数(比如 50)

  • 关键特点

    • 优点:兼顾「分块大小统一」和「语义连续性」;重叠部分能弥补硬切分的语义断裂问题,是工业界最常用的基础策略。

    • 缺点:仍可能切断完整句子 / 段落(只是概率降低);重叠会增加少量冗余数据。

python
代码解读
复制代码
text = "检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合检索和生成技术的模型。它通过引用外部知识库的信息来生成答案或内容,具有较强的可解释性和定制能力,适用于问答系统、文档生成、智能助手等多个自然语言处理任务中。RAG模型的优势在于通用性强、可实现即时的知识更新,以及通过端到端评估方法提供更高效和精准的信息服务.RAG 包含三个主要过程:检索、增强和生成.通过这一过程,RAG模型能够在各种自然语言处理任务中发挥作用,如问答系统、文档生成和自动摘要、智能助手和虚拟代理、信息检索以及知识图谱填充等。同时,RAG模型具有及时更新、解释性强、高度定制能力、安全隐私管理以及减少训练成本等优点。与微调相比,RAG是通用的,适用于多种任务,并且能够实现即时的知识更新而无需重新训练模型。整个 RAG 系统由两个核心模块组成:检索器和生成器。检索器从数据存储中搜索相关信息,生成器生成所需内容."def sliding_window_chunks(text, chunk_size, stride):    chunks = []    for i in range(0, len(text), stride):        chunks.append(text[i:i + chunk_size])    return chunkschunks = sliding_window_chunks(text, 100, 50)  # 100个字符的块,步长为50for i, chunk in enumerate(chunks):    print(f"块 {i + 1}: {len(chunk)}: {chunk}")

1.4 递归方法(RecursiveCharacterTextSplitter)

这是「智能切分」的核心策略,也是 LangChain 等框架的默认推荐策略,逻辑是:

markdown
代码解读
复制代码
先按**大粒度分隔符**(段落符、换行符)切分;如果切出的分块超过`chunk_size`,再按**中粒度分隔符**(句子符:。!?)切分;如果还超,最后按**小粒度分隔符**(逗号、空格)切分;若仍超,才按字符硬切分;全程可搭配`overlap`保证语义连续。
  • 关键特点

    • 优点:最大化保证语义完整性(优先按自然语义边界切分);适配各种长度的文本;兼顾效率和效果。

    • 缺点:实现比前几种稍复杂;切分速度略慢于纯字符切分(但可忽略)。

python
代码解读
复制代码
from langchain.text_splitter import RecursiveCharacterTextSplittertext = """检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合检索和生成技术的模型。它通过引用外部知识库的信息来生成答案或内容,具有较强的可解释性和定制能力,适用于问答系统、文档生成、智能助手等多个自然语言处理任务中。RAG模型的优势在于通用性强、可实现即时的知识更新,以及通过端到端评估方法提供更高效和精准的信息服务.RAG 包含三个主要过程:检索、增强和生成.通过这一过程,RAG模型能够在各种自然语言处理任务中发挥作用,如问答系统、文档生成和自动摘要、智能助手和虚拟代理、信息检索以及知识图谱填充等。同时,RAG模型具有及时更新、解释性强、高度定制能力、安全隐私管理以及减少训练成本等优点。与微调相比,RAG是通用的,适用于多种任务,并且能够实现即时的知识更新而无需重新训练模型。整个 RAG 系统由两个核心模块组成:检索器和生成器。检索器从数据存储中搜索相关信息,生成器生成所需内容."""splitter = RecursiveCharacterTextSplitter(    chunk_size=50,    chunk_overlap=10,    length_function=len,)chunks = splitter.split_text(text)for i, chunk in enumerate(chunks):    print(f"块 {i + 1}: {len(chunk)}: {chunk}")

模块下载 pip install langchain

RecursiveCharacterTextSplitter 是一个用于将文本分割成较小块的工具。 它特别适用于需要递归地按字符拆分文本的场景,例如处理超长文档或嵌套结构的文本 chunk_size = 分割长度 chunk_overlap = 重叠长度 length_function = 固定写法(用于定义如何计算每个文本片段的长度)

2.向量与Embedding

2.1 向量

在数学中,向量(也称为欧几里得向量、几何向量),指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。

  1. 将文本转成一组浮点数:每个下标 i,对应一个维度

  2. 整个数组对应一个 n 维空间的一个点,即文本向量又叫 Embeddings

  3. 向量之间可以计算距离,距离远近对应语义相似度大小

  4. 在计算机中我们用数组来表述向量

python
代码解读
复制代码
import numpy as npv = np.array([3, 4])  # 数组表示向量magnitude = np.linalg.norm(v)  # 计算大小unit_vector = v / magnitude    # 计算单位向量(方向)angle = np.arctan2(v[1], v[0]) * 180 / np.pi  # 角度(度)print(f"大小: {magnitude}")print(f"单位向量 (方向): {unit_vector}")print(f"与x轴角度: {angle:.1f}°")

2.2 Embedding

Embedding(嵌入) 本质是:把文本、图片、音频等「非结构化信息」,转换成计算机能理解的、低维度的数字向量(一串数字) ,且这个向量能反映原始信息的语义 / 特征

  • 举个例子(一看就懂)

    • 原始文本: → Embedding 向量:[0.12, -0.34, 0.56, 0.78, ...]

    • 原始文本: → Embedding 向量:[0.11, -0.33, 0.55, 0.77, ...]

    • 原始文本:汽车 → Embedding 向量:[0.89, 0.21, -0.45, -0.67, ...]

  • 核心特点:语义越相似,向量越接近(猫和狗的向量几乎重合,猫和汽车的向量差很远)。

具体作用拆解

  1. 把文本块变成可计算的向量:计算机无法直接比较「文本块 A」和「问题 B」的语义相似度,但能计算两个向量的余弦相似度;

  2. 实现语义检索:不是关键词匹配(比如搜「猫咪」找不到「小猫」),而是语义匹配(「猫咪」和「小猫」的向量接近,能精准召回);

  3. 降维优化效率:原始文本是高维离散数据,Embedding 转换成低维连续向量,大幅降低向量库存储和检索的成本。

它们是「分工协作」的关系:Embedding 负责「转译」,向量负责「承载和计算」,共同解决「机器看不懂自然语言,但能算向量」的核心问题。

2.3 向量间的相似度计算

常用的相似度计算方法包括:

  • 余弦相似度Cosine:计算两个向量之间的夹角余弦值,只关注「方向是否一致」,不关注向量长度(完美适配 Embedding 语义匹配)。

    • 计算公式: 两个向量的乘积 / 两个向量范数的乘积   A×B / ∥A∥ × ∥B∥

    • 范数: l1(绝对值), l2(勾股定理), l无穷

  • 欧式距离L2:计算两个向量在多维空间中的直线距离,距离越小,相似度越高。

  • 点积:直接计算两个向量的点积(对应维度相乘后求和),仅当向量已归一化(模长 = 1)时,等价于余弦相似度。。

python
代码解读
复制代码
# 第一步:准备两个 Embedding 向量(模拟 RAG 中的「问题向量」和「文档块向量」)# 向量1:用户问题「宠物猫的喂养方法」vec_question = [0.12, 0.34, -0.21, 0.56, 0.09]# 向量2:文档块「猫咪每天需要喂2次,主食选猫粮」(高相似)vec_chunk_similar = [0.11, 0.33, -0.20, 0.55, 0.08]# 向量3:文档块「汽车保养需要定期换机油」(低相似)vec_chunk_dissimilar = [0.89, -0.45, 0.67, -0.32, 0.78]# 第二步:导入计算库import numpy as npfrom sklearn.metrics.pairwise import cosine_similarity# 第三步:定义计算函数def calculate_similarity():    # 1. 余弦相似度(RAG 核心)    cos_sim_similar = cosine_similarity([vec_question], [vec_chunk_similar])[0][0]    cos_sim_dissimilar = cosine_similarity([vec_question], [vec_chunk_dissimilar])[0][0]    # 2. 欧式距离(值越小越相似)    euclid_similar = np.linalg.norm(np.array(vec_question) - np.array(vec_chunk_similar))    euclid_dissimilar = np.linalg.norm(np.array(vec_question) - np.array(vec_chunk_dissimilar))    # 3. 点积相似度(先归一化再计算,等价于余弦)    # 归一化向量(模长=1)    vec_q_norm = vec_question / np.linalg.norm(vec_question)    vec_c_norm = vec_chunk_similar / np.linalg.norm(vec_chunk_similar)    dot_sim = np.dot(vec_q_norm, vec_c_norm)    # 输出结果    print("===== 余弦相似度(越接近1越相似) =====")    print(f"问题 vs 相似文档块:{cos_sim_similar:.4f}")    print(f"问题 vs 不相似文档块:{cos_sim_dissimilar:.4f}")    print("\n===== 欧式距离(值越小越相似) =====")    print(f"问题 vs 相似文档块:{euclid_similar:.4f}")    print(f"问题 vs 不相似文档块:{euclid_dissimilar:.4f}")    print("\n===== 点积相似度(归一化后等价于余弦) =====")    print(f"问题 vs 相似文档块:{dot_sim:.4f}")# 运行计算calculate_similarity()

总结

  • 余弦相似度:RAG 场景首选,关注向量方向,不受长度影响,适配语义匹配;

  • 欧式距离:直观但受长度影响,仅作辅助参考;

  • 点积相似度:归一化后等价于余弦,计算更快,适合高性能场景。

2.4 二次理解向量与Embedding

它们是「分工协作」的关系:Embedding 负责「转译」,向量负责「承载和计算」,共同解决「机器看不懂自然语言,但能算向量」的核心问题。

步骤 1:Embedding(转译过程)—— 把「人类语言」翻译成「向量语言」

LLM/RAG 中,Embedding 的核心作用是「语义转译」:

  1. 输入:人类能懂的自然语言(比如文档块「猫咪每天喂 2 次猫粮」、用户问题「小猫该怎么喂食」);

  2. 处理:通过 Embedding 模型(如 text2vec、OpenAI Embedding),基于「语义」把文本转换成向量;

  3. 输出:带语义属性的 Embedding 向量(比如「猫咪喂养」→ [0.12, 0.34, -0.21],「小猫喂食」→ [0.11, 0.33, -0.20])。

  4. 👉 核心价值:Embedding 保证了「语义相似的文本,转换成的向量也相似」,这是后续检索的基础。

步骤 2:向量(承载 + 计算)—— 让「语义匹配」变成「数学计算」

向量的核心作用是「承载 Embedding 的结果,并支持相似度计算」:

  1. 承载:把 Embedding 生成的语义向量存入向量数据库(而非传统数据库);

  2. 计算:通过向量的数学运算(余弦相似度、欧式距离),衡量两个 Embedding 向量的「语义相似度」;

    • 比如「猫咪喂养」和「小猫喂食」的向量余弦相似度≈0.98(极相似);

    • 「猫咪喂养」和「汽车保养」的向量余弦相似度≈0.05(极不相似)。

  3. 👉 核心价值:向量的可计算性,让机器能快速找到「和用户问题语义最相关的文档块」。

3、向量数据库

3.1 向量数据库

  • 在人工智能时代,向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。

  • 随着AI和机器学习应用的普及,这些模型生成的嵌入包含大量属性或特征,使得它们的表示难以管理。这就是为什么数据从业者需要一种专门为处理这种数据而开发的数据库,这就是向量数据库的用武之地。

思考: 我们这个向量的数据存在哪里, 存mysql MongoDB?我通过一张表格来对比一下传统数据库与向量数据库的区别:

维度传统数据库(MySQL/PostgreSQL/MongoDB)向量数据库(FAISS/Milvus/Chroma/Pinecone)
存储对象结构化数据(数字 / 字符串 / 日期)、半结构化 JSON高维向量(Embedding 输出的一串数字)
核心能力精准匹配(=、>、<、like)、事务、索引(B 树)相似度检索(余弦 / 欧式距离)、近似最近邻(ANN)
检索逻辑基于「关键词 / 规则」的精确匹配基于「语义」的模糊匹配
适用场景电商订单、用户信息、日志统计LLM 语义检索、图片 / 音频相似匹配、RAG
性能特点亿级数据精准查询快,但相似度检索极慢亿级高维向量相似度检索毫秒级响应
核心痛点无法计算「语义相似」,仅能关键词匹配不支持事务,精准匹配能力弱

通俗举例

  • 传统数据库:搜「宠物猫喂养」,只能找到包含「宠物猫喂养」这 5 个字的文本,找不到「如何喂小猫」「猫咪饮食指南」;

  • 向量数据库:搜「宠物猫喂养」的向量,能找到「如何喂小猫」「猫咪饮食指南」的向量(语义相似),哪怕关键词完全不一样。

3.2 常见的向量数据库:

  • Pinecone

    • 重复检测:帮助用户识别和删除重复的数据

    • 排名跟踪:跟踪数据在搜索结果中的排名,有助于优化和调整搜索策略

    • 数据搜索:快速搜索数据库中的数据,支持复杂的搜索条件

    • 分类:对数据进行分类,便于管理和检索

    • 去重:自动识别和删除重复数据,保持数据集的纯净和一致性

  • Milvus

    • 毫秒级搜索万亿级向量数据集

    • 简单管理非结构化数据

    • 可靠的向量数据库,始终可用

    • 高度可扩展和适应性强

    • 混合搜索

    • 统一的Lambda结构

    • 受到社区支持,得到行业认可

  • Chroma

    • 功能丰富:支持查询、过滤、密度估计等多种功能

    • 即将添加的语言链(LangChain)、LlamaIndex等更多功能

    • 相同的API可以在Python笔记本中运行,也可以扩展到集群,用于开发、测试和生产

  • Faiss

    • 不仅返回最近的邻居,还返回第二近、第三近和第k近的邻居

    • 可以同时搜索多个向量,而不仅仅是单个向量(批量处理)

    • 使用最大内积搜索而不是最小欧几里得搜索

    • 也支持其他距离度量,但程度较低。

    • 返回查询位置附近指定半径内的所有元素(范围搜索)

    • 可以将索引存储在磁盘上,而不仅仅是RAM中

3.3 如何选型向量数据库

在选择适合项目的向量数据库时,需要根据项目的具体需求、团队的技术背景和资源情况来综合评估。以下是一些建议和注意事项:

向量嵌入的生成

  • 如果已经有了自己的向量嵌入生成模型,那么需要的是一个能够高效存储和查询这些向量的数据库

  • 如果需要数据库服务来生成向量嵌入,那么应该选择提供这类功能的产品

延迟要求

  • 对于需要实时响应的应用程序,低延迟是关键。需要选择能够提供快速查询响应的数据库

  • 如果应用程序允许批量处理,那么可以选择那些优化了大批量数据处理的数据库

开发人员的经验

  • 根据团队的技术栈和经验,选择一个易于集成和使用的数据库

  • 如果团队成员对某些技术或框架更熟悉,那么选择一个能够与之无缝集成的数据库会更有利

  • 推荐:

    • 小项目:FAISS , Chroma

    • 中型项目 : Weaviate , Qdrant

    • 大规模 : Milvus


作者:青禾木森
链接:https://juejin.cn/post/7618433590320349219
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

该文章在 2026/8/12 11:44:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号