UNPKG

tmaiplugin

Version:

TrainingMaster AIGC Component

67 lines (65 loc) 3.4 kB
import { fixedJsonString, splitLongText } from "./util/stringutil"; import PluginBase from './aipluginbase' import {OutlineSummaryItem, SummaryReponse} from "./declare" const ROLE_DEFINE = ['你是一名专业的内容分析专家,擅长提取篇幅较长内容的重点,形成摘要', '你是一位程序设计专家,特别擅长数据分析,内容组织并进行结构化设计,形成Json格式的数据'] const PROMPT: any = [`请分析以下内容并进行精简,按照内容提炼题纲以及小标题,形成层级式摘要,内容尽量精简 原文内容如下:" {{CONTENT}} "`, `请分析内容结构化,按照[{outline:"提纲标题","summary":["摘要内容1","摘要内容2","摘要内容3"]}]的标准Json结构输出。 内容如下:" {{CONTENT}} "` ] /** * 生成摘要插件 */ export class SummaryPlugin extends PluginBase { /** * 从指定的文本内容中生成相关的问答 * @param {*} content * @param {*} count * @param {*} axiosOption * @returns *///并在答案末尾处必须给出答案内容中的关键词 async execute(params: any): Promise<SummaryReponse> { let { content, sectionlength, axios } = params; sectionlength = sectionlength || 1024; if (!this.gptInstance) return {successed:false}; if (!content) return { successed: false, error: { errcode: 2, errmsg: '缺失参数' } } let arrContent = splitLongText(content, sectionlength); let summary: Array<OutlineSummaryItem> = []; while (arrContent.length > 0) { let subarray = [ { role: 'system', content: ROLE_DEFINE[0] }, { role: 'user', content: PROMPT[0].replace('{{CONTENT}}', arrContent.slice(0, 1)[0]) }, ] console.log('Summary Prompt:', subarray) let result: any = await this.gptInstance.chatRequest(subarray, { replyCounts: 1 }, axios); ///如果请求发生了网络错误(不是内容合规问题),则再重试一次,如果任然有错则放弃 if (!result.successed && result.error != 'content_filter') { console.log('network error,retry onemore time') result = await this.gptInstance.chatRequest(subarray, { replyCounts: 1 }, axios); } if (result.successed && result.message) { let answerString = result.message[0].message.content.trim(); let orgJsonPrompt = [ { role: 'system', content: ROLE_DEFINE[1] }, { role: 'user', content: PROMPT[1].replace('{{CONTENT}}', answerString) } ] console.log('orgJsonPrompt', orgJsonPrompt) let fixedJsonResult: any = await this.gptInstance.chatRequest(orgJsonPrompt, { replyCounts: 1 }, {}) if (fixedJsonResult.successed) { answerString = fixedJsonResult.message[0].message.content.trim().replace(/\t|\n|\v|\r|\f/g, ''); } let jsonObj = fixedJsonResult.successed ? fixedJsonString(answerString) : []; ///能够提取到内容 if (jsonObj.length) summary = summary.concat(jsonObj) } ////删除已经处理的文本 arrContent.splice(0, 1); } return { successed: true, article: summary } } }