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)的先进技术


文本切片与嵌入生成流程

  1. 文本切片
    使用 LangChain 的 RecursiveCharacterTextSplitterChineseTextSplitter 分割长文本(网页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)
    
  2. 生成嵌入向量
    将切片后的文本输入 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)。

参考资料

https://e.naixuejiaoyu.com/p/t_pc/course_pc_detail/video/v_66b9d04fe4b0d84dbbf974a0?product_id=p_66af20abe4b0694c9850a6d3&type=6

posted @ 2025-05-09 10:20  向着朝阳  阅读(138)  评论(0)    收藏  举报