RAG系列(十):切分优化 - 基于句子相似距离的语义切分

深入理解文本的语义切分:从句子到语义块的转换 本文介绍了如何使用语义相似性来对文本进行分割,提供了如何使用的详细代码示例。LangChain 官方文档OpenAI Embeddings 文档。 阅读详情

引言

传统的文档切分方法通常采用基于特定字符和固定长度的切分策略,这种方法虽然实现简单,但在实际应用中容易割裂完整的语义单元,导致后续的信息检索与理解受到影响。

相比之下,一种更智能的切分方法是基于句子相似距离的语义切分。它不再依据特定字符和固定长度进行机械切分,而是对每个句子进行 embedding,以此来计算相邻句子的余弦距离,再通过算法算出一个相对合理的切分点(某个距离值),最后将不大于该阈值的相邻句子聚合在一起作为一个文档块,从而实现文档语义切分。

例如 句子_1、句子_2、句子_3 之间的余弦距离都小于该阈值,而 句子_3 与 句子_4 的余弦距离大于该阈值,则在 句子_3 和 句子_4 之间增加切分点,最终的切分结果就是把 句子_1、句子_2、句子_3 聚合在一个文档块中,句子_4 在其它的文档块中。

实现原理

基于句子相似距离的语义切分大致分为以下5个步骤:

langchain-experimental中的 SemanticChunker[1] 实现了基于句子相似距离的语义切分,因此本文我将通过 SemanticChunker 的源码来带大家了解语义切分的实现原理。

以下是 SemanticChunker 的初始化参数,后面根据不同步骤所需要的参数来了解这些参数的具体作用。

classSemanticChunker(
# 向量模型
    embeddings: Embeddings,
# 向前向后取 buffer_size 个句子一起 embedding
    buffer_size: int = 1,
# 是否在元数据添加开始切分的位置(以文档字符长度计算)
    add_start_index: bool = False,
# 切分点计算方法
    breakpoint_threshold_type: BreakpointThresholdType = "percentile",
# 切分点计算阈值
    breakpoint_threshold_amount: float | None = None,
# 切分后的文档块数量
    number_of_chunks: int | None = None,
# 句子切分规则
    sentence_split_regex: str = r"(?<=[.?!])\s+",
# 最小文档块大小
    min_chunk_size: int | None = None
)

句子切分

这一步是通过特定规则将文档切分为一个个句子,在 SemanticChunker 中通过参数 sentence_split_regex 来设置规则进行切分,默认值为 r"(?<=[.?!])\s+",这是以英文的句号、问号、感叹号来进行切分的,而且是对比较规范的英文行文,也就是这三种标点后还跟空白字符的。如果要对中文文档切分,那就需要将这个正则表达式替换成能切分中文的,例如:r"(?<=[。?!\n])",也就是以中文的句号、问号、感叹号以及换行符来进行切分。

SemanticChunker的实现源码如下:

import re

def_get_single_sentences_list(self, text: str) -> List[str]:
return re.split(self.sentence_split_regex, text)

句子 embedding

这一步是将每个句子进行 embedding,理论上接着就以每个句子 embedding 结果来计算相邻句子的距离就可以了。但通过实际操作发现对单个句子处理噪音比较大,后续切分的效果并不理想,因此 SemanticChunker 通过 buffer_size 来控制当前句子前、后各取几个句子组成一组来计算 embedding 并计算余弦距离。例如buffer_size设置为为1(默认值),表示取当前句子前、后各取1个句子组成一组来计算 embedding。

SemanticChunker的实现源码如下:

首先根据buffer_size得到当前句子的组合。

defcombine_sentences(sentences: List[dict], buffer_size: int = 1) -> List[dict]:
for i inrange(len(sentences)):
# 创建一个字符串变量来保存连接的句子
        combined_sentence = ""

# 添加当前句子之前 buffer_size 个句子
for j inrange(i - buffer_size, i):
if j >= 0:
                combined_sentence += sentences[j]["sentence"] + " "

# 添加当前句子
        combined_sentence += sentences[i]["sentence"]

# 添加当前句子之后 buffer_size 个句子
for j inrange(i + 1, i + 1 + buffer_size):
if j < len(sentences):
                combined_sentence += " " + sentences[j]["sentence"]

# 将合并好的句子存储在当前的句子 combined_sentence 中
        sentences[i]["combined_sentence"] = combined_sentence

return sentences

然后根据通过参数 embeddings传入的向量模型对句子组合进行 embedding。

def_calculate_sentence_distances(self, single_sentences_list: List[str]) -> Tuple[List[float], List[dict]]:
    _sentences = [
        {"sentence": x, "index": i} for i, x inenumerate(single_sentences_list)
    ]
    sentences = combine_sentences(_sentences, self.buffer_size)
    embeddings = self.embeddings.embed_documents(
        [x["combined_sentence"] for x in sentences]
    )
for i, sentence inenumerate(sentences):
        sentence["combined_sentence_embedding"] = embeddings[i]

return calculate_cosine_distances(sentences)

计算相邻句子(组)余弦距离

这一步就是通过计算相邻句子(组) 的余弦相似度来得到相邻句子(组) 的余弦距离。

将横轴记为句子(组)的序号,纵轴为相邻句子(组) 的余弦距离,就可得到下面类似的图:

SemanticChunker的实现源码如下:

from langchain_community.utils.math import cosine_similarity

defcalculate_cosine_distances(sentences: List[dict]) -> Tuple[List[float], List[dict]]:
    distances = []
for i inrange(len(sentences) - 1):
        embedding_current = sentences[i]["combined_sentence_embedding"]
        embedding_next = sentences[i + 1]["combined_sentence_embedding"]

# 计算余弦相似度
        similarity = cosine_similarity([embedding_current], [embedding_next])[0][0]

# 转换成余弦距离
        distance = 1 - similarity
        distances.append(distance)

# 保存余弦距离
        sentences[i]["distance_to_next"] = distance

# 【可选】最后一个句子的处理
# sentences[-1]['distance_to_next'] = None  # 或其它默认值

return distances, sentences

计算切分点

如何计算切分点,SemanticChunker给出了4种方法:

  • • percentile: 分位法,默认方法。将所有余弦距离在第 X 分位数的值作为阈值,并在那些余弦距离超过该阈值的位置进行切分。第 X 分位数可通过breakpoint_threshold_amount 设置,默认为 95。还可以通过 number_of_chunks 指定切分后的文档块总数量,采用线性插值的方式反向推导出该分位数;

SemanticChunker的实现源码如下:

import numpy as np

def_calculate_breakpoint_threshold(self, distances: List[float]) -> Tuple[float, List[float]]:
# 第一种方式:指定分位数
return cast(
float,
      np.percentile(distances, self.breakpoint_threshold_amount),
  ), distances

# 第二种方式:通过 number_of_chunks 反向推导分位数
  x1, y1 = len(distances), 0.0
  x2, y2 = 1.0, 100.0
  x = max(min(self.number_of_chunks, x1), x2)
if x2 == x1:
      y = y2
else:
      y = y1 + ((y2 - y1) / (x2 - x1)) * (x - x1) # 线性插值
  y = min(max(y, 0), 100)
return cast(
float,
      np.percentile(distances, y),),
      distances
  • • standard_deviation: 标准差偏离法,是统计学中表示偏离的常规方法,这种方法比较适合正态分布。将所有余弦距离的平均值加上 X 倍的所有余弦距离标准差的值作为阈值,并在那些余弦距离超过该阈值的位置进行切分。X 倍可通过breakpoint_threshold_amount 设置,默认为 3,这是最常用的值;

SemanticChunker的实现源码如下:

import numpy as np

def_calculate_breakpoint_threshold(self, distances: List[float]) -> Tuple[float, List[float]]:
return cast(
float,
    np.mean(distances) +
self.breakpoint_threshold_amount * np.std(distances),),
    distances
  • • interquartile: 四分位距法,是统计学中表示偏离的另一种常规方法,这种方法计算分位数,所以数据分布不那么正态问题也不大。将所有余弦距离的平均值加上 X 倍的所有余弦距离四分位距的值作为阈值,并在那些余弦距离超过该阈值的位置进行切分。X 倍可通过breakpoint_threshold_amount 设置,默认为 1.5,也是最常用的值;

SemanticChunker的实现源码如下:

import numpy as np

def_calculate_breakpoint_threshold(self, distances: List[float]) -> Tuple[float, List[float]]:
# 取出25分位(下四分位)和75分位(上四分位)的数值
  q1, q3 = np.percentile(distances, [25, 75])

# 计算两个分位的差值(四分位距)
  iqr = q3 - q1

return np.mean(distances) +
self.breakpoint_threshold_amount * iqr, distances
  • • gradient: 梯度法。首先计算所有余弦距离的变化梯度,变化梯度计算出来后,就可以知道哪个地方余弦距离变化得快,然后将所有变化梯度在第 X 分位数的值作为阈值,并在那些余弦距离超过该阈值的位置进行切分。第 X 分位数可通过breakpoint_threshold_amount 设置,默认为 95。

SemanticChunker的实现源码如下:

import numpy as np

def_calculate_breakpoint_threshold(self, distances: List[float]) -> Tuple[float, List[float]]:
# 计算所有余弦距离的变化梯度
  distance_gradient = np.gradient(distances, range(0, len(distances)))
return cast(
float,
      np.percentile(distance_gradient,
self.breakpoint_threshold_amount)),
      distance_gradient

按切分点切分

通过第4步各方法得到切分点后,就可以按切分点对文档进行切分(通过设置min_chunk_size控制合并较小的块),就可得到下面类似的图(包括切分位置以及切片):

SemanticChunker的实现源码如下:

defsplit_text(self, text: str,) -> List[str]:
# 计算相邻句子的余弦距离
      distances, sentences = self._calculate_sentence_distances(single_sentences_list)

# 计算切分点
      breakpoint_distance_threshold, breakpoint_array = self._calculate_breakpoint_threshold(distances)

      indices_above_thresh = [
          i
for i, x inenumerate(breakpoint_array)
if x > breakpoint_distance_threshold
      ]

      chunks = []
      start_index = 0

# 遍历切分点来分割句子
for index in indices_above_thresh:
          end_index = index
          group = sentences[start_index : end_index + 1]
          combined_text = " ".join([d["sentence"] for d in group])

# 通过设置 min_chunk_size 来合并较小的文档块
if (
self.min_chunk_size isnotNone
andlen(combined_text) < self.min_chunk_size
          ):
continue
          chunks.append(combined_text)

          start_index = index + 1

if start_index < len(sentences):
          combined_text = " ".join([d["sentence"] for d in sentences[start_index:]])
          chunks.append(combined_text)
return chunks

代码实践

原 TypeScript 项目已使用 Python 进行了重构,后续将优先使用 Python 进行代码实践和讲解。

其中:RAG.libs 中是封装好的各种不同作用的模块,如 RAG/libs/text_splitter.py 是封装好的文档切分器,RAG/libs/evaluator.py 是封装好的评估器,因此文中不再贴具体的代码,如需查看具体代码实现,请移步到 github 代码仓库中查看。

本文完整代码地址[2]:https://github.com/laixiangran/ai-learn-python/blob/main/RAG/examples/06_semantic_splitting.py

先看下基于句子余弦距离的语义切分的评估结果:

从评估结果来看,相较于 RecursiveCharacterTextSplitter 的切分方法,在上下文召回率、上下文相关性以及答案准确性都有不同程度的提升。

加载文件

from RAG.libs.file_loader import FileLoader

file_loader = FileLoader(
    file_path="RAG/datas/2024少儿编程教育行业发展趋势报告.md",
    provider="customMarkdownLoader",
)
documents = file_loader.load()

语义切分

因为我们的文档只要是中文,因此需要将 sentence_split_regex修改成可对中文切分的规则,如:r"(?<=[。?!\n])"。

from langchain_experimental.text_splitter import SemanticChunker
from RAG.libs.embedding import Embedding

# 向量模型
embeddings = Embedding(model="nomic-embed-text", provider="ollama")

# 使用 SemanticChunker 切分
text_splitter = SemanticChunker(
    embeddings=embeddings,
    breakpoint_threshold_type="percentile",
    sentence_split_regex=r"(?<=[。?!\n])",
)
documents = text_splitter.split_documents(documents=documents)

切分后处理

使用SemanticChunker进行切分,会出现较短或者较长的切片。比如通过percentile进行切分后的结果可以看到,最小的文档块大小只有 1,最大的文档块大小有 3346。因此,为了更好的检索效果,我们一般需要=对较长的文档做二次切分、对较短的文档进行合并和添加标题等其它切分后处理。

count 75 // 总数
mean 731 // 平均值
std 685 // 标准差
min 1 // 最小值
25% 218 // 25分位值
50% 568 // 50分位值
75% 990 // 75分位值
90% 1535 // 90分位值
97% 2577 // 97分位值
99% 2876 // 99分位值
max 3346 // 最大值

将较大的文档块进行二次切分、合并较小的块和添加标题:

from RAG.libs.text_splitter import (
    TextSplitter,
    merge_small_documents,
    add_headers_to_documents,
)

# 将较大的文档块进行二次切分
text_splitter = TextSplitter(
    provider="recursiveCharacter",
    chunk_size=500,
    chunk_overlap=0,
)
documents = text_splitter.split_documents(documents)

# 合并较小的块和添加标题
documents = merge_small_documents(documents, merge_max_length=100)
documents = add_headers_to_documents(documents)

效果评估

from RAG.libs.evaluator import BatchEvaluator

eval_result = BatchEvaluator(
    chat_model=chat_model,
    vector_store=vector_store,
    qa_data=qa_data,
    top_k=3,
filter=filter,
    output_path=output_path,
)

结语

本文介绍了一种更智能的切分方法 - 基于句子相似距离的语义切分,并通过 langchain-experimental 中的 SemanticChunker 的源码来带大家了解了语义切分的实现原理。

从最后评估结果来看,相较于 RecursiveCharacterTextSplitter 的切分方法,在上下文召回率、上下文相关性以及答案准确性都有不同程度的提升,这说明通过基于句子相似距离的语义切分方法对文档切分优化具有一定的可行性,大家可以根据自己的实际情况进一步验证,欢迎大家留言交流。

大模型算是目前当之无愧最火的一个方向了,算是新时代的风口!有小伙伴觉得,作为新领域、新方向人才需求必然相当大,与之相应的人才缺乏、人才竞争自然也会更少,那转行去做大模型是不是一个更好的选择呢?是不是更好就业呢?是不是就暂时能抵抗35岁中年危机呢?

答案当然是这样,大模型必然是新风口!

那如何学习大模型 ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。但是具体到个人,只能说是:

最先掌握AI的人,将会比较晚掌握AI的人有竞争优势。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

但现在很多想入行大模型的人苦于现在网上的大模型老课程老教材,学也不是不学也不是,基于此我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近100余次后,终于把整个AI大模型的学习路线完善出来!

在这里插入图片描述

在这个版本当中:

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型路线+学习教程已经给大家整理并打包分享出来, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全咨料,放心领取)👈

​

一、大模型经典书籍(免费分享)

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套大模型报告(免费分享)

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、大模型系列视频教程(免费分享)

在这里插入图片描述

四、2025最新大模型学习路线(免费分享)

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

img

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

img

L2阶段:攻坚篇丨RAG开发实战工坊

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

img

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

img

L4阶段:精进篇丨模型微调与私有化部署

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

img

L5阶段:专题集丨特训篇 【录播课】

img

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方二维码,免费领取

👉优快云大礼包🎁:全网最全《LLM大模型学习资源包》免费分享(安全资料,放心领取)👈

​

RAG文本切分实战手册:从语义断裂到高精度检索 文本切分是RAG系统效果的底层基石,本质是在LLM上下文窗口限制与人类语义认知之间构建桥梁。其核心原理并非简单按字符或句子分割,而是通过语义连贯性建模,确保每个chunk具备独立表意能力与上下文保真度。技术价值体现在显著提升向量检索召回率、降低语义失真、增强专业术语与长程逻辑的捕捉能力。典型应用场景包括金融合同条款完整性保障、医疗说明书三要素聚合、技术文档API示例保全等。本文聚焦LangChain+Ollama+Llama 3.2技术栈下的语义切分与上下文感知切分落地,直击PDF解析、embedding边 阅读详情

相关推荐

深度解析 Max-Min 语义分块策略对 RAG 的重构与优化

在检索增强生成(RAG)系统的构建过程中,文档分块(Chunking)的质量直接决定了检索的精度与生成内容的连贯性。传统的固定长度或基于结构的分割方法,往往因忽略文本内在语义逻辑而导致上下文断裂或噪声引入。今天一起看下论文《Max–Min semantic chunking of documents for RAG application》,看下动态语义分块算法——Max-Min 语义分块,如何作用提升 RAG 性能的底层优化。

kakaZhui的博客 1081

一文掌握文本语义分割:从朴素切分、Cross-Segment到阿里SeqModel

之所以写本文,源于以下两点详见,但该系统也有个可选项,可以选择达摩院开源的语义分割模型:nlp_bert_document-segmentation_chinese-base考虑到在RAG中,embedding和文档语义分割、段落分割都是绕不开的关键点,故本文重点梳理下各类典型的语义分割模型。

结构之法 算法之道 2万+

RAG生产失败主因:文档切分缺乏结构感知与语义锚点

RAG(检索增强生成)系统在实际部署中频繁失效,核心问题常被误归因为模型能力不足或向量库性能瓶颈,实则源于数据预处理环节的根本性缺陷——传统文档切分将文本机械切片,破坏法律条款、业务规则等关键语义单元的完整性。其原理在于:语义连贯性依赖主体-行为-条件构成的契约闭环,而固定长度切分导致逻辑要素分散,使向量检索仅匹配字面相似度,无法支撑跨段落推理。该问题直接引发LLM幻觉加剧、上下文截断歧义、元数据形同虚设等连锁故障。典型应用场景包括金融合规问答、医疗政策检索、SaaS客户工单理解等强结构化文本场景。本文聚焦

weixin_34109408的博客 397

AI检索不准?99%的人都忽略了这一步!

语义切分,说白了就是让AI“按内容分块”,而不是“按长度分尸”。它是RAG系统“检索-生成”闭环的关键一环,直接决定了AI的“知识召回率”和“答题准确率”。一句话,想让你的AI像“懂王”一样,问啥都能答到点子上?先把语义切分练到极致!最后,欢迎大家留言讨论:你在RAG项目中遇到过哪些“切分翻车”的坑?你觉得还有哪些更骚的切分方法?评论区见!

许泽宇的技术分享 1067

RAG优化:python从零实现一个文本语义分块算法

文本分块是检索增强生成(RAG)中的一个关键步骤,通过将大段文本划分为有意义的段落来提高检索准确性。与固定长度的分块不同,语义分块基于句子之间的内容相似性来划分文本。我们实现了基于语义分块的文本分割方法,并使用OpenAI的嵌入模型进行了语义搜索和响应生成。通过评估AI助手的响应,我们可以进一步优化模型的性能。

AI人工智能的学习之路 922

手把手教你用STM32单片机控制双向可控硅调光(附完整代码+电路图)

本文提供了一套完整的STM32单片机控制双向可控硅实现灯光无级调光的实战方案。详细讲解了硬件电路设计,包括过零检测与隔离驱动,并剖析了基于定时器中断的软件核心逻辑,通过精准的相位角计算实现平滑的灯光强度控制。附有完整代码与电路图,适合嵌入式开发者实践。

weixin_29194255的博客 956

彻底掌握RAG!基于向量模型的语义切分详解,从原理到实战一篇就够了!

之前的文章提到,我们将文本切分划分为五个层级,并介绍了前三个层级的实现和一些基础知识。本篇文章开始,我们将介绍第四层级的内容语义切分;本篇文章将介绍基于向量模型的语义切分。这个 切分器 的工作原理是确定何时分隔句子。这是通过查找任意两个句子之间的向量差异来完成的。当该差异超过某个阈值时,它们将被拆分。后面演示它是怎么实现的:搭建语义切分流程要实例化 SemanticChunker,我们必须指定一个嵌入模型。下面我们将使用 OpenAIEmbeddings,也可以使用[自己的模型]。

m0_59164520的博客 905

Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)

以Carla官网导入RoadRunner地图的标准文档为参考,里面增添了很多细节和注意事项,遇到问题的小伙伴过来看看吧。

DSK_981029的博客 1万+

【文献汇总】语义分割-1

汇总语义分割相关改进论文

qq_31486717的博客 592

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 482

华为FusionCharge 720kW液冷直流快充桩主电流全路径深度详解

本文档详细介绍了华为FusionCharge 720kW液冷分体式直流充电系统的主电流路径全链路解析,适用于配套DS720-720LCNA1充电主机及DT600L1-CNA1液冷终端、DT250N2-CNA1自然冷终端的运维工作。内容涵盖从电网交流输入到电动汽车充电的全过程,重点解析交流门、整流正门、主控正门等五大柜门区域的核心元器件分布及功能,包括额定参数、安全规范、故障排查等关键运维知识。操作人员需持有高压电工证并通过专项培训,作业时必须严格遵守断电验电、穿戴PPE防护装备等安全红线。文档通过16个关键

2401_84939870的博客 750

RAG 语义切分(Semantic Chunking)方法论:告别固定字符切片,基于嵌入相似度断点的自适应分块实战

在构建检索增强生成(RAG)系统与企业知识库时,**文档切分(Document Chunking)**是决定下游检索召回率与大模型回答准确性的“第一道也是最关键一道工序”。然而,业内超过 80% 的开源项目和开发团队,依然在使用极度粗暴的本季度营收下滑 10%团建活动安排如何让切分算法像人类读者一样,?本文深入剖析基于嵌入相似度突变检测的算法机理、动态统计阈值设定,并给出生产级 Python 自适应切分引擎实战代码。

2611_95335967的博客 2993

LoRa无线通信技术介绍(六)SX127X芯片收发程序讲解

接收LORA芯片SX127X的收发程序。

DT程序员的博客 1751

【RAG实战 】 手把手教你从零手撸一个语义切块,解锁更多优化技巧!

在RAG(Retrieval-Augmented Generation)中,chunk是个关键步骤。它的核心目标,就是把语义相近的内容放在一起,语义不同的内容拆开,这样后续的检索(retrieve)和重排序(rerank)才能更有效。举个例子:今天天气很好,我和小明在一起打篮球。隔壁老王在家里看电视。小明的妈妈在家里做晚饭,晚上我去小明家吃饭。这段话其实表达了三个完全不同的意思,最理想的chunk方式,就是精准地把这三个部分分开,互不干扰。

yanqianglifei的专栏 1425

从点击图标到Activity亮屏:AMS、Zygote、ActivityThread的Binder协作之旅

Launcher通过Context调用 startActivity(),最终会通过 Activity.startActivity() 传递到 ActivityManager.getService(),获取AMS的Binder代理对象(IActivityManager)。这里的 attach() 方法通过Binder调用AMS的 attachApplication(),将新进程的 IApplicationThread 代理对象传递给AMS。这一步的Binder通信,是整个启动流程的关键转折点,值得细细品味。

大模型大数据攻城狮的专栏 1071

把入库交货单的 GOS 附件自动带进审批 Work Item:用 SOFM 对象打通 SAP Workflow 附件链路

本文介绍了一种在SAP ECC系统中将入库交货单的GOS附件自动附加到Workflow审批项中的解决方案。通过使用BOR对象引用列表和SOFM业务对象,审批人可直接在Work Item中查看附件,无需返回原单据界面。文章详细阐述了从BUS2015业务对象获取附件连接、转换LOIO_ID为SOFM对象引用,并将附件列表绑定到User Decision步骤的具体实现方法。该方案适用于经典SAP Business Workflow+BOR架构,核心ABAP代码可直接复用,有效解决了审批流程中的附件可见性问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

RAG实战指南 Day 19:相似度算法与检索策略优化

核心相似度算法:余弦相似度、点积、欧氏距离等的实现与优化混合检索策略:如何组合多种算法提升检索质量性能优化技术:批量查询、两阶段检索等加速方法电商搜索案例:展示了在实际业务中的综合应用关键技术点相似度计算是RAG检索的核心组件混合策略能结合不同算法的优势两阶段检索平衡速度与精度业务规则与机器学习结合可获得最佳效果明天我们将探讨【Day 20: 大规模向量索引优化技术】,学习如何处理十亿级向量的高效索引和检索问题。

在未来等你的专栏 1626

简谈基于FPGA的千兆以太网设计

简谈基于FPGA的千兆以太网设计 今天给大侠带来简谈基于FPGA的千兆以太网设计,话不多说,上货。 今天我们来简单的聊一聊以太网,以太网在FPGA学习中属于比较高级的内容了,有些大侠肯定会感觉以太网学习起来非常不容易。其实,我可以告诉大家,前期学习的基础打扎实了,后期的学习也没那么难。总之就是说难没那么难,说容易也不是那么容易。那么,言归正传,下面让我们一起来聊一聊以太网的学习。 说起以太网,大家可能就会想到百兆以太网、千兆以太网以及万兆以太网等等。局域以太网从10M开始发展,经历几多的变迁,发展到现

3620

LLM--RAG中的文本切分策略及长上下文窗口是否会取代RAG?

在使用基于检索的生成模型(RAG)处理长文本数据时,合理的文本切割策略是提高模型性能和效率的关键。本文讲解文本切割相关的概念及技术要点。 目前LLM模型进化的方向是增加上下文窗口的长度,主流LLM支持的上下文窗口长度越来越大,并且随着Infini-Transformer架构的出现,那么长上下文窗口是否会取代RAG?

penriver的博客 4734

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

开源!RAG竞技场(3):语义分割的RAG(Semantic Chunking RAG)

这是我们流程的核心。函数实现了将长文档智能地分割成语义连贯的文本块的逻辑。分割成句子: 使用正则表达式将整篇文档分割成独立的句子。这是语义分析的基本单位。生成句子嵌入: 调用embedder将每个句子转换成一个高维向量。这个向量代表了句子的语义信息。计算相邻距离: 遍历所有相邻的句子对,计算它们嵌入向量之间的余弦距离(1 - 余弦相似度)。距离越大,表示两个句子的语义差异越大。确定分割阈值: 我们不使用固定的距离阈值,而是计算所有相邻距离的百分位数(例如95%)。

qq_63708623的博客 1258

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大模型RAG技术解析,从基础原理到优化实战(二)RAG优化

用正则表达式或者 DOM 解析器(如 BeautifulSoup)按照逻辑结构(标题,段落)分块。适合结构化文档,但是需要手动设计分割规则。

Androiddddd的博客 1649

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RAG文本分块优化:从机械切分到语义单元构建

文本分块(chunking)是RAG系统中影响召回精度与答案质量的基础环节,其本质并非简单按字符或句子截断,而是围绕语义保真度、上下文完整性与任务适配性进行的结构化知识组织过程。传统固定长度分块易导致指代断裂、逻辑割裂和向量信噪比下降;而基于文档结构(标题/列表/表格)、语义连贯性(代词回指、连接词守恒)和任务目标(问答/摘要/合规审查)的协同分块策略,可显著提升关键信息召回率与生成答案可靠性。本文聚焦chunking在金融、医疗、工业等高精度场景中的工程实践,详解结构感知解析、轻量语义校验与动态任务适配三

weixin_34269583的博客 351

如何用bge-m3提升RAG召回率?语义相似度验证完整指南

本文介绍了基于星图GPU平台自动化部署🧠 BAAI/bge-m3 语义相似度分析引擎的方法,结合WebUI实现可视化验证。该镜像可高效计算文本间语义相似度,适用于RAG系统中召回结果的相关性评估,显著提升AI应用的检索精度与生成质量。

weixin_28968525的博客 647

RAG数据分块切割源码逻辑深度解析:从机械切割到语义感知的演进之路

本文深入解析RAG系统中数据分块技术的演进历程,从基础固定切割到高级语义感知策略。首先指出分块需平衡信息完整性与检索精准度,关键参数包括块大小(chunk_size)和重叠量(chunk_overlap)。随后剖析三类分块策略源码:1)固定切割的简单但语义破坏性强;2)递归分割通过优先级分隔符保持结构连贯性;3)语义切分利用向量距离识别语义边界,计算成本高但质量最优。文章还介绍了针对Markdown、代码等特定格式的专用分块器,并强调中文处理需适配标点规则。最后建议开发者根据文档特性选择策略,通过实验确定最

jjlong051360byz的专栏 661

RAG通用范式:RAG的入门介绍与实践优化

本文详细的介绍了RAG遇到的挑战、通用范式、工程实践、优化实现策略等内容

my_name_is_learn的博客 2066

RAG系统性能优化:从文档切分到向量检索的实战指南

在构建基于大语言模型的应用时,检索增强生成(RAG)技术通过结合信息检索与文本生成,有效缓解了模型的幻觉问题并实现了知识更新。其核心原理在于将文档转化为向量表示,通过语义相似度匹配实现精准检索,从而为生成模型提供相关上下文。这一技术的工程价值在于能够基于私有知识库构建可靠的问答系统,广泛应用于企业知识管理、智能客服和文档分析等场景。本文聚焦于RAG流程中的关键环节——文档切分与向量检索,深入探讨了语义割裂、上下文丢失等常见挑战,并提供了基于语义的智能切分、混合检索策略等优化方案,旨在提升系统从海量文档中精准

weixin_34184158的博客 404
上一篇: RAG系列(九):解析优化 - 使用 Doc2X 将 PDF 高效转换为 Markdown
下一篇: RAG系列(十二):MinerU、Docling还是Unstructured?用OmniDocBench评测开源文档解析工具
Llama-Turbo
博客等级 码龄4年 9901粉丝 2022原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值