prompt_package.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package prompt
  2. import (
  3. "data_ai/ai"
  4. "data_ai/clean"
  5. "data_ai/ul"
  6. "fmt"
  7. "github.com/google/uuid"
  8. "github.com/shopspring/decimal"
  9. qu "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  10. "strings"
  11. )
  12. var pmt_pkg_0 = `
  13. 你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目:
  14. 注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外;
  15. json形式回答,急着要结果,避免解释要干脆利落:
  16. {
  17. "分包":"(是/否)",
  18. }
  19. 请回答我的问题,不要联想,不要无中生有,不要生成多余解释;
  20. 公告:` + `%s` + "\n结果JSON:"
  21. var pmt_pkg_1 = `
  22. 公告start:
  23. %s
  24. 公告end
  25. 任务如下:
  26. 第一步、公告预处理:
  27. 将上述公告中信息拆分为两部分
  28. 标的信息:标的名称、标的编号、规格型号、数量等相关信息
  29. 其他信息:去除上述"标的信息"剩余文本内容,执行第二步、第三步、第四步
  30. 不输出内容,仅做思考,完成后输出:"已拆分完成"即可
  31. 第二步、请根据第一步拆解分后的"其他信息",精确提取并整理以下信息,形成一个便于统计的JSON:
  32. 注意:入围供应商、入围中标人、中标候选人存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无”
  33. {
  34. "项目名称":"",
  35. "分包信息":[
  36. {
  37. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"),
  38. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  39. "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  40. "预算金额":(预算金额、整体预留项目金额、最高限价、面向中小企业采购金额,要求:不可以用中标金额来填充),
  41. "中标金额":(项目中标后的成交金额、合同签订金额,如果不存在则使用“无”代替,要求:不能使用预算金额填充。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。),
  42. "中标金额单位":"对应金额的单位,如果不存在输出“无”",
  43. "预算金额单位":"对应金额的单位,如果不存在输出“无”",
  44. "项目编号":(项目编号,通常具有唯一性,它能够准确无误地标识一个特定的项目,不要使用证书编号当做项目编号的值),
  45. "标段编号":(通常为标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字),
  46. "合同编号":(通常为合同提供了一个独一无二的标识,不要使用证书编号当做项目编号的值),
  47. },
  48. ....
  49. ],
  50. }
  51. 第三步、审查第二步输出的结果,
  52. 0.检查"标段名称"及"标段/包号"是否真的在原文中出现,
  53. 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请输出“无”
  54. 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果,中标金额存在于中标信息,不可以使用预算代替,如果不是中标信息,则使用‘无’
  55. 3.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,请输出“无”
  56. 4.检查"项目编号"是否在原文中明确提及,请输出“无”
  57. 5.检查"标段编号"是否在原文中明确提及,请输出“无”
  58. 6.检查"合同编号"是否在原文中明确提及,请输出“无”
  59. 7.注意面向企业采购金额不是中标金额,而是预算金额,不可以使用预算金额填充,请删除中标金额
  60. 8.检查预算金额包括最高限价,面向企业采购金额等非中标成交金额,重新填充预算金额
  61. 9.修正答案
  62. 第四步、根据第一、二、三步结果总结得到最终正确的结果
  63. 答:
  64. 第一步结果:
  65. 第二步结果:
  66. 第三步验证:
  67. 最终正确的结果:
  68. `
  69. var pmt_pkg_2 = `
  70. 公告start:
  71. %s
  72. 公告end
  73. 任务如下:
  74. 第一步、请根据公告内容,精确提取并整理以下信息,形成一个便于统计的JSON:
  75. 注意:入围供应商、入围中标人、中标候选人、评标结果存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无”
  76. {
  77. "项目名称":"",
  78. "分包信息":[
  79. {
  80. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"),
  81. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  82. "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  83. "预算金额":(预算金额、整体预留项目金额、最高限价、面向中小企业采购金额,要求:不可以用中标金额来填充),
  84. "中标金额":(项目中标后的成交金额、合同签订金额,如果不存在则使用“无”代替,要求:不能使用预算金额填充。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。),
  85. "中标金额单位":"对应金额的单位,如果不存在输出“无”",
  86. "预算金额单位":"对应金额的单位,如果不存在输出“无”",
  87. "项目编号":(项目编号,通常具有唯一性,它能够准确无误地标识一个特定的项目,不要使用证书编号当做项目编号的值),
  88. "标段编号":(通常为标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字),
  89. "合同编号":(通常为合同提供了一个独一无二的标识,不要使用证书编号当做项目编号的值),
  90. },
  91. ....
  92. ],
  93. }
  94. 第二步、审查第一步输出的结果,
  95. 0.检查"标段名称"及"标段/包号"是否真的在原文中出现,
  96. 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请输出“无”
  97. 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果,中标金额存在于中标信息,不可以使用预算代替,如果不是中标信息,则使用‘无’
  98. 3.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,请输出“无”
  99. 4.检查"项目编号"是否在原文中明确提及,请输出“无”
  100. 5.检查"标段编号"是否在原文中明确提及,请输出“无”
  101. 6.检查"合同编号"是否在原文中明确提及,请输出“无”
  102. 7.注意面向企业采购金额不是中标金额,而是预算金额,不可以使用预算金额填充,请删除中标金额
  103. 8.检查预算金额包括最高限价,面向企业采购金额等非中标成交金额,重新填充预算金额
  104. 9.修正答案
  105. 第三步、根据第一、二步结果总结得到最终正确的结果
  106. 答:
  107. 第一步结果:
  108. 第二步结果:
  109. 最终正确的结果:
  110. `
  111. // 分包信息提取
  112. func PromptMultiplePackageText(detail string) string {
  113. pmt_pkg := ""
  114. if strings.Contains(detail, "标的名称") || strings.Contains(detail, "标的编号") {
  115. pmt_pkg = pmt_pkg_1
  116. } else {
  117. pmt_pkg = pmt_pkg_2
  118. }
  119. content := fmt.Sprintf(pmt_pkg, detail)
  120. l := len(content)
  121. if l > ul.MaxByte {
  122. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  123. content = fmt.Sprintf(pmt_pkg, detail)
  124. }
  125. return content
  126. }
  127. // 新结构分包信息提取
  128. func AcquireNewMultiplePackageInfo(detail string, isTable bool) map[string]interface{} {
  129. content := PromptMultiplePackageText(detail)
  130. res := map[string]interface{}{}
  131. res = ai.PostZhiPuPackageInfo(content)
  132. //转格式...
  133. ai_pkg := map[string]interface{}{}
  134. s_winner, s_bidamount, s_budget, com_package := "", 0.0, 0.0, []map[string]interface{}{}
  135. win_arr, win_temp := []string{}, map[string]string{}
  136. pkginfo := ul.IsMarkInterfaceMap(res["分包信息"])
  137. for _, v := range pkginfo {
  138. name := qu.ObjToString(v["标段名称"])
  139. code := qu.ObjToString(v["标段/包号"])
  140. winner := clean.CleanWinner(qu.ObjToString(v["中标单位"]))
  141. bidamount, bidamount_unit := clean.CleanMoney([]interface{}{v["中标金额"], ""})
  142. budget, budget_unit := clean.CleanMoney([]interface{}{v["预算金额"], ""})
  143. if !bidamount_unit {
  144. bidamount = clean.ConvertMoney(bidamount, qu.ObjToString(v["中标金额单位"]))
  145. }
  146. if !budget_unit {
  147. budget = clean.ConvertMoney(budget, qu.ObjToString(v["预算金额单位"]))
  148. }
  149. if bidamount > 1000000000.0 {
  150. bidamount = 0.0
  151. }
  152. if budget > 1000000000.0 {
  153. budget = 0.0
  154. }
  155. //各种编号编号
  156. projectcode := clean.CleanPcode(qu.ObjToString(v["项目编号"]), []string{})
  157. packagecode := clean.CleanOtherCode(qu.ObjToString(v["标段编号"]))
  158. contractcode := clean.CleanOtherCode(qu.ObjToString(v["合同编号"]))
  159. //分包信息结构
  160. package_id := uuid.New().String()
  161. package_id = strings.ReplaceAll(package_id, "-", "")
  162. p := map[string]interface{}{
  163. "package_id": package_id,
  164. "name": name,
  165. "code": code,
  166. "budget": budget,
  167. "winner": winner,
  168. "bidamount": bidamount,
  169. "projectcode": projectcode,
  170. "packagecode": packagecode,
  171. "contractcode": contractcode,
  172. }
  173. if isTable {
  174. delete(p, "budget")
  175. delete(p, "bidamount")
  176. }
  177. com_package = append(com_package, p)
  178. //去重计算单位与总金额-精度丢失···
  179. s_bid1 := decimal.NewFromFloat(s_bidamount)
  180. s_bid2 := decimal.NewFromFloat(bidamount)
  181. s_bid_add := s_bid1.Add(s_bid2)
  182. s_bidamount, _ = s_bid_add.Float64()
  183. s_bud1 := decimal.NewFromFloat(s_budget)
  184. s_bud2 := decimal.NewFromFloat(budget)
  185. s_bud_add := s_bud1.Add(s_bud2)
  186. s_budget, _ = s_bud_add.Float64()
  187. if win_temp[winner] == "" && winner != "" {
  188. win_arr = append(win_arr, winner)
  189. win_temp[winner] = winner
  190. }
  191. }
  192. //高精度保留两位小数
  193. ns_bidamount, _ := decimal.NewFromFloat(s_bidamount).Round(2).Float64()
  194. ns_budget, _ := decimal.NewFromFloat(s_budget).Round(2).Float64()
  195. s_winner = strings.Join(win_arr, ",")
  196. ai_pkg["s_winner"] = s_winner
  197. if !isTable {
  198. ai_pkg["s_bidamount"] = ns_bidamount
  199. ai_pkg["s_budget"] = ns_budget
  200. }
  201. ai_pkg["com_package"] = com_package
  202. return ai_pkg
  203. }