import { useState } from 'react'; import { Input, Button, Card, Select, Slider, Table, Tag, Empty, Spin, message, } from 'antd'; import { FileSearchOutlined } from '@ant-design/icons'; import type { ColumnsType } from 'antd/es/table'; import type { RetrieveRecord } from '~/api/dify-dataset/type'; import { retrieveDataset } from '~/api/dify-dataset/api/segmentApi'; interface RetrieveTestProps { datasetId: string; } /** * 召回测试组件 * 用于测试知识库的检索效果 */ export default function RetrieveTest({ datasetId }: RetrieveTestProps) { const [searchQuery, setSearchQuery] = useState(''); const [retrieveResults, setRetrieveResults] = useState([]); const [retrieving, setRetrieving] = useState(false); const [searchMethod, setSearchMethod] = useState('hybrid_search'); const [topK, setTopK] = useState(5); /** * 执行检索 */ const handleRetrieve = async () => { if (!searchQuery.trim()) { message.warning('请输入检索关键词'); return; } if (!datasetId) { message.warning('知识库ID不存在'); return; } setRetrieving(true); try { const response = await retrieveDataset(datasetId, searchQuery, { search_method: searchMethod as any, top_k: topK, }); setRetrieveResults(response.records || []); if (response.records?.length === 0) { message.info('未找到匹配的结果'); } } catch (err: any) { console.error('检索失败:', err); message.error(err.message || '检索失败'); } finally { setRetrieving(false); } }; // 检索结果列定义 const columns: ColumnsType = [ { title: '相关度', dataIndex: 'score', key: 'score', width: 100, render: (score: number) => ( 0.8 ? 'green' : score > 0.5 ? 'orange' : 'default'}> {(score * 100).toFixed(1)}% ), }, { title: '内容', key: 'content', render: (_, record) => (
{record.segment.content.length > 300 ? record.segment.content.substring(0, 300) + '...' : record.segment.content}
{record.segment.answer && (
答案: {record.segment.answer.length > 150 ? record.segment.answer.substring(0, 150) + '...' : record.segment.answer}
)}
), }, { title: '字数', key: 'word_count', width: 80, render: (_, record) => record.segment.word_count, }, { title: '命中次数', key: 'hit_count', width: 100, render: (_, record) => record.segment.hit_count, }, ]; return (
{/* 页面标题 */}

召回测试

输入查询内容,测试知识库的检索效果

{/* 检索设置 */}
} value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} onPressEnter={handleRetrieve} className="search-input" />
检索方式: