2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

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

发布日期:2025-07-14 08:27:30 浏览次数: 2180
作者:许泽宇的技术分享

微信搜一搜,关注“许泽宇的技术分享”

推荐语

RAG检索效果不佳?可能是文本切分方式出了问题!本文揭秘语义切分技术如何让AI检索更精准。

核心内容:
1. 传统定长切分的弊端与语义切分的优势
2. 语义切分的三大算法实现原理
3. 从PDF提取到语义切分的完整代码实践

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

今天我们要聊一个让RAG(检索增强生成)系统“脱胎换骨”的秘密武器——语义切分(Semantic Chunking)。别急,听起来高大上,其实它的本质就是:如何把一大坨文本,切成AI最爱吃的“小块”,让它检索起来又快又准

你是不是也遇到过这种尴尬:明明知识库里啥都有,AI一问三不知,检索出来的内容不是驴唇不对马嘴,就是答非所问?别怀疑,问题很可能就出在“切块”这一步!

今天,我就带你从头到尾,手把手撸一遍语义切分的全流程,让你的RAG系统从“东拼西凑”进化到“对答如流”!


一、为什么要语义切分?定长切分的“原罪”

传统的文本切分方法,最常见的就是定长切分:比如每隔500个字符、100个词,或者10句话就切一刀。听起来很科学,实际上很“机械”——

  • 优点:实现简单,代码一行搞定。
  • 缺点:完全不懂内容,可能把一个完整的知识点切成两半,或者把风马牛不相及的内容拼在一起。

举个栗子:

“小明喜欢吃苹果。他每天早上都吃一个。苹果富含维生素C。深度学习是一种人工智能方法。”

你看,前面三句聊的是苹果,最后一句突然AI上身。定长切分可能把“苹果”和“深度学习”硬塞一块,AI检索时一脸懵逼:你到底问的是水果还是算法?

所以,定长切分的“原罪”就是——不懂内容!


二、语义切分:让AI“按内容分块”,检索更聪明

语义切分,顾名思义,就是根据内容的“相似度”来切块。它的核心思想是:

  • 相似的句子放一起,不相似的分开
  • 每个块尽量语义连贯,便于AI理解和检索

这样,AI在检索时,拿到的都是“主题明确”的内容块,回答自然更靠谱!


三、语义切分的三大“分刀法”

要实现语义切分,关键是找到“切点”。怎么找?主流有三种方法,都是基于“相邻句子的相似度”:

1. 百分位法(Percentile)

  • 算法思路:统计所有相邻句子的相似度差,找到“掉得最狠”的那一批(比如前10%),在这些地方切块。
  • 适用场景:文本风格多变、主题跳跃明显时,效果拔群。

2. 标准差法(Standard Deviation)

  • 算法思路:计算相似度的均值和标准差,凡是低于“均值-若干个标准差”的地方,都是“语义断层”,果断切!
  • 适用场景:文本整体较为均匀,但偶有“断崖式”跳变。

3. 四分位法(IQR)

  • 算法思路:用统计学里的IQR(Q3-Q1),找出那些“极端低”的相似度点,作为切分点。
  • 适用场景:数据分布偏态、异常值多时,IQR法更稳健。

一句话总结:都是在找“语义跳变”的地方下刀!


四、撸代码:从PDF到语义切分,步步为营

1. PDF文本提取

首先,得有“原材料”。假设你有一本AI教材的PDF,咱用PyMuPDF一把梭:

import fitz

def extract_text_from_pdf(pdf_path):
    mypdf = fitz.open(pdf_path)
    all_text = ""
    for page in mypdf:
        all_text += page.get_text("text") + " "
    return all_text.strip()

pdf_path = "data/AI_Information.pdf"
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text[:500])  # 预览前500字符

2. 句子切分 & 句向量生成

有了文本,下一步就是“分句”,然后用大模型(比如OpenAI、BAAI/bge等)生成每句话的向量(embedding):

from openai import OpenAI
import numpy as np
import os

client = OpenAI(
    base_url="https://api.studio.nebius.com/v1/",
    api_key=os.getenv("OPENAI_API_KEY")
)

def get_embedding(text, model="BAAI/bge-en-icl"):
    response = client.embeddings.create(model=model, input=text)
    return np.array(response.data[0].embedding)

sentences = extracted_text.split(". ")
embeddings = [get_embedding(sentence) for sentence in sentences]
print(f"Generated {len(embeddings)} sentence embeddings.")

3. 计算相邻句子的相似度

余弦相似度衡量每对相邻句子的“亲密度”:

def cosine_similarity(vec1, vec2):
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

similarities = [cosine_similarity(embeddings[i], embeddings[i + 1]) for i in range(len(embeddings) - 1)]

4. 找“切点”:以百分位法为例

def compute_breakpoints(similarities, method="percentile", threshold=90):
    if method == "percentile":
        threshold_value = np.percentile(similarities, threshold)
    # ... 省略其他方法
    return [i for i, sim in enumerate(similarities) if sim < threshold_value]

breakpoints = compute_breakpoints(similarities, method="percentile", threshold=90)

5. 真正“切块”

def split_into_chunks(sentences, breakpoints):
    chunks = []
    start = 0
    for bp in breakpoints:
        chunks.append(". ".join(sentences[start:bp + 1]) + ".")
        start = bp + 1
    chunks.append(". ".join(sentences[start:]))
    return chunks

text_chunks = split_into_chunks(sentences, breakpoints)
print(f"Number of semantic chunks: {len(text_chunks)}")
print("\nFirst text chunk:\n", text_chunks[0])

6. 块级向量 & 语义检索

每个块再生成一个embedding,检索时直接比对块向量:

def create_embeddings(text_chunks):
    return [get_embedding(chunk) for chunk in text_chunks]

chunk_embeddings = create_embeddings(text_chunks)

def semantic_search(query, text_chunks, chunk_embeddings, k=5):
    query_embedding = get_embedding(query)
    similarities = [cosine_similarity(query_embedding, emb) for emb in chunk_embeddings]
    top_indices = np.argsort(similarities)[-k:][::-1]
    return [text_chunks[i] for i in top_indices]

五、实战演练:让AI“只答上下文有的内容”

假设你有如下问题:

“什么是可解释AI(Explainable AI),为什么它很重要?”

用上面的方法,检索出来的块内容大致如下:

Context 1:
Explainable AI (XAI) aims to make AI systems more transparent and understandable. Research in XAI focuses on developing methods for explaining AI decisions, enhancing trust, and improving accountability.
========================================
Context 2:
Transparency and explainability are essential for building trust in AI systems. Explainable AI (XAI) techniques aim to make AI decisions more understandable, enabling users to assess their fairness and accuracy.
========================================

然后,用大模型生成答案,并且严格要求只根据检索到的内容作答

system_prompt = "You are an AI assistant that strictly answers based on the given context. If the answer cannot be derived directly from the provided context, respond with: 'I do not have enough information to answer that.'"

user_prompt = "\n".join([f"Context {i + 1}:\n{chunk}\n=====================================\n" for i, chunk in enumerate(top_chunks)])
user_prompt = f"{user_prompt}\nQuestion: {query}"

ai_response = generate_response(system_prompt, user_prompt)
print(ai_response.choices[0].message.content)

六、自动评测:让AI自己打分,闭环优化

最后,别忘了用AI自动评测答案质量,闭环优化:

evaluate_system_prompt = "You are an intelligent evaluation system tasked with assessing the AI assistant's responses. If the AI assistant's response is very close to the true response, assign a score of 1. If the response is incorrect or unsatisfactory in relation to the true response, assign a score of 0. If the response is partially aligned with the true response, assign a score of 0.5."

evaluation_prompt = f"User Query: {query}\nAI Response:\n{ai_response.choices[0].message.content}\nTrue Response: {data[0]['ideal_answer']}\n{evaluate_system_prompt}"

evaluation_response = generate_response(evaluate_system_prompt, evaluation_prompt)
print(evaluation_response.choices[0].message.content)

七、语义切分的“隐藏价值”:让RAG系统更像“懂王”

  • 检索更精准:每个块语义连贯,AI不再“东拉西扯”。
  • 上下文更相关:减少无关内容混入,提升答案质量。
  • 可扩展性强:新文档、新领域,通用性极高。
  • 自动化闭环:配合自动评测,持续优化切分策略。

八、实战Tips & 踩坑指南

  1. 句子切分要靠谱:英文可以用.split(". "),中文建议用snownlpjieba等分句工具,别让AI“断句失误”。
  2. embedding模型选得好,检索效率高:推荐bgetext-embedding-ada-002等主流模型。
  3. 切分阈值要调优:不同文档风格,阈值要动态调整,多试几次,效果肉眼可见。
  4. 块太大太小都不好:太大检索不准,太小上下文不全。建议每块200-500字,视场景微调。
  5. 自动评测不是万能:AI评测有时会“自嗨”,建议人工spot check辅助。

九、总结:让你的RAG系统“聪明又懂你”

语义切分,说白了就是让AI“按内容分块”,而不是“按长度分尸”。它是RAG系统“检索-生成”闭环的关键一环,直接决定了AI的“知识召回率”和“答题准确率”。

一句话,想让你的AI像“懂王”一样,问啥都能答到点子上?先把语义切分练到极致!

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅