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)
This commit is contained in:
yingjianzh
2026-05-15 10:49:14 +08:00
committed by GitHub
parent ef2969a462
commit 4c68a6b86c
5 changed files with 25 additions and 10 deletions

View File

@@ -201,6 +201,7 @@ class Retrieval(ToolBase, ABC):
self._param.top_n, self._param.top_n,
self._param.similarity_threshold, self._param.similarity_threshold,
1 - self._param.keywords_similarity_weight, 1 - self._param.keywords_similarity_weight,
top=self._param.top_k,
doc_ids=doc_ids, doc_ids=doc_ids,
aggs=True, aggs=True,
rerank_mdl=rerank_mdl, rerank_mdl=rerank_mdl,

View File

@@ -16,7 +16,8 @@ import { NumberInput } from '../ui/input';
interface SimilaritySliderFormFieldProps { interface SimilaritySliderFormFieldProps {
similarityName?: string; similarityName?: string;
vectorSimilarityWeightName?: string; similarityWeightName?: string;
similarityWeightType?: 'vector' | 'keyword';
isTooltipShown?: boolean; isTooltipShown?: boolean;
numberInputClassName?: string; numberInputClassName?: string;
} }
@@ -44,14 +45,21 @@ export const initialVectorSimilarityWeightValue = {
export function SimilaritySliderFormField({ export function SimilaritySliderFormField({
similarityName = 'similarity_threshold', similarityName = 'similarity_threshold',
vectorSimilarityWeightName = 'vector_similarity_weight', similarityWeightName = 'vector_similarity_weight',
similarityWeightType = 'vector',
isTooltipShown, isTooltipShown,
numberInputClassName, numberInputClassName,
}: SimilaritySliderFormFieldProps) { }: SimilaritySliderFormFieldProps) {
const { t } = useTranslate('knowledgeDetails'); const { t } = useTranslate('knowledgeDetails');
const form = useFormContext(); const form = useFormContext();
const isVector = const isVector = similarityWeightType === 'vector';
vectorSimilarityWeightName.indexOf('vector_similarity_weight') > -1; 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 ( return (
<> <>
@@ -66,7 +74,7 @@ export function SimilaritySliderFormField({
></SliderInputFormField> ></SliderInputFormField>
<FormField <FormField
control={form.control} control={form.control}
name={vectorSimilarityWeightName} name={similarityWeightName}
defaultValue={0} defaultValue={0}
render={({ field }) => ( render={({ field }) => (
<FormItem <FormItem
@@ -95,7 +103,7 @@ export function SimilaritySliderFormField({
vector vector
</label> </label>
<span className="bg-bg-card rounded-md p-1 w-10 text-center text-xs"> <span className="bg-bg-card rounded-md p-1 w-10 text-center text-xs">
{field.value.toFixed(2)} {getVectorWeight(field.value).toFixed(2)}
</span> </span>
</div> </div>
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
@@ -103,12 +111,14 @@ export function SimilaritySliderFormField({
full-text full-text
</label> </label>
<span className="bg-bg-card rounded-md p-1 w-10 text-center text-xs"> <span className="bg-bg-card rounded-md p-1 w-10 text-center text-xs">
{(1 - field.value).toFixed(2)} {getFullTextWeight(field.value).toFixed(2)}
</span> </span>
</div> </div>
</div> </div>
<SingleFormSlider <SingleFormSlider
{...field} {...field}
value={getVectorWeight(field.value)}
onChange={(value) => field.onChange(getStoredWeight(value))}
max={1} max={1}
step={0.01} step={0.01}
min={0} min={0}
@@ -126,6 +136,8 @@ export function SimilaritySliderFormField({
min={0} min={0}
step={0.01} step={0.01}
{...field} {...field}
value={getVectorWeight(field.value)}
onChange={(value) => field.onChange(getStoredWeight(value))}
></NumberInput> ></NumberInput>
</FormControl> </FormControl>
</div> </div>

View File

@@ -169,7 +169,8 @@ function RetrievalForm({ node }: INextOperatorForm) {
<Collapse title={<div>{t('flow.advancedSettings')}</div>}> <Collapse title={<div>{t('flow.advancedSettings')}</div>}>
<section className="space-y-5"> <section className="space-y-5">
<SimilaritySliderFormField <SimilaritySliderFormField
vectorSimilarityWeightName="keywords_similarity_weight" similarityWeightName="keywords_similarity_weight"
similarityWeightType="keyword"
isTooltipShown isTooltipShown
></SimilaritySliderFormField> ></SimilaritySliderFormField>
<TopNFormField></TopNFormField> <TopNFormField></TopNFormField>

View File

@@ -48,7 +48,8 @@ const RetrievalForm = () => {
<Collapse title={<div>{t('flow.advancedSettings')}</div>}> <Collapse title={<div>{t('flow.advancedSettings')}</div>}>
<FormContainer> <FormContainer>
<SimilaritySliderFormField <SimilaritySliderFormField
vectorSimilarityWeightName="keywords_similarity_weight" similarityWeightName="keywords_similarity_weight"
similarityWeightType="keyword"
isTooltipShown isTooltipShown
></SimilaritySliderFormField> ></SimilaritySliderFormField>
<TopNFormField></TopNFormField> <TopNFormField></TopNFormField>

View File

@@ -422,7 +422,7 @@ const SearchSetting: React.FC<SearchSettingProps> = ({
<SimilaritySliderFormField <SimilaritySliderFormField
isTooltipShown isTooltipShown
similarityName="search_config.similarity_threshold" similarityName="search_config.similarity_threshold"
vectorSimilarityWeightName="search_config.vector_similarity_weight" similarityWeightName="search_config.vector_similarity_weight"
numberInputClassName="rounded-sm" numberInputClassName="rounded-sm"
></SimilaritySliderFormField> ></SimilaritySliderFormField>
{/* Rerank Model */} {/* Rerank Model */}