Ragflow源码挖掘
highlightFields = ["content_ltks", "title_tks"] if highlight else [] # hig hlight什么功能?def search(self, req, idx_names: str | list[str], # idx_names是什么?ranks = {"total": 0, "chunks": [], "doc_aggs": {}
目录
(1)带权重的关键词匹配(核心功能是elasticsearch boost查询)
(2)向量匹配(核心算法是elasticsearch knn检索)
2.1 借用当前针对github代码解析的大模型进行总结概括
2.2.2 api/apps/conversation_app.py:completion()(API端点)
2.2.3 api/db/services/dialog_service.py:chat()(服务层)
2.2.4 rag/nlp/search.py:Dealer.retrieval()
2.2.5 rag/nlp/search.py:Dealer.search()
2.2.6.1 rag/nlp/search.py:Dealer.rerank()
2.2.6.2 rag/nlp/search.py:Dealer.rerank_by_model()
2.2.7 rag/nlp/query.py:question()<——self.qryr.question
1. 框架学习
1.1 功能支持
多种数据文档类型、多种切分方式
1.2 召回(2路召回)
(1)带权重的关键词匹配(核心功能是elasticsearch boost查询)
elasticsearch boost查询:人为放大或缩小某些词的相关性得分。用boost在查询里“显式拉分”,用 function_score把业务因子“算进得分”,两者组合即可精细化控制 Elasticsearch 的排序结果。
- 查询级 boost(最简单)
在 match / term / bool 等查询里直接加boost 数值,大于 1 表示“加分”,小于 1 “降权”。
- function_score 精细 boost(高级场景)
当单纯倍数调整不够时,用 function_score把业务字段(销量、评分、距离、时间衰减等)变成额外得分因子。eg:把销量对数化后乘以原得分,并用高斯衰减让远离 300 元价格区间的文档降分
(2)向量匹配(核心算法是elasticsearch knn检索)
elasticsearch knn检索:核心思想是 分层,逐层定位,到底层贪婪搜索beam search。 建立图索引,降低耗时,在设置索引时,设置"knn": true。
牺牲 1%-5% 精度,换来 100-1000× 速度提升。
近似 k-NN(HNSW)与精确 k-NN(暴力)对比:
|
维度 |
近似 k-NN(HNSW) |
精确 k-NN(暴力) |
|
算法 |
HNSW(分层可导航小世界图) |
线性扫描所有向量 |
|
速度 |
毫秒级(索引后) |
随数据量线性增长,秒~分钟 |
|
召回率 |
>95%(可调) |
100% |
|
资源 |
需额外内存存储图索引 |
仅原始向量即可 |
|
适用场景 |
百万~十亿向量、实时检索 |
数据量小或离线验证 |
|
ES 开启方式 |
建索引时 "knn": true + dense_vector 索引 |
查询里用 script_score 或 knn: false |
|
可调参数 |
ef_search、ef_construction、M |
无 |
|
参数 |
位置 |
建议值 |
作用 |
|
ef_search |
index settings |
100-200 |
查询时遍历节点,越高越准越慢 |
|
ef_construction |
index settings |
200-400 |
构建时遍历节点,越高索引越慢、召回越高 |
|
M |
index settings |
16-64 |
每个节点最大邻居数,越大内存/精度↑ |
|
num_candidates |
查询 |
1.5-2×k |
候选集大小 |
1.3 排序
关键词相似度与向量匹配相似度加权
(1)关键词相似度
(2)向量匹配相似度
专门的排序模型,输入是关键词序列,不是原始文本内容
2. 源码阅读
2.1 借用当前针对github代码解析的大模型进行总结概括
可以直接提问,还挺好用的: https://deepwiki.com/infiniflow/ragflow/2-system-architecture
2.2 回溯看源码
2.2.1 api/ragflow_server.py(系统启动,主进程)
|
Python |
api/apps/init.py(Flask应用,路由注册)):实例化web应用程序(配置)、用户认证
2.2.2 api/apps/conversation_app.py:completion()(API端点)
|
Python |
|
Python |
2.2.3 api/db/services/dialog_service.py:chat()(服务层)
|
Python |
|
Python |
settings.py:
|
Python |
|
Python |
2.2.4 rag/nlp/search.py:Dealer.retrieval()
|
Python |
retrieval()方法实现步骤:
- 初始化返回结果:创建一个字典 ranks,用于存储检索结果。
- 检查问题是否为空:如果问题为空,直接返回空结果。
- 计算重新排序的限制:根据 page_size 计算重新排序的限制 RERANK_LIMIT。
- 构建检索请求:创建一个包含检索参数的请求字典 req。
- 处理租户ID:如果 tenant_ids 是字符串,则将其转换为列表。
- 执行检索:调用 search 方法执行检索操作,获取检索结果 sres。
- 重新排序:如果提供了重新排序模型 rerank_mdl,则使用该模型进行重新排序;否则,使用默认的重新排序方法。
- 分页处理:根据 page 和 page_size 对检索结果进行分页处理。
- 过滤相似度:根据相似度阈值过滤结果。
- 构建返回结果:将过滤后的结果构建成最终返回的字典 ranks。
- 返回结果:返回检索结果 ranks。
2.2.5 rag/nlp/search.py:Dealer.search()
|
Python |
search()实现步骤:
- 获取过滤条件:通过 self.get_filters(req) 获取过滤条件。
- 设置排序表达式:通过 OrderByExpr() 创建排序表达式。
- 解析请求参数:从请求对象 req 中解析出页码、每页大小、查询问题等参数。
- 设置查询源:定义查询源字段列表 src。
- 处理查询问题:根据查询问题 qst,生成查询向量 q_vec 和匹配表达式 matchExprs。
- 执行搜索:根据查询向量、匹配表达式和过滤条件,通过 self.dataStore.search 方法执行搜索。
- 处理搜索结果:获取搜索结果的总数、文档ID、高亮信息、聚合信息等。
- 返回搜索结果:将搜索结果封装成 SearchResult 对象并返回。
2.2.6 rerank
2.2.6.1 rag/nlp/search.py:Dealer.rerank()
|
Python |
2.2.6.2 rag/nlp/search.py:Dealer.rerank_by_model()
|
Python |
2.2.7 rag/nlp/query.py:question()<——self.qryr.question
未完待续...
3. ragflow网站
|
shell |
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)