perf: 知识库录入

This commit is contained in:
archer
2023-03-31 18:23:07 +08:00
parent a3d74ec4a6
commit 5759cbeae0
5 changed files with 142 additions and 156 deletions

View File

@@ -119,20 +119,20 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
.select('text q') .select('text q')
.then((res) => { .then((res) => {
if (!res) return ''; if (!res) return '';
const questions = res.q.map((item) => item.text).join(' '); // const questions = res.q.map((item) => item.text).join(' ');
const answer = res.text; const answer = res.text;
return `${questions} ${answer}`; return `${answer}`;
}); });
}) })
) )
).filter((item) => item); ).filter((item) => item);
// textArr 筛选,最多 3000 tokens // textArr 筛选,最多 3000 tokens
const systemPrompt = systemPromptFilter(textArr, 2800); const systemPrompt = systemPromptFilter(textArr, 3400);
prompts.unshift({ prompts.unshift({
obj: 'SYSTEM', obj: 'SYSTEM',
value: `根据下面的知识回答问题: ${systemPrompt}` value: `${model.systemPrompt}。 我的知识库: "${systemPrompt}"`
}); });
// 控制在 tokens 数量,防止超出 // 控制在 tokens 数量,防止超出

View File

@@ -190,7 +190,11 @@ const Chat = ({ chatId }: { chatId: string }) => {
/** /**
* 发送一个内容 * 发送一个内容
*/ */
const sendPrompt = useCallback(async () => { const sendPrompt = useCallback(
async (e?: React.MouseEvent<HTMLDivElement>) => {
e?.stopPropagation();
e?.preventDefault();
const storeInput = inputVal; const storeInput = inputVal;
// 去除空行 // 去除空行
const val = inputVal const val = inputVal
@@ -264,7 +268,8 @@ const Chat = ({ chatId }: { chatId: string }) => {
history: newChatList.slice(0, newChatList.length - 2) history: newChatList.slice(0, newChatList.length - 2)
})); }));
} }
}, [ },
[
inputVal, inputVal,
chatData, chatData,
isChatting, isChatting,
@@ -274,7 +279,8 @@ const Chat = ({ chatId }: { chatId: string }) => {
gptChatPrompt, gptChatPrompt,
pushChatHistory, pushChatHistory,
chatId chatId
]); ]
);
// 删除一句话 // 删除一句话
const delChatRecord = useCallback( const delChatRecord = useCallback(

View File

@@ -19,7 +19,7 @@ import { DeleteIcon } from '@chakra-ui/icons';
import { customAlphabet } from 'nanoid'; import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12); const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12);
type FormData = { text: string; q: { val: string }[] }; type FormData = { text: string; q: string };
const InputDataModal = ({ const InputDataModal = ({
onClose, onClose,
@@ -36,17 +36,9 @@ const InputDataModal = ({
const { register, handleSubmit, control } = useForm<FormData>({ const { register, handleSubmit, control } = useForm<FormData>({
defaultValues: { defaultValues: {
text: '', text: '',
q: [{ val: '' }] q: ''
} }
}); });
const {
fields: inputQ,
append: appendQ,
remove: removeQ
} = useFieldArray({
control,
name: 'q'
});
const sureImportData = useCallback( const sureImportData = useCallback(
async (e: FormData) => { async (e: FormData) => {
@@ -58,10 +50,12 @@ const InputDataModal = ({
data: [ data: [
{ {
text: e.text, text: e.text,
q: e.q.map((item) => ({ q: [
{
id: nanoid(), id: nanoid(),
text: item.val text: e.q
})) }
]
} }
] ]
}); });
@@ -81,50 +75,46 @@ const InputDataModal = ({
); );
return ( return (
<Modal isOpen={true} onClose={onClose}> <Modal isOpen={true} onClose={onClose} isCentered>
<ModalOverlay /> <ModalOverlay />
<ModalContent maxW={'min(900px, 90vw)'} maxH={'80vh'} position={'relative'}> <ModalContent
m={0}
display={'flex'}
flexDirection={'column'}
h={'90vh'}
maxW={'90vw'}
position={'relative'}
>
<ModalHeader></ModalHeader> <ModalHeader></ModalHeader>
<ModalCloseButton /> <ModalCloseButton />
<Box px={6} pb={2} overflowY={'auto'}>
<Box mb={2}>:</Box> <Flex flex={'1 0 0'} h={0} px={6} pb={2}>
<Box flex={2} mr={4} h={'100%'}>
<Box h={'30px'}></Box>
<Textarea
placeholder="相关问题,可以回车输入多个问法, 最多500字"
maxLength={500}
resize={'none'}
h={'calc(100% - 30px)'}
{...register(`q`, {
required: '相关问题,可以回车输入多个问法'
})}
/>
</Box>
<Box flex={3} h={'100%'}>
<Box h={'30px'}></Box>
<Textarea <Textarea
mb={4}
placeholder="知识点" placeholder="知识点"
rows={3} resize={'none'}
maxH={'200px'} h={'calc(100% - 30px)'}
{...register(`text`, { {...register(`text`, {
required: '知识点' required: '知识点'
})} })}
/> />
{inputQ.map((item, index) => ( </Box>
<Box key={item.id} mb={5}>
<Box mb={2}>{index + 1}:</Box>
<Flex>
<Input
placeholder="问法"
{...register(`q.${index}.val`, {
required: '问法不能为空'
})}
></Input>
{inputQ.length > 1 && (
<IconButton
icon={<DeleteIcon />}
aria-label={'delete'}
colorScheme={'gray'}
variant={'unstyled'}
onClick={() => removeQ(index)}
/>
)}
</Flex> </Flex>
</Box>
))}
</Box>
<Flex px={6} pt={2} pb={4}> <Flex px={6} pt={2} pb={4}>
<Button alignSelf={'flex-start'} variant={'outline'} onClick={() => appendQ({ val: '' })}>
</Button>
<Box flex={1}></Box> <Box flex={1}></Box>
<Button variant={'outline'} mr={3} onClick={onClose}> <Button variant={'outline'} mr={3} onClick={onClose}>

View File

@@ -50,7 +50,7 @@ const ModelDataCard = ({ model }: { model: ModelSchema }) => {
pageNum pageNum
} = usePagination<ModelDataSchema>({ } = usePagination<ModelDataSchema>({
api: getModelDataList, api: getModelDataList,
pageSize: 10, pageSize: 8,
params: { params: {
modelId: model._id modelId: model._id
} }
@@ -119,7 +119,7 @@ const ModelDataCard = ({ model }: { model: ModelSchema }) => {
</Flex> </Flex>
{data && data.length > 0 && <Box fontSize={'xs'}>{data.length}...</Box>} {data && data.length > 0 && <Box fontSize={'xs'}>{data.length}...</Box>}
<Box mt={4}> <Box mt={4}>
<TableContainer h={'600px'} overflowY={'auto'}> <TableContainer>
<Table variant={'simple'}> <Table variant={'simple'}>
<Thead> <Thead>
<Tr> <Tr>
@@ -141,11 +141,8 @@ const ModelDataCard = ({ model }: { model: ModelSchema }) => {
whiteSpace={'pre-wrap'} whiteSpace={'pre-wrap'}
_notLast={{ mb: 1 }} _notLast={{ mb: 1 }}
> >
Q{i + 1}:{' '}
<Box as={'span'} userSelect={'all'}>
{item.text} {item.text}
</Box> </Box>
</Box>
))} ))}
</Td> </Td>
<Td minW={'200px'}> <Td minW={'200px'}>

View File

@@ -108,7 +108,7 @@ const ModelEditForm = ({
<Slider <Slider
aria-label="slider-ex-1" aria-label="slider-ex-1"
min={1} min={0}
max={10} max={10}
step={1} step={1}
value={getValues('temperature')} value={getValues('temperature')}
@@ -138,24 +138,17 @@ const ModelEditForm = ({
</Flex> </Flex>
</FormControl> </FormControl>
<Box mt={4}> <Box mt={4}>
{canTrain ? (
<Box fontWeight={'bold'}>
prompt
使 tokens
</Box>
) : (
<>
<Box mb={1}></Box> <Box mb={1}></Box>
<Textarea <Textarea
rows={6} rows={6}
maxLength={-1} maxLength={-1}
{...register('systemPrompt')} {...register('systemPrompt')}
placeholder={ placeholder={
'模型默认的 prompt 词,通过调整该内容,可以生成一个限定范围的模型。\n\n注意改功能会影响对话的整体朝向' canTrain
? '训练的模型会根据知识库内容,生成一部分系统提示词,因此在对话时需要消耗更多的 tokens。你仍可以增加一些提示词让其效果更精确。'
: '模型默认的 prompt 词,通过调整该内容,可以生成一个限定范围的模型。\n\n注意改功能会影响对话的整体朝向'
} }
/> />
</>
)}
</Box> </Box>
</Card> </Card>
{/* <Card p={4}> {/* <Card p={4}>