MetaSearch 是一个基于深度迭代检索原理构建的先进检索增强生成 (RAG) 系统。它通过逐步精炼搜索、融合多种检索技术,并利用大语言模型 (LLM) 来提供全面且上下文丰富的答案。
遵循社区标准,学习使用清晰、模块化的架构构建 LLM 项目的最佳实践。
实现前沿的 RAG 算法,通过多轮搜索迭代深入探索信息。
结合向量搜索、关键词搜索 (TF-IDF) 和知识图谱检索,实现更广泛的覆盖。
利用 LLM 动态生成子查询,实现知识探索的广度和深度。
基于新发现信息的比例决定是否继续搜索,优化效率。
利用最大边际相关性 (MMR) 平衡相关性和多样性,提供更全面的结果。
将原始文档分割成带有上下文和摘要的可管理文本块。
构建向量、TF-IDF 和知识图谱索引以实现高效检索。
结合多种检索方法(向量、关键词、图谱)查找相关文档。
使用 LLM 基于检索到的信息生成新的子查询。
协调迭代检索过程并综合生成最终答案。
MetaSearch/
├── config/ # 配置文件 (YAML)
├── data/ # 数据目录 (原始, 处理后, 索引)
│ ├── raw/ # 原始数据
│ ├── processed/ # 处理后的数据
│ └── indexes/ # 索引文件
├── deepsearch/ # 核心库代码
│ ├── indexing/ # 索引逻辑 (向量, tfidf, 图谱)
│ ├── llm/ # LLM 接口封装
│ ├── preprocessing/# 文档解析与分块
│ ├── rag/ # RAG 流水线实现 (标准, 深度)
│ ├── retrieval/ # 检索策略与重排序
│ └── utils/ # 工具函数
├── scripts/ # 辅助脚本 (下载, 处理)
├── app.py # 主应用入口点
├── requirements.txt # 项目依赖
└── README.md # 项目文档
原始文档被解析并分割成重叠的块。每个块存储:
content
: 块的主要文本。chunk_id
: 唯一标识符。parent_content
: 可选的更大上下文块。abstract
: LLM 生成的摘要 (可选)。# 示例配置 (config/config.yaml)
processing:
chunk_size: 512 # 每个块的目标大小
overlap_size: 64 # 连续块之间的重叠大小
generate_abstract: true # 是否生成摘要
多个索引捕获数据的不同方面:
检索模块融合来自已启用索引的结果。
迭代地扩展搜索范围:
核心引擎在一个循环中运行:
# 示例配置 (config/config.yaml)
deepsearch:
max_iterations: 3 # 最大检索循环次数
growth_rate_threshold: 0.1 # 如果发现的新信息少于 10%,则停止
extend_query_num: 3 # 每次迭代的子查询数量
app.py --interactive
) 查看实际效果。app.py
: 理解初始化和主要的 RAG 调用流程。deepsearch/preprocessing/
: 文档是如何加载和分块的?deepsearch/indexing/vector_index.py
: 基本的向量索引创建和搜索。deepsearch/llm/
: 代码如何与 LLM (本地或 API) 交互?deepsearch/rag/standard_rag.py
: 基础的“检索-生成”流水线。deepsearch/rag/deep_rag.py
: 理解迭代循环、IGR 和查询扩展逻辑。deepsearch/retrieval/
: 探索混合检索和 MMR 重排序。deepsearch/indexing/
中不同的索引实现。deepsearch/rag/query_expansion.py
中的查询扩展实现。config/config.yaml
中的参数 (迭代次数、阈值、模型) 并观察变化。MetaSearch 是一个开源教育项目。欢迎各种形式的贡献!
欢迎您的 Forks 和 PR!✨