prompt_package.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. "unicode/utf8"
  10. )
  11. // 获取是否为分包信息
  12. func AcquireIsPackageInfo(detail string) bool {
  13. content := PromptIsPackageText(detail)
  14. zp := ai.PostZhiPuInfo(content)
  15. if qu.ObjToString(zp["分包"]) == "是" {
  16. return true
  17. }
  18. return false
  19. }
  20. // 获取标讯多包信息
  21. func AcquireMultiplePackageInfo(detail string) map[string]interface{} {
  22. content := PromptMultiplePackageText(detail)
  23. zp := ai.PostZhiPuInfo(content)
  24. //后续在转格式...
  25. ai_pkg := map[string]interface{}{}
  26. s_winner, s_bidamount, s_pkg := "", 0.0, map[string]map[string]interface{}{}
  27. win_arr, win_temp := []string{}, map[string]string{}
  28. if score := qu.Float64All(zp["分包信息score"]); score >= 90.0 {
  29. pkginfo := ul.IsMarkInterfaceMap(zp["分包信息"])
  30. for k, v := range pkginfo { //
  31. key := fmt.Sprintf("%d", k+1)
  32. name := qu.ObjToString(v["标段/包号"])
  33. winner := clean.CleanWinner(qu.ObjToString(v["中标单位"]))
  34. bidamount := clean.CleanMoney((v["中标金额"]))
  35. //分包信息结构
  36. s_pkg[key] = map[string]interface{}{
  37. "name": name,
  38. "winner": winner,
  39. "bidamount": bidamount,
  40. }
  41. //去重计算单位与总金额
  42. s_bidamount += bidamount
  43. if win_temp[winner] == "" && winner != "" {
  44. win_arr = append(win_arr, winner)
  45. win_temp[winner] = winner
  46. }
  47. }
  48. s_winner = strings.Join(win_arr, ",")
  49. ai_pkg["s_winner"] = s_winner
  50. ai_pkg["s_bidamount"] = s_bidamount
  51. ai_pkg["s_pkg"] = s_pkg
  52. }
  53. return ai_pkg
  54. }
  55. // 分包判断-提问词
  56. func PromptIsPackageText(detail string) string {
  57. if utf8.RuneCountInString(detail) > ul.MaxLen {
  58. detail = string([]rune(detail)[:ul.MaxLen])
  59. }
  60. content := `
  61. 你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目:
  62. 注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外;
  63. json形式回答,急着要结果,避免解释要干脆利落:
  64. {
  65. "分包":"(是/否)",
  66. }
  67. 请回答我的问题,不要联想,不要无中生有,不要生成多余解释;
  68. 公告:` + detail + "\n结果JSON:"
  69. return content
  70. }
  71. func PromptMultiplePackageText(detail string) string {
  72. if utf8.RuneCountInString(detail) > ul.MaxLen {
  73. detail = string([]rune(detail)[:ul.MaxLen])
  74. }
  75. content := `
  76. 请根据提供的招投标文件内容,精确提取并整理以下信息,形成一个便于统计的JSON:
  77. {
  78. "分包信息":[{
  79. "标段/包号":(形式如下但不限于:一标段、包一、I包、I标段,不可以填写项目编号),
  80. "中标单位":(中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  81. "中标金额":(中标金额数值及单位,多个金额时请进行计算。非单价,如果是单价,则等于单价*数量),
  82. "投标折扣系数":"",
  83. ]
  84. "包预算金额":(预算金额数值及单位),
  85. },
  86. ....
  87. ],
  88. # 下方打分要求:根据抽取内容与要求匹配程度打分0-100,默认100分,1、当原文中存在,未抽取到扣分。2、原文中存在多个,选择有歧义扣分。3、原文中不存在,未抽取到不扣分
  89. "分包信息score":,
  90. }
  91. 请务必确保每一条记录都地囊括了各分包项目的详细信息,并按照指定的JSON格式排列数据, 对于尚未确定或未在文件中明确提供的信息,请在相应value位置填写“无”,输出结果JSON即可
  92. 请回答我的问题,不要联想,不要无中生有;
  93. 招投标文件内容:` + detail + "\n结果JSON:"
  94. return content
  95. }