From 551fd94381b9db7a4b65cd0cc46ec210beb2eaf4 Mon Sep 17 00:00:00 2001 From: Liu Haoxuan Date: Fri, 8 May 2026 14:39:38 +0800 Subject: [PATCH] fix external knowledge base retrieval settings save and hit testing --- .../components/query-input/index.tsx | 20 ++++++++++++++++++- .../settings/form/hooks/use-form-state.ts | 11 +++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/web/app/components/datasets/hit-testing/components/query-input/index.tsx b/web/app/components/datasets/hit-testing/components/query-input/index.tsx index 99796015c6..55504c0a24 100644 --- a/web/app/components/datasets/hit-testing/components/query-input/index.tsx +++ b/web/app/components/datasets/hit-testing/components/query-input/index.tsx @@ -17,7 +17,7 @@ import { RiPlayCircleLine, } from '@remixicon/react' import * as React from 'react' -import { useCallback, useMemo, useState } from 'react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { v4 as uuid4 } from 'uuid' import ImageUploaderInRetrievalTesting from '@/app/components/datasets/common/image-uploader/image-uploader-in-retrieval-testing' @@ -65,6 +65,7 @@ const QueryInput = ({ }: QueryInputProps) => { const { t } = useTranslation() const isMultimodal = useDatasetDetailContextWithSelector(s => !!s.dataset?.is_multimodal) + const datasetExternalRetrievalModel = useDatasetDetailContextWithSelector(s => s.dataset?.external_retrieval_model) const [isSettingsOpen, setIsSettingsOpen] = useState(false) const [externalRetrievalSettings, setExternalRetrievalSettings] = useState({ top_k: 4, @@ -72,6 +73,23 @@ const QueryInput = ({ score_threshold_enabled: false, }) + // dataset 是异步加载的,首次挂载时 external_retrieval_model 为 undefined, + // useState 的初始值会被固化为上面的默认值。此处在 dataset 第一次就绪后 + // 一次性同步到本地 state,后续用户通过「设置」弹窗修改的值不会被覆盖。 + const hasSyncedExternalRetrievalSettingsRef = useRef(false) + useEffect(() => { + if (hasSyncedExternalRetrievalSettingsRef.current) + return + if (!datasetExternalRetrievalModel) + return + setExternalRetrievalSettings({ + top_k: datasetExternalRetrievalModel.top_k ?? 4, + score_threshold: datasetExternalRetrievalModel.score_threshold ?? 0.5, + score_threshold_enabled: datasetExternalRetrievalModel.score_threshold_enabled ?? false, + }) + hasSyncedExternalRetrievalSettingsRef.current = true + }, [datasetExternalRetrievalModel]) + const text = useMemo(() => { return queries.find(query => query.content_type === 'text_query')?.content ?? '' }, [queries]) diff --git a/web/app/components/datasets/settings/form/hooks/use-form-state.ts b/web/app/components/datasets/settings/form/hooks/use-form-state.ts index ff61c1e815..c564169a9e 100644 --- a/web/app/components/datasets/settings/form/hooks/use-form-state.ts +++ b/web/app/components/datasets/settings/form/hooks/use-form-state.ts @@ -132,7 +132,7 @@ export const useFormState = () => { return } - if (retrievalConfig.weights) { + if (retrievalConfig?.weights) { retrievalConfig.weights.vector_setting.embedding_provider_name = embeddingModel.provider || '' retrievalConfig.weights.vector_setting.embedding_model_name = embeddingModel.model || '' } @@ -191,20 +191,19 @@ export const useFormState = () => { } } - // Computed values const showMultiModalTip = useMemo(() => { return checkShowMultiModalTip({ embeddingModel, - rerankingEnable: retrievalConfig.reranking_enable, + rerankingEnable: retrievalConfig?.reranking_enable, rerankModel: { - rerankingProviderName: retrievalConfig.reranking_model.reranking_provider_name, - rerankingModelName: retrievalConfig.reranking_model.reranking_model_name, + rerankingProviderName: retrievalConfig?.reranking_model?.reranking_provider_name ?? '', + rerankingModelName: retrievalConfig?.reranking_model?.reranking_model_name ?? '', }, indexMethod, embeddingModelList, rerankModelList, }) - }, [embeddingModel, rerankModelList, retrievalConfig.reranking_enable, retrievalConfig.reranking_model, embeddingModelList, indexMethod]) + }, [embeddingModel, rerankModelList, retrievalConfig?.reranking_enable, retrievalConfig?.reranking_model, embeddingModelList, indexMethod]) return { // Context values