# Ragflow-Plus RAG 引擎与搜索教程
本文档涵盖了为 Ragflow-Plus 的知识检索功能提供支持的混合检索增强生成(RAG)引擎和搜索系统。系统结合全文搜索和向量相似度搜索,为聊天交互和知识库查询提供准确、上下文相关的文档检索。
有关文档处理和知识库管理的信息,请参阅 知识库管理系统。有关聊天功能和对话管理,请参阅 对话与对话系统。
1. 架构概述 #
RAG 引擎实现了复杂的混合搜索架构,通过多个分析、检索和排序阶段处理自然语言查询,以提供相关的文档块用于响应生成。
1.1 核心搜索架构 #
RAG 引擎采用分层架构,包含以下主要层次:
┌─────────────────────────────────────────┐
│ 查询处理层 (Query Processing Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ 查询处理 │ │ 词权重 │ │ 分词 │ │
│ │ │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 搜索引擎层 (Search Engine Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ 全文检索 │ │ 向量检索 │ │ 融合 │ │
│ │ │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 存储层 (Storage Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ ES 索引 │ │ 嵌入模型 │ │ 文档 │ │
│ │ │ │ │ │ 存储 │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 排序层 (Ranking Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ 重排序 │ │ 引用插入 │ │ 结果 │ │
│ │ │ │ │ │ 优化 │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘1.2 搜索在对话系统中的集成 #
搜索系统与对话系统紧密集成,提供端到端的检索增强生成流程:
dialog_service.chat()
↙ ↘
Knowledgebase LLMBundle
Service embedding model
↓ ↓
settings.retrievaler.retrieval()
↓
Dealer.search()
↓
Dealer.rerank()
↓
kb_prompt()
↓
LLMBundle chat model
↓
insert_citations()
↓
decorate_answer()2. 查询处理流水线 #
查询处理流水线通过多个分析阶段转换自然语言输入,为全文和向量检索生成优化的搜索表达式。
2.1 文本处理与分词 #
RagTokenizer 类实现了复杂的中英文混合分词系统,支持:
- 中文分词:使用 jieba 进行中文分词
- 英文分词:处理英文单词和短语
- 混合处理:处理中英文混合文本
- 停用词过滤:移除无意义的停用词
- 词干提取:提取词干以提高匹配准确性
2.2 查询增强流水线 #
查询增强流水线通过以下步骤优化查询:
- 词权重计算:使用
term_weight.Dealer.weights()计算查询词的权重 - 同义词扩展:使用
synonym.Dealer.lookup()查找同义词 - 分词处理:使用
RagTokenizer.tokenize()进行分词 - 查询构建:生成优化的搜索表达式
2.3 查询处理流程 #
FulltextQueryer.question()
↙ ↘ ↘
term_weight synonym.Dealer RagTokenizer
Dealer.weights() .lookup() .tokenize()
↓ ↓ ↓
search.Dealer.search()
↙ ↘ ↘
MatchTextExpr MatchDenseExpr FusionExpr
↓ ↓ ↓
DocStoreConnection.search()
↓
Elasticsearch indices3. 混合搜索实现 #
系统实现了混合搜索,结合全文搜索和向量相似度搜索,以提供最佳的检索结果。
3.1 搜索表达式类型 #
系统支持三种主要的搜索表达式类型:
| 表达式类型 | 用途 | 说明 |
|---|---|---|
| MatchTextExpr | 全文检索 | 基于关键词的文本匹配 |
| MatchDenseExpr | 向量检索 | 基于嵌入向量的相似度搜索 |
| FusionExpr | 混合检索 | 融合全文和向量检索结果 |
3.2 搜索执行流程 #
混合搜索的执行流程包括以下步骤:
- 过滤器构建:从请求参数构建 Elasticsearch 过滤器(
get_filters()) - 查询处理:通过
FulltextQueryer.question()生成MatchTextExpr - 向量生成:通过
get_vector()使用嵌入模型创建查询向量 - 融合设置:配置
FusionExpr,向量权重 95%,文本权重 5% - 执行:通过
DocStoreConnection.search()运行混合搜索 - 回退:如果没有结果,使用放宽的阈值重试
3.3 字段提升配置 #
系统支持字段提升配置,以提高特定字段的搜索权重:
- 文档名称:
docnm_kwd字段提升 - 标题:
title_tks字段提升 - 内容:
content_with_weight字段提升
3.4 相似度阈值 #
系统使用相似度阈值来控制检索结果的准确性:
- 默认阈值:0.1(可配置)
- 动态调整:根据查询结果动态调整阈值
- 回退机制:如果结果不足,自动降低阈值重试
4. 重排序机制 #
系统使用重排序机制优化检索结果,提高结果的相关性。
4.1 重排序方法 #
系统支持两种重排序方法:
- 基于规则的重排序:使用
search.Dealer.rerank()进行基于规则的重排序 - 基于模型的重排序:使用
search.Dealer.rerank_by_model()进行基于模型的重排序
4.2 重排序流程 #
检索结果 (Search Results)
↓
重排序处理 (Reranking)
↙ ↘
基于规则 基于模型
rerank() rerank_by_model()
↓ ↓
优化后的结果
↓
引用插入 (insert_citations())4.3 重排序参数 #
重排序过程使用以下参数:
- top_k:返回的顶级结果数量
- 相似度阈值:结果的最小相似度
- 权重配置:不同字段的权重设置
5. 结果处理与引用 #
系统对检索结果进行处理,并插入引用信息,以便用户了解答案的来源。
5.1 引用插入 #
系统使用 search.Dealer.insert_citations() 在生成的答案中插入引用:
- 文档引用:引用来源文档
- 位置信息:引用文档中的具体位置
- 页码信息:引用文档的页码
5.2 结果装饰 #
系统使用 decorate_answer() 对答案进行装饰:
- 格式化:格式化答案文本
- 引用标记:添加引用标记
- 元数据:添加文档元数据
6. 性能优化 #
系统采用多种性能优化策略,提高搜索效率。
6.1 优化策略 #
- 缓存机制:缓存常用查询结果
- 并行处理:并行执行多个搜索操作
- 索引优化:优化 Elasticsearch 索引结构
- 查询优化:优化查询表达式
6.2 性能指标 #
系统监控以下性能指标:
- 查询延迟:查询响应时间
- 结果质量:检索结果的相关性
- 吞吐量:单位时间处理的查询数
- 资源使用:CPU、内存使用情况
7. 错误处理与回退 #
系统包含完善的错误处理和回退机制。
7.1 错误类型 #
系统处理以下类型的错误:
- 查询错误:查询语法错误
- 向量生成错误:嵌入向量生成失败
- 存储错误:Elasticsearch 连接失败
- 超时错误:查询超时
7.2 回退策略 #
- 阈值调整:自动降低相似度阈值
- 查询简化:简化查询表达式
- 结果合并:合并多个查询结果
- 错误记录:详细记录错误信息
8. 总结 #
RAG 引擎与搜索系统是 Ragflow-Plus 的核心组件,负责从知识库中检索相关信息并生成回答。通过混合搜索、重排序和引用插入,系统能够提供高质量的知识检索和生成服务。
关键特性:
- 混合搜索:结合全文和向量检索
- 智能查询处理:查询增强和优化
- 重排序机制:提高结果相关性
- 引用支持:提供答案来源信息
- 性能优化:高效的搜索处理
- 错误处理:完善的错误处理和回退机制
有关使用处理后的文档进行检索的详细信息,请参阅 文档处理流水线。