import { FileSearchOutlined, SearchOutlined } from '@ant-design/icons';
import { Button, Card, Flex, Input, InputNumber, Select, Slider, Spin, Switch, Tag, Tooltip } from 'antd';
import type { RetrieveRecord } from '~/api/dify-dataset/type';
import { useRetrieveTest } from '~/hooks/dify-dataset-manager/retrieve-test';
import type { RetrieveTestProps } from '~/types/dify-dataset-manager/retrieve-test';
// 颜色常量
const colors = {
bgContainer: '#fff',
bgLayout: '#f5f5f5',
bgElevated: '#fafafa',
border: '#e8e8e8',
text: '#262626',
textSecondary: '#8c8c8c',
textTertiary: '#bfbfbf',
textQuaternary: '#d9d9d9',
fillTertiary: '#f0f0f0',
};
/**
* 检索结果项组件
*/
function ResultItem({ record, index }: { record: RetrieveRecord; index: number }) {
const scorePercent = (record.score * 100).toFixed(1);
const scoreColor = record.score > 0.8 ? '#52c41a' : record.score > 0.5 ? '#faad14' : '#666';
return (
{scorePercent}%
#{index + 1}
{record.segment.word_count} 字 · 命中 {record.segment.hit_count} 次
{record.segment.document && (
来源: {record.segment.document.name}
)}
{record.segment.content.length > 500
? record.segment.content.substring(0, 500) + '...'
: record.segment.content}
{record.segment.answer && (
答案:
{record.segment.answer.length > 200
? record.segment.answer.substring(0, 200) + '...'
: record.segment.answer}
)}
);
}
/**
* 召回测试组件
*/
export default function RetrieveTest({ datasetId }: RetrieveTestProps) {
const {
searchQuery,
setSearchQuery,
retrieveResults,
retrieving,
searchMethod,
setSearchMethod,
topK,
setTopK,
scoreThresholdEnabled,
setScoreThresholdEnabled,
scoreThreshold,
setScoreThreshold,
handleRetrieve,
} = useRetrieveTest(datasetId);
// 检索方式选项(只有3种)
const searchMethodOptions = [
{ label: '向量检索', value: 'semantic_search' },
{ label: '全文检索', value: 'full_text_search' },
{ label: '混合检索', value: 'hybrid_search' },
];
return (
{/* 左侧面板 - 输入区域 */}
{/* 标题 */}
召回测试
根据给定的查询文本测试知识库召回效果
{/* 查询输入区 */}
源文本
setSearchQuery(e.target.value)}
onPressEnter={(e) => {
if (!e.shiftKey) {
e.preventDefault();
handleRetrieve();
}
}}
autoSize={{ minRows: 6, maxRows: 12 }}
style={{
background: colors.bgContainer,
resize: 'none',
}}
/>
{searchQuery.length} / 200
}
onClick={handleRetrieve}
loading={retrieving}
>
测试
{/* 检索设置 */}
检索设置
返回数量 (Top K):
{topK}
{/* Score 阈值设置 */}
Score 阈值:
{scoreThresholdEnabled && (
<>
setScoreThreshold(value ?? 0.5)}
min={0}
max={1}
step={0.01}
size="small"
style={{ width: 70 }}
/>
>
)}
{/* 右侧面板 - 结果展示 */}
检索结果
{retrieveResults.length > 0 ? `${retrieveResults.length} 条结果` : '0 条结果'}
}
className="preview-card"
>
{retrieving ? (
) : retrieveResults.length === 0 ? (
) : (
{retrieveResults.map((record, index) => (
))}
)}
);
}