er.mjs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { HumanMessage } from "langchain/schema"
  2. import { StructuredOutputParser } from "langchain/output_parsers"
  3. import { conversation, llm, logger } from "./llm.mjs"
  4. import { z } from "zod"
  5. import { uploadUml } from "./upload.mjs"
  6. import pRetry from "p-retry"
  7. async function genPlotNames(title, desc) {
  8. const scheme = StructuredOutputParser.fromZodSchema(
  9. z.array(
  10. z.object({
  11. title: z.string().describe("E-R图名称")
  12. })
  13. )
  14. )
  15. const res = await llm.call([
  16. new HumanMessage(`${scheme.getFormatInstructions()}
  17. ------
  18. 你是一个计算机专业擅长写毕业论文的专家,你的任务是帮我的毕业设计撰写一篇论文
  19. 我的毕业设计项目是${title}
  20. 这个项目包含以下功能:
  21. ${desc}
  22. 现在我们需要开始为这个系统设计数据库,首先我们分析一下系统中有哪些实体,我们需要绘制以下五个主要E-R图:`)
  23. ])
  24. return await scheme.parse(res.content)
  25. }
  26. async function plotER(title, desc, name) {
  27. const { chain } = conversation(`你是一个计算机专业擅长写毕业论文的专家,你的任务是帮我的毕业设计撰写一篇论文
  28. 我的毕业设计项目是${title}
  29. 这个项目包含以下功能:
  30. ${desc}`)
  31. const { response: descr } = await chain.call({
  32. input: `现在我们需要在论文中附上一个E-R图:${name},请你先用文字描述一下这个实体关系`
  33. })
  34. let { response: code } = await chain.call({
  35. input: `现在根据文字描述将它转换为plantuml语言
  36. 这是一个plantuml描述E-R图的示例:
  37. \`\`\`
  38. @startuml 示例E-R图
  39. entity 客户 {
  40. name
  41. }
  42. entity 订单 {
  43. date
  44. }
  45. entity 订单详情 {
  46. price
  47. }
  48. 客户 -right-o{ 订单
  49. 订单 ||-right-|{ 订单详情
  50. @enduml
  51. \`\`\``
  52. })
  53. code = /\`\`\`(?:plantuml)?([\s\S]+)\`\`\`/.exec(code)[1]
  54. const url = await uploadUml(code)
  55. return {
  56. name,
  57. desc: descr,
  58. url
  59. }
  60. }
  61. async function createER(title, desc) {
  62. const list = await pRetry(() => genPlotNames(title, desc), { retries: 5 })
  63. return await Promise.all(list.map((item) => pRetry(() => plotER(title, desc, item.title), { retries: 5 })))
  64. }
  65. export { createER }