New dpcs structure and dataset i18n (#551)

* perf: check balance

* md

* lock way

* i18n

* docs

* doc

* i18n

* update doc

* feat: one link sync

* feat: one link sync

* feat: one link sync

* feat: one link sync

* feat: one link sync

* feat: one link sync

* feat: one link sync
This commit is contained in:
Archer
2023-12-04 21:37:07 +08:00
committed by GitHub
parent c3ae38df8b
commit 62e87551ac
141 changed files with 961 additions and 469 deletions

View File

@@ -41,7 +41,7 @@ const ChunkImport = () => {
} = useImportStore();
const { openConfirm, ConfirmModal } = useConfirm({
content: `该任务无法终止,需要一定时间生成索引,请确认导入。如果余额不足,未完成的任务会被暂停,充值后可继续进行。`
content: t('core.dataset.import.Import Tip')
});
return (
@@ -63,7 +63,11 @@ const ChunkImport = () => {
}
}}
>
<MyTooltip label={`范围: 100~${datasetDetail.vectorModel.maxToken}`}>
<MyTooltip
label={t('core.dataset.import.Chunk Range', {
max: datasetDetail.vectorModel.maxToken
})}
>
<NumberInput
ml={4}
defaultValue={chunkLen}
@@ -87,20 +91,22 @@ const ChunkImport = () => {
{/* price */}
<Flex py={4} alignItems={'center'}>
<Box>
{t('core.dataset.import.Estimated Price')}
<MyTooltip
label={`索引生成计费为: ${formatPrice(unitPrice, 1000)}/1k tokens`}
label={t('core.dataset.import.Estimated Price Tips', {
price: formatPrice(unitPrice, 1000)
})}
forceShow
>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<Box ml={4}>{price}</Box>
<Box ml={4}>{t('common.price.Amount', { amount: price, unit: '元' })}</Box>
</Flex>
<Flex mt={3}>
{showRePreview && (
<Button variant={'base'} mr={4} onClick={onReSplitChunks}>
{t('core.dataset.import.Re Preview')}
</Button>
)}
<Button isDisabled={uploading} onClick={openConfirm(onclickUpload)}>

View File

@@ -37,20 +37,20 @@ const CreateFileModal = ({
>
<ModalBody>
<Box mb={1} fontSize={'sm'}>
{t('common.file.File Name')}
</Box>
<Input
mb={5}
{...register('filename', {
required: '文件名不能为空'
required: t('common.file.Filename Can not Be Empty')
})}
/>
<Box mb={1} fontSize={'sm'}>
{t('common.file.File Content')}
</Box>
<Textarea
{...register('content', {
required: '文件内容不能为空'
required: t('common.file.File content can not be empty')
})}
rows={12}
whiteSpace={'nowrap'}
@@ -59,10 +59,10 @@ const CreateFileModal = ({
</ModalBody>
<ModalFooter>
<Button variant={'base'} mr={4} onClick={onClose}>
{t('common.Close')}
</Button>
<Button isLoading={isLoading} onClick={mutate}>
{t('common.Confirm Create')}
</Button>
</ModalFooter>
</MyModal>

View File

@@ -16,7 +16,7 @@ const CsvImport = () => {
useImportStore();
const { openConfirm, ConfirmModal } = useConfirm({
content: `该任务无法终止,需要一定时间生成索引,请确认导入。如果余额不足,未完成的任务会被暂停,充值后可继续进行。`
content: t('core.dataset.import.Import Tip')
});
return (
@@ -25,7 +25,7 @@ const CsvImport = () => {
fileExtension={fileExtension}
showUrlFetch={false}
fileTemplate={{
filename: 'csv 模板.csv',
filename: 'csv templates.csv',
value: csvTemplate,
type: 'text/csv'
}}
@@ -33,7 +33,11 @@ const CsvImport = () => {
>
<Flex mt={3}>
<Button isDisabled={uploading} onClick={openConfirm(onclickUpload)}>
{uploading ? <Box>{Math.round((successChunks / totalChunks) * 100)}%</Box> : '确认导入'}
{uploading ? (
<Box>{Math.round((successChunks / totalChunks) * 100)}%</Box>
) : (
t('common.Confirm Import')
)}
</Button>
</Flex>
</SelectorContainer>

View File

@@ -137,7 +137,7 @@ const FileSelect = ({
if (extension === 'csv') {
const { header, data } = await readCsvContent(file);
if (header[0] !== 'index' || header[1] !== 'content') {
throw new Error('csv 文件格式有误,请确保 index 和 content 两列');
throw new Error(t('core.dataset.import.Csv format error'));
}
const filterData = data
@@ -205,7 +205,7 @@ const FileSelect = ({
} catch (error: any) {
console.log(error);
toast({
title: getErrText(error, '解析文件失败'),
title: getErrText(error, t('common.file.Read File Error')),
status: 'error'
});
}

View File

@@ -10,7 +10,6 @@ const CsvImport = dynamic(() => import('./Csv'), {});
import MyModal from '@/components/MyModal';
import Provider from './Provider';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { qaModelList } from '@/web/common/system/staticData';
import {
DatasetCollectionTrainingModeEnum,
TrainingModeEnum
@@ -96,20 +95,20 @@ const ImportData = ({
list={[
{
icon: 'indexImport',
title: '直接分段',
desc: '选择文本文件,直接将其按分段进行处理',
title: t('core.dataset.import.Chunk Split'),
desc: t('core.dataset.import.Chunk Split Tip'),
value: ImportTypeEnum.chunk
},
{
icon: 'qaImport',
title: 'QA拆分',
desc: '选择文本文件,让大模型自动生成问答对',
title: t('core.dataset.import.QA Import'),
desc: t('core.dataset.import.QA Import Tip'),
value: ImportTypeEnum.qa
},
{
icon: 'csvImport',
title: 'CSV 导入',
desc: '批量导入问答对,是最精准的数据',
title: t('core.dataset.import.CSV Import'),
desc: t('core.dataset.import.CSV Import Tip'),
value: ImportTypeEnum.csv
}
]}

View File

@@ -178,12 +178,12 @@ const Provider = ({
},
onSuccess(num) {
toast({
title: `共成功导入 ${num} 组数据,请耐心等待训练.`,
title: t('core.dataset.import.Import Success Tip', { num }),
status: 'success'
});
onUploadSuccess();
},
errorToast: '导入文件失败'
errorToast: t('core.dataset.import.Import Failed')
});
const onReSplitChunks = useCallback(async () => {
@@ -212,10 +212,10 @@ const Provider = ({
} catch (error) {
toast({
status: 'warning',
title: getErrText(error, '文本分段异常')
title: getErrText(error, t('core.dataset.import.Set Chunk Error'))
});
}
}, [chunkLen, toast]);
}, [chunkLen, chunkOverlapRatio, t, toast]);
const reset = useCallback(() => {
setFiles([]);
@@ -255,6 +255,7 @@ export default React.memo(Provider);
export const PreviewFileOrChunk = () => {
const theme = useTheme();
const { t } = useTranslation();
const { setFiles, previewFile, setPreviewFile, setReShowRePreview, totalChunks, files } =
useImportStore();
@@ -312,11 +313,11 @@ export const PreviewFileOrChunk = () => {
<Box pt={[3, 6]}>
<Flex px={[4, 8]} alignItems={'center'}>
<Box fontSize={['lg', 'xl']} fontWeight={'bold'}>
({totalChunks})
{t('core.dataset.import.Total Chunk Preview', { totalChunks })}
</Box>
{totalChunks > 50 && (
<Box ml={2} fontSize={'sm'} color={'myhGray.500'}>
{t('core.dataset.import.Only Show First 50 Chunk')}
</Box>
)}
</Flex>

View File

@@ -7,10 +7,12 @@ import { QuestionOutlineIcon } from '@chakra-ui/icons';
import { Prompt_AgentQA } from '@/global/core/prompt/agent';
import { useImportStore, SelectorContainer, PreviewFileOrChunk } from './Provider';
import { useDatasetStore } from '@/web/core/dataset/store/dataset';
import { useTranslation } from 'next-i18next';
const fileExtension = '.txt, .docx, .pdf, .md';
const QAImport = () => {
const { t } = useTranslation();
const { datasetDetail } = useDatasetStore();
const agentModel = datasetDetail.agentModel;
const unitPrice = agentModel?.price || 3;
@@ -27,7 +29,7 @@ const QAImport = () => {
} = useImportStore();
const { openConfirm, ConfirmModal } = useConfirm({
content: `该任务无法终止!导入后会自动调用大模型生成问答对,会有一些细节丢失,请确认!如果余额不足,未完成的任务会被暂停。`
content: t('core.dataset.import.Import Tip')
});
const [prompt, setPrompt] = useState(Prompt_AgentQA.description);
@@ -38,7 +40,7 @@ const QAImport = () => {
{/* prompt */}
<Box p={3} bg={'myWhite.600'} borderRadius={'md'}>
<Box mb={1} fontWeight={'bold'}>
QA
{t('core.dataset.collection.QA Prompt')}
</Box>
<Box whiteSpace={'pre-wrap'} fontSize={'sm'}>
<Textarea
@@ -55,24 +57,30 @@ const QAImport = () => {
{/* price */}
<Flex py={5} alignItems={'center'}>
<Box>
{t('core.dataset.import.Estimated Price')}
<MyTooltip
label={`索引生成计费为: ${formatPrice(unitPrice, 1000)}/1k tokens`}
label={t('core.dataset.import.Estimated Price Tips', {
price: formatPrice(unitPrice, 1000)
})}
forceShow
>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<Box ml={4}>{price}</Box>
<Box ml={4}>{t('common.price.Amount', { amount: price, unit: '元' })}</Box>
</Flex>
<Flex mt={3}>
{showRePreview && (
<Button variant={'base'} mr={4} onClick={onReSplitChunks}>
{t('core.dataset.import.Re Preview')}
</Button>
)}
<Button isDisabled={uploading} onClick={openConfirm(() => onclickUpload({ prompt }))}>
{uploading ? <Box>{Math.round((successChunks / totalChunks) * 100)}%</Box> : '确认导入'}
{uploading ? (
<Box>{Math.round((successChunks / totalChunks) * 100)}%</Box>
) : (
t('common.Confirm Import')
)}
</Button>
</Flex>
</SelectorContainer>