From 5b3f461ce81b5534e57260f1f362c1c626dfd611 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Fri, 14 Mar 2025 14:49:27 +0800 Subject: [PATCH] feat: rerank modal select and weight (#4164) --- .../zh-cn/docs/development/upgrading/491.md | 1 + .../global/common/system/types/index.d.ts | 4 +- packages/global/core/ai/model.d.ts | 2 +- packages/global/core/app/type.d.ts | 22 +- packages/global/core/app/utils.ts | 14 +- packages/global/core/workflow/constants.ts | 2 + .../workflow/template/system/datasetSearch.ts | 16 ++ packages/service/core/ai/config/utils.ts | 4 +- packages/service/core/ai/model.ts | 2 +- packages/service/core/ai/rerank/index.ts | 4 +- packages/service/core/ai/type.d.ts | 8 +- .../service/core/dataset/search/controller.ts | 27 +- .../core/workflow/dispatch/dataset/search.ts | 13 +- packages/service/type.d.ts | 2 +- .../web/components/common/Icon/constants.ts | 2 + .../icons/core/dataset/questionExtension.svg | 3 + .../Icon/icons/core/dataset/searchfilter.svg | 3 + .../components/common/Tabs/LightRowTabs.tsx | 10 +- packages/web/i18n/en/app.json | 1 + packages/web/i18n/en/common.json | 4 +- packages/web/i18n/zh-CN/app.json | 1 + packages/web/i18n/zh-CN/common.json | 4 +- packages/web/i18n/zh-Hant/app.json | 1 + packages/web/i18n/zh-Hant/common.json | 4 +- projects/app/public/imgs/workflow/cfr.svg | 1 - .../core/app/DatasetParamsModal.tsx | 235 ++++++++++-------- .../app/src/global/common/api/systemRes.d.ts | 2 +- .../account/model/ModelConfigTable.tsx | 4 + .../app/detail/SimpleApp/EditForm.tsx | 4 +- .../app/detail/SimpleApp/index.tsx | 2 - .../templates/SelectDatasetParams.tsx | 9 +- .../app/src/pages/api/core/ai/model/test.ts | 4 +- .../app/src/pages/api/core/ai/model/update.ts | 7 - projects/app/src/types/index.d.ts | 2 +- .../src/web/common/system/useSystemStore.ts | 4 +- projects/app/src/web/core/app/utils.ts | 32 ++- 36 files changed, 282 insertions(+), 178 deletions(-) create mode 100644 packages/web/components/common/Icon/icons/core/dataset/questionExtension.svg create mode 100644 packages/web/components/common/Icon/icons/core/dataset/searchfilter.svg delete mode 100644 projects/app/public/imgs/workflow/cfr.svg diff --git a/docSite/content/zh-cn/docs/development/upgrading/491.md b/docSite/content/zh-cn/docs/development/upgrading/491.md index 312c1654e..9bda4aae6 100644 --- a/docSite/content/zh-cn/docs/development/upgrading/491.md +++ b/docSite/content/zh-cn/docs/development/upgrading/491.md @@ -13,6 +13,7 @@ weight: 799 2. 知识库分块阅读器。 3. API 知识库支持 PDF 增强解析。 4. 邀请团队成员,改为邀请链接模式。 +5. 支持重排模型选择和权重设置,同时调整了知识库搜索权重计算方式,改成 搜索权重 + 重排权重,而不是向量检索权重+全文检索权重+重排权重。 ## ⚙️ 优化 diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index a2b2367c1..403d4380f 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -6,7 +6,7 @@ import type { EmbeddingModelItemType, AudioSpeechModels, STTModelType, - ReRankModelItemType + RerankModelItemType } from '../../../core/ai/model.d'; import { SubTypeEnum } from '../../../support/wallet/sub/constants'; @@ -35,7 +35,7 @@ export type FastGPTConfigFileType = { // Abandon llmModels?: ChatModelItemType[]; vectorModels?: EmbeddingModelItemType[]; - reRankModels?: ReRankModelItemType[]; + reRankModels?: RerankModelItemType[]; audioSpeechModels?: TTSModelType[]; whisperModel?: STTModelType; }; diff --git a/packages/global/core/ai/model.d.ts b/packages/global/core/ai/model.d.ts index 57505a2cc..63de6662a 100644 --- a/packages/global/core/ai/model.d.ts +++ b/packages/global/core/ai/model.d.ts @@ -72,7 +72,7 @@ export type EmbeddingModelItemType = PriceType & queryConfig?: Record; // Custom parameters for query }; -export type ReRankModelItemType = PriceType & +export type RerankModelItemType = PriceType & BaseModelItemType & { type: ModelTypeEnum.rerank; }; diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 1a0a53b85..2552f155b 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -71,6 +71,19 @@ export type AppDetailType = AppSchema & { permission: AppPermission; }; +export type AppDatasetSearchParamsType = { + searchMode: `${DatasetSearchModeEnum}`; + limit?: number; // limit max tokens + similarity?: number; + + usingReRank?: boolean; + rerankModel?: string; + rerankWeight?: number; + + datasetSearchUsingExtensionQuery?: boolean; + datasetSearchExtensionModel?: string; + datasetSearchExtensionBg?: string; +}; export type AppSimpleEditFormType = { // templateId: string; aiSettings: { @@ -88,14 +101,7 @@ export type AppSimpleEditFormType = { }; dataset: { datasets: SelectedDatasetType; - searchMode: `${DatasetSearchModeEnum}`; - similarity?: number; - limit?: number; - usingReRank?: boolean; - datasetSearchUsingExtensionQuery?: boolean; - datasetSearchExtensionModel?: string; - datasetSearchExtensionBg?: string; - }; + } & AppDatasetSearchParamsType; selectedTools: FlowNodeTemplateType[]; chatConfig: AppChatConfigType; }; diff --git a/packages/global/core/app/utils.ts b/packages/global/core/app/utils.ts index 0835dbb59..e20e21067 100644 --- a/packages/global/core/app/utils.ts +++ b/packages/global/core/app/utils.ts @@ -24,9 +24,11 @@ export const getDefaultAppForm = (): AppSimpleEditFormType => { dataset: { datasets: [], similarity: 0.4, - limit: 1500, + limit: 3000, searchMode: DatasetSearchModeEnum.embedding, usingReRank: false, + rerankModel: '', + rerankWeight: 0.5, datasetSearchUsingExtensionQuery: true, datasetSearchExtensionBg: '' }, @@ -106,10 +108,20 @@ export const appWorkflow2Form = ({ defaultAppForm.dataset.searchMode = findInputValueByKey(node.inputs, NodeInputKeyEnum.datasetSearchMode) || DatasetSearchModeEnum.embedding; + // Rerank defaultAppForm.dataset.usingReRank = !!findInputValueByKey( node.inputs, NodeInputKeyEnum.datasetSearchUsingReRank ); + defaultAppForm.dataset.rerankModel = findInputValueByKey( + node.inputs, + NodeInputKeyEnum.datasetSearchRerankModel + ); + defaultAppForm.dataset.rerankWeight = findInputValueByKey( + node.inputs, + NodeInputKeyEnum.datasetSearchRerankWeight + ); + // Query extension defaultAppForm.dataset.datasetSearchUsingExtensionQuery = findInputValueByKey( node.inputs, NodeInputKeyEnum.datasetSearchUsingExtensionQuery diff --git a/packages/global/core/workflow/constants.ts b/packages/global/core/workflow/constants.ts index 9eb9daf2d..3188f6588 100644 --- a/packages/global/core/workflow/constants.ts +++ b/packages/global/core/workflow/constants.ts @@ -155,6 +155,8 @@ export enum NodeInputKeyEnum { datasetMaxTokens = 'limit', datasetSearchMode = 'searchMode', datasetSearchUsingReRank = 'usingReRank', + datasetSearchRerankWeight = 'rerankWeight', + datasetSearchRerankModel = 'rerankModel', datasetSearchUsingExtensionQuery = 'datasetSearchUsingExtensionQuery', datasetSearchExtensionModel = 'datasetSearchExtensionModel', datasetSearchExtensionBg = 'datasetSearchExtensionBg', diff --git a/packages/global/core/workflow/template/system/datasetSearch.ts b/packages/global/core/workflow/template/system/datasetSearch.ts index f869e165f..174d8dda7 100644 --- a/packages/global/core/workflow/template/system/datasetSearch.ts +++ b/packages/global/core/workflow/template/system/datasetSearch.ts @@ -64,6 +64,7 @@ export const DatasetSearchModule: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.string, value: DatasetSearchModeEnum.embedding }, + // Rerank { key: NodeInputKeyEnum.datasetSearchUsingReRank, renderTypeList: [FlowNodeInputTypeEnum.hidden], @@ -71,6 +72,20 @@ export const DatasetSearchModule: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.boolean, value: false }, + { + key: NodeInputKeyEnum.datasetSearchRerankModel, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.string + }, + { + key: NodeInputKeyEnum.datasetSearchRerankWeight, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.number, + value: 0.5 + }, + // Query Extension { key: NodeInputKeyEnum.datasetSearchUsingExtensionQuery, renderTypeList: [FlowNodeInputTypeEnum.hidden], @@ -91,6 +106,7 @@ export const DatasetSearchModule: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.string, value: '' }, + { key: NodeInputKeyEnum.authTmbId, renderTypeList: [FlowNodeInputTypeEnum.hidden], diff --git a/packages/service/core/ai/config/utils.ts b/packages/service/core/ai/config/utils.ts index 86c3786df..e1f8c104f 100644 --- a/packages/service/core/ai/config/utils.ts +++ b/packages/service/core/ai/config/utils.ts @@ -8,7 +8,7 @@ import { EmbeddingModelItemType, TTSModelType, STTModelType, - ReRankModelItemType + RerankModelItemType } from '@fastgpt/global/core/ai/model.d'; import { debounce } from 'lodash'; import { @@ -94,7 +94,7 @@ export const loadSystemModels = async (init = false) => { global.embeddingModelMap = new Map(); global.ttsModelMap = new Map(); global.sttModelMap = new Map(); - global.reRankModelMap = new Map(); + global.reRankModelMap = new Map(); // @ts-ignore global.systemDefaultModel = {}; diff --git a/packages/service/core/ai/model.ts b/packages/service/core/ai/model.ts index 3b0f0aef8..68a8e62cf 100644 --- a/packages/service/core/ai/model.ts +++ b/packages/service/core/ai/model.ts @@ -38,7 +38,7 @@ export function getSTTModel(model?: string) { } export const getDefaultRerankModel = () => global?.systemDefaultModel.rerank!; -export function getReRankModel(model?: string) { +export function getRerankModel(model?: string) { if (!model) return getDefaultRerankModel(); return global.reRankModelMap.get(model) || getDefaultRerankModel(); } diff --git a/packages/service/core/ai/rerank/index.ts b/packages/service/core/ai/rerank/index.ts index 5a440284c..2811f7086 100644 --- a/packages/service/core/ai/rerank/index.ts +++ b/packages/service/core/ai/rerank/index.ts @@ -2,7 +2,7 @@ import { addLog } from '../../../common/system/log'; import { POST } from '../../../common/api/serverRequest'; import { getDefaultRerankModel } from '../model'; import { getAxiosConfig } from '../config'; -import { ReRankModelItemType } from '@fastgpt/global/core/ai/model.d'; +import { RerankModelItemType } from '@fastgpt/global/core/ai/model.d'; type PostReRankResponse = { id: string; @@ -19,7 +19,7 @@ export function reRankRecall({ documents, headers }: { - model?: ReRankModelItemType; + model?: RerankModelItemType; query: string; documents: { id: string; text: string }[]; headers?: Record; diff --git a/packages/service/core/ai/type.d.ts b/packages/service/core/ai/type.d.ts index 11ab4a50a..02c477e69 100644 --- a/packages/service/core/ai/type.d.ts +++ b/packages/service/core/ai/type.d.ts @@ -1,7 +1,7 @@ import { ModelTypeEnum } from '@fastgpt/global/core/ai/model'; import { STTModelType, - ReRankModelItemType, + RerankModelItemType, TTSModelType, EmbeddingModelItemType, LLMModelItemType @@ -18,7 +18,7 @@ export type SystemModelItemType = | EmbeddingModelItemType | TTSModelType | STTModelType - | ReRankModelItemType; + | RerankModelItemType; export type SystemDefaultModelType = { [ModelTypeEnum.llm]?: LLMModelItemType; @@ -28,7 +28,7 @@ export type SystemDefaultModelType = { [ModelTypeEnum.embedding]?: EmbeddingModelItemType; [ModelTypeEnum.tts]?: TTSModelType; [ModelTypeEnum.stt]?: STTModelType; - [ModelTypeEnum.rerank]?: ReRankModelItemType; + [ModelTypeEnum.rerank]?: RerankModelItemType; }; declare global { @@ -38,7 +38,7 @@ declare global { var embeddingModelMap: Map; var ttsModelMap: Map; var sttModelMap: Map; - var reRankModelMap: Map; + var reRankModelMap: Map; var systemActiveModelList: SystemModelItemType[]; var systemDefaultModel: SystemDefaultModelType; diff --git a/packages/service/core/dataset/search/controller.ts b/packages/service/core/dataset/search/controller.ts index 87350f25d..4fd96733e 100644 --- a/packages/service/core/dataset/search/controller.ts +++ b/packages/service/core/dataset/search/controller.ts @@ -27,6 +27,7 @@ import { ChatItemType } from '@fastgpt/global/core/chat/type'; import { POST } from '../../../common/api/plusRequest'; import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { datasetSearchQueryExtension } from './utils'; +import type { RerankModelItemType } from '@fastgpt/global/core/ai/model.d'; export type SearchDatasetDataProps = { histories: ChatItemType[]; @@ -39,7 +40,10 @@ export type SearchDatasetDataProps = { [NodeInputKeyEnum.datasetSimilarity]?: number; // min distance [NodeInputKeyEnum.datasetMaxTokens]: number; // max Token limit [NodeInputKeyEnum.datasetSearchMode]?: `${DatasetSearchModeEnum}`; + [NodeInputKeyEnum.datasetSearchUsingReRank]?: boolean; + [NodeInputKeyEnum.datasetSearchRerankModel]?: RerankModelItemType; + [NodeInputKeyEnum.datasetSearchRerankWeight]?: number; /* { @@ -75,13 +79,16 @@ export type SearchDatasetDataResponse = { }; export const datasetDataReRank = async ({ + rerankModel, data, query }: { + rerankModel?: RerankModelItemType; data: SearchDataResponseItemType[]; query: string; }): Promise => { const results = await reRankRecall({ + model: rerankModel, query, documents: data.map((item) => ({ id: item.id, @@ -155,6 +162,8 @@ export async function searchDatasetData( limit: maxTokens, searchMode = DatasetSearchModeEnum.embedding, usingReRank = false, + rerankModel, + rerankWeight = 0.5, datasetIds = [], collectionFilterMatch } = props; @@ -711,6 +720,7 @@ export async function searchDatasetData( }); try { return await datasetDataReRank({ + rerankModel, query: reRankQuery, data: filterSameDataResults }); @@ -721,11 +731,22 @@ export async function searchDatasetData( })(); // embedding recall and fullText recall rrf concat - const rrfConcatResults = datasetSearchResultConcat([ + const rrfSearchResult = datasetSearchResultConcat([ { k: 60, list: embeddingRecallResults }, - { k: 60, list: fullTextRecallResults }, - { k: 58, list: reRankResults } + { k: 60, list: fullTextRecallResults } ]); + const rrfConcatResults = (() => { + if (rerankWeight === 1) return reRankResults; + + const baseK = 30; + const searchK = Math.round(baseK / (1 - rerankWeight)); // 搜索结果的 k 值 + const rerankK = Math.round(baseK / rerankWeight); // rerank 结果的 k 值 + + return datasetSearchResultConcat([ + { k: searchK, list: rrfSearchResult }, + { k: rerankK, list: reRankResults } + ]); + })(); // remove same q and a data set = new Set(); diff --git a/packages/service/core/workflow/dispatch/dataset/search.ts b/packages/service/core/workflow/dispatch/dataset/search.ts index 62338fc6f..754ef918c 100644 --- a/packages/service/core/workflow/dispatch/dataset/search.ts +++ b/packages/service/core/workflow/dispatch/dataset/search.ts @@ -6,7 +6,7 @@ import { formatModelChars2Points } from '../../../../support/wallet/usage/utils' import type { SelectedDatasetType } from '@fastgpt/global/core/workflow/api.d'; import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import type { ModuleDispatchProps } from '@fastgpt/global/core/workflow/runtime/type'; -import { getEmbeddingModel } from '../../../ai/model'; +import { getEmbeddingModel, getRerankModel } from '../../../ai/model'; import { deepRagSearch, defaultSearchDatasetData } from '../../../dataset/search/controller'; import { NodeInputKeyEnum, NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants'; @@ -24,7 +24,11 @@ type DatasetSearchProps = ModuleDispatchProps<{ [NodeInputKeyEnum.datasetMaxTokens]: number; [NodeInputKeyEnum.datasetSearchMode]: `${DatasetSearchModeEnum}`; [NodeInputKeyEnum.userChatInput]?: string; + [NodeInputKeyEnum.datasetSearchUsingReRank]: boolean; + [NodeInputKeyEnum.datasetSearchRerankModel]?: string; + [NodeInputKeyEnum.datasetSearchRerankWeight]?: number; + [NodeInputKeyEnum.collectionFilterMatch]: string; [NodeInputKeyEnum.authTmbId]?: boolean; @@ -53,12 +57,15 @@ export async function dispatchDatasetSearch( datasets = [], similarity, limit = 1500, - usingReRank, searchMode, userChatInput = '', authTmbId = false, collectionFilterMatch, + usingReRank, + rerankModel, + rerankWeight, + datasetSearchUsingExtensionQuery, datasetSearchExtensionModel, datasetSearchExtensionBg, @@ -123,6 +130,8 @@ export async function dispatchDatasetSearch( datasetIds, searchMode, usingReRank: usingReRank && (await checkTeamReRankPermission(teamId)), + rerankModel: getRerankModel(rerankModel), + rerankWeight, collectionFilterMatch }; const { diff --git a/packages/service/type.d.ts b/packages/service/type.d.ts index d2aa22e56..57bfd43ef 100644 --- a/packages/service/type.d.ts +++ b/packages/service/type.d.ts @@ -1,7 +1,7 @@ import { FastGPTFeConfigsType, SystemEnvType } from '@fastgpt/global/common/system/types'; import { TTSModelType, - ReRankModelItemType, + RerankModelItemType, STTModelType, EmbeddingModelItemType, LLMModelItemType diff --git a/packages/web/components/common/Icon/constants.ts b/packages/web/components/common/Icon/constants.ts index 430a26490..aa45a3c07 100644 --- a/packages/web/components/common/Icon/constants.ts +++ b/packages/web/components/common/Icon/constants.ts @@ -212,7 +212,9 @@ export const iconPaths = { 'core/dataset/manualCollection': () => import('./icons/core/dataset/manualCollection.svg'), 'core/dataset/mixedRecall': () => import('./icons/core/dataset/mixedRecall.svg'), 'core/dataset/modeEmbedding': () => import('./icons/core/dataset/modeEmbedding.svg'), + 'core/dataset/questionExtension': () => import('./icons/core/dataset/questionExtension.svg'), 'core/dataset/rerank': () => import('./icons/core/dataset/rerank.svg'), + 'core/dataset/searchfilter': () => import('./icons/core/dataset/searchfilter.svg'), 'core/dataset/splitLight': () => import('./icons/core/dataset/splitLight.svg'), 'core/dataset/tableCollection': () => import('./icons/core/dataset/tableCollection.svg'), 'core/dataset/tag': () => import('./icons/core/dataset/tag.svg'), diff --git a/packages/web/components/common/Icon/icons/core/dataset/questionExtension.svg b/packages/web/components/common/Icon/icons/core/dataset/questionExtension.svg new file mode 100644 index 000000000..328f1c2a8 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/questionExtension.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Icon/icons/core/dataset/searchfilter.svg b/packages/web/components/common/Icon/icons/core/dataset/searchfilter.svg new file mode 100644 index 000000000..46209a234 --- /dev/null +++ b/packages/web/components/common/Icon/icons/core/dataset/searchfilter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/web/components/common/Tabs/LightRowTabs.tsx b/packages/web/components/common/Tabs/LightRowTabs.tsx index 9b517a1c6..450f1a3c8 100644 --- a/packages/web/components/common/Tabs/LightRowTabs.tsx +++ b/packages/web/components/common/Tabs/LightRowTabs.tsx @@ -73,6 +73,11 @@ const LightRowTabs = ({ color: activeColor }} fontWeight={'medium'} + onClick={() => { + if (value === item.value) return; + onChange(item.value); + }} + {...inlineStyles} {...(value === item.value ? { color: activeColor, @@ -82,11 +87,6 @@ const LightRowTabs = ({ : { cursor: 'pointer' })} - onClick={() => { - if (value === item.value) return; - onChange(item.value); - }} - {...inlineStyles} > {item.icon && ( <> diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index cc0bc8f46..f90699c35 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -120,6 +120,7 @@ "publish_success": "Publish Successful", "question_guide_tip": "After the conversation, 3 guiding questions will be generated for you.", "reasoning_response": "Output thinking", + "rerank_weight": "Rearrange weights", "response_format": "Response format", "saved_success": "Saved successfully! \nTo use this version externally, click Save and Publish", "search_app": "Search apps", diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index f8c05ab6b..2d89ab71b 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -107,6 +107,7 @@ "code_error.user_error.balance_not_enough": "Insufficient Account Balance", "code_error.user_error.bin_visitor_guest": "You Are Currently a Guest, Unauthorized to Operate", "code_error.user_error.un_auth_user": "User Not Found", + "commercial_function_tip": "Please Upgrade to the Commercial Version to Use This Feature: https://doc.fastgpt.cn/docs/commercial/intro/", "common.Action": "Action", "common.Add": "Add", "common.Add New": "Add New", @@ -256,7 +257,6 @@ "common.submit_success": "Submitted Successfully", "common.submitted": "Submitted", "common.support": "Support", - "commercial_function_tip": "Please Upgrade to the Commercial Version to Use This Feature: https://doc.fastgpt.cn/docs/commercial/intro/", "common.system.Help Chatbot": "Help Chatbot", "common.system.Use Helper": "Use Helper", "common.ui.textarea.Magnifying": "Magnifying", @@ -627,7 +627,7 @@ "core.dataset.search.score.reRank desc": "Calculate the relevance between sentences using the re-rank model, ranging from 0 to 1.", "core.dataset.search.score.rrf": "Comprehensive Ranking", "core.dataset.search.score.rrf desc": "Merge multiple search results using the reciprocal rank fusion method.", - "core.dataset.search.search mode": "Search Mode", + "core.dataset.search.search mode": "Search Method", "core.dataset.status.active": "Ready", "core.dataset.status.syncing": "Syncing", "core.dataset.test.Batch test": "Batch Test", diff --git a/packages/web/i18n/zh-CN/app.json b/packages/web/i18n/zh-CN/app.json index 75232c3d2..90f5ca3b0 100644 --- a/packages/web/i18n/zh-CN/app.json +++ b/packages/web/i18n/zh-CN/app.json @@ -120,6 +120,7 @@ "publish_success": "发布成功", "question_guide_tip": "对话结束后,会为你生成 3 个引导性问题。", "reasoning_response": "输出思考", + "rerank_weight": "重排权重", "response_format": "回复格式", "saved_success": "保存成功!如需在外部使用该版本,请点击“保存并发布”", "search_app": "搜索应用", diff --git a/packages/web/i18n/zh-CN/common.json b/packages/web/i18n/zh-CN/common.json index d703f612b..1d8e3ebff 100644 --- a/packages/web/i18n/zh-CN/common.json +++ b/packages/web/i18n/zh-CN/common.json @@ -111,6 +111,7 @@ "code_error.user_error.balance_not_enough": "账号余额不足~", "code_error.user_error.bin_visitor_guest": "您当前身份为游客,无权操作", "code_error.user_error.un_auth_user": "找不到该用户", + "commercial_function_tip": "请升级商业版后使用该功能:https://doc.fastgpt.cn/docs/commercial/intro/", "common.Action": "操作", "common.Add": "添加", "common.Add New": "新增", @@ -260,7 +261,6 @@ "common.submit_success": "提交成功", "common.submitted": "已提交", "common.support": "支持", - "commercial_function_tip": "请升级商业版后使用该功能:https://doc.fastgpt.cn/docs/commercial/intro/", "common.system.Help Chatbot": "机器人助手", "common.system.Use Helper": "使用帮助", "common.ui.textarea.Magnifying": "放大", @@ -631,7 +631,7 @@ "core.dataset.search.score.reRank desc": "通过 Rerank 模型计算句子之间的关联度,范围为 0~1。", "core.dataset.search.score.rrf": "综合排名", "core.dataset.search.score.rrf desc": "通过倒排计算的方式,合并多个检索结果。", - "core.dataset.search.search mode": "搜索模式", + "core.dataset.search.search mode": "搜索方式", "core.dataset.status.active": "已就绪", "core.dataset.status.syncing": "同步中", "core.dataset.test.Batch test": "批量测试", diff --git a/packages/web/i18n/zh-Hant/app.json b/packages/web/i18n/zh-Hant/app.json index dfa6bfc7d..475b4955f 100644 --- a/packages/web/i18n/zh-Hant/app.json +++ b/packages/web/i18n/zh-Hant/app.json @@ -120,6 +120,7 @@ "publish_success": "發布成功", "question_guide_tip": "對話結束後,會為你產生 3 個引導性問題。", "reasoning_response": "輸出思考", + "rerank_weight": "重排權重", "response_format": "回复格式", "saved_success": "保存成功!\n如需在外部使用該版本,請點擊“儲存並發布”", "search_app": "搜尋應用程式", diff --git a/packages/web/i18n/zh-Hant/common.json b/packages/web/i18n/zh-Hant/common.json index 65ea94516..1b3fe6a4d 100644 --- a/packages/web/i18n/zh-Hant/common.json +++ b/packages/web/i18n/zh-Hant/common.json @@ -106,6 +106,7 @@ "code_error.user_error.balance_not_enough": "帳戶餘額不足", "code_error.user_error.bin_visitor_guest": "您目前身份為訪客,無權操作", "code_error.user_error.un_auth_user": "找不到此使用者", + "commercial_function_tip": "請升級為商業版後使用此功能:https://doc.fastgpt.cn/docs/commercial/intro/", "common.Action": "操作", "common.Add": "新增", "common.Add New": "新增", @@ -255,7 +256,6 @@ "common.submit_success": "送出成功", "common.submitted": "已送出", "common.support": "支援", - "commercial_function_tip": "請升級為商業版後使用此功能:https://doc.fastgpt.cn/docs/commercial/intro/", "common.system.Help Chatbot": "機器人助手", "common.system.Use Helper": "使用說明", "common.ui.textarea.Magnifying": "放大", @@ -626,7 +626,7 @@ "core.dataset.search.score.reRank desc": "透過重新排名模型計算句子之間的關聯度,範圍為 0 到 1。", "core.dataset.search.score.rrf": "綜合排名", "core.dataset.search.score.rrf desc": "使用倒數排名融合方法,合併多個搜尋結果。", - "core.dataset.search.search mode": "搜尋模式", + "core.dataset.search.search mode": "搜索方式", "core.dataset.status.active": "已就緒", "core.dataset.status.syncing": "同步中", "core.dataset.test.Batch test": "批次測試", diff --git a/projects/app/public/imgs/workflow/cfr.svg b/projects/app/public/imgs/workflow/cfr.svg deleted file mode 100644 index da46b4de6..000000000 --- a/projects/app/public/imgs/workflow/cfr.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/projects/app/src/components/core/app/DatasetParamsModal.tsx b/projects/app/src/components/core/app/DatasetParamsModal.tsx index 08e7f555c..46f9e5c99 100644 --- a/projects/app/src/components/core/app/DatasetParamsModal.tsx +++ b/projects/app/src/components/core/app/DatasetParamsModal.tsx @@ -1,15 +1,5 @@ import React, { useEffect, useMemo, useState } from 'react'; -import { - Box, - Button, - Checkbox, - Divider, - Flex, - ModalBody, - ModalFooter, - Switch, - useTheme -} from '@chakra-ui/react'; +import { Box, Button, Flex, HStack, ModalBody, ModalFooter, Switch } from '@chakra-ui/react'; import { useForm } from 'react-hook-form'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants'; @@ -17,30 +7,17 @@ import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; -import { DatasetSearchModeMap } from '@fastgpt/global/core/dataset/constants'; -import MyRadio from '@/components/common/MyRadio'; -import MyIcon from '@fastgpt/web/components/common/Icon'; import LightRowTabs from '@fastgpt/web/components/common/Tabs/LightRowTabs'; import { useUserStore } from '@/web/support/user/useUserStore'; -import { useToast } from '@fastgpt/web/hooks/useToast'; import SelectAiModel from '@/components/Select/AIModelSelector'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; import MyTextarea from '@/components/common/Textarea/MyTextarea'; import { defaultDatasetMaxTokens } from '@fastgpt/global/core/app/constants'; import InputSlider from '@fastgpt/web/components/common/MySlider/InputSlider'; +import LeftRadio from '@fastgpt/web/components/common/Radio/LeftRadio'; +import { AppDatasetSearchParamsType } from '@fastgpt/global/core/app/type'; -export type DatasetParamsProps = { - searchMode: `${DatasetSearchModeEnum}`; - limit?: number; - similarity?: number; - usingReRank?: boolean; - datasetSearchUsingExtensionQuery?: boolean; - datasetSearchExtensionModel?: string; - datasetSearchExtensionBg?: string; - - maxTokens?: number; // limit max tokens -}; enum SearchSettingTabEnum { searchMode = 'searchMode', limit = 'limit', @@ -52,16 +29,20 @@ const DatasetParamsModal = ({ limit, similarity, usingReRank, - maxTokens = defaultDatasetMaxTokens, + rerankModel, + rerankWeight, datasetSearchUsingExtensionQuery, datasetSearchExtensionModel, datasetSearchExtensionBg, + maxTokens = defaultDatasetMaxTokens, onClose, onSuccess -}: DatasetParamsProps & { onClose: () => void; onSuccess: (e: DatasetParamsProps) => void }) => { +}: AppDatasetSearchParamsType & { + maxTokens?: number; // limit max tokens + onClose: () => void; + onSuccess: (e: AppDatasetSearchParamsType) => void; +}) => { const { t } = useTranslation(); - const theme = useTheme(); - const { toast } = useToast(); const { teamPlanStatus } = useUserStore(); const { reRankModelList, llmModelList, defaultModels } = useSystemStore(); const [refresh, setRefresh] = useState(false); @@ -72,28 +53,34 @@ const DatasetParamsModal = ({ value: item.model, label: item.name })))(); + const reRankModelSelectList = (() => + reRankModelList.map((item) => ({ + value: item.model, + label: item.name + })))(); - const { register, setValue, getValues, handleSubmit, watch } = useForm({ - defaultValues: { - limit, - similarity, - searchMode, - usingReRank: !!usingReRank && teamPlanStatus?.standardConstants?.permissionReRank !== false, - datasetSearchUsingExtensionQuery, - datasetSearchExtensionModel: datasetSearchExtensionModel || defaultModels.llm?.model, - datasetSearchExtensionBg - } - }); + const { register, setValue, getValues, handleSubmit, watch } = + useForm({ + defaultValues: { + limit, + similarity, + searchMode, + usingReRank: !!usingReRank && teamPlanStatus?.standardConstants?.permissionReRank !== false, + rerankModel: rerankModel || defaultModels?.rerank?.model, + rerankWeight: rerankWeight || 0.5, + datasetSearchUsingExtensionQuery, + datasetSearchExtensionModel: datasetSearchExtensionModel || defaultModels.llm?.model, + datasetSearchExtensionBg + } + }); + + const searchModeWatch = watch('searchMode'); const datasetSearchUsingCfrForm = watch('datasetSearchUsingExtensionQuery'); const queryExtensionModel = watch('datasetSearchExtensionModel'); - const cfbBgDesc = watch('datasetSearchExtensionBg'); - const usingReRankWatch = watch('usingReRank'); - const searchModeWatch = watch('searchMode'); - const searchModeList = useMemo(() => { - const list = Object.values(DatasetSearchModeMap); - return list; - }, []); + const usingReRankWatch = watch('usingReRank'); + const reRankModelWatch = watch('rerankModel'); + const rerankWeightWatch = watch('rerankWeight'); const showSimilarity = useMemo(() => { if (similarity === undefined) return false; @@ -134,93 +121,123 @@ const DatasetParamsModal = ({ title={t('common:core.dataset.search.Dataset Search Params')} w={['90vw', '550px']} > - + width={'100%'} mb={3} list={[ { - icon: 'modal/setting', + icon: 'common/setting', label: t('common:core.dataset.search.search mode'), value: SearchSettingTabEnum.searchMode }, { - icon: 'support/outlink/apikeyFill', + icon: 'core/dataset/searchfilter', label: t('common:core.dataset.search.Filter'), value: SearchSettingTabEnum.limit }, { label: t('common:core.module.template.Query extension'), value: SearchSettingTabEnum.queryExtension, - icon: '/imgs/workflow/cfr.svg' + icon: 'core/dataset/questionExtension' } ]} + inlineStyles={{ + borderBottomColor: 'myGray.200', + borderBottom: '1px solid' + }} value={currentTabType} onChange={setCurrentTabType} /> {currentTabType === SearchSettingTabEnum.searchMode && ( - <> - + + py={2.5} + gridGap={4} + list={[ + { + title: t('common:core.dataset.search.mode.embedding'), + desc: t('common:core.dataset.search.mode.embedding desc'), + value: DatasetSearchModeEnum.embedding + }, + { + title: t('common:core.dataset.search.mode.fullTextRecall'), + desc: t('common:core.dataset.search.mode.fullTextRecall desc'), + value: DatasetSearchModeEnum.fullTextRecall + }, + { + title: t('common:core.dataset.search.mode.mixedRecall'), + desc: t('common:core.dataset.search.mode.mixedRecall desc'), + value: DatasetSearchModeEnum.mixedRecall + // children: searchModeWatch === DatasetSearchModeEnum.mixedRecall && 111 + } + ]} + value={searchModeWatch} onChange={(e) => { - setValue('searchMode', e as `${DatasetSearchModeEnum}`); - setRefresh(!refresh); + setValue('searchMode', e); }} /> + {/* Rerank */} <> - - { - if (!showReRank) { - return toast({ - status: 'warning', - title: t('common:core.ai.Not deploy rerank model') - }); - } - if ( - teamPlanStatus?.standardConstants && - !teamPlanStatus?.standardConstants?.permissionReRank - ) { - return toast({ - status: 'warning', - title: t('common:support.team.limit.No permission rerank') - }); - } - setValue('usingReRank', !getValues('usingReRank')); - setRefresh((state) => !state); - }} - > - - - {t('common:core.dataset.search.ReRank')} - - {t('common:core.dataset.search.ReRank desc')} + + + {t('common:core.dataset.search.ReRank')} + + + {!showReRank ? ( + + {t('common:core.ai.Not deploy rerank model')} - - - - - - + ) : teamPlanStatus?.standardConstants && + !teamPlanStatus?.standardConstants?.permissionReRank ? ( + + {t('common:support.team.limit.No permission rerank')} + + ) : ( + + )} + + {usingReRankWatch && ( + <> + + + {t('app:rerank_weight')} + + + { + setValue( + NodeInputKeyEnum.datasetSearchRerankWeight, + Number(val.toFixed(2)) + ); + }} + /> + + + + + {t('common:model.type.reRank')} + + + { + setValue(NodeInputKeyEnum.datasetSearchRerankModel, val); + }} + /> + + + + )} - + )} {currentTabType === SearchSettingTabEnum.limit && ( @@ -262,7 +279,7 @@ const DatasetParamsModal = ({ }} /> ) : ( - + {t('common:core.dataset.search.No support similarity')} )} diff --git a/projects/app/src/global/common/api/systemRes.d.ts b/projects/app/src/global/common/api/systemRes.d.ts index f88d9b23c..5640d548d 100644 --- a/projects/app/src/global/common/api/systemRes.d.ts +++ b/projects/app/src/global/common/api/systemRes.d.ts @@ -3,7 +3,7 @@ import type { EmbeddingModelItemType, AudioSpeechModels, STTModelType, - ReRankModelItemType + RerankModelItemType } from '@fastgpt/global/core/ai/model.d'; import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/index.d'; diff --git a/projects/app/src/pageComponents/account/model/ModelConfigTable.tsx b/projects/app/src/pageComponents/account/model/ModelConfigTable.tsx index bcbcebfc8..0b6d368be 100644 --- a/projects/app/src/pageComponents/account/model/ModelConfigTable.tsx +++ b/projects/app/src/pageComponents/account/model/ModelConfigTable.tsx @@ -280,6 +280,10 @@ const ModelTable = ({ Tab }: { Tab: React.ReactNode }) => { isCustom: true, isActive: true, + + isDefault: false, + isDefaultDatasetTextModel: false, + isDefaultDatasetImageModel: false, // @ts-ignore type }); diff --git a/projects/app/src/pageComponents/app/detail/SimpleApp/EditForm.tsx b/projects/app/src/pageComponents/app/detail/SimpleApp/EditForm.tsx index ae54cd57c..8bf8b2084 100644 --- a/projects/app/src/pageComponents/app/detail/SimpleApp/EditForm.tsx +++ b/projects/app/src/pageComponents/app/detail/SimpleApp/EditForm.tsx @@ -10,7 +10,6 @@ import { HStack } from '@chakra-ui/react'; import type { AppSimpleEditFormType } from '@fastgpt/global/core/app/type.d'; -import type { DatasetSimpleItemType } from '@fastgpt/global/core/dataset/type.d'; import { useRouter } from 'next/router'; import { useTranslation } from 'next-i18next'; @@ -106,6 +105,7 @@ const EditForm = ({ const tokenLimit = useMemo(() => { return selectedModel?.quoteMaxToken || 3000; }, [selectedModel?.quoteMaxToken]); + // Force close image select when model not support vision useEffect(() => { if (!selectedModel.vision) { @@ -434,8 +434,6 @@ const EditForm = ({ ...e } })); - - console.dir(e); }} /> )} diff --git a/projects/app/src/pageComponents/app/detail/SimpleApp/index.tsx b/projects/app/src/pageComponents/app/detail/SimpleApp/index.tsx index e2e00e37e..e02a1659b 100644 --- a/projects/app/src/pageComponents/app/detail/SimpleApp/index.tsx +++ b/projects/app/src/pageComponents/app/detail/SimpleApp/index.tsx @@ -28,8 +28,6 @@ const SimpleEdit = () => { // Init app form useMount(() => { - // show selected dataset - if (appDetail.version !== 'v2') { return setAppForm( appWorkflow2Form({ diff --git a/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDatasetParams.tsx b/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDatasetParams.tsx index 38918d816..e8eb3a7d7 100644 --- a/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDatasetParams.tsx +++ b/projects/app/src/pageComponents/app/detail/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDatasetParams.tsx @@ -6,13 +6,14 @@ import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import DatasetParamsModal, { DatasetParamsProps } from '@/components/core/app/DatasetParamsModal'; +import DatasetParamsModal from '@/components/core/app/DatasetParamsModal'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import SearchParamsTip from '@/components/core/dataset/SearchParamsTip'; import { useContextSelector } from 'use-context-selector'; import { WorkflowContext } from '@/pageComponents/app/detail/WorkflowComponents/context'; import { getWebLLMModel } from '@/web/common/system/utils'; import { defaultDatasetMaxTokens } from '@fastgpt/global/core/app/constants'; +import { AppDatasetSearchParamsType } from '@fastgpt/global/core/app/type'; const SelectDatasetParam = ({ inputs = [], nodeId }: RenderInputProps) => { const onChangeNode = useContextSelector(WorkflowContext, (v) => v.onChangeNode); @@ -21,11 +22,13 @@ const SelectDatasetParam = ({ inputs = [], nodeId }: RenderInputProps) => { const { t } = useTranslation(); const { defaultModels } = useSystemStore(); - const [data, setData] = useState({ + const [data, setData] = useState({ searchMode: DatasetSearchModeEnum.embedding, - limit: 5, + limit: 3000, similarity: 0.5, usingReRank: false, + rerankModel: defaultModels.llm?.model, + rerankWeight: 0.6, datasetSearchUsingExtensionQuery: true, datasetSearchExtensionModel: defaultModels.llm?.model, datasetSearchExtensionBg: '' diff --git a/projects/app/src/pages/api/core/ai/model/test.ts b/projects/app/src/pages/api/core/ai/model/test.ts index 23b5708b9..e54c5ff06 100644 --- a/projects/app/src/pages/api/core/ai/model/test.ts +++ b/projects/app/src/pages/api/core/ai/model/test.ts @@ -5,7 +5,7 @@ import { findModelFromAlldata } from '@fastgpt/service/core/ai/model'; import { EmbeddingModelItemType, LLMModelItemType, - ReRankModelItemType, + RerankModelItemType, STTModelType, TTSModelType } from '@fastgpt/global/core/ai/model.d'; @@ -151,7 +151,7 @@ const testSTTModel = async (model: STTModelType, headers: Record addLog.info(`STT result: ${text}`); }; -const testReRankModel = async (model: ReRankModelItemType, headers: Record) => { +const testReRankModel = async (model: RerankModelItemType, headers: Record) => { await reRankRecall({ model, query: 'Hi', diff --git a/projects/app/src/pages/api/core/ai/model/update.ts b/projects/app/src/pages/api/core/ai/model/update.ts index 00658b7b2..2ccd60403 100644 --- a/projects/app/src/pages/api/core/ai/model/update.ts +++ b/projects/app/src/pages/api/core/ai/model/update.ts @@ -27,13 +27,6 @@ async function handler( const dbModel = await MongoSystemModel.findOne({ model }).lean(); const modelData = findModelFromAlldata(model); - if (metadata) { - delete metadata.isActive; - delete metadata.isDefault; - delete metadata.isDefaultDatasetTextModel; - delete metadata.isDefaultDatasetImageModel; - } - const metadataConcat: Record = { ...modelData, // system config ...dbModel?.metadata, // db config diff --git a/projects/app/src/types/index.d.ts b/projects/app/src/types/index.d.ts index 6550db0ad..9cde1d550 100644 --- a/projects/app/src/types/index.d.ts +++ b/projects/app/src/types/index.d.ts @@ -3,7 +3,7 @@ import { ChatModelItemType, FunctionModelItemType, LLMModelItemType, - ReRankModelItemType, + RerankModelItemType, EmbeddingModelItemType, STTModelType } from '@fastgpt/global/core/ai/model.d'; diff --git a/projects/app/src/web/common/system/useSystemStore.ts b/projects/app/src/web/common/system/useSystemStore.ts index 373b389e4..e16e4ccb1 100644 --- a/projects/app/src/web/common/system/useSystemStore.ts +++ b/projects/app/src/web/common/system/useSystemStore.ts @@ -6,7 +6,7 @@ import { OAuthEnum } from '@fastgpt/global/support/user/constant'; import type { TTSModelType, LLMModelItemType, - ReRankModelItemType, + RerankModelItemType, EmbeddingModelItemType, STTModelType } from '@fastgpt/global/core/ai/model.d'; @@ -56,7 +56,7 @@ type State = { getVlmModelList: () => LLMModelItemType[]; embeddingModelList: EmbeddingModelItemType[]; ttsModelList: TTSModelType[]; - reRankModelList: ReRankModelItemType[]; + reRankModelList: RerankModelItemType[]; sttModelList: STTModelType[]; initStaticData: (e: InitDateResponse) => void; appType?: string; diff --git a/projects/app/src/web/core/app/utils.ts b/projects/app/src/web/core/app/utils.ts index 07db0be9c..b1a4640a4 100644 --- a/projects/app/src/web/core/app/utils.ts +++ b/projects/app/src/web/core/app/utils.ts @@ -239,58 +239,72 @@ export function form2AppWorkflow( version: DatasetSearchModule.version, inputs: [ { - key: 'datasets', + key: NodeInputKeyEnum.datasetSelectList, renderTypeList: [FlowNodeInputTypeEnum.selectDataset, FlowNodeInputTypeEnum.reference], - label: 'core.module.input.label.Select dataset', + label: i18nT('common:core.module.input.label.Select dataset'), value: selectedDatasets, valueType: WorkflowIOValueTypeEnum.selectDataset, list: [], required: true }, { - key: 'similarity', + key: NodeInputKeyEnum.datasetSimilarity, renderTypeList: [FlowNodeInputTypeEnum.selectDatasetParamsModal], label: '', value: formData.dataset.similarity, valueType: WorkflowIOValueTypeEnum.number }, { - key: 'limit', + key: NodeInputKeyEnum.datasetMaxTokens, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', value: formData.dataset.limit, valueType: WorkflowIOValueTypeEnum.number }, { - key: 'searchMode', + key: NodeInputKeyEnum.datasetSearchMode, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', valueType: WorkflowIOValueTypeEnum.string, value: formData.dataset.searchMode }, { - key: 'usingReRank', + key: NodeInputKeyEnum.datasetSearchUsingReRank, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', valueType: WorkflowIOValueTypeEnum.boolean, value: formData.dataset.usingReRank }, { - key: 'datasetSearchUsingExtensionQuery', + key: NodeInputKeyEnum.datasetSearchRerankModel, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.string, + value: formData.dataset.rerankModel + }, + { + key: NodeInputKeyEnum.datasetSearchRerankWeight, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.number, + value: formData.dataset.rerankWeight + }, + { + key: NodeInputKeyEnum.datasetSearchUsingExtensionQuery, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', valueType: WorkflowIOValueTypeEnum.boolean, value: formData.dataset.datasetSearchUsingExtensionQuery }, { - key: 'datasetSearchExtensionModel', + key: NodeInputKeyEnum.datasetSearchExtensionModel, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', valueType: WorkflowIOValueTypeEnum.string, value: formData.dataset.datasetSearchExtensionModel }, { - key: 'datasetSearchExtensionBg', + key: NodeInputKeyEnum.datasetSearchExtensionBg, renderTypeList: [FlowNodeInputTypeEnum.hidden], label: '', valueType: WorkflowIOValueTypeEnum.string,