核心理念:从"跑通代码"到"解决真实世界的复杂脏活",掌握生产级 RAG 系统的工程化深度。
📋 实验目标
- 掌握高级切分策略:理解不同切分方法的适用场景和效果差异
- 优化检索准确度:学习混合检索、重排序等先进技术
- 管理上下文窗口:解决长文档、成本控制等工程难题
- 实战项目:构建"智能投后报告分析助手",处理真实复杂场景
- 性能调优:建立评估体系,持续优化系统性能
🛠️ 实验环境准备
升级依赖安装
CodeBlock Loading...
环境验证
CodeBlock Loading...
实验一:高级切分策略 (Advanced Chunking)
实验目标
深入理解不同切分策略对检索效果的影响,掌握何时使用何种切分方法。
理论基础
1. 切分策略对比
| 策略 | 实现难度 | 检索效果 | 上下文保持 | 计算成本 | 适用场景 |
|---|---|---|---|---|---|
| 固定长度 | ⭐ | ⭐⭐ | ⭐ | ⭐⭐⭐⭐⭐ | 简单文档、日志 |
| 句子级 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | 论文、新闻 |
| 段落级 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 常规文档 |
| 递归切分 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 通用场景 |
| 语义切分 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | 复杂文档 |
2. Overlap 窗口策略
问题:切分时丢失跨块上下文信息 解决方案:相邻块之间保留重叠区域
CodeBlock Loading...
实验步骤
Step 1: 实现多种切分策略
CodeBlock Loading...
固定长度切分: 11 个块
句子级切分: 8 个块
递归切分: 9 个块= 切分效果分析 =
CodeBlock Loading...
句子级:
CodeBlock Loading...
递归切分:
CodeBlock Loading...
Step 2: 切分效果评估
CodeBlock Loading...
CodeBlock Loading...
【固定长度】
块数量: 17
语义连贯性: 0.772 (越高越好)
完整性: 1.000
平均块大小: 195 ± 19【固定长度(大)】
块数量: 11
语义连贯性: 0.773 (越高越好)
完整性: 0.767
平均块大小: 300 ± 0【句子级】
块数量: 11
语义连贯性: 0.774 (越高越好)
完整性: 0.723
平均块大小: 273 ± 37【递归切分】
块数量: 12
语义连贯性: 0.804 (越高越好)
完整性: 0.798
平均块大小: 269 ± 27✅ 评估图表已保存为 chunking_evaluation.png
CodeBlock Loading...
测试日期: 2025-12-05
固定长度切分
Python
# 配置参数
chunk_size = 200
overlap = 20
# 测试结果
块数量: 17
平均Token数: 195.0 ± 19
语义连贯性分数: 0.772
观察:
- 重叠比例20%时,上下丢失情况: overlap 为 40 时比 20 高4.4%
- 最优overlap值: 50 -> 0.810
递归切分
CodeBlock Loading...
观察:
- 递归切分 vs 固定长度的语义连贯性提升: 4.4%
- 适用场景:
通用场景: 递归切分
- 平衡了语义连贯性和完整性
- 自适应不同类型的文档结构
简单文档: 固定长度(300字符, 30重叠)
- 速度快,可预测
- 适合日志、代码等结构化内容
文学/学术文本: 句子级切分
- 保持句子完整性
- 适合诗歌、论文等需要保持语义单元的内容
对比结果
| 策略 | 块数量 | 语义连贯性 | 完整性 | 推荐度 |
|---|---|---|---|---|
| 固定长度 | 17 | 0.772 | 1.000 | ⭐⭐ |
| 句子级 | 11 | 0.774 | 0.723 | ⭐⭐⭐ |
| 递归切分 | 12 | 0.804 | 0.798 | ⭐⭐⭐⭐⭐ |
实验一练习题
- 重叠窗口优化实验:分别测试 overlap = 0, 10, 20, 30, 40, 50,找出最佳重叠比例
- 混合策略实验:对文档不同部分使用不同切分策略(如标题用句子级,正文用递归)
- 领域特化实验:对法律文书、医学论文等特定领域文本,设计专用切分策略
发现与思考
问题1: 当文档结构不规律时,哪种策略最鲁棒?
- 答案: 递归切分
- 证据: 通过多级分隔符(段落→句子→词语)自动适应不规律结构,能在自然边界处切分,保持语义完整性,最适合混合格式文档
问题2: Overlap比例对召回率的影响?
- 测试了overlap = 0, 10, 20, 30, 50
- 最佳值: 50
- 原因分析: 重叠 50 字符确保关键信息不会在切分处丢失,向量检索时,即使部分信息在边界处,仍有足够上下文被匹配到
问题3: 如何针对特定领域优化切分?
- 法律文档: 按条款/章节切分,保持条款完整性,识别"第X条"、"第X款"等法律标记
- 技术文档: 代码块与文本分离,API文档按方法/类切分,保留代码上下文
- 财务报表: 表格结构化切分,按会计科目/时间周期划分,保留表头与数据关联
实验二:检索准确度优化 (Retrieval Optimization)
实验目标
掌握混合检索、重排序等先进技术,显著提升检索质量。
理论基础
1. 传统检索 vs 语义检索
| 维度 | 关键词检索 (BM25) | 语义检索 (Dense) | 混合检索 |
|---|---|---|---|
| 原理 | TF-IDF统计 | 向量相似度 | 加权融合 |
| 优点 | 精确匹配、速度快 | 语义理解、鲁棒性好 | 综合优势 |
| 缺点 | 无法理解语义 | 可能过度泛化 | 实现复杂 |
| 适用 | 精确查询、专业术语 | 同义表达、语义理解 | 复杂查询 |
2. 重排序 (Reranking)
问题:Top-K检索可能包含不相关结果 解决:使用更强的模型对初步结果重新排序
初始检索 (100个结果) → 重排序模型 → Top-10最终结果
实验步骤
Step 1: 实现混合检索
CodeBlock Loading...
✅ 索引构建完成: 12 个文档块🔍 查询: Anthropic公司的发展历程
CodeBlock Loading...
混合检索实验
测试日期: 2025-12-05
权重调优实验
CodeBlock Loading...
不同权重配置对比
- 纯语义:(1.0, 0.0)
- 纯BM25:(0.0, 1.0)
- 混合比例:(0.7, 0.3)、(0.5, 0.5)、(0.3, 0.7)
| 比例 | 混合得分 | 语义得分 | BM25得分 | 备注 |
|---|---|---|---|---|
| 1.0, 0.0 | 0.783 | 0.783 | 0.826 | |
| 0.0, 1.0 | 1.000 | 0.717 | 1.000 | |
| 0.7, 0.3 | 0.670 | 0.750 | 0.983 | |
| 0.5, 0.5 | 0.867 | 0.750 | 0.983 | |
| 0.3, 0.7 | 0.915 | 0.717 | 1.000 |
最佳配置:
- Alpha = 1.0 (纯语义), 场景:推荐系统、FAQ问答(用户描述问题,寻找标准答案)、跨语言搜索。 例子:"如何调整心情?" -> 匹配心理健康文档。
- Alpha = 0.0 (纯 BM25), 场景:代码搜索、SKU/零件编号搜索、法律文书中的特定条款搜索。 例子:"func getuserid()" -> 精确匹配代码库。
- Alpha = 0.5 (平衡,常用默认值), 场景:通用知识库、RAG(检索增强生成)系统。 原理:既想要同义词扩展,又想确保关键词尽可能出现。
- 偏向 BM25 (e.g., Semantic 0.3, BM25 0.7), 场景:电商搜索。用户搜 "耐克 红色 跑鞋",通常希望这三个词都严格匹配,而不是推荐 "阿迪达斯 红色 跑鞋"(虽然语义相近,但在电商场景是错误的)。
Step 2: 实现重排序机制
CodeBlock Loading...
✅ 索引构建完成: 195 个文档块🔍 查询: 贾宝玉和林黛玉的关系
CodeBlock Loading...
【混合检索 + 重排序 Top-5】
CodeBlock Loading...
================
省略
================================================================================🔍 查询: 红楼梦的主题思想
CodeBlock Loading...
【混合检索 + 重排序 Top-5】
CodeBlock Loading...
================
Step 3: 检索质量评估
CodeBlock Loading...
实验三:上下文窗口与成本控制 (Context Window Management)
实验目标
解决长文档处理和API调用成本控制问题,实现高效的生产级RAG系统。
理论基础
1. 上下文窗口管理问题
挑战:
- LLM上下文窗口有限
- API调用成本随token数线性增长
- 检索内容过多会稀释相关信息
解决方案:
多轮检索 → 动态选择 → 上下文压缩 → 成本控制
2. 成本模型
总成本 = (Prompt Tokens + Context Tokens + Output Tokens) × 单Token价格
实验步骤
Step 1: 实现动态上下文选择
CodeBlock Loading...
🔄 正在生成语义向量索引...
✅ 语义索引构建完成: 2 个文档块================
查询: Anthropic的融资和估值是多少?
📊 上下文统计:
选择chunk数: 1
总Token数: 3722
压缩比: 2.00x
多样性得分: 1.000📄 选择的上下文:
[1] Anthropic 与 Claude:人工智能安全与大模型演进深度报告 版本日期:2024年...================
查询: Claude 3.5有什么新功能?
省略Step 2: 实现成本跟踪与预算控制
CodeBlock Loading...
调用 deepseek-chat: $0.0004
调用 gpt-3.5-turbo: $0.0030
调用 deepseek-coder: $0.0004
调用 gpt-4: $0.0900
调用 claude-3: $0.0675💡 查询成本估算: $0.0006
Token分解: {'prompt': 50, 'query': 6, 'context': 4325, 'output': 100}============
📊 API调用成本报告
💰 总支出: $0.1613
💰 预算限制: $1.00
💰 预算使用率: 16.1%📞 总调用次数: 5
📈 模型使用统计:
gpt-4: 1次, $0.0900
claude-3: 1次, $0.0675
gpt-3.5-turbo: 1次, $0.0030
deepseek-chat: 1次, $0.0004
deepseek-coder: 1次, $0.0004📅 每日支出:
2025-12-08: $0.1613✅ 成本分析图已保存为 cost_analysis.png
实验四:实战项目 - 智能投后报告分析助手
项目背景
场景:投资机构需要分析被投企业的财报和投后报告,回答如"对比A公司和B公司的营收增长率"等复杂问题。
挑战:
- 非结构化PDF文档(财报、报告)
- 跨文档查询
- 需要数值计算和对比分析
- 多格式数据(表格、文本、图片)
项目实现
Step 1: 文档解析与预处理
CodeBlock Loading...
Step 2: 构建多模态RAG系统
CodeBlock Loading...
CodeBlock Loading...
省略
建议: 手动查看检索到的文档以获取详细数据