feat: 摘要拆分

This commit is contained in:
archer
2023-03-26 22:09:59 +08:00
parent 888642f154
commit 3e4487ad9a
20 changed files with 397 additions and 83 deletions

View File

@@ -20,7 +20,8 @@ export async function generateQA(next = false): Promise<any> {
// 找出一个需要生成的 dataItem
dataItem = await DataItem.findOne({
status: { $ne: 0 },
times: { $gt: 0 }
times: { $gt: 0 },
type: 'QA'
});
if (!dataItem) {
@@ -49,62 +50,72 @@ export async function generateQA(next = false): Promise<any> {
throw new Error('获取 openai key 失败');
}
console.log('正在生成一QA, ID:', dataItem._id, 'temperature: ', dataItem.temperature / 100);
console.log('正在生成一QA, ID:', dataItem._id);
const startTime = Date.now();
// 获取 openai 请求实例
const chatAPI = getOpenAIApi(userApiKey || systemKey);
// 请求 chatgpt 获取回答
const response = await chatAPI.createChatCompletion(
{
model: ChatModelNameEnum.GPT35,
temperature: dataItem.temperature / 100,
n: 1,
messages: [
systemPrompt,
const response = await Promise.allSettled(
[0, 0.5, 0.8].map((temperature) =>
chatAPI.createChatCompletion(
{
role: 'user',
content: dataItem.text
model: ChatModelNameEnum.GPT35,
temperature: temperature,
n: 1,
messages: [
systemPrompt,
{
role: 'user',
content: dataItem?.text || ''
}
]
},
{
timeout: 120000,
httpsAgent
}
]
},
{
timeout: 120000,
httpsAgent
}
)
)
);
// 过滤出成功的响应
const successResponse = response.filter((item) => item.status === 'fulfilled');
// 提取响应内容
const rawContents: string[] = successResponse.map(
(item: any) => item?.value?.data.choices[0].message?.content || ''
);
const content = response.data.choices[0].message?.content;
// 从 content 中提取 QA
const splitResponse = splitText(content || '');
const splitResponses = rawContents.map((content) => splitText(content)).flat();
// 插入数据库,并修改状态
await DataItem.findByIdAndUpdate(dataItem._id, {
status: dataItem.temperature >= 90 ? 0 : 1, // 需要生成 4 组内容。0,0.3,0.6,0.9
temperature: dataItem.temperature >= 90 ? dataItem.temperature : dataItem.temperature + 30,
status: 0,
$push: {
rawResponse: content,
rawResponse: {
$each: rawContents
},
result: {
$each: splitResponse
$each: splitResponses
}
}
});
// 计费
!userApiKey &&
splitResponse.length > 0 &&
splitResponses.length > 0 &&
pushSplitDataBill({
userId: dataItem.userId,
text: systemPrompt.content + dataItem.text + content
type: 'QA',
text: systemPrompt.content + dataItem.text + rawContents.join('')
});
console.log(
'生成QA成功time:',
`${(Date.now() - startTime) / 1000}s`,
'QA数量',
splitResponse.length
splitResponses.length
);
} catch (error: any) {
console.log('error: 生成QA错误', dataItem?._id);
console.log('response:', error?.response);
// 重置状态
if (dataItem?._id) {
await DataItem.findByIdAndUpdate(dataItem._id, {
status: dataItem.times > 0 ? 1 : 0, // 还有重试次数则可以继续进行