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.智能去重

去重逻辑:

  1. 统计相关性: 计算每个父文档被匹配的子块数量
  2. 按相关性排序: 匹配子块越多的菜谱排名越靠前
  3. 去重输出: 每个菜谱只输出一次完整文档


第三节 索引构建与检索优化

一、核心设计

索引构建模块的核心任务是将文本块转换为向量表示,并构建高效的检索索引。

  • 嵌入模型: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.实际使用示例

  • 列表查询&详细查询示例
  • 交互式问答

三、优化方向

  • 集成图数据库 
  • 融合多模态数据
  • 融合多模态数据
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐