RagFlow Retriever
上面我们介绍了 ragflow 检索的 query 模块,这一节我们来介绍 search 的具体实现。
6. search
search 代码比较长,我们分成几个部分讲解:
- 初始化和工具方法
- search
- insert_citations
- rerank
- retrieval
- tag 接口
下面是每个方法的作用和入参说明:
get_vector
作用:将输入文本转成向量,构造并返回向量检索表达式。
- txt:查询文本。
- emb_mdl:embedding 模型,用于生成向量。
- topk:返回的候选数量。
- similarity:相似度阈值。
get_filters
作用:从请求字典中提取过滤条件(如知识库 ID、文档 ID 等)。
- req:查询请求字典。
trans2floats
作用:将字符串(\t
分隔的数值)转换为 float 数组。
- txt:用
\t
分隔的数值字符串。
hybrid_similarity
作用:计算 token 相似度 + 向量相似度的混合得分。
- ans_embd:答案向量。
- ins_embd:候选向量。
- ans:答案文本。
- inst:候选文本。
search
作用:执行搜索(支持关键字 + 向量混合检索),返回 SearchResult
。
- req:请求字典,描述查询需求。
- idx_names:索引名或索引名列表。
- kb_ids:知识库 ID 列表。
- emb_mdl:embedding 模型(可选,用于向量检索)。
- highlight:是否对匹配部分高亮。
- rank_feature:排序特征(如 PageRank、标签权重)。
insert_citations
作用:在回答中插入文档引用标记(如 [ID:x]
),生成带引用的回答。
- answer:模型生成的回答文本。
- chunks:候选文档块。
- chunk_v:候选文档块向量。
- embd_mdl:embedding 模型。
- tkweight:token 相似度权重。
- vtweight:向量相似度权重。
_rank_feature_scores
作用:计算搜索结果的 rank 特征得分(如 PageRank、标签分数)。
- query_rfea:查询的 rank 特征。
- search_res:搜索结果。
rerank
作用:使用混合相似度(向量 + token + rank feature)对搜索结果进行重排。
- sres:搜索结果。
- query:查询文本。
- tkweight:token 相似度权重。
- vtweight:向量相似度权重。
- cfield:文档内容字段。
- rank_feature:排序特征。
rerank_by_model
作用:调用外部重排模型(如 CrossEncoder)对搜索结果重新排序。
- rerank_mdl:重排模型。
- sres:搜索结果。
- query:查询文本。
- cfield:文档内容字段。
retrieval
作用:核心检索接口,执行文档召回 + (可选)重排,返回分页后的文档 chunks。
- question:用户查询问题。
- embd_mdl:embedding 模型。
- tenant_ids:租户 ID 列表。
- kb_ids:知识库 ID 列表。
- page:页码。
- page_size:分页大小。
- similarity_threshold:相似度阈值。
- vector_similarity_weight:向量相似度权重。
- top:召回数量。
- doc_ids:指定过滤的文档 ID。
- aggs:是否进行聚合。
- rerank_mdl:重排模型(可选)。
- highlight:是否高亮。
- rank_feature:排序特征。
sql_retrieval
作用:通过 SQL 接口直接查询底层数据存储。
- sql:SQL 语句。
- fetch_size:批量返回大小。
- format:结果格式。
chunk_list
作用:获取某个文档的所有切分块(支持分页)。
- doc_id:文档 ID。
- tenant_id:租户 ID。
- kb_ids:知识库 ID 列表。
- max_count:最大返回数量。
- offset:偏移量。
- fields:返回字段。
all_tags
作用:获取所有标签(tag_kwd)的聚合。
- tenant_id:租户 ID。
- kb_ids:知识库列表。
- S:平滑参数。
all_tags_in_portion
作用:获取标签的概率分布(带平滑因子)。
- tenant_id:租户 ID。
- kb_ids:知识库列表。
- S:平滑参数。
tag_content
作用:根据文档内容自动打标签,并写入 TAG_FLD
。
- tenant_id:租户 ID。
- kb_ids:知识库列表。
- doc:文档对象。
- all_tags:全局标签分布。
- topn_tags:取多少标签。
- keywords_topn:关键词数量。
- S:平滑参数。
tag_query
作用:给查询打标签,返回 query 的标签特征。
- question:用户查询。
- tenant_ids:租户 ID 列表。
- kb_ids:知识库 ID 列表。
- all_tags:全局标签分布。
- topn_tags:取多少标签。
- S:平滑参数。
6.1 工具函数
|
|
6.2 search
作用:执行搜索(支持关键字 + 向量混合检索),返回 SearchResult
。
- req:请求字典,描述查询需求。
- idx_names:索引名或索引名列表。
- kb_ids:知识库 ID 列表。
- emb_mdl:embedding 模型(可选,用于向量检索)。
- highlight:是否对匹配部分高亮。
- rank_feature:排序特征(如 PageRank、标签权重)。
在 search 的查询实现中,最终会生成三个查询表达式: matchExprs = [matchText, matchDense, fusionExpr]
matchText, keywords = self.qryr.question(qst, min_match=0.3)
全文索引实现关键词匹配matchDense = self.get_vector(qst, emb_mdl, topk, req.get("similarity", 0.1))
向量查询fusionExpr = self.get_fusion_expr(matchText, matchDense, rank_feature)
设定融合策略
|
|
search 总共调用了 self.dataStore 的六个方法:
search()
: 核心检索方法,用于执行过滤条件 + 匹配表达式 + 排序 + 分页的查询。getTotal()
: 用于获取检索结果的总条数(总命中数)。getChunkIds()
: 从检索结果中提取文档或数据块的唯一 ID 列表。getHighlight()
: 根据关键词和文本字段生成高亮信息,用于前端展示。getAggregation()
: 对指定字段(如docnm_kwd
)做聚合统计,返回分面信息。getFields()
: 获取最终结果中实际返回的字段数据。
6.3 insert_citations
insert_citations 在回答中插入文档引用标记(如 [ID:x]
),生成带引用的回答。
- answer:模型生成的回答文本。
- chunks:候选文档块。
- chunk_v:候选文档块向量。
- embd_mdl:embedding 模型。
- tkweight:token 相似度权重。
- vtweight:向量相似度权重。
|
|
6.4 rerank
作用:使用混合相似度(向量 + token + rank feature)对搜索结果进行重排。
- sres:搜索结果。
- query:查询文本。
- tkweight:token 相似度权重。
- vtweight:向量相似度权重。
- cfield:文档内容字段。
- rank_feature:排序特征。
|
|
6.5 retrieval
|
|
6.6 tag 接口
|
|