import { forwardRef, useImperativeHandle, useState, useEffect } from 'react'; import { Form, Input, Select, Button, InputNumber } from 'antd'; import { useTranslation } from 'react-i18next'; import type { RecallTestDrawerRef, RecallTestData, RecallTestParams } from '@/views/KnowledgeBase/types'; // import refreshIcon from '@/assets/images/knowledgeBase/refresh-blue.png'; import RecallTestResult from './RecallTestResult'; import { reChunks, getRetrievalModeType } from '@/api/knowledgeBase'; import { hybrid } from 'react-syntax-highlighter/dist/esm/styles/hljs'; const { TextArea } = Input; interface RetrievalModeOption { label: string; value: boolean; } const RecallTest = forwardRef(({},ref) => { const [form] = Form.useForm(); const { t } = useTranslation(); const [data, setData] = useState([]); const [knowledgeBaseId, setKnowledgeBaseId] = useState(''); const [loading, setLoading] = useState(false); const [retrieveType, setRetrieveType] = useState('hybrid'); const [retrievalModeOptions, setRetrievalModeOptions] = useState([ { label: t('knowledgeBase.hybrid'), value: true }, { label: t('knowledgeBase.vector'), value: false }, ]); // 获取检索模式选项 useEffect(() => { fetchRetrievalModeOptions(); }, []); const fetchRetrievalModeOptions = async () => { try { const response = await getRetrievalModeType(); if (response && Array.isArray(response)) { // 将 API 返回的数据转换为选项格式 const options = response.map((item: any) => { // 支持多种数据格式 let label = t(`knowledgeBase.${item}`) + ' ' + t(`knowledgeBase.retrieve`); let value = item; return { label, value }; }); if (options.length > 0) { setRetrievalModeOptions(options); } } } catch (error) { console.error('获取检索模式选项失败:', error); // 保持默认选项 } }; const handleOpen = (kbId?: string) => { console.log('RecallTest - handleOpen called with kbId:', kbId); setKnowledgeBaseId(kbId || ''); form.resetFields(); setData([]); setRetrieveType('hybrid'); // 重置为默认值 // 确保表单字段也设置为默认值 form.setFieldsValue({ retrieve_type: 'hybrid' }); } const fetchData = (params: RecallTestParams) => { if (loading) return; setLoading(true); console.log('params', params); reChunks(params) .then((res) => { const response = res as RecallTestData[] ; setData(response || []) }) .finally(() => { setLoading(false); }); } const handleStartTest = () => { form.validateFields().then((values) => { const params: RecallTestParams = { query: values.query || '', kb_ids: knowledgeBaseId ? [knowledgeBaseId] : [], similarity_threshold: values.similarity_threshold || 0.2, vector_similarity_weight: values.vector_similarity_weight || 0.3, top_k: values.top_k || 1024, // hybrid: values.retrieve_type !== hybrid ? true : false, retrieve_type: retrieveType, }; console.log('RecallTest - params:', params); fetchData(params); }).catch((error) => { console.error('表单验证失败:', error); }); } // 暴露给父组件的方法 useImperativeHandle(ref, () => ({ handleOpen, })); return (
{ t('knowledgeBase.testQuestion')} {/*
refresh { t('knowledgeBase.loadSampleQuestions')}
*/}