outline.mjs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { AIMessage, HumanMessage, SystemMessage } from "langchain/schema"
  2. import { StructuredOutputParser } from "langchain/output_parsers"
  3. import { z } from "zod"
  4. import { PromptTemplate } from "langchain/prompts"
  5. import { llm, logger, conversation, usage } from "./llm.mjs"
  6. import fs from "fs"
  7. import { createFlow } from "./flow.mjs"
  8. import { createER } from "./er.mjs"
  9. import { createTable } from "./table.mjs"
  10. const chapters = [
  11. {
  12. title: "第一章概述"
  13. },
  14. {
  15. title: "第二章关键技术介绍"
  16. },
  17. {
  18. title: "第三章系统分析",
  19. sections: [
  20. {
  21. title: "3.1 系统概述"
  22. },
  23. {
  24. title: "3.2 需求分析"
  25. },
  26. {
  27. title: "3.3 可行性分析"
  28. },
  29. {
  30. title: "3.4 系统流程分析"
  31. },
  32. {
  33. title: "3.5 本章小节"
  34. }
  35. ]
  36. },
  37. {
  38. title: "第四章系统设计",
  39. sections: [
  40. { title: "4.1 系统基本结构设计" },
  41. {
  42. title: "4.2 数据库设计",
  43. sections: [{ title: "4.2.1 数据库E-R图设计" }, { title: "4.2.2 数据库表设计" }]
  44. },
  45. { title: "4.3 本章小节" }
  46. ]
  47. },
  48. {
  49. title: "第五章系统实现"
  50. },
  51. {
  52. title: "第六章系统测试"
  53. },
  54. {
  55. title: "结论"
  56. },
  57. {
  58. title: "参考文献"
  59. },
  60. {
  61. title: "致谢"
  62. }
  63. ]
  64. const title = "《thinkphp5鲜花销售管理系统》"
  65. const desc = `- 管理员:登录、个人中心、用户管理、鲜花分类管理、鲜花信息管理、鲜花信息、用户留言管理、特殊服务管理、系统管理、订单管理。
  66. - 用户:注册、登录、个人中心、鲜花信息、花语公告、后台管理、购物车、联系客服、我的订单、我的地址、我的收藏。`
  67. let paper = fs.createWriteStream("./paper.md")
  68. async function main(title, desc) {
  69. const startTime = Date.now()
  70. const { chain, memory } = conversation(`你是一个计算机专业擅长写毕业论文的专家,你的任务是帮我的毕业设计撰写一篇论文
  71. 我的毕业设计项目是${title}
  72. 这个项目包含以下功能:${desc}
  73. 现在我们已经为论文拟好了一个大纲:
  74. ${chapters.map((i) => `- ${i.title}`).join("\n")}
  75. 现在我们来一步一步的编写这篇论文
  76. 请严格按照markdown格式返回内容`)
  77. for (let i = 0; i < chapters.length; i++) {
  78. if (i === 2) {
  79. for (let j = 0; j < chapters[i].sections.length; j++) {
  80. let input = ""
  81. if (j === 0) {
  82. input += `现在我们来编写第三章系统分析,这一章节内容较多,我们可以分成几个小节来写:
  83. ${chapters[i].sections.map((i) => i.title).join("\n")}\n`
  84. }
  85. input += `现在我们来编写${chapters[i].title}的第${j + 1}小节: ${chapters[i].sections[j].title}`
  86. if (j === 3) {
  87. const flows = await createFlow(title, desc)
  88. input += `\n我已为你绘制好了以下几个流程图
  89. ${flows
  90. .map((i) => {
  91. return `- ![${i.name}](${i.url})
  92. ${i.desc}`
  93. })
  94. .join("\n\n")}
  95. 请你帮我完成第${j + 1}小节: ${chapters[i].sections[j].title}的内容,请确保附上我提供的图片`
  96. }
  97. let { response } = await chain.call({
  98. input: input
  99. })
  100. if (j !== 0) {
  101. response = response.replace(/# ?第三章 ?系统分析\n/, "")
  102. }
  103. paper.write("\n\n" + response)
  104. }
  105. } else if (i === 3) {
  106. for (let j = 0; j < chapters[i].sections.length; j++) {
  107. let input = ""
  108. if (j === 0) {
  109. input += `现在我们来编写第四章系统设计,这一章节内容较多,我们可以分成几个小节来写:
  110. ${chapters[i].sections.map((i) => i.title).join("\n")}\n`
  111. }
  112. input += `现在我们来编写${chapters[i].title}的第${j + 1}小节: ${chapters[i].sections[j].title}`
  113. if (j === 1) {
  114. const er = await createER(title, desc)
  115. const table = await createTable(title, desc)
  116. input += `\n本小节分为以下几个部分:
  117. ${chapters[i].sections[j].sections.map((i) => `- ${i.title}`).join("\n")}
  118. 我已为你绘制好了以下几个E-R图图
  119. ${er
  120. .map((i) => {
  121. return `- ![${i.name}E-R图](${i.url})
  122. ${i.desc}`
  123. })
  124. .join("\n")}
  125. 这是我为你提供的数据库表:
  126. ${table
  127. .map((i) => {
  128. return `- ${i.name}表:
  129. ${i.desc}
  130. `
  131. })
  132. .join("\n\n")}
  133. 请你帮我编写第${j + 1}小节: ${chapters[i].sections[j].title}的内容, 请确保附上我提供的E-R图和数据库表`
  134. }
  135. let { response } = await chain.call({
  136. input: input
  137. })
  138. if (j !== 0) {
  139. response = response.replace(/# ?第四章 ?系统设计\n/, "")
  140. }
  141. paper.write("\n\n" + response)
  142. }
  143. } else {
  144. const { response } = await chain.call({
  145. input: `现在我们来编写${chapters[i].title}`
  146. })
  147. paper.write("\n\n" + response)
  148. }
  149. }
  150. console.log(`usage: ${JSON.stringify(usage)}`)
  151. console.log(`time: ${(Date.now() - startTime) / 1000}s`)
  152. }
  153. main(title, desc)