feat(enum): 统一结构化枚举值传输与同步

This commit is contained in:
2026-05-24 21:12:14 +08:00
parent bd8bfeb607
commit e37e8dfca6
23 changed files with 793 additions and 78 deletions

View File

@@ -47,13 +47,21 @@ export interface RagDocumentBatchUploadRequest {
remark?: string;
}
export type RagChunkStrategy =
| 'FIXED_LENGTH'
| 'PARAGRAPH'
| 'HEADING'
| 'TABLE_ROW'
| 'DELIMITER'
| 'SEMANTIC';
/**
* RAG 切片策略枚举值。
* <p>
* 前后端统一传递枚举值,不再传递字符串名称。
*/
export const RAG_CHUNK_STRATEGY = {
FIXED_LENGTH: 1,
PARAGRAPH: 2,
HEADING: 3,
TABLE_ROW: 4,
DELIMITER: 5,
SEMANTIC: 6,
} as const;
export type RagChunkStrategy = (typeof RAG_CHUNK_STRATEGY)[keyof typeof RAG_CHUNK_STRATEGY];
export interface RagDocumentParseRequest {
documentIds: string[];

View File

@@ -10,6 +10,7 @@ import {
parseRagDocuments,
queryRagDocuments,
saveRagDocument,
RAG_CHUNK_STRATEGY,
type RagChunkStrategy,
type RagDocument,
} from '@/api/ragDocuments';
@@ -49,19 +50,19 @@ const editForm = reactive({
const parseForm = reactive({
documentIds: [] as string[],
chunkStrategy: 'FIXED_LENGTH' as RagChunkStrategy,
chunkStrategy: RAG_CHUNK_STRATEGY.FIXED_LENGTH as RagChunkStrategy,
chunkSize: 800,
chunkOverlap: 120,
delimiter: '。',
});
const chunkStrategyOptions: Array<{ label: string; value: RagChunkStrategy; description: string }> = [
{ label: '固定长度切片', value: 'FIXED_LENGTH', description: '按指定长度和重叠长度切分通用文本' },
{ label: '按段落切片', value: 'PARAGRAPH', description: '按空行、自然段落边界切分' },
{ label: '按标题层级切片', value: 'HEADING', description: '按标题和章节层级组织内容' },
{ label: '按表格行切片', value: 'TABLE_ROW', description: '适合 Excel 表格和结构化明细数据' },
{ label: '按分隔符切片', value: 'DELIMITER', description: '按句号、换行符或自定义分隔符切分' },
{ label: '语义切片', value: 'SEMANTIC', description: '后续结合语义边界或模型能力切分' },
{ label: '固定长度切片', value: RAG_CHUNK_STRATEGY.FIXED_LENGTH, description: '按指定长度和重叠长度切分通用文本' },
{ label: '按段落切片', value: RAG_CHUNK_STRATEGY.PARAGRAPH, description: '按空行、自然段落边界切分' },
{ label: '按标题层级切片', value: RAG_CHUNK_STRATEGY.HEADING, description: '按标题和章节层级组织内容' },
{ label: '按表格行切片', value: RAG_CHUNK_STRATEGY.TABLE_ROW, description: '适合 Excel 表格和结构化明细数据' },
{ label: '按分隔符切片', value: RAG_CHUNK_STRATEGY.DELIMITER, description: '按句号、换行符或自定义分隔符切分' },
{ label: '语义切片', value: RAG_CHUNK_STRATEGY.SEMANTIC, description: '后续结合语义边界或模型能力切分' },
];
const filteredRows = computed(() => {
@@ -138,7 +139,7 @@ function openParseDialog(rows: RagDocument[]) {
return;
}
parseForm.documentIds = ids;
parseForm.chunkStrategy = 'FIXED_LENGTH';
parseForm.chunkStrategy = RAG_CHUNK_STRATEGY.FIXED_LENGTH;
parseForm.chunkSize = 800;
parseForm.chunkOverlap = 120;
parseForm.delimiter = '。';
@@ -467,13 +468,13 @@ onMounted(() => {
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="parseForm.chunkStrategy === 'FIXED_LENGTH'" label="切片长度">
<el-form-item v-if="parseForm.chunkStrategy === RAG_CHUNK_STRATEGY.FIXED_LENGTH" label="切片长度">
<el-input-number v-model="parseForm.chunkSize" :min="100" :max="4000" :step="100" />
</el-form-item>
<el-form-item v-if="parseForm.chunkStrategy === 'FIXED_LENGTH'" label="重叠长度">
<el-form-item v-if="parseForm.chunkStrategy === RAG_CHUNK_STRATEGY.FIXED_LENGTH" label="重叠长度">
<el-input-number v-model="parseForm.chunkOverlap" :min="0" :max="1000" :step="20" />
</el-form-item>
<el-form-item v-if="parseForm.chunkStrategy === 'DELIMITER'" label="分隔符">
<el-form-item v-if="parseForm.chunkStrategy === RAG_CHUNK_STRATEGY.DELIMITER" label="分隔符">
<el-input v-model="parseForm.delimiter" maxlength="20" placeholder="如 。、换行符或自定义符号" />
</el-form-item>
</el-form>

View File

@@ -29,6 +29,14 @@ vi.mock('@/api/ragStores', () => ({
vi.mock('@/api/ragDocuments', () => ({
SOURCE_TYPE_RAG: 'RAG',
RAG_CHUNK_STRATEGY: {
FIXED_LENGTH: 1,
PARAGRAPH: 2,
HEADING: 3,
TABLE_ROW: 4,
DELIMITER: 5,
SEMANTIC: 6,
},
queryRagDocuments: vi.fn((query?: { storeId?: string }) => {
const rows = [
{
@@ -178,7 +186,7 @@ describe('RagDocumentsPage', () => {
expect(parseRagDocuments).toHaveBeenCalledWith({
documentIds: ['11'],
chunkStrategy: 'FIXED_LENGTH',
chunkStrategy: 1,
chunkSize: 800,
chunkOverlap: 120,
delimiter: '。',