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')
.then((res) => {
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;
return `${questions} ${answer}`;
return `${answer}`;
});
})
)
).filter((item) => item);
// textArr 筛选,最多 3000 tokens
const systemPrompt = systemPromptFilter(textArr, 2800);
const systemPrompt = systemPromptFilter(textArr, 3400);
prompts.unshift({
obj: 'SYSTEM',
value: `根据下面的知识回答问题: ${systemPrompt}`
value: `${model.systemPrompt}。 我的知识库: "${systemPrompt}"`
});
// 控制在 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 val = inputVal
@@ -264,7 +268,8 @@ const Chat = ({ chatId }: { chatId: string }) => {
history: newChatList.slice(0, newChatList.length - 2)
}));
}
}, [
},
[
inputVal,
chatData,
isChatting,
@@ -274,7 +279,8 @@ const Chat = ({ chatId }: { chatId: string }) => {
gptChatPrompt,
pushChatHistory,
chatId
]);
]
);
// 删除一句话
const delChatRecord = useCallback(

View File

@@ -19,7 +19,7 @@ import { DeleteIcon } from '@chakra-ui/icons';
import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 12);
type FormData = { text: string; q: { val: string }[] };
type FormData = { text: string; q: string };
const InputDataModal = ({
onClose,
@@ -36,17 +36,9 @@ const InputDataModal = ({
const { register, handleSubmit, control } = useForm<FormData>({
defaultValues: {
text: '',
q: [{ val: '' }]
q: ''
}
});
const {
fields: inputQ,
append: appendQ,
remove: removeQ
} = useFieldArray({
control,
name: 'q'
});
const sureImportData = useCallback(
async (e: FormData) => {
@@ -58,10 +50,12 @@ const InputDataModal = ({
data: [
{
text: e.text,
q: e.q.map((item) => ({
q: [
{
id: nanoid(),
text: item.val
}))
text: e.q
}
]
}
]
});
@@ -81,50 +75,46 @@ const InputDataModal = ({
);
return (
<Modal isOpen={true} onClose={onClose}>
<Modal isOpen={true} onClose={onClose} isCentered>
<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>
<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
mb={4}
placeholder="知识点"
rows={3}
maxH={'200px'}
resize={'none'}
h={'calc(100% - 30px)'}
{...register(`text`, {
required: '知识点'
})}
/>
{inputQ.map((item, index) => (
<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)}
/>
)}
</Box>
</Flex>
</Box>
))}
</Box>
<Flex px={6} pt={2} pb={4}>
<Button alignSelf={'flex-start'} variant={'outline'} onClick={() => appendQ({ val: '' })}>
</Button>
<Box flex={1}></Box>
<Button variant={'outline'} mr={3} onClick={onClose}>

View File

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

View File

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