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 }}
/>
: }
sx={{ mt: 3 }}
>
{testing ? '测试中...' : '开始测试'}
{/* 测试结果 */}
{/* 返回按钮 */}
{/* 消息提示 */}
{snackbar.message}
);
}
export default KnowledgeBaseTesting;