doomiaichat 4.6.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 CHANGED
@@ -1,4 +1,4 @@
1
- import { OpenAIApi, ChatCompletionRequestMessage } from "azure-openai";
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): Array<ChatCompletionRequestMessage>;
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
- 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"]}]的结构输出' //请将答案放在最后,标记为答案:()
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
- const arrContent = typeof (content) == 'string' ? this.splitLongText(content) : content;
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 subarray = arrContent.slice(0, 1);
331
- let itemCount = Math.min(Math.ceil(subarray.length * questions4EverySentense), count - gotted);
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, 4);
408
+ arrContent.splice(0, 1);
349
409
  }
350
410
  arrContent = []; /// 释放内存
351
411
  ///发出信号,解析完毕
@@ -426,7 +486,6 @@ 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
  */
@@ -436,8 +495,14 @@ class OpenAIGpt extends gptbase_1.default {
436
495
  ///还需要抓取题目
437
496
  if (remainCount[key] > 0) {
438
497
  noMoreQuestionRetrive = false;
439
- let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
440
- subarray.unshift({ role: 'system', content: QUESTION_TEXT_MAPPING[key].replace('@ITEMCOUNT@', itemCount) });
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()
441
506
  console.log('subarray', subarray);
442
507
  let result = yield this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
443
508
  console.log('subarray returned', result.successed);
@@ -452,7 +517,7 @@ class OpenAIGpt extends gptbase_1.default {
452
517
  totalscore = totalscore + pickedQuestions.length * ITEM_SCORE[key];
453
518
  }
454
519
  }
455
- subarray.splice(0, 1); ///把第一个角色定位的问法删除
520
+ //subarray.splice(0, 1); ///把第一个角色定位的问法删除
456
521
  // subarray.splice(subarray.length - 1, 1); ///把第一个角色定位的问法删除
457
522
  }
458
523
  }
@@ -607,9 +672,9 @@ class OpenAIGpt extends gptbase_1.default {
607
672
  break;
608
673
  }
609
674
  }
610
- const subtext = content.substr(start, realLength);
675
+ const subtext = content.substr(start, realLength).replace(/\t|\n|\v|\r|\f/g, '');
611
676
  if (subtext)
612
- message.push({ role: 'user', content: subtext });
677
+ message.push(subtext); //message.push({ role: 'user', content: subtext })
613
678
  start += realLength || len;
614
679
  }
615
680
  return message;
@@ -31,7 +31,7 @@ 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": paramOption.denoising_strength || this.apiOption.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
37
  "hr_scale": paramOption.hr_scale || this.apiOption.hr_scale || 2,
@@ -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 || 50,
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,
@@ -69,11 +69,11 @@ class StabilityPlusAI extends stabilityai_1.default {
69
69
  // "save_images": false,
70
70
  // "alwayson_scripts": {}
71
71
  } });
72
- console.log('param', param);
73
72
  const response = yield (0, declare_1.request)(param);
74
73
  if (response.successed) {
75
74
  return { successed: true, type: 'image', data: response.data.images, };
76
75
  }
76
+ console.log('response result ', response.data);
77
77
  return Object.assign({ successed: false }, response.data);
78
78
  }
79
79
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doomiaichat",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "description": "Doomisoft OpenAI",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
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
- 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
- }
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
- const arrContent = typeof (content) == 'string' ? this.splitLongText(content) : content;
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 subarray = arrContent.slice(0, 1);
300
- let itemCount = Math.min(Math.ceil(subarray.length * questions4EverySentense), count - gotted);
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, 4);
378
+ arrContent.splice(0, 1);
320
379
  }
321
380
  arrContent = []; /// 释放内存
322
381
  ///发出信号,解析完毕
@@ -393,7 +452,6 @@ 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
  */
@@ -404,8 +462,14 @@ export default class OpenAIGpt extends GptBase {
404
462
  if (remainCount[key] > 0) {
405
463
  noMoreQuestionRetrive = false;
406
464
 
407
- let itemCount = Math.min(remainCount[key], Math.ceil(subarray.length * sectionCount[key]));
408
- subarray.unshift({ role: 'system', content: QUESTION_TEXT_MAPPING[key].replace('@ITEMCOUNT@', itemCount) })
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()
409
473
  console.log('subarray', subarray)
410
474
  let result = await this.chatRequest(subarray, { replyCounts: 1 }, axiosOption);
411
475
  console.log('subarray returned', result.successed)
@@ -420,7 +484,7 @@ export default class OpenAIGpt extends GptBase {
420
484
  totalscore = totalscore + pickedQuestions.length * ITEM_SCORE[key];
421
485
  }
422
486
  }
423
- subarray.splice(0, 1); ///把第一个角色定位的问法删除
487
+ //subarray.splice(0, 1); ///把第一个角色定位的问法删除
424
488
  // subarray.splice(subarray.length - 1, 1); ///把第一个角色定位的问法删除
425
489
  }
426
490
  }
@@ -557,8 +621,8 @@ export default class OpenAIGpt extends GptBase {
557
621
  * 将一段很长的文本,按1024长度来划分到多个中
558
622
  * @param {*} content
559
623
  */
560
- protected splitLongText(content: string, len = SECTION_LENGTH): Array<ChatCompletionRequestMessage> {
561
- let start = 0, message: Array<ChatCompletionRequestMessage> = [], length = content.length;
624
+ protected splitLongText(content: string, len = SECTION_LENGTH): string[]{ //Array<ChatCompletionRequestMessage> {
625
+ let start = 0, message: string[] = [], length = content.length;
562
626
  while (start < length) {
563
627
 
564
628
  let realLength: number = len;
@@ -569,8 +633,8 @@ export default class OpenAIGpt extends GptBase {
569
633
  break;
570
634
  }
571
635
  }
572
- const subtext = content.substr(start, realLength);
573
- 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 })
574
638
  start += realLength || len;
575
639
  }
576
640
  return message;
@@ -20,7 +20,7 @@ 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": paramOption.denoising_strength || this.apiOption.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
26
  "hr_scale": paramOption.hr_scale || this.apiOption.hr_scale || 2,
@@ -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 || 50,
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,
@@ -60,11 +60,11 @@ export default class StabilityPlusAI extends StabilityAI {
60
60
  },
61
61
 
62
62
  };
63
- console.log('param', param)
64
63
  const response: any = await request(param)
65
64
  if (response.successed) {
66
65
  return { successed: true, type: 'image', data: response.data.images, };
67
66
  }
67
+ console.log('response result ', response.data)
68
68
  return { successed: false, ...response.data };
69
69
  } catch (error) {
70
70
  console.log('result is error ', error)