xiongzhu 2 роки тому
батько
коміт
e231bad656
5 змінених файлів з 187 додано та 2 видалено
  1. 44 0
      1.md
  2. 40 0
      111.puml
  3. 32 0
      src/paper/paper-gen/abstract.ts
  4. 56 0
      src/paper/paper-gen/arch.ts
  5. 15 2
      src/paper/paper-gen/index.ts

+ 44 - 0
1.md

@@ -0,0 +1,44 @@
+我的毕业设计项目是基于Java的电器销售系统
+这个项目包含以下功能:本管理系统采用的集成开发环境为Eclipse,使用Java等语言及 SSM框架进行开发:
+用户:注册登录,个人中心,公告消息、电器资讯、电器商城、留言反馈。
+管理员:登录、用户管理、电器商城管理、电器分类管理、订单管理、留言反馈管理、公告信息管理、电器资讯管理、系统管理。
+现在我们已经为论文拟好了一个大纲:
+- 第一章概述
+- 第二章关键技术介绍
+- 第三章系统分析
+- 第四章系统设计
+- 第五章系统实现
+- 第六章系统测试
+- 结论
+- 参考文献
+- 致谢
+现在我们来一步一步的编写这篇论文
+请严格按照markdown格式返回内容
+
+现在我们来编写第三章系统分析,这一章节内容较多,我们可以分成几个小节来写:
+3.1 系统概述
+3.2 需求分析
+3.3 可行性分析
+3.4 系统流程分析
+3.5 本章小节
+现在我们来编写第三章系统分析的第1小节: 3.1 系统概述
+我已为你绘制好了以下总体结构图:
+![总体结构图](https://nebuai.oss-cn-hangzhou.aliyuncs.com/uml/1699346780898.png)
+请你帮我完成第1小节: 3.1 系统概述的内容,请确保附上我提供的总体结构图
+AI: ```markdown
+# 第三章 系统分析
+
+## 3.1 系统概述
+
+随着电子商务的蓬勃发展,以及信息技术的不断创新,传统的电器销售模式已经无法满足市场的需求。基于Java的电器销售系统作为一种新兴的电子商务平台,能够提供更加便捷、高效、个性化的服务。该系统旨在为用户提供一个方便快捷的在线购买电器的平台,同时为管理员提供一个强大的后台管理工具,便于管理电器商品、订单、用户等。
+
+电器销售系统的总体结构设计如下图所示,本系统分为前台和后台两大部分。前台为用户提供注册登录、浏览商品、下单购物等功能,后台则为管理员提供管理全平台的综合服务,包括用户管理、商品管理、订单管理、公告信息管理等。系统运行在Web环境中,前端采用HTML、CSS和JavaScript等技术实现动态的用户界面,后端则基于SSM(Spring + SpringMVC + MyBatis)框架,利用Java语言进行业务逻辑的处理和数据的持久化操作。数据库系统选用MySQL,保存所有用户数据、订单数据、商品数据等。
+
+![总体结构图](https://nebuai.oss-cn-hangzhou.aliyuncs.com/uml/1699346780898.png)
+
+系统采用B/S(Browser/Server)架构,用户只需要通过浏览器即可访问系统服务。系统提供了简洁友好的用户界面和强大的系统管理功能,支持用户对电器商品的浏览、检索、购买,以及对个人信息的管理。同时,对于系统管理员而言,提供的后台管理工具可用于管理电器商品的上架、下架、信息更新,订单的处理,以及发布新的公告资讯等。
+
+该系统的设计考虑到了用户操作的便捷性与系统功能的稳定安全性,并特别强调了系统的可维护性和扩展性,以便于随着业务需求的变化而进行相应的功能扩展或优化。
+```
+
+在文档中添加结构图是非常重要的,它帮助读者直观地理解系统的框架。在Markdown中嵌入图片,你需要将图片放置到一个可以公开访问的URL中,然后用`![alt text](image_url)`的格式将图片插入到文本中,在这里你已经给出了相应的图片URL,按照要求我们已经正确地添加了这张图。

+ 40 - 0
111.puml

@@ -0,0 +1,40 @@
+@startuml 功能结构图
+rectangle 电器销售系统 {
+    rectangle 用户 {
+        rectangle 注册登录
+        rectangle 个人中心
+        rectangle 公告消息
+        rectangle 电器资讯
+        rectangle 电器商城
+        rectangle 留言反馈
+    }
+    rectangle 管理员 {
+        rectangle 登录
+        rectangle 用户管理
+        rectangle 电器商城管理
+        rectangle 电器分类管理
+        rectangle 订单管理
+        rectangle 留言反馈管理
+        rectangle 公告信息管理
+        rectangle 电器资讯管理
+        rectangle 系统管理
+    }
+    
+    用户 -- 注册登录
+    用户 -- 个人中心
+    用户 -- 公告消息
+    用户 -- 电器资讯
+    用户 -- 电器商城
+    用户 -- 留言反馈
+    
+    管理员 -- 登录
+    管理员 -- 用户管理
+    管理员 -- 电器商城管理
+    管理员 -- 电器分类管理
+    管理员 -- 订单管理
+    管理员 -- 留言反馈管理
+    管理员 -- 公告信息管理
+    管理员 -- 电器资讯管理
+    管理员 -- 系统管理
+}
+@enduml

+ 32 - 0
src/paper/paper-gen/abstract.ts

@@ -0,0 +1,32 @@
+import { HumanMessage, SystemMessage } from 'langchain/schema'
+import { StructuredOutputParser } from 'langchain/output_parsers'
+import { z } from 'zod'
+import { uploadUml } from './upload'
+
+export async function _createAbstract(tools, title, desc) {
+    const { llm, usage, conversation } = tools
+    let { content } = await llm.call([
+        new HumanMessage(`我正在给我的毕业设计撰写一篇论文
+我的毕业设计项目是${title}
+这个项目包含以下功能:
+${desc}
+
+请你帮我的论文写一篇摘,然后抽取几个关键词
+开始:#摘要`)
+    ])
+
+    const abstract = content.replace(/^摘要[::][\s\n]+/, '')
+    const { content: translated } = await llm.call([
+        new SystemMessage(
+            '我希望你能担任英语翻译、拼写校对和修辞改进的角色。请将我给你的内容,用更为优美和精炼的英语翻译给我。请确保意思不变,但使其更具文学性。'
+        ),
+        new HumanMessage(abstract)
+    ])
+
+    return `# 摘要\n\n${abstract}\n\n# Abstract\n\n${translated}`
+}
+
+export async function createAbstract(tools, title, desc) {
+    const pRetry = (await eval("import('p-retry')")).default
+    return await pRetry(() => _createAbstract(tools, title, desc), { retries: 5 })
+}

+ 56 - 0
src/paper/paper-gen/arch.ts

@@ -0,0 +1,56 @@
+import { HumanMessage } from 'langchain/schema'
+import { StructuredOutputParser } from 'langchain/output_parsers'
+import { z } from 'zod'
+import { uploadUml } from './upload'
+
+export async function _createArch(tools, title, desc) {
+    const { llm, usage, conversation } = tools
+    let { content: code } = await llm.call([
+        new HumanMessage(`我的毕业设计项目是${title}
+这个项目包含以下功能:
+${desc}
+请用plantUML语言描述一下我的毕业设计项目的功能结构图
+
+以下是一个plantuml描述功能结构图的示例
+\`\`\`
+@startuml 结构图
+rectangle 房产公司管理系统
+rectangle 用户
+rectangle 管理员
+rectangle 注册登录
+rectangle 房源信息
+rectangle 房源租赁
+rectangle 个人中心
+rectangle 登录
+rectangle 个人资料
+rectangle 用户管理
+rectangle 信息管理
+rectangle 类型管理
+rectangle 租客管理
+
+房产公司管理系统 -- 用户
+房产公司管理系统 -- 管理员
+用户 -- 注册登录
+用户 -- 房源信息
+用户 -- 房源租赁
+用户 -- 个人中心
+管理员 -- 登录
+管理员 -- 个人资料
+管理员 -- 用户管理
+管理员 -- 信息管理
+管理员 -- 类型管理
+管理员 -- 租客管理
+@enduml
+
+\`\`\`
+(你的回答关系到我的工作和职业生涯,请认真一点)`)
+    ])
+    code = /@startuml[\w\W]*@enduml/.exec(code)[0]
+    const url = await uploadUml(code)
+    return { url }
+}
+
+export async function createArch(tools, title, desc) {
+    const pRetry = (await eval("import('p-retry')")).default
+    return await pRetry(() => _createArch(tools, title, desc), { retries: 5 })
+}

+ 15 - 2
src/paper/paper-gen/index.ts

@@ -4,6 +4,8 @@ import { createFlow } from './flow'
 import { createER } from './er'
 import { createTable } from './table'
 import { uploadDoc } from './upload'
+import { createArch } from './arch'
+import { createAbstract } from './abstract'
 
 export async function genPaper(title: string, desc: string) {
     const tools = createLLM()
@@ -66,11 +68,15 @@ export async function genPaper(title: string, desc: string) {
     ]
     let paper = new WritableStreamBuffer()
     const startTime = Date.now()
+
+    paper.write(`${await createAbstract(tools, title, desc)}\n\n`)
+
     const { chain, memory } = conversation(`你是一个计算机专业擅长写毕业论文的专家,你的任务是帮我的毕业设计撰写一篇论文
 我的毕业设计项目是${title}
 这个项目包含以下功能:${desc}
 现在我们已经为论文拟好了一个大纲:
 ${chapters.map((i) => `- ${i.title}`).join('\n')}
+
 现在我们来一步一步的编写这篇论文
 请严格按照markdown格式返回内容`)
 
@@ -83,7 +89,13 @@ ${chapters.map((i) => `- ${i.title}`).join('\n')}
 ${chapters[i].sections.map((i) => i.title).join('\n')}\n`
                 }
                 input += `现在我们来编写${chapters[i].title}的第${j + 1}小节: ${chapters[i].sections[j].title}`
+                if (j === 0) {
+                    const arch = await createArch(tools, title, desc)
+                    input += `\n我已为你绘制好了以下总体结构图:
+![总体结构图](${arch.url})
 
+请你帮我完成第${j + 1}小节: ${chapters[i].sections[j].title}的内容,请确保附上我提供的总体结构图`
+                }
                 if (j === 3) {
                     const flows = await createFlow(tools, title, desc)
                     input += `\n我已为你绘制好了以下几个流程图       
@@ -93,6 +105,7 @@ ${flows
 ${i.desc}`
     })
     .join('\n\n')}
+
 请你帮我完成第${j + 1}小节: ${chapters[i].sections[j].title}的内容,请确保附上我提供的图片`
                 }
                 let { response } = await chain.call({
@@ -110,7 +123,7 @@ ${i.desc}`
                     input += `现在我们来编写第四章系统设计,这一章节内容较多,我们可以分成几个小节来写:
 ${chapters[i].sections.map((i) => i.title).join('\n')}\n`
                 }
-                input += `现在我们来编写${chapters[i].title}的第${j + 1}小节: ${chapters[i].sections[j].title}`
+                input += `\n现在我们来编写${chapters[i].title}的第${j + 1}小节: ${chapters[i].sections[j].title}`
 
                 if (j === 1) {
                     const er = await createER(tools, title, desc)
@@ -118,7 +131,7 @@ ${chapters[i].sections.map((i) => i.title).join('\n')}\n`
                     input += `\n本小节分为以下几个部分:
 ${chapters[i].sections[j].sections.map((i) => `- ${i.title}`).join('\n')}
 
-我已为你绘制好了以下几个E-R图
+我已为你绘制好了以下几个E-R图
 ${er
     .map((i) => {
         return `- ![${i.name}E-R图](${i.url})