你的 RAG 为什么总答错?问题出在分块这一步

智能客服答错了,怎么定位问题:Trace 驱动的 RAG 排障与评测闭环 这篇文章讨论智能客服上线后最现实的问题:答错了,怎么快速定位原因。文章以 Trace 为主线,把一次 RAG 回答拆成 Router、Rewrite、Retrieval、Generation、Output Gate / Policy 等可观察阶段,说明如何从线上 bad case 回放回答路径,判断问题到底出在路由、检索、重排、生成还是策略兜底。进一步,它强调不要追着单个坏例子改 prompt,而应把 bad case 沉淀进分阶段评测集,通过归因、最小修复、回归验证和发布观测形成闭环,让每次错误都变成下一 阅读详情

RAG 分块策略全攻略 —— 从"暴力切"到"语义切",一篇讲透

RAG 系列里,咱们一直用"按固定字数切块"——200 字一段,到点就切。这就像切面包不看纹路,上来就咔咔咔等分。结果呢?好好的一句话被劈成两半,上下文全断了。用户问"Django 怎么安装",检索到的块里只有个 go,大模型能答对才怪。这篇咱们来认真聊聊分块这个事儿,从最粗暴到最聪明,5 种方案全给你对比一遍,每种都有完整可跑代码和模拟效果。分块这一步做好了,后面 Embedding、检索、生成全链路都受益。

一、为什么分块这么重要?

块太大:塞不进 LLM 的上下文窗口,而且噪音多——无关信息把有用的内容稀释了,大模型看了半天抓不住重点。你塞进去 2000 字,真正有用的可能就 100 字,剩下全是干扰项。

块太小:信息被切碎,上下文丢了。比如"年假 5 天"被切成"年假"和"5 天"两块,检索到其中一块也答不对。再比如"3 天以上病假需部门总监审批",切成"3 天以上"和"病假需部门总监审批",用户问"几天要总监批",检索逻辑直接懵了。

最佳状态是什么?一个块 = 一个完整的语义单元。可以是一个观点、一条规则、一个步骤。边界清晰,不拖泥带水。用户问什么,检索到的块就能直接回答什么,不用大模型去"猜"前后文。

说白了,分块是 RAG 的"天花板"。后面你怎么调 Embedding 模型、怎么优化检索策略、怎么改 prompt,都赢不了一个烂分块。这块没做好,后面全是白忙活。

图片


二、准备测试文档


咱们用同一篇结构化的技术文档来对比 5 种分块策略。下面这篇"Python Web 框架对比"有标题、段落、代码块、列表,结构比较典型:`TEST_DOC = “”"
Python Web 框架对比(2024版)

一、Django

Django 是 Python 生态里最成熟的全栈框架,自带 ORM、Admin、认证系统。
适合中大型项目,学习曲线稍陡,但文档完善。
安装命令:pip install django

二、Flask

Flask 是轻量级微框架,核心只有路由和模板,其他功能靠扩展。
适合小型项目和 API 服务,灵活度高。
安装命令:pip install flask

三、FastAPI

FastAPI 基于类型注解,自动生成 OpenAPI 文档,性能接近 Go。
适合需要高性能 API 的场景,异步支持完善。
安装命令:pip install fastapi uvicorn

四、选型建议

  • 要快速上线:选 Django
  • 要灵活可控:选 Flask
  • 要高性能 API:选 FastAPI
    “”"`

后面所有策略都用这篇文档跑一遍,方便对比。选这篇是因为它有典型结构:标题、小节、列表、代码块。如果你的文档是纯长段落、或者全是表格,分块策略的差异会更明显,可以自己换一篇试试。


三、策略一:固定大小切块(咱们的老朋友)


原理很简单:每 N 个字符切一刀,不管内容。到 200 字就切,管你是在句子中间还是段落中间。很多教程的第一版 RAG 就是这么写的,因为实现起来只要一个 for 循环。`def simple_chunk(text, chunk_size=200):
“”“固定大小切块:到字数就切”“”
text = text.strip()
chunks = []
for i in range(0, len(text), chunk_size):
chunk = text[i:i + chunk_size]
if chunk.strip():
chunks.append(chunk)
return chunks

测试

chunks = simple_chunk(TEST_DOC, chunk_size=200)
for i, c in enumerate(chunks):
print(f"— 块 {i+1} —")
print(c[:80] + "…"if len© > 80else c)
print()`

运行效果:`— 块 1 —
Python Web 框架对比(2024版)

一、Django

Django 是 Python 生态里最成熟的全栈框架,自带 ORM、Admin、认证系统。
适合中大型项目,学习曲线稍陡,但文档完善。
安装命令:pip install djan…

— 块 2 —
go

二、Flask

Flask 是轻量级微框架,核心只有路由和模板,其他功能靠扩展。
适合小型项目和 API 服务,灵活度高。
安装命令:pip install flask

三、FastAPI

FastAPI 基于类型注解,自动生成 OpenAPI 文档,性能接近 Go。
适合需要高性能 API 的场景,异步支持完善。
安装命令:pip install fastapi uvicorn

四、选型建议

  • 要快速上线:选 Django
  • 要灵活可控:选 Flask
  • 要高性能 API:选 FastAPI`

看到没?块 1 结尾是 pip install djan,块 2 开头是 go。django 被活生生劈成两半。用户问"Django 怎么安装",检索到块 2 只有个孤零零的 go,大模型能答对才怪。这种切法适合什么?快速验证想法、做个 Demo 给老板看,够用了。真要上线,别用。

优点:实现简单,速度快,不依赖任何库。缺点:完全不管语义,切到哪儿算哪儿。


四、策略二:固定大小 + 重叠(V2 升级)


既然一刀切会断上下文,那就让相邻块有重叠区域。块 1 的末尾和块 2 的开头重复 50 个字,这样 django 至少会完整出现在某个块里。overlap 一般设为 chunk_size 的 10%–20%,太小救不了断句,太大又浪费存储。`def overlap_chunk(text, chunk_size=200, overlap=50):
“”“固定大小 + 重叠:相邻块共享 overlap 个字符”“”
text = text.strip()
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
if chunk.strip():
chunks.append(chunk)
start = end - overlap # 下一块从 overlap 位置开始
return chunks

测试

chunks = overlap_chunk(TEST_DOC, chunk_size=200, overlap=50)
for i, c in enumerate(chunks):
print(f"— 块 {i+1} (len={len©}) —")
print(c[:100] + "…"if len© > 100else c)
print()`

运行效果:`— 块 1 (len=200) —
Python Web 框架对比(2024版)

一、Django

Django 是 Python 生态里最成熟的全栈框架,自带 ORM、Admin、认证系统。
适合中大型项目,学习曲线稍陡,但文档完善。
安装命令:pip install django…

— 块 2 (len=200) —
安装命令:pip install django

二、Flask

Flask 是轻量级微框架,核心只有路由和模板,其他功能靠扩展。
适合小型项目和 API 服务,灵活度高。
安装命令:pip install flask

三、FastAPI

FastAPI 基于类型注解,自动生成 OpenAPI 文档,性能接近 Go。
适合需要高性能 API 的场景,异步支持完善。
安装命令:pip install fastapi uvicorn…

— 块 3 (len=200) —
安装命令:pip install fastapi uvicorn

四、选型建议

  • 要快速上线:选 Django
  • 要灵活可控:选 Flask
  • 要高性能 API:选 FastAPI`

这次 pip install django 完整出现在块 1 和块 2 里了。重叠区减少了信息断裂,算是个小升级。但代价也很明显:每个块有 50 字是重复的,存进向量库会多占空间,检索时也可能把相似的两块都召回来——top_k=3 可能给你两块内容几乎一样的。而且 overlap 设多少合适?50?100?得自己试。如果切点刚好在句子中间,重叠也救不了,只是把"断点"往后挪了一点而已。


五、策略三:按段落/换行切


文档本身就有结构:双换行是段落,单换行是行内换行。按 /n/n 切,至少不会把段落劈开。写文档的人已经帮你分好段了,咱们就顺着这个结构来,比硬切靠谱。`def paragraph_chunk(text):
“”“按双换行切块,太短的合并,太长的二次切”“”
paragraphs = [p.strip() for p in text.split(“/n/n”) if p.strip()]
chunks = []
current = []
current_len = 0
max_len = 300# 单块最大长度

for p in paragraphs:
    if current_len + len(p) + 2 <= max_len and current:
        current.append(p)
        current_len += len(p) + 2
    else:
        if current:
            chunks.append("/n/n".join(current))
        if len(p) > max_len:

            # 段落太长,按句号再切

            parts = p.replace("。", "。/n").split("/n")
            for part in parts:
                if part.strip():
                    chunks.append(part.strip())
            current = []
            current_len = 0
        else:
            current = [p]
            current_len = len(p)

if current:
    chunks.append("/n/n".join(current))
return chunks

测试

chunks = paragraph_chunk(TEST_DOC)
for i, c in enumerate(chunks):
print(f"— 块 {i+1} —")
print©
print()`

运行效果:`— 块 1 —
Python Web 框架对比(2024版)

一、Django

Django 是 Python 生态里最成熟的全栈框架,自带 ORM、Admin、认证系统。
适合中大型项目,学习曲线稍陡,但文档完善。
安装命令:pip install django

— 块 2 —

二、Flask

Flask 是轻量级微框架,核心只有路由和模板,其他功能靠扩展。
适合小型项目和 API 服务,灵活度高。
安装命令:pip install flask

— 块 3 —

三、FastAPI

FastAPI 基于类型注解,自动生成 OpenAPI 文档,性能接近 Go。
适合需要高性能 API 的场景,异步支持完善。
安装命令:pip install fastapi uvicorn

— 块 4 —

四、选型建议

  • 要快速上线:选 Django
  • 要灵活可控:选 Flask
  • 要高性能 API:选 FastAPI`

每个块都是一个完整的小节,语义边界清晰。这种切法特别适合结构规整的文档:产品说明书、API 文档、有明确章节的技术文章。问题是:有的文档段落特别长(比如一整段代码、一整段法律条文),有的特别短(比如只有标题、选型建议")。所以加了合并和二次切割逻辑——太短就拼一起,太长就按句号再切一刀。如果你的文档是 Markdown 写的,段落结构清晰,按段落切往往比固定字数靠谱得多。

图片


六、策略四:递归字符切块(LangChain 的方案)


这是当前工程里很常见的方案。思路是:按一组分隔符的优先级递归切。先按 /n/n 切,切完发现某块太长?再按 /n 切。还太长?按句号 . 切。还太长?按空格切。总之尽量在"自然边界"切,实在不行才硬切。相当于把"按段落切"和"按字数切"结合了,既尊重结构,又控制块大小。`# 用 LangChain 的实现
from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=30,
length_function=len,
separators=[“/n/n”, “/n”, “。”, “.”, " ", “”]
)
chunks = splitter.split_text(TEST_DOC)

纯 Python 手写版(不依赖 LangChain)

def recursive_chunk(text, chunk_size=200, overlap=30, separators=None):
if separators isNone:
separators = [“/n/n”, “/n”, “。”, “.”, " ", “”]

def _split(s, seps):
    ifnot s.strip():
        return []
    if len(s) <= chunk_size:
        return [s] if s.strip() else []
    
    sep = seps[0] if seps else""
    if sep == "":
        return [s[i:i+chunk_size] for i in range(0, len(s), chunk_size - overlap) if s[i:i+chunk_size].strip()]
    
    parts = s.split(sep)
    chunks = []
    current = ""
    for i, p in enumerate(parts):
        piece = p + (sep if i < len(parts) - 1else"")
        if len(current) + len(piece) <= chunk_size:
            current += piece
        else:
            if current.strip():
                chunks.append(current.strip())
            if len(piece) > chunk_size and len(seps) > 1:
                chunks.extend(_split(piece, seps[1:]))
                current = ""
            else:
                current = piece
    if current.strip():
        chunks.append(current.strip())
    return chunks

return _split(text.strip(), separators)

测试

chunks = recursive_chunk(TEST_DOC, chunk_size=200, overlap=30)
for i, c in enumerate(chunks):
print(f"— 块 {i+1} —")
print(c[:120] + "…"if len© > 120else c)
print()`

运行效果:`— 块 1 —
Python Web 框架对比(2024版)

一、Django

Django 是 Python 生态里最成熟的全栈框架,自带 ORM、Admin、认证系统。
适合中大型项目,学习曲线稍陡,但文档完善。
安装命令:pip install django

— 块 2 —

二、Flask

Flask 是轻量级微框架,核心只有路由和模板,其他功能靠扩展。
适合小型项目和 API 服务,灵活度高。
安装命令:pip install flask

— 块 3 —

三、FastAPI

FastAPI 基于类型注解,自动生成 OpenAPI 文档,性能接近 Go。
适合需要高性能 API 的场景,异步支持完善。
安装命令:pip install fastapi uvicorn

— 块 4 —

四、选型建议

  • 要快速上线:选 Django
  • 要灵活可控:选 Flask
  • 要高性能 API:选 FastAPI`

和按段落切的结果很像,但递归切块能处理更复杂的文档。有代码块、有长段落、有短标题混在一起时,它会自动选更合适的分隔符。先试 /n/n,不行试 /n,再不行试句号,最后才硬切。它的优势在于兼顾了语义边界和大小限制,所以在生产里非常常见。LangChain 的 RecursiveCharacterTextSplitter 默认就是这么干的,你可以直接用,separators 也能按文档特点微调,比如中文文档把 。 放前面。


七、策略五:语义分块(Semantic Chunking)


前面四种都是"看字符、看标点",语义分块是"看意思"。思路是:把文本拆成句子,每句话算一个 Embedding,然后算相邻句子的余弦相似度。相似度高,通常说明两句话还在聊同一件事;相似度骤降,往往意味着话题换了,就可以考虑在那儿切一刀。比如"安装命令:pip install django"和"

二、Flask"之间,语义往往会有明显跳变,那就是一个很自然的候选切点。`import os

import numpy as np
from openai import OpenAI

client = OpenAI(api_key=os.getenv(“OPENAI_API_KEY”))

def get_embeddings(texts):
“”“批量获取 Embedding,避免一条句子调一次 API”“”
r = client.embeddings.create(model=“text-embedding-3-small”, input=texts)
return [np.array(item.embedding) for item in r.data]

def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def semantic_chunk(text, threshold=0.5, min_chunk_len=50, max_chunk_len=400):
“”“语义分块:在相似度骤降处切割”“”
import re
sentences = re.split(r’[。/n.!?]', text)
sentences = [s.strip() for s in sentences if len(s.strip()) > 5]

if len(sentences) < 2:
    return [text] if text.strip() else []

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

cut_points = [0]
for i, sim in enumerate(similarities):
    if sim < threshold:
        cut_points.append(i + 1)
cut_points.append(len(sentences))

chunks = []
for i in range(len(cut_points) - 1):
    start, end = cut_points[i], cut_points[i + 1]
    chunk_text = "。".join(sentences[start:end])
    if len(chunk_text) > max_chunk_len:
        chunks.append(chunk_text[:max_chunk_len])
        chunks.append(chunk_text[max_chunk_len:])
    elif len(chunk_text) >= min_chunk_len:
        chunks.append(chunk_text)
return chunks

测试(需要 OPENAI_API_KEY)

chunks = semantic_chunk(TEST_DOC, threshold=0.5)
for i, c in enumerate(chunks):
print(f"— 块 {i+1} —")
print©
print()`

模拟相似度曲线(示意):句子对: 1-2 2-3 3-4 4-5 5-6 6-7 7-8 ... 相似度: 0.85 0.82 0.45 0.88 0.79 0.52 0.91 ... ↑ ↑ 切点 切点

在 3-4 和 6-7 之间相似度明显下降,说明话题切换了,就在这些位置切。切出来的块会更接近"语义单元",上限通常更高。这种方案适合什么?文档没有明显段落结构、或者段落很长很杂、你需要尽可能精准地切出"一个观点一块"的场景。比如法律条款、医疗指南、长篇技术博客。

优点:真正按语义切,上限更高。缺点:要额外算 Embedding,有成本;处理速度比简单规则切块慢;还要调 threshold 这个超参数,设高了切得太碎,设低了块太大。工程上通常更适合离线批处理,而不是临时在线切。

图片


八、实测对比:同一个问题,5 种分块谁最准?


光说不练假把式。咱们用同一批文档、同一个 Embedding 模型、同一个问题"FastAPI 怎么安装?",分别建 5 个向量库,看谁召回的块最相关。这个测试你本地跑一遍就能复现,结论会很有说服力。`import chromadb
from chromadb.config import Settings

def build_and_query(chunks, question, top_k=2):
“”“建库 + 检索”“”
client = chromadb.Client(Settings(anonymized_telemetry=False))
coll = client.create_collection(“test”, metadata={“hnsw:space”: “cosine”})
embeddings = [get_embedding© for c in chunks]
coll.add(ids=[str(i) for i in range(len(chunks))], embeddings=embeddings, documents=chunks)
q_emb = get_embedding(question)
results = coll.query(query_embeddings=[q_emb], n_results=top_k)
return results[“documents”][0]

question = “FastAPI 怎么安装?”

5 种策略分别测试

strategies = [
(“固定大小”, simple_chunk(TEST_DOC, 200)),
(“固定+重叠”, overlap_chunk(TEST_DOC, 200, 50)),
(“按段落”, paragraph_chunk(TEST_DOC)),
(“递归切块”, recursive_chunk(TEST_DOC, 200, 30)),
(“语义分块”, semantic_chunk(TEST_DOC, 0.5)),
]

for name, chunks in strategies:
retrieved = build_and_query(chunks, question)
print(f"【{name}】召回:“)
for r in retrieved:
print(f” - {r[:60]}…")
print()`

结果对比:

策略召回内容是否包含 “pip install fastapi uvicorn”
固定大小可能只召回含 “fastapi” 的碎片,安装命令被切断
固定+重叠能召回完整命令,但可能带多余重叠内容
按段落能召回完整 FastAPI 段落 ✓
递归切块能召回完整段落 ✓
语义分块能召回最精准的语义块 ✓

固定大小切块最容易翻车:块 2 可能刚好是 "go/n/n

二、Flask…" 这种四不像,和"FastAPI 安装"的语义距离说不清。重叠切块能救回来一部分,但块会变多,检索时重复内容也多。按段落和递归切块都能稳定召回完整段落,语义分块在文档更复杂时优势会更明显。你可以拿自己的文档多试几个问题,感受一下差异。


九、五种策略对比表


策略原理复杂度效果适合场景
固定大小按字数切最低差快速验证 / Demo
固定+重叠按字数 + 重叠区低一般简单项目
按段落按换行切低较好结构清晰的文档
递归切块多级分隔符中等好生产环境通用
语义分块Embedding 相似度高上限高高精度 RAG

十、实用建议


大多数项目,先用递归切块就够了。实现简单,效果稳定,LangChain 也有现成实现,不用自己造轮子。先把递归切块跑起来,再根据实际效果决定要不要上语义分块。

如果文档有明确的标题、章节结构,按标题切会比按段落更好。比如 Markdown 的 ##、###,可以优先按这些切。很多 RAG 框架支持 MarkdownHeaderTextSplitter,会按标题层级切,切出来的块自带"这是第几章"的元数据,检索时还能按章节过滤。

语义分块适合"精度比成本重要"的场景,比如法律文书、医疗文档。要算好 Embedding 的调用量和延迟。如果文档量不大(几百篇以内),可以离线跑一次语义分块,建好索引后检索阶段和普通分块一样快。

不管用哪种策略,chunk_size 的选择都要结合 Embedding 模型、文档类型和问题类型一起看。很多项目会先从 256–512 token 这个量级试起,中文粗略可以理解成 150–300 字左右,但这不是铁律。别拍脑袋定个 2000,也别切得太碎。更稳妥的方式是先拿一批真实问题做召回测试,再调大小和 overlap。

图片

十一、写在最后

分块是 RAG 里最不起眼但影响很大的环节。很多人花大量时间调 Embedding 模型、调检索策略、调 Rerank,结果分块方式还是第一天写的那个 200 字硬切。检索不准的时候,先回去看看你的块是怎么切的,是不是一句话被劈成两半,是不是一个完整规则被拆到了三个块里。先把分块做对了,很多"检索不准"的问题会先消掉一大半。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

在这里插入图片描述

4. 2026行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

7. 资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

RAG 为什么仍然会答错?从检索到生成拆解六类失败 RAG 让模型在回答时先检索外部资料,再依据取回内容生成答案。它能补充时效性和私有知识,却不会自动保证检索正确、资料可信或生成忠实。理解 RAG 的最好方式,不是背诵术语,而是沿着完整责任链提问:输入从哪里来,中间怎样转换,哪些内容被舍弃,谁有权执行,结果如何核验,失败怎样恢复。当我们把这些问题说清楚,就不会因为一次惊艳演示断言 AI 已经无所不能,也不会因为一次错误否定整项技术。成熟的态度是:把适合机器处理的重复工作交给机器,同时把证据、权限和最终责任留在可控制的系统与人手中。 阅读详情

相关推荐

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 249

RAG 为什么经常答错表格问题?

RAG系统答错表格问题的根源,往往不在检索或生成环节,而在于更上游的PDF解析阶段破坏了表格的字段级归属关系(即数值与表头、单位的从属关联)。当解析器将多层表头(如“收入”下的“Q2”与“成本”下的“Q2”)拍平为孤立文本时,系统便丧失了区分同名列不同含义的能力;同时,单位、币种等元数据也常与表格主体脱钩,跨页长表在切片时更会导致数据块丢失表头。这些结构性缺陷意味着,答案的质量上限在数据入库时已被锁定,后续调优检索策略或提示词均无法弥补,最终使模型自信地给出看似合理实则错误的答案。

INTSIG的博客 340

RAG 为什么总答不准?用 100 条合成故障案例搭一套可复现评测

很多 RAG 教程把最后一步拍得很漂亮:用户提问,系统检索,模型回答,页面上还带着流式打字效果。真正把它接进故障知识库后,体验却常常变成另一回事:这时最容易做的动作,是继续改提示词。可如果正确证据根本没有进入检索结果,提示词写得再严谨也只是要求模型“根据一份错误材料认真作答”。生成模型并没有机会看到正确答案。所以这篇文章暂时把大模型请出实验室,只追一个更朴素的问题:我会用同一份 100 条合成案例、同一个向量模型和同一批查询,对比三种分块方案,再给表现最好的候选方案加一层 CrossEncoder 重排。实

争者留其名 247

企业内部 Copilot 为什么容易答错:从文档 RAG 到可信上下文层

过去两年,大量企业开始构建自己的内部 Copilot。最常见的做法是将企业文档接入大模型,让员工用自然语言提问。销售可以问“最新产品报价政策是什么”,客服可以问“这个客户的问题怎么处理”,实施工程师可以问“系统部署步骤在哪”,管理者可以问“某项目当前推进到什么阶段”。

虹科网络安全的博客 364

51 RAG 答错了怎么排查:找到证据第一次消失的位置

RAG 线上答错时,先别改 Prompt、换模型或盲目增加 Top-K。本文用一个报警 204 的缺条件案例,从 Answer、Citation、Context Manifest、Rerank、候选集合、Index、Chunk 一直反查到原始 Page,定位正确证据第一次消失或变形的位置,并给出可回放日志、故障止损、根因修复、回归测试和发布门的完整方法。

老于的笔记的专栏 47

19 文档解析与分块:RAG 准确率的第一道门槛

很多 RAG 系统答不准,不是模型不够强,而是文档在入口处就被解析坏、清洗乱、分块碎。本文讲清文档解析、清洗、元数据、语义分块、重叠和父文档策略,帮你守住 RAG 准确率的第一道门槛。

老于的笔记的专栏 241

为什么你的 RAG 项目总在 POC 阶段就死了?从零到一完整部署指南

本文深入解析LangChain框架在AI智能体时代的应用,提供从理论到实践的全面指南。主要内容包括: 框架概述:介绍LangChain作为AI应用开发生态系统的定位,及其核心设计理念。 核心架构:详细拆解RAG/IAG项目的三大组件: 知识库构建(文档加载、文本分割、向量化嵌入) 检索生成(查询处理、提示工程、LLM交互) 智能体增强(任务规划、工具调用、记忆管理) 部署流程:分阶段指导环境准备、向量知识库构建和服务搭建,包含Python代码示例(文档处理、Chroma向量库、FastAPI服务)。 关键决

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 1160

MTK-AWB 小结 (二)

调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset )

qq_46056347的博客 1170

RAG召回率98%却答错客户问题:多模型API重排的3个致命盲区

当我们的多模型API架构召回率达到98%却频现答非所问时,追踪到重排算法、模型间干扰和引用解析三大陷阱。通过引入边界标记、动态temperature和预处理层,最终将复杂query准确率从53%提升至89%。本文详解多模型协同的5个致命误区和7项工程解决方案。

weixin_47315004的博客 12

基于OpenAI Agents构建多智能体工作流:从原理到实战

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个智能体(Agent)的协作与交互,解决单一智能体难以处理的复杂任务。其核心原理在于将任务分解、分配与协调,每个智能体具备特定能力,通过通信机制实现信息共享与决策协同。在工程实践中,多智能体框架的价值在于提升任务处理效率、增强系统鲁棒性,并支持模块化开发。典型的应用场景包括自动化工作流编排、复杂问题求解以及人机协同交互。本文以OpenAI Agents SDK为例,深入探讨如何利用其提供的智能体(Agent)、会话(Ses

weixin_28725959的博客 606

Aurix TC387 Ethernet代码解析之二_移植

英飞凌官方仅提供了TC397的例程,故需通过TC397例程来移植到TC387新建工程里。TC397官方例程名称【Ethernet_1_KIT_TC397_TFT】,网络上可以免费获取到,此处不赘述。使用工具【

m0_69929716的博客 886

RAG系统分块策略优化:提升检索增强生成准确率

检索增强生成(RAG)系统通过结合检索与生成技术,显著提升了自然语言处理的准确性与信息可靠性。其核心原理在于将外部知识库信息通过向量检索引入生成过程,而文本分块(chunking)作为向量化的前置步骤,直接影响检索质量。合理的分块策略能保留语义完整性,避免信息碎片化,这对金融、法律等专业领域尤为重要。实践中需动态调整分块大小与重叠比例,结合语义边界识别和元数据注入,例如对财务报表采用25-30%重叠分块,对法律合同保持1000-1200 tokens的大分块。优化后的分块方案可使RAG系统准确率提升26%,

weixin_34293141的博客 352

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 158

RAG 评估:答错了,是检索的错还是生成的错?

《AI 知识卡片》第 15 期 · 三元组把病灶分开,优化才不是盲人摸象。答错了别急着改提示词。先分清是检索没捞对、生成在瞎说,还是压根没答到点。

qq_52732369的博客 393

深度学习特征融合(feature fusion)操作详解

特征融合是指在深度神经网络中,将来自不同来源(如不同网络分支、不同模态、不同时间步、不同空间尺度或不同抽象层级)的特征表示进行有策略地整合,以生成更具判别性、鲁棒性和语义丰富性的联合特征表示。其核心目标是最大化信息互补性,最小化信息冗余与噪声干扰。关键问题:如何“有效”融合?——这取决于任务需求、数据特性、计算资源和融合机制的设计。✅ 是否对齐了空间/通道/模态?✅ 融合方式是否与任务匹配?(检测需定位+语义 → 多尺度融合)✅ 是否引入可学习机制提升适应性?✅ 是否控制了计算开销?

浩瀚之水的专栏 793

YOLOv8改进,YOLOv8添加DCNv3可变性卷积,无需编译

DCNv3在DCNv2版本上进行了改进,上一期我们在YOLOv8中添加了DCNv2,这一期我们将添加DCNv3,DCNv3代码详解可以参考链接:代码详解——可变形卷积(DCNv3)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5021

LLM之RAG实战:为什么您的 RAG 系统无法解决复杂的问题?

摘要:传统RAG方法因直接输入非结构化文本存在两大缺陷:模型易受噪声干扰产生错误,且难以处理多步推理问题。为此,RAS(检索与结构化)框架应运而生,通过三阶段优化:检索相关文档→将文本结构化(如构建知识图谱)→基于结构化知识生成答案。RAS采用分类法增强检索、知识图谱引导推理等技术,显著提升模型的事实准确性和复杂问题处理能力。其核心创新在于将原始文本转化为原子化、可验证的结构化知识,使大模型实现"先组织后推理"的精准思考路径,有效抑制幻觉现象。实验证明RAS在闭源/开源模型上均能带来显著

WANGJUNAIJIAO的博客 969

软件需求规格说明书(SRS)标准模板

《软件需求规格说明书(SRS)框架解析》摘要: 本文档系统阐述了SRS的标准结构,包含7大核心部分:1)引言(目的、背景和术语);2)总体描述(产品定位与用户特征);3)功能需求(模块化功能说明);4)非功能需求(性能、安全等指标);5)接口需求(用户/硬件/软件接口);6)其他技术要求;7)附录(图表与参考资料)。重点突出了功能需求模块的标准化描述模板(FR-01),以及安全需求中的HTTPS通信、SHA-256加密等关键指标。该框架为软件开发提供了明确的需求基准,涵盖从业务背景到技术实现的完整链条,是确

moton2017的博客 2894

RAG工程-RAG为什么总翻车-召回重排和上下文拼装

所以 RAG 的难点不在“找没找到”,而在“找对没有、排序对没有、拼进去对没有”。但如果你把它当成“召回、重排、证据拼装、回答约束”的完整系统,它就会稳很多。召回解决的是“先找一批回来”,重排解决的是“谁最值得放进上下文”。上下文拼装不是把片段堆上去,而是把它们组织成模型能读懂的证据包。有些系统前两步没问题,最后还是答错,原因就是上下文拼得太烂。如果你只把它当“向量库 + 模型”,它确实经常翻车。它更像一条流水线,哪一步出问题,最后答案都会歪。而是最后喂给模型的那一小段,能不能刚好说中问题。

weixin_51864284的博客 408

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 567

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RAG 明明检索到了正确文档,为什么 Agent 还是答错了?

企业AI助手知识库问答中的版本管理问题:当RAG检索到正确文档却仍给出错误答案时,测试发现旧版制度因表述相似被优先采用。解决方案包括:1)检索前过滤失效文档;2)重排候选片段时综合考量相关性、状态和版本;3)证据冲突时主动提示而非自动选择;4)为回答添加详细引用来源。关键在于不仅要检索到相关内容,更要通过元数据管理确保模型使用正确版本,这比单纯优化召回率更重要。企业场景中,答案的可信度比回答流畅性更关键。

weixin_51228134的博客 383

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

面试“杀手级”问题:RAG系统最难搞定的部分是哪个?90%的人都答错了!

前不久在知乎回答了一个提问:大家觉得做一个大模型检索增强生成(RAG)系统,最难搞定的是那部分工作?

m0_59164520的博客 977

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RAG 可观测性实战:上线后必须能定位“为什么答错“(五)

RAG 系统上线只是开始。Demo 阶段"能不能回答"很容易验证,但生产环境里每天都会出现"答错、答偏、答不出来"的 case,而 RAG 是一条多阶段流水线——查询改写错了?检索没召回?重排序把对的排下去了?上下文组装丢了关键片段?还是 LLM 生成阶段幻觉了?没有可观测性,工程师面对用户投诉只能反复盲猜 prompt;有了可观测性,任何一个 bad case 都能在十分钟内定位到具体环节。这就是 RAG 运营和 RAG 玩具的分水岭。RAG 系统上线后,不能只看"能不能回答",还要能定位。

GQ_666的博客 359

RAG最怕的不是答错,而是“没依据却像答对了”

先不用把概念搞得太学术。先找资料,再让模型回答。用户提问↓系统理解问题↓从知识库中检索相关内容↓把相关内容连同问题一起给大模型↓大模型基于检索结果生成答案↓返回答案和引用来源普通聊天更依赖模型自身知识RAG 更强调“基于外部知识库回答”文档解析切片检索排序生成引用权限一旦链路中某个环节出问题,最终答案就会出问题。很多团队做知识库问答测试时,最容易停留在一个表面问题:它答得像不像对的?它到底是从哪答出来的?它是不是基于正确文档回答的?

测试技师的自我修养 473

为什么说检索质量才是RAG系统的天花板?小白也能懂的RAG核心秘诀!

RAG系统性能受限于检索质量而非LLM能力,"垃圾进,垃圾出"导致AI回答错误。高质量检索需具备精准性、召回率和相关性排序,这三者共同构成RAG系统天花板。搭建RAG系统应将80%精力投入检索优化,包括数据清洗、文档分块、Embedding模型选择和检索算法设计,而非仅追逐最新LLM。只有稳定提供高质量参考资料,RAG系统才能发挥真正价值。

Trb201013的博客 635
上一篇: 高级 RAG 技术:查询转换与查询分解
下一篇: 揭秘RAG技术如何给大模型装上“知识外挂”
AI_小站
博客等级 码龄3年 6255粉丝 1154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值