Datawhale All-in-RAG打卡学习-Task 05
运行 python main.py输入用户问题,报错 → 那是没有在kimi充值的原因!
Task 05
第八章 项目实战一(基础篇)
第一节 环境配置与项目架构
一、环境配置
按步骤进行环境配置:
1.创建虚拟环境 → 2.安装核心依赖 → 3.申请Kimi APIKey → 4.API配置
运行 python main.py
输入用户问题,报错 → 那是没有在kimi充值的原因!
二、项目架构
"小块检索,大块生成"
边幅较长,此处省略
三、整体架构
code/C8/
├── config.py # 配置管理
├── main.py # 主程序入口
├── requirements.txt # 依赖列表
├── rag_modules/ # 核心模块
│ ├── __init__.py
│ ├── data_preparation.py # 数据准备模块
│ ├── index_construction.py # 索引构建模块
│ ├── retrieval_optimization.py # 检索优化模块
│ └── generation_integration.py # 生成集成模块
└── vector_index/ # 向量索引缓存(自动生成)
第二节 数据准备模块实现
数据准备模块的核心是实现"小块检索,大块生成"的父子文本块架构。
一、核心设计
基本流程:
- 检索阶段:使用小的子块进行精确匹配,提高检索准确性
- 生成阶段:传递完整的父文档给LLM,确保上下文完整性
- 智能去重:当检索到同一道菜的多个子块时,合并为一个完整菜谱
元数据增强:
- 菜品分类:从文件路径推断(荤菜、素菜、汤品等)
- 难度等级:从内容中的星级标记提取
- 菜品名称:从文件名提取
- 文档关系:建立父子文档的ID映射关系
二、模块实现详解
1.类结构设计
class DataPreparationModule:
"""数据准备模块 - 负责数据加载、清洗和预处理"""
2.文档加载实现
- 批量加载Markdown文件
- 元数据增强
3.Markdown结构分块
- 分块策略 →
- markdown标题分割器
4.智能去重
去重逻辑:
- 统计相关性: 计算每个父文档被匹配的子块数量
- 按相关性排序: 匹配子块越多的菜谱排名越靠前
- 去重输出: 每个菜谱只输出一次完整文档
第三节 索引构建与检索优化
一、核心设计
索引构建模块的核心任务是将文本块转换为向量表示,并构建高效的检索索引。
- 嵌入模型:BGE-small-zh-v1.5
- 向量数据库:FAISS
- 如何提高系统启动速度:索引缓存机制(首次构建后会将FAISS索引保存到本地,后续启动时直接加载已有索引),启动时间从几分钟缩短到几秒钟。
混合检索
采用双路检索的方式:向量检索基于语义相似度,擅长理解查询意图;BM25检索基于关键词匹配,擅长精确匹配。为了综合两种检索方式的优势,使用RRF(Reciprocal Rank Fusion)算法来融合检索结果。
二、索引构建详解
1. 类结构设计
class IndexConstructionModule
"""索引构建模块 - 负责向量化和索引构建"""
2. 嵌入模型初始化
"""初始化嵌入模型"""
3. 向量索引构建
使用FAISS作为向量数据库,它的检索速度很快,同时保存了文本内容和元数据信息,支持大规模向量的高效检索。
4. 索引缓存机制
索引缓存的效果很明显:首次运行时构建索引需要几分钟,但后续运行时加载索引只需几秒钟。索引文件通常只有几十MB,存储效率很高。
三、检索优化模块
1.类结构设计
class RetrievalOptimizationModule:
"""检索优化模块 - 负责混合检索和过滤"""
2.检索器设置
def setup_retrievers(self)
"""设置向量检索器和BM25检索器"""
3.RRF混合检索
def hybrid_search(self, query: str, top_k: int = 3) -> List[Document]:
"""混合检索 - 结合向量检索和BM25检索,使用RRF重排"""
# 分别获取向量检索和BM25检索结果
4.元数据过滤检索
def metadata_filtered_search(self, query: str, filters: Dict[str, Any], top_k: int = 5) -> List[Document]:
"""基于元数据过滤的检索"""
过滤检索应用场景:
- 用户询问"推荐几道素菜"时,可以按菜品分类过滤,只检索素菜相关的内容
- 新手用户问"有什么简单的菜谱"时,可以按难度等级过滤,只返回标记为"简单"的菜谱
- 想做汤品时询问"今天喝什么汤",可以按分类过滤出所有汤品菜谱
第四节 生成集成与系统整合
一、生成集成模块
1 设计思路
智能查询路由、查询重写优化、多模式生成
2 类结构设计
class GenerationIntegrationModule
"""生成集成模块 - 负责LLM集成和回答生成"""
3 查询路由实现
def query_router(self, query: str) -> str
"""查询路由 - 根据查询类型选择不同的处理方式"""
查询路由是整个系统的关键,决定了后续的处理流程。通过LLM自动判断查询意图,比简单的关键词匹配更准确。
4 查询重写优化
def query_rewrite(self, query: str) -> str
查询重写能够将模糊的用户输入转换为更适合检索的查询,显著提升系统的实用性。重写规则包括:保持原意不变、增加相关烹饪术语、优先推荐简单易做的菜品。 """智能查询重写 - 让大模型判断是否需要重写查询"""
5 多模式生成
- 列表模型
- 详细模式
二、系统整合
主程序负责协调各个模块,实现完整的RAG流程:数据准备 → 索引构建 → 检索优化 → 生成集成。同时提供了索引缓存、交互式问答等实用功能。
main.py
1.主系统类设计
class RecipeRAGSystem
"""食谱RAG系统主类"""
主系统类负责协调所有模块,确保系统的完整性和一致性。
2.系统初始化流程
def initialize_system(self)
"""初始化所有模块"""
初始化过程按照依赖关系有序进行,保证每个模块都能正确设置。
3.知识库构建流程
def build_knowledge_base(self)
"""构建知识库"""
这个流程运用了之前设计的索引缓存机制,能够大幅提升系统启动速度。
4.智能问答流程
def ask_question(self, question: str, stream: bool = False):
"""回答用户问题"""
这部分展示了程序执行流程:智能路由 → 查询优化 → 混合检索 → 父子文档处理 → 多模式生成。
5.实际使用示例
- 列表查询&详细查询示例
- 交互式问答
三、优化方向
- 集成图数据库
- 融合多模态数据
- 融合多模态数据
更多推荐
所有评论(0)