无LangChain:30K+分块、含大文档与表格的RAG QA规模化优化求助
解决方案:大规模RAG系统的检索精度、表格处理与成本优化
一、提升大规模分块的初始检索精度
1. 混合检索:文本索引+向量检索结合
用PostgreSQL的文本检索能力先缩小范围,再执行向量KNN,避免全量30K分块检索:
- 在分块表中新增
text_content字段,存储分块的标题、关键词或核心文本 - 为该字段创建GIN全文索引:
CREATE INDEX idx_chunk_text ON chunks USING GIN(to_tsvector('english', text_content)); - 查询时先通过全文匹配过滤出候选分块,再做向量排序:
SELECT id, content, embedding <-> :query_embedding AS distance FROM chunks WHERE to_tsvector('english', text_content) @@ to_tsquery('english', :query_text) ORDER BY distance LIMIT 50;
2. 语义化分块与主题聚类
- 替换固定长度分块,用语义分块工具(如
sentence-transformers的语义分割功能)按段落语义边界拆分内容,减少无关分块 - 对所有文档做主题聚类:
- 用轻量嵌入模型生成每份文档的全局嵌入
- 用KMeans聚类将文档划分为N个主题簇,存储簇ID到分块表
- 查询时先匹配主题簇,再在簇内执行向量检索,大幅缩小检索范围
3. 轻量交叉编码器重排序
舍弃LLM全量重排序,改用轻量交叉编码器(如cross-encoder/ms-marco-MiniLM-L-6-v2)对初始检索的Top50分块重排序:
from sentence_transformers import CrossEncoder model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2') pairs = [[query, chunk.content] for chunk in initial_results] scores = model.predict(pairs) # 按分数排序结果 sorted_results = sorted(zip(initial_results, scores), key=lambda x: x[1], reverse=True)
二、高效处理表格密集型内容
1. 表格结构化存储+多模态检索
利用Docling提取表格的结构化数据,单独存储并构建多维度检索能力:
- 创建独立的
tables表,字段包括table_id,document_id,structured_data(JSONB格式存储表格行列数据),table_embedding - 生成两种表格嵌入:
- 语义嵌入:将表格标题、列名、核心数值拼接为文本,用轻量模型生成嵌入
- 结构化嵌入:用专门的表格嵌入模型(如
table-transformers)生成适配结构化数据的嵌入
- 查询时根据查询类型分支处理:
- 数值/条件查询:直接通过JSONB的数值字段过滤(如
WHERE structured_data->>'销售额' > '1000000') - 语义查询:结合表格嵌入与文本分块嵌入共同检索
- 数值/条件查询:直接通过JSONB的数值字段过滤(如
2. 表格细粒度索引
将表格拆分为行级细粒度单元,兼顾结构化查询与语义检索:
- 把表格的每一行(附带列名)转换为文本片段(如
"区域:华东,销售额:1200000,同比增长:15%") - 为每个行单元生成嵌入,同时将数值字段单独存储为PostgreSQL的数值类型列
- 检索时可同时支持语义匹配和精准数值过滤
3. 轻量模型生成表格元数据
不用LLaMA生成表格摘要,改用小模型(如DistilBERT)生成表格核心元数据:
- 提取表格的主题、列含义、数值范围等元数据,生成短文本
- 用轻量模型为元数据生成嵌入,用于快速定位相关表格,再查询结构化数据
三、成本控制与效率优化
1. 轻量嵌入模型选型
替换大模型,选用开源轻量嵌入模型:
- 英文场景:
sentence-transformers/all-MiniLM-L6-v2或BAAI/bge-small-en-v1.5 - 多语言场景:
BAAI/bge-small-multilingual-v1.5
这些模型推理速度快、资源占用低,且检索效果接近大模型
2. 缓存机制落地
- 用Redis缓存查询嵌入、检索结果、重排序结果,相同查询直接复用结果
- 缓存分块的嵌入与元数据,避免重复生成
3. 批量处理与GPU加速
- 生成嵌入时采用批量处理,利用
sentence-transformers的encode方法的batch_size参数提升效率 - 有GPU资源时启用CUDA加速,大幅降低嵌入生成的时间成本
4. 无效分块过滤
利用Docling的文档结构解析能力,自动过滤页眉、页脚、空白页、重复内容,从源头减少分块数量与噪声
内容的提问来源于stack exchange,提问作者Anton Lee
相关产品推荐
相关产品推荐

