feat(knowledge-config): enhance knowledge configuration form with accordion sections
- Add accordion sections for general, page rank, RAPTOR, and GraphRAG configurations - Implement detailed form controls for each configuration section - Update parser config interfaces to support new configuration options
This commit is contained in:
@@ -3,6 +3,54 @@ import knowledgeService from '@/services/knowledge_service';
|
|||||||
import type { IKnowledge, IKnowledgeResult } from '@/interfaces/database/knowledge';
|
import type { IKnowledge, IKnowledgeResult } from '@/interfaces/database/knowledge';
|
||||||
import type { IFetchKnowledgeListRequestParams } from '@/interfaces/request/knowledge';
|
import type { IFetchKnowledgeListRequestParams } from '@/interfaces/request/knowledge';
|
||||||
|
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
"avatar": "data:image/png;base64,iVBORw0K
|
||||||
|
"chunk_num": 1180,
|
||||||
|
"create_time": 1759986452748,
|
||||||
|
"description": " 213213",
|
||||||
|
"doc_num": 16,
|
||||||
|
"embd_id": "",
|
||||||
|
"id": "dcc2871aa4cd11f08d4116ac85b1de0a",
|
||||||
|
"language": "English",
|
||||||
|
"name": "k1123",
|
||||||
|
"pagerank": 0,
|
||||||
|
"parser_config": {
|
||||||
|
"auto_keywords": 0,
|
||||||
|
"auto_questions": 0,
|
||||||
|
"chunk_token_num": 512,
|
||||||
|
"delimiter": "\n",
|
||||||
|
"graphrag": {
|
||||||
|
"entity_types": [
|
||||||
|
"organization",
|
||||||
|
"person",
|
||||||
|
"geo",
|
||||||
|
"event",
|
||||||
|
"category"
|
||||||
|
],
|
||||||
|
"method": "light",
|
||||||
|
"use_graphrag": true
|
||||||
|
},
|
||||||
|
"html4excel": false,
|
||||||
|
"layout_recognize": "Plain Text",
|
||||||
|
"raptor": {
|
||||||
|
"max_cluster": 64,
|
||||||
|
"max_token": 256,
|
||||||
|
"prompt": "\u8bf7\u603b\u7ed3\u4ee5\u4e0b\u6bb5\u843d\u3002 \u5c0f\u5fc3\u6570\u5b57\uff0c\u4e0d\u8981\u7f16\u9020\u3002 \u6bb5\u843d\u5982\u4e0b\uff1a\n {cluster_content}\n\u4ee5\u4e0a\u5c31\u662f\u4f60\u9700\u8981\u603b\u7ed3\u7684\u5185\u5bb9\u3002",
|
||||||
|
"random_seed": 0,
|
||||||
|
"threshold": 0.1,
|
||||||
|
"use_raptor": false
|
||||||
|
},
|
||||||
|
"topn_tags": 3
|
||||||
|
},
|
||||||
|
"parser_id": "naive",
|
||||||
|
"permission": "team",
|
||||||
|
"size": 56819092,
|
||||||
|
"token_num": 293067,
|
||||||
|
"update_time": 1760436169574
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// 知识库列表Hook状态接口
|
// 知识库列表Hook状态接口
|
||||||
export interface UseKnowledgeListState {
|
export interface UseKnowledgeListState {
|
||||||
knowledgeBases: IKnowledge[];
|
knowledgeBases: IKnowledge[];
|
||||||
|
|||||||
@@ -1,5 +1,56 @@
|
|||||||
import type { RunningStatus } from '@/constants/knowledge';
|
import type { RunningStatus } from '@/constants/knowledge';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
"avatar": "data:image/png;base64,iVBORw0K
|
||||||
|
"chunk_num": 1180,
|
||||||
|
"create_time": 1759986452748,
|
||||||
|
"description": " 213213",
|
||||||
|
"doc_num": 16,
|
||||||
|
"embd_id": "",
|
||||||
|
"id": "dcc2871aa4cd11f08d4116ac85b1de0a",
|
||||||
|
"language": "English",
|
||||||
|
"name": "k1123",
|
||||||
|
"pagerank": 0,
|
||||||
|
"parser_config": {
|
||||||
|
"auto_keywords": 0,
|
||||||
|
"auto_questions": 0,
|
||||||
|
"chunk_token_num": 512,
|
||||||
|
"delimiter": "\n",
|
||||||
|
"graphrag": {
|
||||||
|
"entity_types": [
|
||||||
|
"organization",
|
||||||
|
"person",
|
||||||
|
"geo",
|
||||||
|
"event",
|
||||||
|
"category"
|
||||||
|
],
|
||||||
|
"method": "light",
|
||||||
|
"use_graphrag": true
|
||||||
|
},
|
||||||
|
"html4excel": false,
|
||||||
|
"layout_recognize": "Plain Text",
|
||||||
|
"raptor": {
|
||||||
|
"max_cluster": 64,
|
||||||
|
"max_token": 256,
|
||||||
|
"prompt": "\u8bf7\u603b\u7ed3\u4ee5\u4e0b\u6bb5\u843d\u3002 \u5c0f\u5fc3\u6570\u5b57\uff0c\u4e0d\u8981\u7f16\u9020\u3002 \u6bb5\u843d\u5982\u4e0b\uff1a\n {cluster_content}\n\u4ee5\u4e0a\u5c31\u662f\u4f60\u9700\u8981\u603b\u7ed3\u7684\u5185\u5bb9\u3002",
|
||||||
|
"random_seed": 0,
|
||||||
|
"threshold": 0.1,
|
||||||
|
"use_raptor": false
|
||||||
|
},
|
||||||
|
"topn_tags": 3
|
||||||
|
},
|
||||||
|
"parser_id": "naive",
|
||||||
|
"permission": "team",
|
||||||
|
"size": 56819092,
|
||||||
|
"token_num": 293067,
|
||||||
|
"update_time": 1760436169574
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 知识库接口定义
|
* 知识库接口定义
|
||||||
* 包含知识库的基本信息、配置和状态
|
* 包含知识库的基本信息、配置和状态
|
||||||
@@ -26,7 +77,7 @@ export interface IKnowledge {
|
|||||||
/** 知识库名称 */
|
/** 知识库名称 */
|
||||||
name: string;
|
name: string;
|
||||||
/** 解析器配置 */
|
/** 解析器配置 */
|
||||||
parser_config: ParserConfig;
|
parser_config: IParserConfig;
|
||||||
/** 解析器ID */
|
/** 解析器ID */
|
||||||
parser_id: string;
|
parser_id: string;
|
||||||
/** 管道ID */
|
/** 管道ID */
|
||||||
@@ -83,17 +134,60 @@ export interface IKnowledgeResult {
|
|||||||
/**
|
/**
|
||||||
* Raptor配置接口
|
* Raptor配置接口
|
||||||
* 用于配置是否启用Raptor功能
|
* 用于配置是否启用Raptor功能
|
||||||
|
{
|
||||||
|
"max_cluster": 64,
|
||||||
|
"max_token": 256,
|
||||||
|
"prompt": "\u8bf7\u603b\u7ed3\u4ee5\u4e0b\u6bb5\u843d\u3002
|
||||||
|
\u5c0f\u5fc3\u6570\u5b57\uff0c\u4e0d\u8981\u7f16\u9020\u3002 \u6bb5\u843d\u5982\u4e0b\uff1a\n
|
||||||
|
{cluster_content}\n\u4ee5\u4e0a\u5c31\u662f\u4f60\u9700\u8981\u603b\u7ed3\u7684\u5185\u5bb9\u3002",
|
||||||
|
"random_seed": 0,
|
||||||
|
"threshold": 0.1,
|
||||||
|
"use_raptor": false
|
||||||
|
}
|
||||||
*/
|
*/
|
||||||
export interface Raptor {
|
export interface IRaptor {
|
||||||
/** 是否使用Raptor */
|
/** 是否使用Raptor */
|
||||||
use_raptor: boolean;
|
use_raptor: boolean;
|
||||||
|
/** 最大集群数,可选 */
|
||||||
|
max_cluster?: number;
|
||||||
|
/** 最大令牌数,可选 */
|
||||||
|
max_token?: number;
|
||||||
|
/** 提示模板,可选 */
|
||||||
|
prompt?: string;
|
||||||
|
/** 随机种子,可选 */
|
||||||
|
random_seed?: number;
|
||||||
|
/** 阈值,可选 */
|
||||||
|
threshold?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GraphRAG配置接口
|
||||||
|
* 用于配置是否启用GraphRAG功能
|
||||||
|
{
|
||||||
|
"entity_types": [
|
||||||
|
"organization",
|
||||||
|
"person",
|
||||||
|
"geo",
|
||||||
|
"event",
|
||||||
|
"category"
|
||||||
|
],
|
||||||
|
"method": "light",
|
||||||
|
"use_graphrag": true
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
export interface IGraphrag {
|
||||||
|
use_graphrag: boolean;
|
||||||
|
/** 实体类型列表,可选 */
|
||||||
|
entity_types?: string[];
|
||||||
|
/** 方法,可选 */
|
||||||
|
method?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析器配置接口
|
* 解析器配置接口
|
||||||
* 定义文档解析的各种参数和选项
|
* 定义文档解析的各种参数和选项
|
||||||
*/
|
*/
|
||||||
export interface ParserConfig {
|
export interface IParserConfig {
|
||||||
/** 起始页码,可选 */
|
/** 起始页码,可选 */
|
||||||
from_page?: number;
|
from_page?: number;
|
||||||
/** 结束页码,可选 */
|
/** 结束页码,可选 */
|
||||||
@@ -111,13 +205,13 @@ export interface ParserConfig {
|
|||||||
/** 是否启用布局识别,可选 */
|
/** 是否启用布局识别,可选 */
|
||||||
layout_recognize?: boolean;
|
layout_recognize?: boolean;
|
||||||
/** Raptor配置,可选 */
|
/** Raptor配置,可选 */
|
||||||
raptor?: Raptor;
|
raptor?: IRaptor;
|
||||||
/** 标签知识库ID列表,可选 */
|
/** 标签知识库ID列表,可选 */
|
||||||
tag_kb_ids?: string[];
|
tag_kb_ids?: string[];
|
||||||
/** 顶部标签数量,可选 */
|
/** 顶部标签数量,可选 */
|
||||||
topn_tags?: number;
|
topn_tags?: number;
|
||||||
/** GraphRAG配置,可选 */
|
/** GraphRAG配置,可选 */
|
||||||
graphrag?: { use_graphrag?: boolean };
|
graphrag?: IGraphrag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,11 +12,62 @@ import {
|
|||||||
FormHelperText,
|
FormHelperText,
|
||||||
Button,
|
Button,
|
||||||
CircularProgress,
|
CircularProgress,
|
||||||
|
Switch,
|
||||||
|
FormControlLabel,
|
||||||
|
Chip,
|
||||||
|
Slider,
|
||||||
|
Accordion,
|
||||||
|
AccordionSummary,
|
||||||
|
AccordionDetails,
|
||||||
} from '@mui/material';
|
} from '@mui/material';
|
||||||
import {
|
import {
|
||||||
Save as SaveIcon,
|
Save as SaveIcon,
|
||||||
|
ExpandMore as ExpandMoreIcon,
|
||||||
|
Add as AddIcon,
|
||||||
} from '@mui/icons-material';
|
} from '@mui/icons-material';
|
||||||
import { DOCUMENT_PARSER_TYPES, type DocumentParserType } from '@/constants/knowledge';
|
import { DOCUMENT_PARSER_TYPES, type DocumentParserType } from '@/constants/knowledge';
|
||||||
|
import { type IParserConfig } from '@/interfaces/database/knowledge';
|
||||||
|
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
"kb_id": "dcc2871aa4cd11f08d4116ac85b1de0a",
|
||||||
|
"name": "k1123",
|
||||||
|
"description": " 213213",
|
||||||
|
"permission": "team",
|
||||||
|
"parser_id": "naive",
|
||||||
|
"embd_id": "",
|
||||||
|
"parser_config": {
|
||||||
|
"layout_recognize": "Plain Text",
|
||||||
|
"chunk_token_num": 512,
|
||||||
|
"delimiter": "\n",
|
||||||
|
"auto_keywords": 0,
|
||||||
|
"auto_questions": 0,
|
||||||
|
"html4excel": false,
|
||||||
|
"topn_tags": 3,
|
||||||
|
"raptor": {
|
||||||
|
"use_raptor": true,
|
||||||
|
"prompt": "请总结以下段落。 小心数字,不要编造。 段落如下:\n {cluster_content}\n以上就是你需要总结的内容。",
|
||||||
|
"max_token": 256,
|
||||||
|
"threshold": 0.1,
|
||||||
|
"max_cluster": 64,
|
||||||
|
"random_seed": 0
|
||||||
|
},
|
||||||
|
"graphrag": {
|
||||||
|
"use_graphrag": true,
|
||||||
|
"entity_types": [
|
||||||
|
"organization",
|
||||||
|
"person",
|
||||||
|
"geo",
|
||||||
|
"event",
|
||||||
|
"category"
|
||||||
|
],
|
||||||
|
"method": "light"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pagerank": 0
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
// 解析器选项配置
|
// 解析器选项配置
|
||||||
const parserOptions = [
|
const parserOptions = [
|
||||||
@@ -37,12 +88,8 @@ const parserOptions = [
|
|||||||
{ value: DOCUMENT_PARSER_TYPES.KnowledgeGraph, label: '知识图谱解析器', description: '构建知识图谱结构' },
|
{ value: DOCUMENT_PARSER_TYPES.KnowledgeGraph, label: '知识图谱解析器', description: '构建知识图谱结构' },
|
||||||
];
|
];
|
||||||
|
|
||||||
export interface ConfigFormData {
|
export interface ConfigFormData extends IParserConfig {
|
||||||
parser_id: DocumentParserType;
|
parser_id: DocumentParserType;
|
||||||
chunk_token_count?: number;
|
|
||||||
layout_recognize?: boolean;
|
|
||||||
task_page_size?: number;
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ChunkMethodFormProps {
|
interface ChunkMethodFormProps {
|
||||||
@@ -61,232 +108,432 @@ function ChunkMethodForm({
|
|||||||
isSubmitting = false,
|
isSubmitting = false,
|
||||||
onCancel,
|
onCancel,
|
||||||
disabled = false,
|
disabled = false,
|
||||||
submitButtonText = '提交',
|
submitButtonText = '保存',
|
||||||
cancelButtonText = '取消'
|
cancelButtonText = '取消'
|
||||||
}: ChunkMethodFormProps) {
|
}: ChunkMethodFormProps) {
|
||||||
const selectedParser: DocumentParserType = form.watch('parser_id');
|
const selectedParser: DocumentParserType = form.watch('parser_id');
|
||||||
|
const [entityTypes, setEntityTypes] = React.useState<string[]>(['organization', 'person', 'geo', 'event', 'category']);
|
||||||
|
|
||||||
// 根据选择的解析器显示不同的配置选项
|
// 通用配置部分
|
||||||
const renderParserSpecificConfig = () => {
|
const renderGeneralConfig = () => (
|
||||||
switch (selectedParser) {
|
<Accordion defaultExpanded>
|
||||||
case DOCUMENT_PARSER_TYPES.Naive:
|
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
|
||||||
return (
|
<Typography variant="h6">通用</Typography>
|
||||||
<Grid container spacing={3}>
|
</AccordionSummary>
|
||||||
<Grid size={{xs:12,sm:6}}>
|
<AccordionDetails>
|
||||||
|
<Grid container spacing={3}>
|
||||||
|
{/* 切片方法 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControl fullWidth disabled={disabled}>
|
||||||
|
<InputLabel>切片方法</InputLabel>
|
||||||
|
<Select
|
||||||
|
label="切片方法"
|
||||||
|
defaultValue={DOCUMENT_PARSER_TYPES.Naive}
|
||||||
|
{...form.register('parser_id')}
|
||||||
|
value={form.watch('parser_id') || DOCUMENT_PARSER_TYPES.Naive}
|
||||||
|
>
|
||||||
|
{parserOptions.map((option) => (
|
||||||
|
<MenuItem key={option.value} value={option.value}>
|
||||||
|
<Box>
|
||||||
|
<Typography variant="body1">{option.label}</Typography>
|
||||||
|
<Typography variant="caption" color="text.secondary">
|
||||||
|
{option.description}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
<FormHelperText>选择适合您文档类型的解析器</FormHelperText>
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* PDF解析器 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControl fullWidth disabled={disabled}>
|
||||||
|
<InputLabel>PDF解析器</InputLabel>
|
||||||
|
<Select
|
||||||
|
label="PDF解析器"
|
||||||
|
defaultValue="Naive"
|
||||||
|
disabled={disabled}
|
||||||
|
>
|
||||||
|
<MenuItem value="Naive">Naive</MenuItem>
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 嵌入模型 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControl fullWidth disabled={disabled}>
|
||||||
|
<InputLabel>嵌入模型</InputLabel>
|
||||||
|
<Select
|
||||||
|
label="嵌入模型"
|
||||||
|
defaultValue=""
|
||||||
|
disabled={disabled}
|
||||||
|
>
|
||||||
|
<MenuItem value="">请选择嵌入模型</MenuItem>
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 建议文本块大小 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<Typography gutterBottom>建议文本块大小</Typography>
|
||||||
|
<Box sx={{ px: 2 }}>
|
||||||
|
<Slider
|
||||||
|
defaultValue={512}
|
||||||
|
min={50}
|
||||||
|
max={2048}
|
||||||
|
step={1}
|
||||||
|
valueLabelDisplay="on"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('chunk_token_num', { valueAsNumber: true })}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Typography variant="caption" color="text.secondary" sx={{ ml: 2 }}>
|
||||||
|
512
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 文本分段标识符 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
label="文本分段标识符"
|
||||||
|
placeholder="\\n"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('delimiter')}
|
||||||
|
helperText="用于分割文本的分隔符"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</AccordionDetails>
|
||||||
|
</Accordion>
|
||||||
|
);
|
||||||
|
|
||||||
|
// 页面排名配置部分
|
||||||
|
const renderPageRankConfig = () => (
|
||||||
|
<Accordion>
|
||||||
|
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
|
||||||
|
<Typography variant="h6">页面排名</Typography>
|
||||||
|
</AccordionSummary>
|
||||||
|
<AccordionDetails>
|
||||||
|
<Grid container spacing={3}>
|
||||||
|
{/* 页面排名 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
|
||||||
|
<Typography>页面排名</Typography>
|
||||||
|
<Switch disabled={disabled} />
|
||||||
<TextField
|
<TextField
|
||||||
fullWidth
|
|
||||||
type="number"
|
type="number"
|
||||||
label="分块大小"
|
size="small"
|
||||||
placeholder="512"
|
defaultValue={0}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
{...form.register('chunk_token_num', {
|
sx={{ width: 100 }}
|
||||||
valueAsNumber: true,
|
|
||||||
min: {
|
|
||||||
value: 50,
|
|
||||||
message: '分块大小不能小于50',
|
|
||||||
},
|
|
||||||
max: {
|
|
||||||
value: 2048,
|
|
||||||
message: '分块大小不能超过2048',
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
error={!!form.formState.errors.chunk_token_num}
|
|
||||||
helperText={form.formState.errors.chunk_token_num?.message?.toString() || '设置每个文本块的最大token数量'}
|
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Box>
|
||||||
<Grid size={{xs:12,sm:6}}>
|
</Grid>
|
||||||
|
|
||||||
|
{/* 自动关键词提取 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
|
||||||
|
<Typography>自动关键词提取</Typography>
|
||||||
|
<Switch disabled={disabled} />
|
||||||
<TextField
|
<TextField
|
||||||
fullWidth
|
type="number"
|
||||||
label="分隔符"
|
size="small"
|
||||||
placeholder="\\n"
|
defaultValue={0}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
{...form.register('delimiter')}
|
sx={{ width: 100 }}
|
||||||
helperText="用于分割文本的分隔符"
|
{...form.register('auto_keywords', { valueAsNumber: true })}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Box>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
|
||||||
|
|
||||||
case DOCUMENT_PARSER_TYPES.Table:
|
{/* 自动问题提取 */}
|
||||||
return (
|
<Grid size={12}>
|
||||||
<Grid container spacing={3}>
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
|
||||||
<Grid size={12}>
|
<Typography>自动问题提取</Typography>
|
||||||
<Typography variant="body2" color="text.secondary">
|
<Switch disabled={disabled} />
|
||||||
表格解析器会自动处理表格结构,无需额外配置。
|
|
||||||
</Typography>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
);
|
|
||||||
|
|
||||||
case DOCUMENT_PARSER_TYPES.KnowledgeGraph:
|
|
||||||
return (
|
|
||||||
<Grid container spacing={3}>
|
|
||||||
<Grid size={12}>
|
|
||||||
<TextField
|
<TextField
|
||||||
fullWidth
|
type="number"
|
||||||
label="实体类型"
|
size="small"
|
||||||
placeholder="person,organization,location"
|
defaultValue={0}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
{...form.register('entity_types')}
|
sx={{ width: 100 }}
|
||||||
helperText="指定要提取的实体类型,用逗号分隔"
|
{...form.register('auto_questions', { valueAsNumber: true })}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
</Box>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
|
||||||
|
|
||||||
case DOCUMENT_PARSER_TYPES.Picture:
|
{/* 表格转HTML */}
|
||||||
return (
|
<Grid size={12}>
|
||||||
<Grid container spacing={3}>
|
<FormControlLabel
|
||||||
<Grid size={12}>
|
control={
|
||||||
<TextField
|
<Switch
|
||||||
fullWidth
|
disabled={disabled}
|
||||||
multiline
|
{...form.register('html4excel')}
|
||||||
rows={3}
|
/>
|
||||||
label="系统提示词"
|
}
|
||||||
placeholder="请描述图片中的内容..."
|
label="表格转HTML"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 标签集 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControl fullWidth disabled={disabled}>
|
||||||
|
<InputLabel>标签集</InputLabel>
|
||||||
|
<Select
|
||||||
|
label="标签集"
|
||||||
|
defaultValue=""
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
{...form.register('system_prompt')}
|
>
|
||||||
helperText="用于指导AI理解图片内容的提示词"
|
<MenuItem value="">请选择</MenuItem>
|
||||||
/>
|
</Select>
|
||||||
</Grid>
|
</FormControl>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
</Grid>
|
||||||
|
</AccordionDetails>
|
||||||
|
</Accordion>
|
||||||
|
);
|
||||||
|
|
||||||
default:
|
// RAPTOR集成配置部分
|
||||||
return (
|
const renderRaptorConfig = () => (
|
||||||
<Grid container spacing={3}>
|
<Accordion>
|
||||||
<Grid size={12}>
|
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
|
||||||
<Typography variant="body2" color="text.secondary">
|
<Typography variant="h6">使用召回增强RAPTOR集成</Typography>
|
||||||
该解析器使用默认配置,无需额外设置。
|
</AccordionSummary>
|
||||||
</Typography>
|
<AccordionDetails>
|
||||||
</Grid>
|
<Grid container spacing={3}>
|
||||||
|
{/* 启用RAPTOR */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControlLabel
|
||||||
|
control={
|
||||||
|
<Switch
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.use_raptor')}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
label="使用召回增强RAPTOR集成"
|
||||||
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
);
|
|
||||||
}
|
{/* 提示词 */}
|
||||||
};
|
<Grid size={12}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
multiline
|
||||||
|
rows={4}
|
||||||
|
label="提示词"
|
||||||
|
placeholder="请总结以下段落。小心数字,不要编造。段落如下: {cluster_content} 以上就是你需要总结的内容。"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.prompt')}
|
||||||
|
helperText="用于RAPTOR集成的提示词模板"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 最大token数 */}
|
||||||
|
<Grid size={{xs:12,sm:6}}>
|
||||||
|
<Typography gutterBottom>最大token数</Typography>
|
||||||
|
<Box sx={{ px: 2 }}>
|
||||||
|
<Slider
|
||||||
|
defaultValue={256}
|
||||||
|
min={50}
|
||||||
|
max={1000}
|
||||||
|
step={1}
|
||||||
|
valueLabelDisplay="on"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.max_token', { valueAsNumber: true })}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Typography variant="caption" color="text.secondary" sx={{ ml: 2 }}>
|
||||||
|
256
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 阈值 */}
|
||||||
|
<Grid size={{xs:12,sm:6}}>
|
||||||
|
<Typography gutterBottom>阈值</Typography>
|
||||||
|
<Box sx={{ px: 2 }}>
|
||||||
|
<Slider
|
||||||
|
defaultValue={0.1}
|
||||||
|
min={0 as number}
|
||||||
|
max={1}
|
||||||
|
step={0.01}
|
||||||
|
valueLabelDisplay="on"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.threshold', { valueAsNumber: true })}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Typography variant="caption" color="text.secondary" sx={{ ml: 2 }}>
|
||||||
|
0.1
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 最大聚类数 */}
|
||||||
|
<Grid size={{xs:12,sm:6}}>
|
||||||
|
<Typography gutterBottom>最大聚类数</Typography>
|
||||||
|
<Box sx={{ px: 2 }}>
|
||||||
|
<Slider
|
||||||
|
defaultValue={64}
|
||||||
|
min={1}
|
||||||
|
max={200 as number}
|
||||||
|
step={1}
|
||||||
|
valueLabelDisplay="on"
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.max_cluster', { valueAsNumber: true })}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Typography variant="caption" color="text.secondary" sx={{ ml: 2 }}>
|
||||||
|
64
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 随机种子 */}
|
||||||
|
<Grid size={{xs:12,sm:6}}>
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
type="number"
|
||||||
|
label="随机种子"
|
||||||
|
defaultValue={0}
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('raptor.random_seed', { valueAsNumber: true })}
|
||||||
|
InputProps={{
|
||||||
|
endAdornment: (
|
||||||
|
<Button size="small" disabled={disabled}>
|
||||||
|
+
|
||||||
|
</Button>
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</AccordionDetails>
|
||||||
|
</Accordion>
|
||||||
|
);
|
||||||
|
|
||||||
|
// 提取知识图谱配置部分
|
||||||
|
const renderGraphRagConfig = () => (
|
||||||
|
<Accordion>
|
||||||
|
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
|
||||||
|
<Typography variant="h6">提取知识图谱</Typography>
|
||||||
|
</AccordionSummary>
|
||||||
|
<AccordionDetails>
|
||||||
|
<Grid container spacing={3}>
|
||||||
|
{/* 启用知识图谱 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControlLabel
|
||||||
|
control={
|
||||||
|
<Switch
|
||||||
|
disabled={disabled}
|
||||||
|
{...form.register('graphrag.use_graphrag')}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
label="提取知识图谱"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 添加实体类型 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<Button
|
||||||
|
startIcon={<AddIcon />}
|
||||||
|
variant="outlined"
|
||||||
|
size="small"
|
||||||
|
disabled={disabled}
|
||||||
|
onClick={() => {
|
||||||
|
// 添加新实体类型的逻辑
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
+ 实体类型
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 实体类型标签 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<Typography variant="subtitle2" gutterBottom>实体类型</Typography>
|
||||||
|
<Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 1 }}>
|
||||||
|
{entityTypes.map((type, index) => (
|
||||||
|
<Chip
|
||||||
|
key={index}
|
||||||
|
label={type}
|
||||||
|
onDelete={disabled ? undefined : () => {
|
||||||
|
setEntityTypes(prev => prev.filter((_, i) => i !== index));
|
||||||
|
}}
|
||||||
|
disabled={disabled}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</Box>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 方法 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControl fullWidth disabled={disabled}>
|
||||||
|
<InputLabel>方法</InputLabel>
|
||||||
|
<Select
|
||||||
|
label="方法"
|
||||||
|
defaultValue="Light"
|
||||||
|
{...form.register('graphrag.method')}
|
||||||
|
>
|
||||||
|
<MenuItem value="Light">Light</MenuItem>
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 实体归一化 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControlLabel
|
||||||
|
control={<Switch disabled={disabled} />}
|
||||||
|
label="实体归一化"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
{/* 社区报告生成 */}
|
||||||
|
<Grid size={12}>
|
||||||
|
<FormControlLabel
|
||||||
|
control={<Switch disabled={disabled} />}
|
||||||
|
label="社区报告生成"
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
</AccordionDetails>
|
||||||
|
</Accordion>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Typography variant="h6" gutterBottom>
|
<Typography variant="h5" gutterBottom>
|
||||||
解析配置
|
配置
|
||||||
|
</Typography>
|
||||||
|
<Typography variant="body2" color="text.secondary" gutterBottom sx={{ mb: 3 }}>
|
||||||
|
在这里更新您的知识库详细信息,并更改切片方法。
|
||||||
</Typography>
|
</Typography>
|
||||||
|
|
||||||
<Grid container spacing={3}>
|
<Box sx={{ mb: 3 }}>
|
||||||
{/* 解析器选择 */}
|
{renderGeneralConfig()}
|
||||||
<Grid size={12}>
|
{renderPageRankConfig()}
|
||||||
<FormControl fullWidth disabled={disabled}>
|
{renderRaptorConfig()}
|
||||||
<InputLabel>解析器类型</InputLabel>
|
{renderGraphRagConfig()}
|
||||||
<Select
|
</Box>
|
||||||
label="解析器类型"
|
|
||||||
defaultValue={DOCUMENT_PARSER_TYPES.Naive}
|
|
||||||
{...form.register('parser_id')}
|
|
||||||
value={form.watch('parser_id') || DOCUMENT_PARSER_TYPES.Naive}
|
|
||||||
>
|
|
||||||
{parserOptions.map((option) => (
|
|
||||||
<MenuItem key={option.value} value={option.value}>
|
|
||||||
<Box>
|
|
||||||
<Typography variant="body1">{option.label}</Typography>
|
|
||||||
<Typography variant="caption" color="text.secondary">
|
|
||||||
{option.description}
|
|
||||||
</Typography>
|
|
||||||
</Box>
|
|
||||||
</MenuItem>
|
|
||||||
))}
|
|
||||||
</Select>
|
|
||||||
<FormHelperText>
|
|
||||||
选择适合您文档类型的解析器
|
|
||||||
</FormHelperText>
|
|
||||||
</FormControl>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
{/* 解析器特定配置 */}
|
{/* 操作按钮 */}
|
||||||
<Grid size={12}>
|
<Box sx={{ display: 'flex', gap: 2, justifyContent: 'flex-end' }}>
|
||||||
<Box sx={{ mt: 2 }}>
|
{onCancel && (
|
||||||
<Typography variant="subtitle2" gutterBottom>
|
<Button
|
||||||
解析器配置
|
variant="outlined"
|
||||||
</Typography>
|
onClick={onCancel}
|
||||||
{renderParserSpecificConfig()}
|
disabled={isSubmitting}
|
||||||
</Box>
|
>
|
||||||
</Grid>
|
{cancelButtonText}
|
||||||
|
</Button>
|
||||||
{/* 通用配置 */}
|
)}
|
||||||
<Grid size={12}>
|
<Button
|
||||||
<Box sx={{ mt: 2 }}>
|
variant="contained"
|
||||||
<Typography variant="subtitle2" gutterBottom>
|
onClick={form.handleSubmit(onSubmit)}
|
||||||
通用配置
|
disabled={disabled || isSubmitting}
|
||||||
</Typography>
|
startIcon={isSubmitting ? <CircularProgress size={20} /> : <SaveIcon />}
|
||||||
<Grid container spacing={3}>
|
>
|
||||||
<Grid size={{xs:12,sm:6}}>
|
{submitButtonText}
|
||||||
<TextField
|
</Button>
|
||||||
fullWidth
|
</Box>
|
||||||
type="number"
|
|
||||||
label="自动关键词数量"
|
|
||||||
placeholder="0"
|
|
||||||
disabled={disabled}
|
|
||||||
{...form.register('auto_keywords', {
|
|
||||||
valueAsNumber: true,
|
|
||||||
min: {
|
|
||||||
value: 0,
|
|
||||||
message: '关键词数量不能小于0',
|
|
||||||
},
|
|
||||||
max: {
|
|
||||||
value: 10,
|
|
||||||
message: '关键词数量不能超过10',
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
error={!!form.formState.errors.auto_keywords}
|
|
||||||
helperText={form.formState.errors.auto_keywords?.message?.toString() || '自动提取的关键词数量,0表示不提取'}
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
<Grid size={{xs:12,sm:6}}>
|
|
||||||
<TextField
|
|
||||||
fullWidth
|
|
||||||
type="number"
|
|
||||||
label="自动问题数量"
|
|
||||||
placeholder="0"
|
|
||||||
disabled={disabled}
|
|
||||||
{...form.register('auto_questions', {
|
|
||||||
valueAsNumber: true,
|
|
||||||
min: {
|
|
||||||
value: 0,
|
|
||||||
message: '问题数量不能小于0',
|
|
||||||
},
|
|
||||||
max: {
|
|
||||||
value: 10,
|
|
||||||
message: '问题数量不能超过10',
|
|
||||||
},
|
|
||||||
})}
|
|
||||||
error={!!form.formState.errors.auto_questions}
|
|
||||||
helperText={form.formState.errors.auto_questions?.message?.toString() || '自动生成的问题数量,0表示不生成'}
|
|
||||||
/>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
</Box>
|
|
||||||
</Grid>
|
|
||||||
|
|
||||||
{/* 操作按钮 */}
|
|
||||||
<Grid size={12}>
|
|
||||||
<Box sx={{ display: 'flex', gap: 2, justifyContent: 'flex-end', mt: 2 }}>
|
|
||||||
{onCancel && (
|
|
||||||
<Button
|
|
||||||
variant="outlined"
|
|
||||||
onClick={onCancel}
|
|
||||||
disabled={isSubmitting}
|
|
||||||
>
|
|
||||||
{cancelButtonText}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
onClick={form.handleSubmit(onSubmit)}
|
|
||||||
disabled={disabled || isSubmitting}
|
|
||||||
startIcon={isSubmitting ? <CircularProgress size={20} /> : <SaveIcon />}
|
|
||||||
>
|
|
||||||
{submitButtonText}
|
|
||||||
</Button>
|
|
||||||
</Box>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user