FastGPT 源码:混合检索调用链路

ops/2025/3/6 10:02:44/

文章目录

    • FastGPT 源码:混合检索调用链路
      • 1. 入口函数
      • 2. 核心搜索函数
      • 3. RRF合并函数
      • 4. Rerank重排序函数
      • 5. 完整流程

FastGPT 源码:混合检索调用链路

主要调用链路如下:

1. 入口函数

dispatchDatasetSearch(packages/service/core/workflow/dispatch/dataset/search.ts):

export async function dispatchDatasetSearch(props: DatasetSearchProps) {// 1. 获取参数const {teamId,histories,module,params: {datasets,similarity,limit,usingReRank,searchMode,userChatInput}} = props;// 2. 问题优化/扩展const { concatQueries, rewriteQuery } = await datasetSearchQueryExtension({query: userChatInput,extensionModel,extensionBg,histories});// 3. 调用核心搜索函数const { searchRes } = await searchDatasetData({teamId,reRankQuery: rewriteQuery,queries: concatQueries,model: vectorModel.model,similarity,limit,datasetIds: datasets.map((item) => item.datasetId),searchMode,usingReRank});
}

2. 核心搜索函数

searchDatasetData(packages/service/core/dataset/search/controller.ts):

export async function searchDatasetData({teamId,reRankQuery,queries,model,similarity,limit,searchMode,usingReRank,datasetIds
}) {// 1. 向量检索和全文检索const { embeddingRecallResults, fullTextRecallResults } = await multiQueryRecall({embeddingLimit,fullTextLimit});// 2. 第一次RRF合并(向量检索和全文检索结果)const concatRecallResults = embeddingRecallResults.concat(fullTextRecallResults.filter((item) => !set.has(item.id)));// 3. Rerank二次排序const reRankResults = await reRankSearchResult({query: reRankQuery,data: concatRecallResults });// 4. 最终RRF合并(三种结果)const rrfConcatResults = datasetSearchResultConcat([{ k: 60, list: embeddingRecallResults },{ k: 60, list: fullTextRecallResults },{ k: 58, list: reRankResults }]);// 5. 结果过滤和处理const scoreFilter = filterResults(rrfConcatResults);return { searchRes: filterResultsByMaxTokens(scoreFilter, maxTokens) };
}

3. RRF合并函数

datasetSearchResultConcat(packages/global/core/dataset/search/utils.ts):

export const datasetSearchResultConcat = (arr: { k: number; list: SearchDataResponseItemType[] }[]) => {// 1. 计算每个结果的RRF分数arr.forEach((item) => {const k = item.k;item.list.forEach((data, index) => {const rank = index + 1;const score = 1 / (k + rank);// 合并分数...});});// 2. 根据RRF分数排序return results.sort((a, b) => b.rrfScore - a.rrfScore);
}

4. Rerank重排序函数

reRankRecall(packages/service/core/ai/rerank/index.ts):

export function reRankRecall({query, documents}) {// 调用重排序模型APIreturn POST(model.requestUrl, {model: model.model,query,documents: documents.map((doc) => doc.text)}).then(data => {// 返回重排序结果和分数return data?.results?.map(item => ({id: documents[item.index].id,score: item.relevance_score}));});
}

5. 完整流程

  1. dispatchDatasetSearch 作为入口,接收搜索参数
  2. 调用 searchDatasetData 执行核心搜索逻辑
  3. searchDatasetData 中:
    • 先执行向量检索和全文检索
    • 合并这两种检索结果
    • 调用 reRankRecall 进行重排序
    • 最后通过 datasetSearchResultConcat 合并所有结果
  4. 返回最终过滤和处理后的搜索结果

这个调用链路完整实现了:

  • Embedding 和 BM25 检索
  • 结果合并后的 Rerank
  • 最终三路结果的 RRF 合并

http://www.ppmy.cn/ops/163570.html

相关文章

Mac OS升级后变慢了,如何恢复老系统?

我的一台Mac Air闲置很久了,原因是某次系统升级后用着会卡,有差不多10年没用了。今天想试着恢复一下出厂系统,目前看这条路可以走通。记录如下: 1、去哪里下载旧版系统? https://support.apple.com/zh-cn/102662 2、…

游戏引擎学习第136天

回顾 今天,我们的工作重点是继续探索之前搭建的资产系统,目的是最终定义我们的资产包文件格式。通过这个工作,我们希望能够创建一个符合我们要求的资产包文件。这样,我可以在直播之外的时间完成它,并为我们提供一个符…

JAVA入门——网络编程简介

自己学习时的笔记,可能有点水( 以后可能还会补充(大概率不会) 一、基本概念 网络编程三要素: IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数,0~1023用于知名的网络…

基于 Kubernetes 搭建 DevOps 持续集成环境

环境准备 在部署 Kubernetes(K8s)以及相关 DevOps 工具(如 Jenkins、Kuboard、Harbor)时,我们需要确保服务器和软件环境符合要求。 服务器及软件环境 服务器配置:2 核 4G 及以上(推荐至少 2 …

【Vue3】实现一个超过高度后可控制显示隐藏的组件

组件效果图 未达到最大高度 达到设置的最大高度 进行展开 实现代码 组件代码 备注&#xff1a;通过tailwindcss设置的样式&#xff0c;通过element-plus/icons-vue设置的图标&#xff0c;可根据情况进行替换 <template><!-- 限制高度组件 --><div ref"…

smart代理原生住宅IP是如何避免跨境电商店铺被DDoS攻击的?

随着跨境电商的迅猛发展&#xff0c;越来越多的商家开始把业务拓展到国际市场&#xff0c;然而&#xff0c;随之而来的是网络安全问题的威胁&#xff0c;其中最常见的是DDoS攻击。 这种攻击方式会让商家的网站或应用程序停止运作&#xff0c;从而影响销售和声誉。 幸运的是&…

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会&#xff0c;CES Asia 2025&#xff08;第七届亚洲消费电子技术贸易展&#xff09;即将盛大启幕。今年展会规模再度升级&#xff0c;预计将吸引超过500家全球展商参展&#xff0c;专业观众人数有望突破10万。除了聚焦人工智能、物联网、…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…