From 4c68a6b86ce0f126b4bbbc5df9f83d74ea8833a4 Mon Sep 17 00:00:00 2001 From: yingjianzh <59633288+yingjianzh@users.noreply.github.com> Date: Fri, 15 May 2026 10:49:14 +0800 Subject: [PATCH] fix(agent): pass top_k and fix similarity weight slider behavior (#14760) ### What problem does this PR solve? This PR fixes two issues in Agent Retrieval behavior and configuration UX: 1. `top_k` configured in Agent Retrieval was not passed down to the backend retriever call, so retrieval could ignore the configured vector recall limit. 2. Similarity weight slider semantics were confusing in Agent forms because the Agent field stores `keywords_similarity_weight` while UI interactions were interpreted as vector weight. This could cause displayed values and actual behavior to diverge. This PR ensures Agent retrieval uses configured `top_k`, and makes the slider behavior consistent and explicit for both vector and keyword weight modes. ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --- agent/tools/retrieval.py | 1 + .../components/similarity-slider/index.tsx | 26 ++++++++++++++----- .../pages/agent/form/retrieval-form/next.tsx | 3 ++- .../form/tool-form/retrieval-form/index.tsx | 3 ++- web/src/pages/next-search/search-setting.tsx | 2 +- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/agent/tools/retrieval.py b/agent/tools/retrieval.py index 4496f497ae..0ccf056a29 100644 --- a/agent/tools/retrieval.py +++ b/agent/tools/retrieval.py @@ -201,6 +201,7 @@ class Retrieval(ToolBase, ABC): self._param.top_n, self._param.similarity_threshold, 1 - self._param.keywords_similarity_weight, + top=self._param.top_k, doc_ids=doc_ids, aggs=True, rerank_mdl=rerank_mdl, diff --git a/web/src/components/similarity-slider/index.tsx b/web/src/components/similarity-slider/index.tsx index c950688869..f822bf20d7 100644 --- a/web/src/components/similarity-slider/index.tsx +++ b/web/src/components/similarity-slider/index.tsx @@ -16,7 +16,8 @@ import { NumberInput } from '../ui/input'; interface SimilaritySliderFormFieldProps { similarityName?: string; - vectorSimilarityWeightName?: string; + similarityWeightName?: string; + similarityWeightType?: 'vector' | 'keyword'; isTooltipShown?: boolean; numberInputClassName?: string; } @@ -44,14 +45,21 @@ export const initialVectorSimilarityWeightValue = { export function SimilaritySliderFormField({ similarityName = 'similarity_threshold', - vectorSimilarityWeightName = 'vector_similarity_weight', + similarityWeightName = 'vector_similarity_weight', + similarityWeightType = 'vector', isTooltipShown, numberInputClassName, }: SimilaritySliderFormFieldProps) { const { t } = useTranslate('knowledgeDetails'); const form = useFormContext(); - const isVector = - vectorSimilarityWeightName.indexOf('vector_similarity_weight') > -1; + const isVector = similarityWeightType === 'vector'; + const normalizeWeight = (weight: number) => Number(weight.toFixed(2)); + const getVectorWeight = (weight: number) => + normalizeWeight(isVector ? weight : 1 - weight); + const getFullTextWeight = (weight: number) => + normalizeWeight(isVector ? 1 - weight : weight); + const getStoredWeight = (vectorWeight: number) => + normalizeWeight(isVector ? vectorWeight : 1 - vectorWeight); return ( <> @@ -66,7 +74,7 @@ export function SimilaritySliderFormField({ > ( - {field.value.toFixed(2)} + {getVectorWeight(field.value).toFixed(2)}
@@ -103,12 +111,14 @@ export function SimilaritySliderFormField({ full-text - {(1 - field.value).toFixed(2)} + {getFullTextWeight(field.value).toFixed(2)}
field.onChange(getStoredWeight(value))} max={1} step={0.01} min={0} @@ -126,6 +136,8 @@ export function SimilaritySliderFormField({ min={0} step={0.01} {...field} + value={getVectorWeight(field.value)} + onChange={(value) => field.onChange(getStoredWeight(value))} > diff --git a/web/src/pages/agent/form/retrieval-form/next.tsx b/web/src/pages/agent/form/retrieval-form/next.tsx index 44a6fe9ad5..6e831cedf2 100644 --- a/web/src/pages/agent/form/retrieval-form/next.tsx +++ b/web/src/pages/agent/form/retrieval-form/next.tsx @@ -169,7 +169,8 @@ function RetrievalForm({ node }: INextOperatorForm) { {t('flow.advancedSettings')}}>
diff --git a/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx b/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx index 84cb0896c0..c84f07efaa 100644 --- a/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx +++ b/web/src/pages/agent/form/tool-form/retrieval-form/index.tsx @@ -48,7 +48,8 @@ const RetrievalForm = () => { {t('flow.advancedSettings')}}> diff --git a/web/src/pages/next-search/search-setting.tsx b/web/src/pages/next-search/search-setting.tsx index 697e7369e8..cb658eea5e 100644 --- a/web/src/pages/next-search/search-setting.tsx +++ b/web/src/pages/next-search/search-setting.tsx @@ -422,7 +422,7 @@ const SearchSetting: React.FC = ({ {/* Rerank Model */}