prompt_package.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package prompt
  2. import (
  3. "data_ai/ai"
  4. "data_ai/clean"
  5. "data_ai/ul"
  6. "fmt"
  7. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  8. "strings"
  9. )
  10. var pmt_pkg_0 = `
  11. 你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目:
  12. 注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外;
  13. json形式回答,急着要结果,避免解释要干脆利落:
  14. {
  15. "分包":"(是/否)",
  16. }
  17. 请回答我的问题,不要联想,不要无中生有,不要生成多余解释;
  18. 公告:` + `%s` + "\n结果JSON:"
  19. var pmt_pkg_1 = `
  20. 你是一名’招标工程师’,拥有写标书及阅读理解公告的能力,根据要求抽取所需的内容,抽取内容要实事求是,不会无中生有。
  21. 公告start:
  22. {` + `%s` + `}
  23. 公告end
  24. 任务如下:
  25. 第一步、公告预处理:
  26. 将上述公告中信息拆分为两部分
  27. 标的信息:标的名称、标的编号、规格型号、数量等相关信息
  28. 其他信息:去除上述"标的信息"剩余文本内容,执行第二步、第三步、第四步
  29. 不输出内容,仅做思考,完成后输出:"已拆分完成"即可
  30. 第二步、请根据第一步拆解分后的"其他信息",精确提取并整理以下信息,形成一个便于统计的JSON:
  31. 注意:入围供应商、入围中标人、中标候选人存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无”
  32. {
  33. "分包信息":[
  34. {
  35. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"),
  36. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  37. "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  38. "中标金额":(中标金额数值及单位,要求:不能使用预算金额。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。),
  39. "预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充),
  40. "投标折扣系数":""
  41. },
  42. ....
  43. ],
  44. }
  45. 第三步、审查第一步输出的结果,
  46. 0.检查"标段名称"及"标段/包号"是否真的在原文中出现,
  47. 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请删除
  48. 2.检查中标金额是否在原文中明确提及,否则删除第一步的中标金额结果
  49. 3.检查中标金额与预算金额中的数值与单位是否正确
  50. 4.修正答案
  51. 第四步、根据第一、二、三步结果总结得到最终正确的结果
  52. 答:
  53. 第一步结果:
  54. 第二步结果:
  55. 第三步验证:
  56. 最终正确的结果:`
  57. var pmt_pkg_2 = `
  58. 你是一名’招标工程师’,拥有写标书及阅读理解公告的能力,根据要求抽取所需的内容,抽取内容要实事求是,不会无中生有。
  59. 公告start:
  60. {` + `%s` + `}
  61. 公告end
  62. 任务如下:
  63. 第一步、请根据公告内容,精确提取并整理以下信息,形成一个便于统计的JSON:
  64. 注意:入围供应商、入围中标人、中标候选人存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无”
  65. {
  66. "分包信息":[
  67. {
  68. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"),
  69. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  70. "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  71. "中标金额":(中标金额数值及单位,如果公告中没有明确说明,输出"无",不能使用预算金额。),
  72. "投标折扣系数":"",
  73. "包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充)
  74. },
  75. ....
  76. ],
  77. }
  78. 第二步、审查第一步输出的结果,
  79. 0.检查"标段名称"及"标段/包号"是否真的在原文中出现,
  80. 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请删除
  81. 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果
  82. 3.检查中标金额与预算金额中的数值与单位是否正确
  83. 4.修正答案
  84. 第三步、根据第一、二步结果总结得到最终正确的结果
  85. 答:
  86. 第一步结果:
  87. 第二步结果:
  88. 最终正确的结果:`
  89. // 获取是否为分包信息
  90. func AcquireIsPackageInfo(detail string) bool {
  91. content := PromptIsPackageText(detail)
  92. zp := ai.PostZhiPuPackageInfo(content)
  93. if qu.ObjToString(zp["分包"]) == "是" {
  94. return true
  95. }
  96. return false
  97. }
  98. // 获取标讯多包信息
  99. func AcquireMultiplePackageInfo(detail string) map[string]interface{} {
  100. content := PromptMultiplePackageText(detail)
  101. zp := ai.PostZhiPuPackageInfo(content)
  102. //转格式...
  103. ai_pkg := map[string]interface{}{}
  104. s_winner, s_bidamount, s_pkg := "", 0.0, map[string]map[string]interface{}{}
  105. win_arr, win_temp := []string{}, map[string]string{}
  106. pkginfo := ul.IsMarkInterfaceMap(zp["分包信息"])
  107. for k, v := range pkginfo { //
  108. key := fmt.Sprintf("%d", k+1)
  109. name := qu.ObjToString(v["标段名称"])
  110. code := qu.ObjToString(v["标段/包号"])
  111. winner := clean.CleanWinner(qu.ObjToString(v["中标单位"]))
  112. bidamount := clean.CleanMoney([]interface{}{v["中标金额"], ""})
  113. //分包信息结构
  114. s_pkg[key] = map[string]interface{}{
  115. "name": name,
  116. "code": code,
  117. "winner": winner,
  118. "bidamount": bidamount,
  119. }
  120. //去重计算单位与总金额
  121. s_bidamount += bidamount
  122. if win_temp[winner] == "" && winner != "" {
  123. win_arr = append(win_arr, winner)
  124. win_temp[winner] = winner
  125. }
  126. }
  127. s_winner = strings.Join(win_arr, ",")
  128. ai_pkg["s_winner"] = s_winner
  129. ai_pkg["s_bidamount"] = s_bidamount
  130. ai_pkg["s_pkg"] = s_pkg
  131. return ai_pkg
  132. }
  133. // 分包判断-提问词
  134. func PromptIsPackageText(detail string) string {
  135. content := fmt.Sprintf(pmt_pkg_0, detail)
  136. l := len(content)
  137. if l > ul.MaxByte {
  138. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  139. content = fmt.Sprintf(pmt_pkg_0, detail)
  140. }
  141. return content
  142. }
  143. // 分包信息提取
  144. func PromptMultiplePackageText(detail string) string {
  145. pmt_pkg := ""
  146. if strings.Contains(detail, "标的名称") || strings.Contains(detail, "标的编号") {
  147. pmt_pkg = pmt_pkg_1
  148. } else {
  149. pmt_pkg = pmt_pkg_2
  150. }
  151. content := fmt.Sprintf(pmt_pkg, detail)
  152. l := len(content)
  153. if l > ul.MaxByte {
  154. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  155. content = fmt.Sprintf(pmt_pkg, detail)
  156. }
  157. return content
  158. }