doomiaichat 4.5.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/openai.d.ts +2 -2
- package/dist/openai.js +85 -16
- package/dist/stabilityai.d.ts +2 -0
- package/dist/stabilityplusai.js +5 -4
- package/package.json +1 -1
- package/src/openai.ts +88 -19
- package/src/stabilityai.ts +2 -0
- package/src/stabilityplusai.ts +5 -4
package/dist/openai.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OpenAIApi
|
|
1
|
+
import { OpenAIApi } from "azure-openai";
|
|
2
2
|
import GptBase from "./gptbase";
|
|
3
3
|
import { OpenAIApiParameters, ChatReponse, SummaryReponse, FaqItem, ExaminationPaperResult, EmotionResult, SimilarityResult, QuestionItem, CommentResult, EmbeddingResult } from './declare';
|
|
4
4
|
export default class OpenAIGpt extends GptBase {
|
|
@@ -108,5 +108,5 @@ export default class OpenAIGpt extends GptBase {
|
|
|
108
108
|
* 将一段很长的文本,按1024长度来划分到多个中
|
|
109
109
|
* @param {*} content
|
|
110
110
|
*/
|
|
111
|
-
protected splitLongText(content: string, len?: number):
|
|
111
|
+
protected splitLongText(content: string, len?: number): string[];
|
|
112
112
|
}
|
package/dist/openai.js
CHANGED
|
@@ -18,11 +18,56 @@ const gptbase_1 = __importDefault(require("./gptbase"));
|
|
|
18
18
|
const SECTION_LENGTH = 1024; ///每2400个字符分成一组
|
|
19
19
|
const MESSAGE_LENGTH = 1; ///每次送8句话给openai 进行解析,送多了,会报错
|
|
20
20
|
//请将答案放在最后,标记为答案:()
|
|
21
|
-
const QUESTION_TEXT_MAPPING = {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
// const QUESTION_TEXT_MAPPING: any = {
|
|
22
|
+
// singlechoice: '你是一名专业的出题老师,根据以下内容,生成@ITEMCOUNT@道单选题,每道题目4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题一个正确答案,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
23
|
+
// multiplechoice: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道多选题,提供4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题的答案至少有两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出', //请将答案放在最后,标记为答案:()
|
|
24
|
+
// trueorfalse: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道判断题,每道题正确和错误两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出', //标记为答案:(正确或错误)
|
|
25
|
+
// completion: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道填空题和对应答案,输出结果必须是JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出' //请将答案放在最后,标记为答案:()
|
|
26
|
+
// }
|
|
27
|
+
const FAQ_ROLE_DEFINE = `
|
|
28
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的问题及对应的答案和答案的关键词。请记住:
|
|
29
|
+
1、问题需要偏口语化,问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
30
|
+
2、对应的答案必须要在资料中能找到,绝对不能给出在资料里没有的答案,答案的关键词必须完整在所给的答案中出现,绝不能给出不在答案里的关键词;
|
|
31
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
32
|
+
4、生成的结果严格按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的标准JSON数组结构输出。
|
|
33
|
+
`;
|
|
34
|
+
const QUESTION_ROLE_DEFINE = {
|
|
35
|
+
singlechoice: `
|
|
36
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的单选题,每道题包括一个问题和四个选项,其中只有一个选项是正确的。请记住:
|
|
37
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
38
|
+
2、四个选项用大写字母ABCD开头,其中只有一个是正确的选项,而且这个正确的选项必须要在资料中能找到,绝对不能给出在资料里没有的正确选项;
|
|
39
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
40
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出`,
|
|
41
|
+
multiplechoice: `
|
|
42
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的多选题,每道题包括一个问题和四个选项,其中至少有两个选项是正确的。请记住:
|
|
43
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
44
|
+
2、四个选项用大写字母ABCD开头,其中至少有两个是正确的选项,而且正确的选项必须要在资料中能找到,绝对不能给出在资料里没有的正确选项;
|
|
45
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
46
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出
|
|
47
|
+
`,
|
|
48
|
+
trueorfalse: `
|
|
49
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的判断题,每道题包括一个问题和一个正确和一个错误的两个选项。请记住:
|
|
50
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
51
|
+
2、两个选项必须为“正确”和“错误”这两个,正确答案必须是其中一个;
|
|
52
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
53
|
+
5、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出'
|
|
54
|
+
`,
|
|
55
|
+
completion: `
|
|
56
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的填空题及对应的答案。请记住:
|
|
57
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
58
|
+
2、对应的答案必须要在资料中能找到,绝对不能给出在资料里没有的答案,答案尽量选择数字、词组等,字数不超过10个字,避免出现过长的答案;
|
|
59
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
60
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出'
|
|
61
|
+
`
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* 问题生成的Prompt
|
|
65
|
+
*/
|
|
66
|
+
const QUESTION_PROMPT = {
|
|
67
|
+
singlechoice: '根据以下内容,生成@ITEMCOUNT@道单选题,每道题目4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题一个正确答案,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
68
|
+
multiplechoice: '根据以下内容,请生成@ITEMCOUNT@道多选题,提供4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题的答案至少有两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
69
|
+
trueorfalse: '根据以下内容,请生成@ITEMCOUNT@道判断题,每道题正确和错误两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出',
|
|
70
|
+
completion: '根据以下内容,请生成@ITEMCOUNT@道填空题和对应答案,输出结果必须是JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出'
|
|
26
71
|
};
|
|
27
72
|
const QUESTION_TYPE = ['singlechoice', 'multiplechoice', 'trueorfalse', 'completion'];
|
|
28
73
|
class OpenAIGpt extends gptbase_1.default {
|
|
@@ -287,7 +332,16 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
287
332
|
*/
|
|
288
333
|
getSummaryOfContent(content, axiosOption = {}) {
|
|
289
334
|
return __awaiter(this, void 0, void 0, function* () {
|
|
290
|
-
|
|
335
|
+
let arrContent = [];
|
|
336
|
+
if (typeof (content) == 'string') {
|
|
337
|
+
let splittext = this.splitLongText(content);
|
|
338
|
+
for (const string of splittext) {
|
|
339
|
+
arrContent.push({ role: 'user', content: string });
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
arrContent = content;
|
|
344
|
+
}
|
|
291
345
|
let summary = [];
|
|
292
346
|
while (arrContent.length > 0) {
|
|
293
347
|
let subarray = arrContent.slice(0, MESSAGE_LENGTH);
|
|
@@ -327,10 +381,16 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
327
381
|
while (arrContent.length > 0 && gotted < count) {
|
|
328
382
|
questions4EverySentense = (count - gotted) / arrContent.length;
|
|
329
383
|
////每次最多送MESSAGE_LENGTH句话给openai
|
|
330
|
-
let
|
|
331
|
-
let
|
|
384
|
+
let itemCount = Math.min(Math.ceil(questions4EverySentense), count - gotted);
|
|
385
|
+
let subarray = [
|
|
386
|
+
{ role: 'system', content: FAQ_ROLE_DEFINE },
|
|
387
|
+
{ role: 'user', content: `从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。` },
|
|
388
|
+
{ role: 'user', content: arrContent.slice(0, 1)[0]
|
|
389
|
+
}
|
|
390
|
+
];
|
|
332
391
|
//subarray.push({ role: 'user', content:'请根据上述内容,给出一道提问与答案以及答案关键词,按照先问题内容,再标准答案,再关键词的顺序输出,关键词之间用、分开'})
|
|
333
|
-
subarray.unshift({ role: 'system', content: `你是一位专业培训师,从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。` })
|
|
392
|
+
//subarray.unshift({ role: 'system', content: `你是一位专业培训师,从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。` })
|
|
393
|
+
// subarray.unshift({role: 'system', content: FAQ_ROLE_DEFINE});
|
|
334
394
|
//subarray.unshift({ role: 'system', content: `你是一位专业程序开发工程师,根据以下内容,按照[{"question":"问题内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]JSON数组结构,给出${itemCount}条提问问题及答案以及答案关键词` })
|
|
335
395
|
// console.log('subarray', subarray)
|
|
336
396
|
let result = yield this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
|
|
@@ -345,7 +405,7 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
345
405
|
}
|
|
346
406
|
}
|
|
347
407
|
////删除已经处理的文本
|
|
348
|
-
arrContent.splice(0,
|
|
408
|
+
arrContent.splice(0, 1);
|
|
349
409
|
}
|
|
350
410
|
arrContent = []; /// 释放内存
|
|
351
411
|
///发出信号,解析完毕
|
|
@@ -426,18 +486,26 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
426
486
|
}, noMoreQuestionRetrive = false, totalscore = 0;
|
|
427
487
|
while (arrContent.length > 0 && !noMoreQuestionRetrive) {
|
|
428
488
|
////每次最多送MESSAGE_LENGTH句话给openai
|
|
429
|
-
let subarray = arrContent.slice(0, MESSAGE_LENGTH);
|
|
430
489
|
/**
|
|
431
490
|
* 每种类型的题目进行遍历
|
|
432
491
|
*/
|
|
492
|
+
console.log('arrContent.length', arrContent.length);
|
|
433
493
|
noMoreQuestionRetrive = true;
|
|
434
494
|
for (const key of QUESTION_TYPE) {
|
|
435
495
|
///还需要抓取题目
|
|
436
496
|
if (remainCount[key] > 0) {
|
|
437
497
|
noMoreQuestionRetrive = false;
|
|
438
|
-
let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
|
|
439
|
-
|
|
498
|
+
//let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
|
|
499
|
+
let itemCount = Math.min(remainCount[key], Math.ceil(sectionCount[key]));
|
|
500
|
+
let subarray = [
|
|
501
|
+
{ role: 'system', content: QUESTION_ROLE_DEFINE[key] },
|
|
502
|
+
{ role: 'user', content: QUESTION_PROMPT[key].replace('@ITEMCOUNT@', itemCount) },
|
|
503
|
+
{ role: 'user', content: arrContent.slice(0, 1)[0] }
|
|
504
|
+
];
|
|
505
|
+
// subarray.unshift()
|
|
506
|
+
console.log('subarray', subarray);
|
|
440
507
|
let result = yield this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
|
|
508
|
+
console.log('subarray returned', result.successed);
|
|
441
509
|
if (result.successed && result.message) {
|
|
442
510
|
//console.log('paper result', key, result.message.length)
|
|
443
511
|
let pickedQuestions = this.pickUpQuestions(result.message, itemCount, key, ITEM_SCORE[key]);
|
|
@@ -449,13 +517,14 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
449
517
|
totalscore = totalscore + pickedQuestions.length * ITEM_SCORE[key];
|
|
450
518
|
}
|
|
451
519
|
}
|
|
452
|
-
subarray.splice(0, 1);
|
|
520
|
+
//subarray.splice(0, 1); ///把第一个角色定位的问法删除
|
|
453
521
|
// subarray.splice(subarray.length - 1, 1); ///把第一个角色定位的问法删除
|
|
454
522
|
}
|
|
455
523
|
}
|
|
456
524
|
////删除已经处理的文本
|
|
457
525
|
arrContent.splice(0, MESSAGE_LENGTH);
|
|
458
526
|
}
|
|
527
|
+
console.log('parseover');
|
|
459
528
|
///发出信号,解析完毕
|
|
460
529
|
this.emit('parseover', { type: 'question', items: paperReturned });
|
|
461
530
|
return { successed: true, score: totalscore, paper: paperReturned };
|
|
@@ -603,9 +672,9 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
603
672
|
break;
|
|
604
673
|
}
|
|
605
674
|
}
|
|
606
|
-
const subtext = content.substr(start, realLength);
|
|
675
|
+
const subtext = content.substr(start, realLength).replace(/\t|\n|\v|\r|\f/g, '');
|
|
607
676
|
if (subtext)
|
|
608
|
-
message.push({ role: 'user', content: subtext })
|
|
677
|
+
message.push(subtext); //message.push({ role: 'user', content: subtext })
|
|
609
678
|
start += realLength || len;
|
|
610
679
|
}
|
|
611
680
|
return message;
|
package/dist/stabilityai.d.ts
CHANGED
package/dist/stabilityplusai.js
CHANGED
|
@@ -31,10 +31,10 @@ class StabilityPlusAI extends stabilityai_1.default {
|
|
|
31
31
|
try {
|
|
32
32
|
let param = Object.assign(Object.assign({}, axiosOption), { method: "post", url: `${paramOption.endpoint || this.apiSetting.endpoint}/sdapi/v1/txt2img`, data: {
|
|
33
33
|
"enable_hr": false,
|
|
34
|
-
"denoising_strength": 0,
|
|
34
|
+
"denoising_strength": paramOption.denoising_strength || this.apiOption.denoising_strength || 0.5,
|
|
35
35
|
"firstphase_width": 0,
|
|
36
36
|
"firstphase_height": 0,
|
|
37
|
-
"hr_scale": 2,
|
|
37
|
+
"hr_scale": paramOption.hr_scale || this.apiOption.hr_scale || 2,
|
|
38
38
|
"hr_upscaler": "string",
|
|
39
39
|
"hr_second_pass_steps": 0,
|
|
40
40
|
"hr_resize_x": 0,
|
|
@@ -46,10 +46,10 @@ class StabilityPlusAI extends stabilityai_1.default {
|
|
|
46
46
|
"subseed_strength": 0,
|
|
47
47
|
"seed_resize_from_h": -1,
|
|
48
48
|
"seed_resize_from_w": -1,
|
|
49
|
-
"sampler_name": paramOption.sampler || this.apiOption.sampler || "Euler",
|
|
49
|
+
"sampler_name": paramOption.sampler || this.apiOption.sampler || "Euler a",
|
|
50
50
|
"batch_size": 1,
|
|
51
51
|
"n_iter": paramOption.samples || this.apiOption.samples || 1,
|
|
52
|
-
"steps": paramOption.steps || this.apiOption.steps ||
|
|
52
|
+
"steps": paramOption.steps || this.apiOption.steps || 20,
|
|
53
53
|
"cfg_scale": paramOption.cfg_scale || this.apiOption.cfg_scale || 7,
|
|
54
54
|
"width": paramOption.width || this.apiOption.width || 512,
|
|
55
55
|
"height": paramOption.height || this.apiOption.height || 512,
|
|
@@ -73,6 +73,7 @@ class StabilityPlusAI extends stabilityai_1.default {
|
|
|
73
73
|
if (response.successed) {
|
|
74
74
|
return { successed: true, type: 'image', data: response.data.images, };
|
|
75
75
|
}
|
|
76
|
+
console.log('response result ', response.data);
|
|
76
77
|
return Object.assign({ successed: false }, response.data);
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
package/package.json
CHANGED
package/src/openai.ts
CHANGED
|
@@ -5,13 +5,58 @@ import { OpenAIApiParameters, ChatReponse, OutlineSummaryItem, SummaryReponse, F
|
|
|
5
5
|
const SECTION_LENGTH = 1024; ///每2400个字符分成一组
|
|
6
6
|
const MESSAGE_LENGTH = 1; ///每次送8句话给openai 进行解析,送多了,会报错
|
|
7
7
|
//请将答案放在最后,标记为答案:()
|
|
8
|
-
const QUESTION_TEXT_MAPPING: any = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
8
|
+
// const QUESTION_TEXT_MAPPING: any = {
|
|
9
|
+
// singlechoice: '你是一名专业的出题老师,根据以下内容,生成@ITEMCOUNT@道单选题,每道题目4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题一个正确答案,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
10
|
+
// multiplechoice: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道多选题,提供4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题的答案至少有两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出', //请将答案放在最后,标记为答案:()
|
|
11
|
+
// trueorfalse: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道判断题,每道题正确和错误两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出', //标记为答案:(正确或错误)
|
|
12
|
+
// completion: '你是一名专业的出题老师,根据以下内容,请生成@ITEMCOUNT@道填空题和对应答案,输出结果必须是JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出' //请将答案放在最后,标记为答案:()
|
|
13
|
+
// }
|
|
14
|
+
const FAQ_ROLE_DEFINE = `
|
|
15
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的问题及对应的答案和答案的关键词。请记住:
|
|
16
|
+
1、问题需要偏口语化,问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
17
|
+
2、对应的答案必须要在资料中能找到,绝对不能给出在资料里没有的答案,答案的关键词必须完整在所给的答案中出现,绝不能给出不在答案里的关键词;
|
|
18
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
19
|
+
4、生成的结果严格按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的标准JSON数组结构输出。
|
|
20
|
+
`
|
|
14
21
|
|
|
22
|
+
const QUESTION_ROLE_DEFINE: any = {
|
|
23
|
+
singlechoice: `
|
|
24
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的单选题,每道题包括一个问题和四个选项,其中只有一个选项是正确的。请记住:
|
|
25
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
26
|
+
2、四个选项用大写字母ABCD开头,其中只有一个是正确的选项,而且这个正确的选项必须要在资料中能找到,绝对不能给出在资料里没有的正确选项;
|
|
27
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
28
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出`,
|
|
29
|
+
multiplechoice: `
|
|
30
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的多选题,每道题包括一个问题和四个选项,其中至少有两个选项是正确的。请记住:
|
|
31
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
32
|
+
2、四个选项用大写字母ABCD开头,其中至少有两个是正确的选项,而且正确的选项必须要在资料中能找到,绝对不能给出在资料里没有的正确选项;
|
|
33
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
34
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出
|
|
35
|
+
`,
|
|
36
|
+
trueorfalse: `
|
|
37
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的判断题,每道题包括一个问题和一个正确和一个错误的两个选项。请记住:
|
|
38
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
39
|
+
2、两个选项必须为“正确”和“错误”这两个,正确答案必须是其中一个;
|
|
40
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
41
|
+
5、生成的结果严格按照标准JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出'
|
|
42
|
+
`,
|
|
43
|
+
completion: `
|
|
44
|
+
角色扮演:你是一位精通各行业的培训专家,你擅长从资料里提取重点要点,并形成用于培训员工的填空题及对应的答案。请记住:
|
|
45
|
+
1、问题需要与所给的资料相关,绝不能问超出所给资料的范围;每个问题需要有主语,所提问题需要准确、完整、清晰,绝不能有歧义;意思相近的问题不要重复给出;
|
|
46
|
+
2、对应的答案必须要在资料中能找到,绝对不能给出在资料里没有的答案,答案尽量选择数字、词组等,字数不超过10个字,避免出现过长的答案;
|
|
47
|
+
3、生成问题的时候,请出具有代表性的问题,对于一些无关紧要的问题可以忽略。特别注意资料中关于数字、参数、特点等关键信息的提取,在给出的问题中尽可能覆盖;
|
|
48
|
+
4、生成的结果严格按照标准JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出'
|
|
49
|
+
`
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 问题生成的Prompt
|
|
53
|
+
*/
|
|
54
|
+
const QUESTION_PROMPT: any ={
|
|
55
|
+
singlechoice:'根据以下内容,生成@ITEMCOUNT@道单选题,每道题目4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题一个正确答案,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
56
|
+
multiplechoice: '根据以下内容,请生成@ITEMCOUNT@道多选题,提供4个选项,每道题的选项中的元素用大写字母ABCD开头,每道题的答案至少有两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":[],"answer":[]}]的结构输出',
|
|
57
|
+
trueorfalse: '根据以下内容,请生成@ITEMCOUNT@道判断题,每道题正确和错误两个选项,输出结果必须是JSON数组并按照[{"question":"","choice":["A.正确","B.错误"],"answer":[]}]的结构输出',
|
|
58
|
+
completion: '根据以下内容,请生成@ITEMCOUNT@道填空题和对应答案,输出结果必须是JSON数组并按照[{"question":"","answer":["填空答案1","填空答案2"]}]的结构输出'
|
|
59
|
+
}
|
|
15
60
|
const QUESTION_TYPE: string[] = ['singlechoice', 'multiplechoice', 'trueorfalse', 'completion']
|
|
16
61
|
|
|
17
62
|
export default class OpenAIGpt extends GptBase {
|
|
@@ -260,7 +305,15 @@ export default class OpenAIGpt extends GptBase {
|
|
|
260
305
|
* @param axiosOption
|
|
261
306
|
*/
|
|
262
307
|
override async getSummaryOfContent(content: string | Array<any>, axiosOption: any = {}): Promise<SummaryReponse> {
|
|
263
|
-
|
|
308
|
+
let arrContent:any[] =[];
|
|
309
|
+
if (typeof (content) == 'string'){
|
|
310
|
+
let splittext = this.splitLongText(content);
|
|
311
|
+
for (const string of splittext){
|
|
312
|
+
arrContent.push({ role: 'user', content: string })
|
|
313
|
+
}
|
|
314
|
+
}else{
|
|
315
|
+
arrContent = content;
|
|
316
|
+
}
|
|
264
317
|
let summary: Array<OutlineSummaryItem> = [];
|
|
265
318
|
while (arrContent.length > 0) {
|
|
266
319
|
let subarray = arrContent.slice(0, MESSAGE_LENGTH);
|
|
@@ -296,10 +349,16 @@ export default class OpenAIGpt extends GptBase {
|
|
|
296
349
|
while (arrContent.length > 0 && gotted < count) {
|
|
297
350
|
questions4EverySentense = (count - gotted) / arrContent.length
|
|
298
351
|
////每次最多送MESSAGE_LENGTH句话给openai
|
|
299
|
-
let
|
|
300
|
-
let
|
|
352
|
+
let itemCount = Math.min(Math.ceil(questions4EverySentense), count - gotted);
|
|
353
|
+
let subarray = [
|
|
354
|
+
{ role: 'system', content: FAQ_ROLE_DEFINE },
|
|
355
|
+
{ role: 'user', content: `从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。`},
|
|
356
|
+
{ role: 'user', content: arrContent.slice(0, 1)[0]
|
|
357
|
+
}
|
|
358
|
+
]
|
|
301
359
|
//subarray.push({ role: 'user', content:'请根据上述内容,给出一道提问与答案以及答案关键词,按照先问题内容,再标准答案,再关键词的顺序输出,关键词之间用、分开'})
|
|
302
|
-
subarray.unshift({ role: 'system', content: `你是一位专业培训师,从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。` })
|
|
360
|
+
//subarray.unshift({ role: 'system', content: `你是一位专业培训师,从以下内容中提取${itemCount}条提问及答案,并从答案内容提取出至少2个关键词,最终结果按照[{"question":"提问内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]的JSON数组结构输出。` })
|
|
361
|
+
// subarray.unshift({role: 'system', content: FAQ_ROLE_DEFINE});
|
|
303
362
|
//subarray.unshift({ role: 'system', content: `你是一位专业程序开发工程师,根据以下内容,按照[{"question":"问题内容","answer":"答案内容","keywords":["关键词1","关键词2"]}]JSON数组结构,给出${itemCount}条提问问题及答案以及答案关键词` })
|
|
304
363
|
// console.log('subarray', subarray)
|
|
305
364
|
let result = await this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
|
|
@@ -316,7 +375,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
316
375
|
}
|
|
317
376
|
|
|
318
377
|
////删除已经处理的文本
|
|
319
|
-
arrContent.splice(0,
|
|
378
|
+
arrContent.splice(0, 1);
|
|
320
379
|
}
|
|
321
380
|
arrContent = []; /// 释放内存
|
|
322
381
|
///发出信号,解析完毕
|
|
@@ -393,19 +452,27 @@ export default class OpenAIGpt extends GptBase {
|
|
|
393
452
|
|
|
394
453
|
while (arrContent.length > 0 && !noMoreQuestionRetrive) {
|
|
395
454
|
////每次最多送MESSAGE_LENGTH句话给openai
|
|
396
|
-
let subarray = arrContent.slice(0, MESSAGE_LENGTH);
|
|
397
455
|
/**
|
|
398
456
|
* 每种类型的题目进行遍历
|
|
399
457
|
*/
|
|
458
|
+
console.log('arrContent.length', arrContent.length)
|
|
400
459
|
noMoreQuestionRetrive = true;
|
|
401
460
|
for (const key of QUESTION_TYPE) {
|
|
402
461
|
///还需要抓取题目
|
|
403
462
|
if (remainCount[key] > 0) {
|
|
404
463
|
noMoreQuestionRetrive = false;
|
|
405
464
|
|
|
406
|
-
let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
|
|
407
|
-
|
|
465
|
+
//let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
|
|
466
|
+
let itemCount = Math.min(remainCount[key], Math.ceil(sectionCount[key]));
|
|
467
|
+
let subarray:any[] = [
|
|
468
|
+
{ role: 'system', content: QUESTION_ROLE_DEFINE[key] },
|
|
469
|
+
{ role: 'user', content: QUESTION_PROMPT[key].replace('@ITEMCOUNT@', itemCount) },
|
|
470
|
+
{ role: 'user', content: arrContent.slice(0, 1)[0] }
|
|
471
|
+
]
|
|
472
|
+
// subarray.unshift()
|
|
473
|
+
console.log('subarray', subarray)
|
|
408
474
|
let result = await this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
|
|
475
|
+
console.log('subarray returned', result.successed)
|
|
409
476
|
if (result.successed && result.message) {
|
|
410
477
|
//console.log('paper result', key, result.message.length)
|
|
411
478
|
let pickedQuestions = this.pickUpQuestions(result.message, itemCount, key, ITEM_SCORE[key]);
|
|
@@ -417,13 +484,15 @@ export default class OpenAIGpt extends GptBase {
|
|
|
417
484
|
totalscore = totalscore + pickedQuestions.length * ITEM_SCORE[key];
|
|
418
485
|
}
|
|
419
486
|
}
|
|
420
|
-
subarray.splice(0, 1); ///把第一个角色定位的问法删除
|
|
487
|
+
//subarray.splice(0, 1); ///把第一个角色定位的问法删除
|
|
421
488
|
// subarray.splice(subarray.length - 1, 1); ///把第一个角色定位的问法删除
|
|
422
489
|
}
|
|
423
490
|
}
|
|
491
|
+
|
|
424
492
|
////删除已经处理的文本
|
|
425
493
|
arrContent.splice(0, MESSAGE_LENGTH);
|
|
426
494
|
}
|
|
495
|
+
console.log('parseover')
|
|
427
496
|
///发出信号,解析完毕
|
|
428
497
|
this.emit('parseover', { type: 'question', items: paperReturned })
|
|
429
498
|
return { successed: true, score: totalscore, paper: paperReturned }
|
|
@@ -552,8 +621,8 @@ export default class OpenAIGpt extends GptBase {
|
|
|
552
621
|
* 将一段很长的文本,按1024长度来划分到多个中
|
|
553
622
|
* @param {*} content
|
|
554
623
|
*/
|
|
555
|
-
protected splitLongText(content: string, len = SECTION_LENGTH): Array<ChatCompletionRequestMessage> {
|
|
556
|
-
let start = 0, message:
|
|
624
|
+
protected splitLongText(content: string, len = SECTION_LENGTH): string[]{ //Array<ChatCompletionRequestMessage> {
|
|
625
|
+
let start = 0, message: string[] = [], length = content.length;
|
|
557
626
|
while (start < length) {
|
|
558
627
|
|
|
559
628
|
let realLength: number = len;
|
|
@@ -564,8 +633,8 @@ export default class OpenAIGpt extends GptBase {
|
|
|
564
633
|
break;
|
|
565
634
|
}
|
|
566
635
|
}
|
|
567
|
-
const subtext = content.substr(start, realLength)
|
|
568
|
-
if (subtext) message.push({ role: 'user', content: subtext })
|
|
636
|
+
const subtext = content.substr(start, realLength).replace(/\t|\n|\v|\r|\f/g, '')
|
|
637
|
+
if (subtext) message.push(subtext); //message.push({ role: 'user', content: subtext })
|
|
569
638
|
start += realLength || len;
|
|
570
639
|
}
|
|
571
640
|
return message;
|
package/src/stabilityai.ts
CHANGED
package/src/stabilityplusai.ts
CHANGED
|
@@ -20,10 +20,10 @@ export default class StabilityPlusAI extends StabilityAI {
|
|
|
20
20
|
url: `${paramOption.endpoint || this.apiSetting.endpoint}/sdapi/v1/txt2img`,
|
|
21
21
|
data: {
|
|
22
22
|
"enable_hr": false,
|
|
23
|
-
"denoising_strength": 0,
|
|
23
|
+
"denoising_strength": paramOption.denoising_strength || this.apiOption.denoising_strength || 0.5,
|
|
24
24
|
"firstphase_width": 0,
|
|
25
25
|
"firstphase_height": 0,
|
|
26
|
-
"hr_scale": 2,
|
|
26
|
+
"hr_scale": paramOption.hr_scale || this.apiOption.hr_scale || 2,
|
|
27
27
|
"hr_upscaler": "string",
|
|
28
28
|
"hr_second_pass_steps": 0,
|
|
29
29
|
"hr_resize_x": 0,
|
|
@@ -35,10 +35,10 @@ export default class StabilityPlusAI extends StabilityAI {
|
|
|
35
35
|
"subseed_strength": 0,
|
|
36
36
|
"seed_resize_from_h": -1,
|
|
37
37
|
"seed_resize_from_w": -1,
|
|
38
|
-
"sampler_name": paramOption.sampler || this.apiOption.sampler || "Euler", //"Euler",
|
|
38
|
+
"sampler_name": paramOption.sampler || this.apiOption.sampler || "Euler a", //"Euler",
|
|
39
39
|
"batch_size": 1,
|
|
40
40
|
"n_iter": paramOption.samples || this.apiOption.samples || 1, //生成的数量
|
|
41
|
-
"steps": paramOption.steps || this.apiOption.steps ||
|
|
41
|
+
"steps": paramOption.steps || this.apiOption.steps || 20,
|
|
42
42
|
"cfg_scale": paramOption.cfg_scale || this.apiOption.cfg_scale || 7,
|
|
43
43
|
"width": paramOption.width || this.apiOption.width || 512,
|
|
44
44
|
"height": paramOption.height || this.apiOption.height || 512,
|
|
@@ -64,6 +64,7 @@ export default class StabilityPlusAI extends StabilityAI {
|
|
|
64
64
|
if (response.successed) {
|
|
65
65
|
return { successed: true, type: 'image', data: response.data.images, };
|
|
66
66
|
}
|
|
67
|
+
console.log('response result ', response.data)
|
|
67
68
|
return { successed: false, ...response.data };
|
|
68
69
|
} catch (error) {
|
|
69
70
|
console.log('result is error ', error)
|