@3-/aiapi 0.1.79 → 0.1.81

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/check/GEN.js CHANGED
@@ -7,13 +7,13 @@ export default {
7
7
  items: {
8
8
  type: TYPE.OBJECT,
9
9
  properties: {
10
- title: {
10
+ question: {
11
11
  type: TYPE.STRING,
12
- description: '简短的标题,概述研究内容'
12
+ description: '从对话中提炼出的、具有明确事实属性,可通过网络搜索验证的关键行业洞察。必须是可以被证明或者证伪的命题。请避免无法验证的主观形容词'
13
13
  },
14
- question: {
14
+ title: {
15
15
  type: TYPE.STRING,
16
- description: '从对话中提炼出的、具有明确事实属性且可通过外部搜索验证的关键行业洞察,是可以被证明或者证伪的命题。请避免无法验证的主观形容词。'
16
+ description: '从最少字概述命题(必须是一个命题)作为标题'
17
17
  },
18
18
  zh: {
19
19
  type: TYPE.ARRAY,
package/check/SEARCH.js CHANGED
@@ -9,14 +9,14 @@ export default {
9
9
  description: `请执行以下结构化的研究报告撰写任务:
10
10
  1. 章节拆分规划:首先,请根据研究主题的内在逻辑,将报告内容拆分为3-5个主要章节,每个章节需有明确的主题和研究范围。
11
11
  2. 研究过程汇报:其次,详细记录并汇报研究实施的完整过程,包括但不限于:研究方法选择、数据收集途径、分析工具使用、关键节点时间线等。
12
- 3. 资料汇总整理:然后,在最后一章中,基于汇总的资料进行严谨的逻辑推理,分析数据间的关联性和规律,最终得出明确、有依据的研究结论。`,
12
+ 3. 资料汇总整理:然后,在最后一章中,基于汇总的资料进行严谨的逻辑推理,分析数据间的关联性和规律,最终得出明确、有依据的研究结论,如果无法得出答案,请写存疑。`,
13
13
  items: {
14
14
  type: TYPE.OBJECT,
15
15
  required: ['title', 'md'],
16
16
  properties: {
17
17
  title: {
18
18
  type: TYPE.STRING,
19
- description: '章节标题'
19
+ description: '章节标题(只需要标题,不标注是第几章)'
20
20
  },
21
21
  md: {
22
22
  type: TYPE.STRING,
@@ -27,11 +27,15 @@ export default {
27
27
  },
28
28
  结论: {
29
29
  type: TYPE.STRING,
30
- description: '一句话概述研究结论(支持还是不支持命题)'
30
+ description: '一句话概述研究结论(支持还是不支持命题,如果不确定,请写存疑)'
31
+ },
32
+ 分: {
33
+ type: TYPE.INTEGER,
34
+ description: '1=支持,0=不确定,-1=不支持'
31
35
  },
32
36
  文献: {
33
37
  type: TYPE.ARRAY,
34
- description: '参考资料',
38
+ description: '参考资料(按重要程度排序,重要的在前面)',
35
39
  minItems: 1,
36
40
  items: {
37
41
  type: TYPE.OBJECT,
@@ -43,7 +47,7 @@ export default {
43
47
  },
44
48
  brief: {
45
49
  type: TYPE.STRING,
46
- description: '概述文章内容'
50
+ description: '抽取与命题有关的文章内容、数据'
47
51
  },
48
52
  url: {
49
53
  type: TYPE.STRING,
@@ -53,5 +57,5 @@ export default {
53
57
  }
54
58
  }
55
59
  },
56
- required: ['结论', '研究', "文献"]
60
+ required: ['结论', '研究', "文献", "分"]
57
61
  };
package/fmt.js CHANGED
@@ -4,8 +4,8 @@ import fmtJson from './fmtJson.js';
4
4
  import partition from './partition.js';
5
5
 
6
6
  export default async(chat, txt) => {
7
- var pli;
8
- pli = (await partition(chat, txt));
7
+ var pli, 题;
8
+ [题, pli] = (await partition(chat, txt));
9
9
  if (!pli.length) {
10
10
  return '';
11
11
  }
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@3-/aiapi","version":"0.1.79","repository":{"type":"git","url":"git+https://atomgit.com/i18n/lib.git"},"homepage":"https://atomgit.com/i18n/lib/tree/dev/aiapi","author":"i18n.site@gmail.com","license":"MulanPSL-2.0","exports":{".":"./lib.js","./*":"./*"},"files":["./*"],"devDependencies":{"@3-/read":"^0.1.4"},"scripts":{},"type":"module","dependencies":{"@3-/retry":"^0.0.2","@3-/rm_cn_space":"^0.1.1","@3-/sleep":"^0.0.4","@3-/txt_li":"^0.1.5","@3-/utf8":"^0.0.4","lodash-es":"^4.17.21"}}
1
+ {"name":"@3-/aiapi","version":"0.1.81","repository":{"type":"git","url":"git+https://atomgit.com/i18n/lib.git"},"homepage":"https://atomgit.com/i18n/lib/tree/dev/aiapi","author":"i18n.site@gmail.com","license":"MulanPSL-2.0","exports":{".":"./lib.js","./*":"./*"},"files":["./*"],"devDependencies":{"@3-/read":"^0.1.4"},"scripts":{},"type":"module","dependencies":{"@3-/retry":"^0.0.2","@3-/rm_cn_space":"^0.1.1","@3-/sleep":"^0.0.4","@3-/txt_li":"^0.1.5","@3-/utf8":"^0.0.4","lodash-es":"^4.17.21"}}
package/partition.js CHANGED
@@ -1,4 +1,4 @@
1
- import seg from "./seg.js";
1
+ import { default as seg, segWithTitle } from "./seg.js";
2
2
  import txtLi from "@3-/txt_li";
3
3
  import rmCnSpace from "@3-/rm_cn_space";
4
4
 
@@ -43,8 +43,9 @@ const partition = async (li, title_number, remain_seg) => {
43
43
 
44
44
  export default async (chat, txt) => {
45
45
  if (!txt) {
46
- return [];
46
+ return ["", []];
47
47
  }
48
- const li = txtLi(txt).map((i) => rmCnSpace(i));
49
- return partition(li, await seg(chat, li), repartition(chat, li.length));
48
+ const li = txtLi(txt).map((i) => rmCnSpace(i)),
49
+ [title, seg_li] = await segWithTitle(chat, li);
50
+ return [title, await partition(li, seg_li, repartition(chat, li.length))];
50
51
  };
package/researchFmt.js CHANGED
@@ -10,8 +10,8 @@ import SEARCH from './check/SEARCH.js';
10
10
  import refmt from './refmt.js';
11
11
 
12
12
  export default async(chat, txt) => {
13
- var fmt, gen_txt, pli, search;
14
- pli = (await partition(chat, txt));
13
+ var fmt, gen_txt, pli, search, 文章标题;
14
+ [文章标题, pli] = (await partition(chat, txt));
15
15
  if (!pli.length) {
16
16
  return [];
17
17
  }
@@ -20,12 +20,12 @@ export default async(chat, txt) => {
20
20
  return '# ' + title + '\n' + li.join('\n');
21
21
  }).join('\n');
22
22
  search = Promise.all(((await chat(gen_txt, GEN, "你是专业的风险投资人"))).map(async(i) => {
23
- var body, en, question, reason, title, zh, 文献, 研究, 结论;
23
+ var body, en, question, reason, title, zh, 分, 文献, 研究, 结论;
24
24
  // console.log i
25
25
  ({title, question, zh, en, reason} = i);
26
26
  body = title + '\n研究命题: ' + question + '\n中文搜索词: ' + zh + '\n英文搜索词: ' + en;
27
27
  console.log('\n# ' + body);
28
- ({结论, 研究, 文献} = (await chat('请基于搜索(包括权威媒体、财报、论文等),对以下命题深度研究:\n' + body, SEARCH, '利用搜索工具进行客观理性的研究分析,以数据为支撑来推演', {
28
+ ({结论, 研究, 文献, 分} = (await chat('请基于搜索(包括权威媒体、财报、论文等),对以下命题深度研究:\n' + body, SEARCH, '利用搜索工具进行客观理性的研究分析,以数据为支撑来推演', {
29
29
  tools: [
30
30
  {
31
31
  google_search: {}
@@ -35,7 +35,15 @@ export default async(chat, txt) => {
35
35
  }
36
36
  ]
37
37
  })));
38
- return '## ' + title.trim() + '\n\n**<u>问题:</u>** ' + question.trim() + '\n\n**<u>结论</u>:** ' + 结论.trim() + '\n\n' + 研究.map(({title, md}) => {
38
+ title = title.trim();
39
+ if (分 > 0) {
40
+ title = '✅ ' + title;
41
+ } else if (分 < 0) {
42
+ title = '❌ ' + title;
43
+ } else {
44
+ title = '❓ ' + title;
45
+ }
46
+ return '## ' + title + '\n\n**<u>命题:</u>** ' + question.trim() + '\n\n**<u>结论</u>:** ' + 结论.trim() + '\n\n' + 研究.map(({title, md}) => {
39
47
  return '### ' + title + '\n\n' + md;
40
48
  }).join('\n') + '\n\n### 参考资料\n\n' + 文献.map(({title, brief, url}, pos) => {
41
49
  return (pos + 1) + '. [' + title + '](' + url + ') : ' + brief;
@@ -45,5 +53,5 @@ export default async(chat, txt) => {
45
53
  if (search.length) {
46
54
  fmt += '# 机器投研\n\n' + search.map(refmt).join('\n');
47
55
  }
48
- return fmt;
56
+ return [文章标题, fmt];
49
57
  };
package/seg.js CHANGED
@@ -1,34 +1,64 @@
1
1
  #!/usr/bin/env -S node --trace-uncaught --expose-gc --unhandled-rejections=strict --experimental-wasm-modules
2
+ var OPT, OPT_WITH_TITLE, gen;
3
+
2
4
  import TYPE from './TYPE.js';
3
5
 
4
- export default async(chat, txt_li) => {
5
- var split_li, 提示词;
6
+ OPT = {
7
+ type: TYPE.OBJECT,
8
+ required: ['li'],
9
+ properties: {
10
+ li: {
11
+ type: TYPE.ARRAY,
12
+ description: '拆分文章为多个章节,每个章节包含一系列问答对',
13
+ minItems: 1,
14
+ items: {
15
+ type: TYPE.OBJECT,
16
+ properties: {
17
+ 题: {
18
+ description: '章节标题(只写标题,不写序号、注释)',
19
+ type: TYPE.STRING
20
+ },
21
+ 行: {
22
+ description: '该章最后一句的行号',
23
+ type: TYPE.INTEGER
24
+ }
25
+ },
26
+ required: ['题', '行']
27
+ }
28
+ }
29
+ }
30
+ };
31
+
32
+ OPT_WITH_TITLE = structuredClone(OPT);
33
+
34
+ OPT_WITH_TITLE.required.push('题');
35
+
36
+ OPT_WITH_TITLE.properties.题 = {
37
+ type: TYPE.STRING,
38
+ description: '文章总标题(要简短)'
39
+ };
40
+
41
+ gen = async(opt, chat, txt_li) => {
42
+ var r, 提示词;
6
43
  提示词 = `下文第1列为行号,第2列为对话内容,以tab分隔。
7
44
  请划分章节,每章不要太长也不要太短,千字左右一章。
8
45
  输出章节标题、每章最后一句号的行号。
9
46
  输出格式为json数组:\n` + txt_li.map((i, pos) => {
10
47
  return (pos + 1) + '\t' + i.trim();
11
48
  }).join('\n');
12
- split_li = (await chat(提示词, {
13
- type: TYPE.ARRAY,
14
- description: '拆分文章为多个章节,每个章节包含一系列问答对',
15
- minItems: 1,
16
- items: {
17
- type: TYPE.OBJECT,
18
- properties: {
19
- 题: {
20
- description: '章节标题(只写标题,不写注释)',
21
- type: TYPE.STRING
22
- },
23
- 行: {
24
- description: '该章最后一句的行号',
25
- type: TYPE.INTEGER
26
- }
27
- },
28
- required: ['题', '行']
29
- }
30
- }, '你是专业资深的杂志编辑'));
31
- return split_li.map((i) => {
49
+ r = (await chat(提示词, opt, '你是专业资深的杂志编辑'));
50
+ r.li = r.li.map((i) => {
32
51
  return [i.题, i.行];
33
52
  });
53
+ return r;
54
+ };
55
+
56
+ export default async(chat, txt_li) => {
57
+ return ((await gen(OPT, chat, txt_li))).li;
58
+ };
59
+
60
+ export const segWithTitle = async(chat, txt_li) => {
61
+ var r;
62
+ r = (await gen(OPT_WITH_TITLE, chat, txt_li));
63
+ return [r.题, r.li];
34
64
  };