大规模优化检索增强生成:分块、检索以及将延迟降低 40% 的贝叶斯搜索
我们如何从“语义搜索加碰运气”转变为具有 95% 的前 10 个结果召回率的、可衡量且可调节的检索流水线
检索增强生成的现实检验
每个人部署检索增强生成的方式都如出一辙:按 512 个词元进行分块,使用 text-embedding-3-small 进行嵌入,取前 k=5 个结果,然后塞入上下文。这在演示中很有效。
然而,当你进入生产环境时:
- 法律合同:512 个词元的分块会在句子中间切断条款
- 应用程序接口文档:1000 个词元的分块使信号淹没在噪声中
- 客户工单:对话式上下文需要重叠,而不是固定的窗口
- 延迟:500 毫秒嵌入 + 200 毫秒向量搜索 + 300 毫秒大语言模型 = 每次查询超过 1 秒
我们从第一性原理出发重建了我们的检索层。以下是真正能提升指标的做法。
分块:一刀切并不适用任何场景
# rag/chunking.py
from abc import ABC, abstractmethod
from dataclasses import dataclass
@dataclass
class Chunk:
text: str
metadata: dict
token_count: int
chunk_id: str
class ChunkingStrategy(ABC):
@abstractmethod
def chunk(self, document: str, metadata: dict) -> list[Chunk]: ...
class FixedTokenChunker(ChunkingStrategy):
"""基线。适用于同质化内容。"""
def __init__(self, chunk_size=512, overlap=50):
self.chunk_size = chunk_size
self.overlap = overlap
class RecursiveChunker(ChunkingStrategy):
"""尊重结构:Markdown 标题、代码块、段落。"""
def __init__免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。