RAG由浅入深02
第一部分分块策略 —— 如何优雅地切分长文档分块Chunking是RAG的地基工程——分块太大检索噪声多分块太小语义不完整。核心目标是在保持语义完整性和控制检索粒度之间找到最佳平衡。 五大主流分块策略1. 固定字符分块最基础deffixed_size_chunking(text,chunk_size500,overlap50): 按固定字符数切分带重叠区域防止语义断裂 chunks[]start0whilestartlen(text):endstartchunk_size chunks.append(text[start:end])startend-overlap# 重叠区域保留上下文returnchunks优点实现简单计算开销小缺点可能切断句子或段落语义不完整适用场景对质量要求不高的快速原型2. 递归字符分块LangChain默认方式fromlangchain.text_splitterimportRecursiveCharacterTextSplitter splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,,, ,]# 优先级递减)chunkssplitter.split_text(document)核心思想优先在段落、句子边界切分保持自然语义单元优点比固定切分更智能保留更多语义完整性适用场景通用场景的首选方案3. 语义分块基于句子嵌入fromsentence_transformersimportSentenceTransformerimportnumpyasnpdefsemantic_chunking(sentences,similarity_threshold0.7): 计算句子间的语义相似度相似度低的切分 modelSentenceTransformer(all-MiniLM-L6-v2)embeddingsmodel.encode(sentences)chunks[]current_chunk[sentences[0]]foriinrange(1,len(sentences)):# 计算当前句子与上一句的相似度simnp.dot(embeddings[i],embeddings[i-1])/(np.linalg.norm(embeddings[i])*np.linalg.norm(embeddings[i-1]))ifsimsimilarity_threshold:chunks.append( .join(current_chunk))current_chunk[sentences[i]]else:current_chunk.append(sentences[i])ifcurrent_chunk:chunks.append( .join(current_chunk))returnchunks优点能智能识别主题边界分块质量高缺点计算开销大需要调用模型适用场景对检索精度要求高的生产环境4. 文档结构感知分块针对特定格式defmarkdown_aware_chunking(markdown_text): 按Markdown的标题层级切分保持文档结构 importre# 按标题# ## ###分割patternr(#{1,3}\s[^\n]\n)sectionsre.split(pattern,markdown_text)chunks[]current_headercurrent_content[]foriteminsections:ifre.match(r^#{1,3}\s,item):# 是标题保存之前的块ifcurrent_headerandcurrent_content:chunks.append(current_header\n.join(current_content))current_headeritem current_content[]else:current_content.append(item)ifcurrent_headerandcurrent_content:chunks.append(current_header\n.join(current_content))returnchunks适用场景技术文档、法律文书、财报等结构化文档5. 大小块混合策略进阶方案defhybrid_chunking(document): 同时建立大块用于上下文和小块用于检索 # 大块提供完整上下文large_chunksRecursiveCharacterTextSplitter(chunk_size1000,chunk_overlap100).split_text(document)# 小块用于精确检索small_chunksRecursiveCharacterTextSplitter(chunk_size200,chunk_overlap50).split_text(document)return{large_chunks:large_chunks,small_chunks:small_chunks,strategy:父文档检索Parent Document Retrieval}核心思想检索时用小块精确定位返回答案时附带大块上下文优点兼顾检索精度和回答质量 分块策略选择决策表文档类型推荐策略chunk_sizeoverlap短文章500字不切分整文使用--技术博客/文章递归字符分块500-80050-100法律/政策文档结构感知分块按章节-财报/年报语义分块动态-多主题综合文档混合策略200/100050/100用户评论/对话固定字符分块200-30030-50 第二部分检索优化 —— 让AI找到最相关的信息分块只是第一步更关键的是如何让检索系统精准找到用户问题的相关片段。 检索优化策略矩阵策略1多路召回 重排序Reranking核心思想先快速召回多个候选再用更精细的模型重新排序。fromsentence_transformersimportCrossEncoderimportnumpyasnpdefrerank_search(query,chunks,top_k10): 多路召回 交叉编码器重排 # 1. 第一轮快速召回20个候选用普通嵌入embeddingsOpenAIEmbeddings()query_embembeddings.embed_query(query)chunk_embs[embeddings.embed_query(chunk)forchunkinchunks]# 计算余弦相似度取前20similaritiesnp.dot(chunk_embs,query_emb)top_indicesnp.argsort(similarities)[-20:][::-1]candidates[chunks[i]foriintop_indices]# 2. 第二轮用交叉编码器精细排序rerankerCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)scoresreranker.predict([(query,chunk)forchunkincandidates])# 返回排序后的top_krerankedsorted(zip(candidates,scores),keylambdax:x[1],reverseTrue)return[chunkforchunk,scoreinreranked[:top_k]]性能提升检索精度提升20-30%适用场景大规模知识库10万文档策略2HyDE假设文档嵌入核心思想让大模型先想象一个理想答案然后用这个假想答案去检索。defhyde_search(query,llm,knowledge_base): HyDE先让AI生成假设答案再检索 # 1. 生成假设答案不要求准确只求相关概念hypothesisllm.invoke(f假设你是专家请针对以下问题写一段可能的答案草稿{query})# 2. 用假设答案进行检索而非原始问题hypothesis_embedembeddings.embed_query(hypothesis.content)resultsknowledge_base.similarity_search_by_vector(hypothesis_embed)returnresults优点能召回与问题语义相近但关键词不同的文档缺点增加LLM调用开销约100-300ms策略3多查询查询Multi-Query核心思想将用户问题改写为多个不同视角的问题分别检索后合并去重。defmulti_query_search(query,llm,knowledge_base): 生成5个不同视角的问题合并检索结果 # 1. 生成多个查询变体promptf请将以下问题从不同角度改写为5个不同的问题保持原意{query}variantsllm.invoke(prompt).content.split(\n)[:5]# 2. 每个变体分别检索all_results[]forqin[query]variants:resultsknowledge_base.similarity_search(q,k3)all_results.extend(results)# 3. 去重并合并基于内容相似度unique_resultsdeduplicate_documents(all_results)returnunique_results适用场景用户问题模糊、多义性强的场景策略4元数据过滤Metadata Filtering核心思想为文档块附加元数据来源、日期、类型等检索时先按条件过滤。defmetadata_aware_retrieval(query,metadata_filters,knowledge_base): 带元数据过滤的检索 # 例只检索2024年以后的文档且类型为政策filters{year:{$gte:2024},doc_type:policy}resultsknowledge_base.similarity_search(query,k5,filterfilters# 先过滤再检索)returnresults优点大幅减少无关候选提升精度适用场景结构化知识库如企业文档库策略5自适应检索Adaptive Retrieval核心思想根据问题的复杂度动态调整检索策略。defadaptive_search(query,llm,knowledge_base): 先判断问题复杂度再选择策略 # 1. 问题复杂度判断complexity_promptf请判断以下问题的复杂度简单/中等/复杂{query}levelllm.invoke(complexity_prompt).content.strip()# 2. 动态策略选择iflevel简单:returnknowledge_base.similarity_search(query,k3)eliflevel中等:# 使用多路召回returnmulti_query_search(query,llm,knowledge_base)else:# 复杂# 使用HyDE或链式检索returnhyde_search(query,llm,knowledge_base) 实战完整优化方案代码示例fromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportLLMChainExtractordefbuild_optimized_rag(): 构建一个整合了多种优化策略的RAG系统 # 1. 优化分块策略text_splitterRecursiveCharacterTextSplitter(chunk_size600,chunk_overlap80,separators[\n\n,\n,。,,,, ,])docstext_splitter.split_documents(documents)# 2. 创建向量库embeddingsOpenAIEmbeddings()vectorstoreChroma.from_documents(docs,embeddings,collection_metadata{hnsw:space:cosine}# 使用余弦相似度)# 3. 基础检索器多路召回base_retrievervectorstore.as_retriever(search_typemmr,# MMR算法平衡相关性和多样性search_kwargs{k:20,fetch_k:50})# 4. 重排序压缩LLM链式压缩llmChatOpenAI(modelgpt-3.5-turbo)compressorLLMChainExtractor.from_llm(llm)# 5. 最终检索器final_retrieverContextualCompressionRetriever(base_compressorcompressor,base_retrieverbase_retriever)returnfinal_retriever# 使用优化后的检索器retrieverbuild_optimized_rag()relevant_docsretriever.get_relevant_documents(公司年假政策是什么) 优化效果与性能权衡优化策略精度提升延迟增加实现难度推荐指数递归字符分块10%5ms⭐⭐⭐⭐⭐⭐语义分块15%50ms⭐⭐⭐⭐⭐⭐⭐多路召回重排20-30%100-200ms⭐⭐⭐⭐⭐⭐⭐⭐⭐HyDE15-25%200-300ms⭐⭐⭐⭐⭐⭐元数据过滤25%10ms⭐⭐⭐⭐⭐⭐⭐自适应检索30%50-300ms⭐⭐⭐⭐⭐⭐⭐⭐ 最佳实践建议从小规模开始先在1000个文档的规模测试分块策略建立评测集准备50-100个标准问题及期望答案量化评估每个优化策略的效果分层优化先优化分块影响基础再优化检索锦上添花监控关键指标关注召回的NDCG10和回答的BLEU/ROUGE分数渐进式部署在生产环境先用简单策略逐步迭代复杂优化分块和检索优化没有银弹最佳实践是根据你的文档类型、用户查询模式、性能要求做AB测试找到最适合的组合。

相关新闻

发展智慧农业,有哪些国家扶持政策?

发展智慧农业,有哪些国家扶持政策?

不少做农业的朋友布局智慧农业,却不了解相关扶持政策,白白错失扶持机会。各地每年都会推出涉农数字化相关扶持项目,提前摸清政策方向,对基地数字化升级十分关键。一、政策覆盖范围广,支持多个建设板块各地涉农数字化扶…

2026/10/2 1:35:47 阅读更多 →
为什么 Agent Skill 突然火了?

为什么 Agent Skill 突然火了?

你是不是也有过这样的崩溃时刻? 每次让 Claude 写代码,都要重复粘贴 请使用我们的代码规范:驼峰命名、2空格缩进、必须写单元测试 ——像极了每天入职新公司; 好不容易调教好的 Prompt 换个项目就完全失效,之前的调教经…

2026/9/28 18:54:05 阅读更多 →
Gradio.Net 开发指南 -- 快速入门

Gradio.Net 开发指南 -- 快速入门

目录 快速入门 安装 创建新项目 安装 Gradio.Net 构建你的第一个演示 理解 Interface 类 快速入门 Gradio.Net (https://github.com/feiyun0112/Gradio.Net)是一个开源的 .NET 库,它是 Gradio 的 .NET 移植版本,允许你为机器学习模型、API 或任何…

2026/10/6 2:03:35 阅读更多 →

最新新闻

K8s监控告警实战:Prometheus组件规划与Helm部署指南

K8s监控告警实战:Prometheus组件规划与Helm部署指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:36:33 阅读更多 →
微信小程序web-view通信:H5 postMessage传值实战与避坑指南

微信小程序web-view通信:H5 postMessage传值实战与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:36:33 阅读更多 →
ESP32 ModbusTCP分片缓存实战:解决数据错乱与超时

ESP32 ModbusTCP分片缓存实战:解决数据错乱与超时

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:36:33 阅读更多 →
航空电子系统形式化验证:从FSM、LTL到Petri网的工程落地

航空电子系统形式化验证:从FSM、LTL到Petri网的工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:36:33 阅读更多 →
大模型Agent智能体开发实战:从状态机到ReAct的完整复盘

大模型Agent智能体开发实战:从状态机到ReAct的完整复盘

今年上半年我们项目组立项了一个内部代号叫「赋饭」的Agent项目,产品形态就是现在大家看到的「九天猜猜」——一个让用户和AI互相出题、互相猜答案的互动智能体。这篇算是一份大模型Agent智能体开发实战的完整复盘,我想把从需求拆解、架构选型、代码实现…

2026/10/13 5:36:33 阅读更多 →
CTF RSA常见题型与攻击脚本系统整理:从模数分解到共模攻击

CTF RSA常见题型与攻击脚本系统整理:从模数分解到共模攻击

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 5:35:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →