import React, { useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import { Box, Container, Typography, Paper, TextField, Button, Slider, FormControl, InputLabel, Select, MenuItem, FormControlLabel, Switch, Fab, Snackbar, Alert, Grid, Card, CardContent, Chip, Divider, Stack, CircularProgress, } from '@mui/material'; import { ArrowBack as ArrowBackIcon, Search as SearchIcon, Psychology as PsychologyIcon, } from '@mui/icons-material'; import { useKnowledgeDetail } from '@/hooks/knowledge-hooks'; import knowledgeService from '@/services/knowledge_service'; import type { ITestRetrievalRequestBody } from '@/interfaces/request/knowledge'; import type { ITestingResult, ITestingChunk, ITestingDocument } from '@/interfaces/database/knowledge'; import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs'; interface TestFormData { question: string; similarity_threshold: number; vector_similarity_weight: number; rerank_id?: string; top_k: number; use_kg: boolean; highlight: boolean; } interface ResultViewProps { result: ITestingResult | null; loading: boolean; } function ResultView({ result, loading }: ResultViewProps) { if (loading) { return ( 正在检索测试... ); } if (!result) { return ( 请输入测试问题并点击测试按钮 ); } return ( {/* 测试结果概览 */} 测试结果概览 {result.total} 匹配的文档块 {result.documents?.length || 0} 相关文档 {result.chunks?.length || 0} 返回的块数 {/* 匹配的文档块 */} {result.chunks && result.chunks.length > 0 && ( 匹配的文档块 {result.chunks.map((chunk: ITestingChunk, index: number) => ( 文档: {chunk.document_name} {chunk.vector_similarity && ( )} {chunk.term_similarity && ( )} {chunk.content || '内容不可用'} ))} )} {/* 相关文档统计 */} {result.documents && result.documents.length > 0 && ( 相关文档统计 {result.documents.map((doc: ITestingDocument, index: number) => ( {doc.doc_name} ))} )} ); } function KnowledgeBaseTesting() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const [testResult, setTestResult] = useState(null); const [testing, setTesting] = useState(false); const [snackbar, setSnackbar] = useState<{ open: boolean; message: string; severity: 'success' | 'error'; }>({ open: false, message: '', severity: 'success', }); // 获取知识库详情 const { knowledge, loading: detailLoading } = useKnowledgeDetail(id || ''); // 测试表单 const form = useForm({ defaultValues: { question: '', similarity_threshold: 0.2, vector_similarity_weight: 0.3, rerank_id: '', top_k: 6, use_kg: false, highlight: true, }, }); const { register, handleSubmit, watch, setValue, formState: { errors } } = form; const handleTestSubmit = async (data: TestFormData) => { if (!id) return; try { setTesting(true); const requestBody: ITestRetrievalRequestBody = { question: data.question, similarity_threshold: data.similarity_threshold, vector_similarity_weight: data.vector_similarity_weight, top_k: data.top_k, use_kg: data.use_kg, highlight: data.highlight, kb_id: [id], }; if (data.rerank_id && data.rerank_id.trim()) { requestBody.rerank_id = data.rerank_id; } const response = await knowledgeService.retrievalTest(requestBody); if (response.data.code === 0) { setTestResult(response.data.data); setSnackbar({ open: true, message: '检索测试完成', severity: 'success', }); } else { throw new Error(response.data.message || '检索测试失败'); } } catch (error: any) { setSnackbar({ open: true, message: error.message || '检索测试失败', severity: 'error', }); } finally { setTesting(false); } }; const handleBackToDetail = () => { navigate(`/knowledge/${id}`); }; const handleCloseSnackbar = () => { setSnackbar(prev => ({ ...prev, open: false })); }; if (detailLoading) { return ( 加载中... ); } return ( {/* 面包屑导航 */} 知识库测试 {knowledge?.name} {/* 测试表单 */} 测试配置 相似度阈值: {watch('similarity_threshold')} setValue('similarity_threshold', value as number)} min={0} max={1} step={0.1} marks valueLabelDisplay="auto" /> 向量相似度权重: {watch('vector_similarity_weight')} setValue('vector_similarity_weight', value as number)} min={0} max={1} step={0.1} marks valueLabelDisplay="auto" /> setValue('use_kg', e.target.checked)} /> } label="使用知识图谱" sx={{ mt: 2 }} /> setValue('highlight', e.target.checked)} /> } label="高亮显示" sx={{ mt: 1 }} /> {/* 测试结果 */} {/* 返回按钮 */} {/* 消息提示 */} {snackbar.message} ); } export default KnowledgeBaseTesting;