RAG-03-切片
背景
固定chunk_size,上下文重叠(5%-10%)
text_splitter = SentenceSplitter(
chunk_size=400, # 可根据文本长度调整,如缩短至300-400
chunk_overlap=40, # 太长句子才会触发overlap。 比如一个句子用400 chunk size切,把一个完整的句子切断了,那么被切断的完整句子会发生overlap
paragraph_separator="\n\n",
# 增加中文标点!?,使用全角符号匹配
secondary_chunking_regex="[^,。;!?]+[,。;!?]?",
)
语义切片
目的:完整语义
1 大语言模型,做格式转化。如 markdown
2 使用规则切割(如基于markdown的规则切割)
分段数据稠密
整体上召回 前后关联很大
VRM VRA 图片推理
语义段落: 大模型,
GraphRAG(Graph-based Retrieval-Augmented Generation)是一种结合知识图谱与检索增强生成(RAG)的先进技术
文本切片与嵌入生成流程
-
文本切片
使用 LangChain 的RecursiveCharacterTextSplitter或ChineseTextSplitter分割长文本(网页1、网页2)。from langchain.text_splitter import RecursiveCharacterTextSplitter # 示例:中文文本切片 text_splitter = RecursiveCharacterTextSplitter( chunk_size=512, # 每个切片的 token 数 chunk_overlap=20, # 切片间重叠的 token 数 separators=["\n\n", "\n", "。", "!", "?", ";"] # 中文语义分割符 ) long_text = "这里是需要处理的长文本段落..." chunks = text_splitter.split_text(long_text) -
生成嵌入向量
将切片后的文本输入 FlagEmbedding 生成向量(网页6):from FlagEmbedding import FlagModel # 加载模型 model = FlagModel('BAAI/bge-large-zh-v1.5', use_fp16=True) # 生成嵌入 embeddings = model.encode(chunks) print(f"切片数量:{len(chunks)},嵌入维度:{embeddings[0].shape}")
关键参数说明
chunk_size
建议与 Embedding 模型的输入长度对齐(如 512),避免填充或截断(网页1)。chunk_overlap
设置 10%~20% 的重叠,保持语义连贯性(网页2)。- 分割器选择
中文推荐ChineseTextSplitter,英文推荐RecursiveCharacterTextSplitter(网页1)。
完整 DEMO 示例
from langchain.text_splitter import ChineseTextSplitter
from FlagEmbedding import FlagModel
# 1. 文本切片
text = "长文本内容..."
splitter = ChineseTextSplitter(chunk_size=512, chunk_overlap=50)
chunks = splitter.split_text(text)
# 2. 嵌入生成
model = FlagModel('BAAI/bge-large-zh-v1.5', query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:")
embeddings = model.encode(chunks)
# 3. 输出结果
for i, (chunk, emb) in enumerate(zip(chunks, embeddings)):
print(f"切片 {i+1}(长度:{len(chunk)}字符): {chunk[:50]}...")
print(f"嵌入维度:{emb.shape}\n")
相关实践建议
- 数据对齐:确保切片后的文本长度接近模型输入限制(如 512 token),以最大化模型编码能力(网页1)。
- 性能优化:对中文场景使用
use_fp16=True加速推理(网页6)。 - 领域适配:若处理法律/医学文本,建议对 Embedding 模型微调以提升精度(网页3)。

浙公网安备 33010602011771号