mirror of
https://github.com/langgenius/dify.git
synced 2026-04-27 19:27:23 +08:00
chore: offline n to 1 retrieval (#8134)
This commit is contained in:
parent
a27d4d58ec
commit
bbb609179f
@ -1,20 +1,12 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { memo, useMemo } from 'react'
|
import { memo, useEffect, useMemo } from 'react'
|
||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import {
|
|
||||||
RiAlertFill,
|
|
||||||
} from '@remixicon/react'
|
|
||||||
import WeightedScore from './weighted-score'
|
import WeightedScore from './weighted-score'
|
||||||
import TopKItem from '@/app/components/base/param-item/top-k-item'
|
import TopKItem from '@/app/components/base/param-item/top-k-item'
|
||||||
import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
|
import ScoreThresholdItem from '@/app/components/base/param-item/score-threshold-item'
|
||||||
import RadioCard from '@/app/components/base/radio-card/simple'
|
|
||||||
import { RETRIEVE_TYPE } from '@/types/app'
|
import { RETRIEVE_TYPE } from '@/types/app'
|
||||||
import {
|
|
||||||
MultiPathRetrieval,
|
|
||||||
NTo1Retrieval,
|
|
||||||
} from '@/app/components/base/icons/src/public/common'
|
|
||||||
import type {
|
import type {
|
||||||
DatasetConfigs,
|
DatasetConfigs,
|
||||||
} from '@/models/debug'
|
} from '@/models/debug'
|
||||||
@ -31,7 +23,6 @@ import { RerankingModeEnum } from '@/models/datasets'
|
|||||||
import cn from '@/utils/classnames'
|
import cn from '@/utils/classnames'
|
||||||
import { useSelectedDatasetsMode } from '@/app/components/workflow/nodes/knowledge-retrieval/hooks'
|
import { useSelectedDatasetsMode } from '@/app/components/workflow/nodes/knowledge-retrieval/hooks'
|
||||||
import Switch from '@/app/components/base/switch'
|
import Switch from '@/app/components/base/switch'
|
||||||
import { useGetLanguage } from '@/context/i18n'
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
datasetConfigs: DatasetConfigs
|
datasetConfigs: DatasetConfigs
|
||||||
@ -43,11 +34,6 @@ type Props = {
|
|||||||
selectedDatasets?: DataSet[]
|
selectedDatasets?: DataSet[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const LEGACY_LINK_MAP = {
|
|
||||||
en_US: 'https://docs.dify.ai/guides/knowledge-base/integrate-knowledge-within-application',
|
|
||||||
zh_Hans: 'https://docs.dify.ai/v/zh-hans/guides/knowledge-base/integrate_knowledge_within_application',
|
|
||||||
} as Record<string, string>
|
|
||||||
|
|
||||||
const ConfigContent: FC<Props> = ({
|
const ConfigContent: FC<Props> = ({
|
||||||
datasetConfigs,
|
datasetConfigs,
|
||||||
onChange,
|
onChange,
|
||||||
@ -58,15 +44,18 @@ const ConfigContent: FC<Props> = ({
|
|||||||
selectedDatasets = [],
|
selectedDatasets = [],
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const language = useGetLanguage()
|
|
||||||
const selectedDatasetsMode = useSelectedDatasetsMode(selectedDatasets)
|
const selectedDatasetsMode = useSelectedDatasetsMode(selectedDatasets)
|
||||||
const type = datasetConfigs.retrieval_model
|
const type = datasetConfigs.retrieval_model
|
||||||
const setType = (value: RETRIEVE_TYPE) => {
|
|
||||||
onChange({
|
useEffect(() => {
|
||||||
...datasetConfigs,
|
if (type === RETRIEVE_TYPE.oneWay) {
|
||||||
retrieval_model: value,
|
onChange({
|
||||||
}, true)
|
...datasetConfigs,
|
||||||
}
|
retrieval_model: RETRIEVE_TYPE.multiWay,
|
||||||
|
}, isInWorkflow)
|
||||||
|
}
|
||||||
|
}, [type])
|
||||||
|
|
||||||
const {
|
const {
|
||||||
modelList: rerankModelList,
|
modelList: rerankModelList,
|
||||||
defaultModel: rerankDefaultModel,
|
defaultModel: rerankDefaultModel,
|
||||||
@ -166,63 +155,21 @@ const ConfigContent: FC<Props> = ({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className='system-xl-semibold text-text-primary'>{t('dataset.retrievalSettings')}</div>
|
<div className='system-xl-semibold text-text-primary'>{t('dataset.retrievalSettings')}</div>
|
||||||
<div className='mt-2 space-y-3'>
|
<div className='system-xs-regular text-text-tertiary'>
|
||||||
<RadioCard
|
{t('dataset.defaultRetrievalTip')}
|
||||||
icon={<NTo1Retrieval className='shrink-0 mr-3 w-9 h-9 rounded-lg' />}
|
|
||||||
title={(
|
|
||||||
<div className='flex items-center'>
|
|
||||||
{t('appDebug.datasetConfig.retrieveOneWay.title')}
|
|
||||||
<Tooltip
|
|
||||||
popupContent={(
|
|
||||||
<div className='w-[320px]'>
|
|
||||||
{t('dataset.nTo1RetrievalLegacy')}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
<div className='ml-1 flex items-center px-[5px] h-[18px] rounded-[5px] border border-text-accent-secondary system-2xs-medium-uppercase text-text-accent-secondary'>legacy</div>
|
|
||||||
</Tooltip>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
description={t('appDebug.datasetConfig.retrieveOneWay.description')}
|
|
||||||
isChosen={type === RETRIEVE_TYPE.oneWay}
|
|
||||||
onChosen={() => { setType(RETRIEVE_TYPE.oneWay) }}
|
|
||||||
extra={(
|
|
||||||
<div className='flex pl-3 pr-1 py-3 border-t border-divider-subtle bg-state-warning-hover rounded-b-xl'>
|
|
||||||
<RiAlertFill className='shrink-0 mr-1.5 w-4 h-4 text-text-warning-secondary' />
|
|
||||||
<div className='system-xs-medium text-text-primary'>
|
|
||||||
{t('dataset.nTo1RetrievalLegacyLinkText')}
|
|
||||||
<a
|
|
||||||
className='text-text-accent'
|
|
||||||
href={LEGACY_LINK_MAP[language]}
|
|
||||||
target='_blank'
|
|
||||||
rel='noopener noreferrer'
|
|
||||||
>
|
|
||||||
{t('dataset.nTo1RetrievalLegacyLink')}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
<RadioCard
|
|
||||||
icon={<MultiPathRetrieval className='shrink-0 mr-3 w-9 h-9 rounded-lg' />}
|
|
||||||
title={t('appDebug.datasetConfig.retrieveMultiWay.title')}
|
|
||||||
description={t('appDebug.datasetConfig.retrieveMultiWay.description')}
|
|
||||||
isChosen={type === RETRIEVE_TYPE.multiWay}
|
|
||||||
onChosen={() => { setType(RETRIEVE_TYPE.multiWay) }}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
{type === RETRIEVE_TYPE.multiWay && (
|
{type === RETRIEVE_TYPE.multiWay && (
|
||||||
<>
|
<>
|
||||||
<div className='mb-2 mt-4 h-[1px] bg-divider-subtle'></div>
|
<div className='flex items-center my-2 py-1 h-6'>
|
||||||
<div
|
<div className='shrink-0 mr-2 system-xs-semibold-uppercase text-text-secondary'>
|
||||||
className='flex items-center mb-2 h-6 system-md-semibold text-text-secondary'
|
{t('dataset.rerankSettings')}
|
||||||
>
|
</div>
|
||||||
{t('dataset.rerankSettings')}
|
<div className='grow h-[1px] bg-gradient-to-l from-white to-[rgba(16,24,40,0.08)]'></div>
|
||||||
</div>
|
</div>
|
||||||
{
|
{
|
||||||
selectedDatasetsMode.inconsistentEmbeddingModel
|
selectedDatasetsMode.inconsistentEmbeddingModel
|
||||||
&& (
|
&& (
|
||||||
<div className='mt-4 system-xs-regular text-text-warning'>
|
<div className='mt-4 system-xs-medium text-text-warning'>
|
||||||
{t('dataset.inconsistentEmbeddingModelTip')}
|
{t('dataset.inconsistentEmbeddingModelTip')}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@ -230,7 +177,7 @@ const ConfigContent: FC<Props> = ({
|
|||||||
{
|
{
|
||||||
selectedDatasetsMode.mixtureHighQualityAndEconomic
|
selectedDatasetsMode.mixtureHighQualityAndEconomic
|
||||||
&& (
|
&& (
|
||||||
<div className='mt-4 system-xs-regular text-text-warning'>
|
<div className='mt-4 system-xs-medium text-text-warning'>
|
||||||
{t('dataset.mixtureHighQualityAndEconomicTip')}
|
{t('dataset.mixtureHighQualityAndEconomicTip')}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -55,6 +55,7 @@ const translation = {
|
|||||||
hybrid_search: 'HYBRID',
|
hybrid_search: 'HYBRID',
|
||||||
invertedIndex: 'INVERTED',
|
invertedIndex: 'INVERTED',
|
||||||
},
|
},
|
||||||
|
defaultRetrievalTip: 'Multi-path retrieval is used by default. Knowledge is retrieved from multiple knowledge bases and then re-ranked.',
|
||||||
mixtureHighQualityAndEconomicTip: 'The Rerank model is required for mixture of high quality and economical knowledge bases.',
|
mixtureHighQualityAndEconomicTip: 'The Rerank model is required for mixture of high quality and economical knowledge bases.',
|
||||||
inconsistentEmbeddingModelTip: 'The Rerank model is required if the Embedding models of the selected knowledge bases are inconsistent.',
|
inconsistentEmbeddingModelTip: 'The Rerank model is required if the Embedding models of the selected knowledge bases are inconsistent.',
|
||||||
retrievalSettings: 'Retrieval Setting',
|
retrievalSettings: 'Retrieval Setting',
|
||||||
|
|||||||
@ -55,6 +55,7 @@ const translation = {
|
|||||||
hybrid_search: '混合检索',
|
hybrid_search: '混合检索',
|
||||||
invertedIndex: '倒排索引',
|
invertedIndex: '倒排索引',
|
||||||
},
|
},
|
||||||
|
defaultRetrievalTip: '默认情况下使用多路召回。从多个知识库中检索知识,然后重新排序。',
|
||||||
mixtureHighQualityAndEconomicTip: '混合使用高质量和经济型知识库需要配置 Rerank 模型。',
|
mixtureHighQualityAndEconomicTip: '混合使用高质量和经济型知识库需要配置 Rerank 模型。',
|
||||||
inconsistentEmbeddingModelTip: '当所选知识库配置的 Embedding 模型不一致时,需要配置 Rerank 模型。',
|
inconsistentEmbeddingModelTip: '当所选知识库配置的 Embedding 模型不一致时,需要配置 Rerank 模型。',
|
||||||
retrievalSettings: '召回设置',
|
retrievalSettings: '召回设置',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user