prompt_field.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package prompt
  2. import (
  3. "data_ai/ai"
  4. "data_ai/ul"
  5. "fmt"
  6. "unicode/utf8"
  7. )
  8. var pmt_field_prefix = `
  9. 请帮我判断公告内容有效还是无效:
  10. 有效性:文中出现实体单位
  11. 无效性:文中没有出现实体单位
  12. json形式回答,急着要结果,避免解释要干脆利落:
  13. {
  14. "结果":"(是/否)",
  15. }
  16. 公告:` + `%s` + "\n结果JSON:"
  17. //三阶段 采购单位、中标单位、代理机构,联系人、联系电话
  18. var pmt_field1 = `
  19. 你是一个文本处理模型,专门用于分析文本提取信息,你具备以下能力:
  20. 1、实体识别抽取
  21. 2、信息归属地域
  22. 请根据我提供的正文做以下工作;
  23. 首先,根据正文进行"项目所在地的省份"、"项目所在地的城市"、"采购单位"、"项目的中标单位"、"代理机构"、"采购单位联系人"、"采购单位联系电话"、"中标单位联系人"、"中标单位联系电话"、"代理机构联系人"、"代理机构联系电话" 进行实体抽取;
  24. 你在识别"项目所在地的省份"的时候,如果找不到,请去找项目信息的省份、采购单位的省份,如果还找不到,请根据上下文思考,给出你认为的最佳匹配的省份;
  25. 你在识别"项目所在地的城市"的时候,如果找不到,请去找项目信息的城市、采购单位所在的城市,如果匹配到三级区县信息,请推导出具体城市。如果还找不到,请根据上下文思考,给出你认为的最佳匹配的城市;
  26. 你在识别"采购单位"的时候,请根据上下文思考,输出最佳匹配结果;包括但不限于采购人,采购方,甲方,委托人,负责采购的单位名称等;不要使用:代理机构与中标单位;
  27. 你在识别"项目的中标单位"的时候,中标单位包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、受让单位、中选单位、服务商、第一名中标候选人、第1名中标人(忽略其他中标候选人),如果正文明确指定了中标单位,请优先选正文的中标单位。联合体投标时,请列出所有单位名称使用","分割)。如果不能准确识别出"项目的中标单位",请填写"无";注:不要采购单位,不要代理机构;
  28. 你在识别"代理机构"的时候,输出代理采购事务的机构名称,不能使用采购单位和中标单位;
  29. 你在识别"采购单位联系人"的时候,输出负责采购的单位联系人,包括但不限于采购⼈或招标⼈或采购项目联系人;
  30. 你在识别"采购单位联系方式"的时候,输出负责采购单位信息中的联系方式,包括但不限于采购⼈或招标⼈或采购单位信息的联系电话或联系方式,不能使用非电话号码;
  31. 你在识别"中标单位联系人"的时候,输出项目的中标单位的联系人,通常为供应商或中标人;
  32. 你在识别"中标单位联系方式"的时候,输出负责中标单位的联系方式,包括但不限于中标人的联系电话,中标单位联系人的联系电话等,不能使用非电话号码;
  33. 你在识别"代理机构联系人"的时候你在识别"中标单,输出代理采购事务的机构的联系人;
  34. 你在识别"代理机构联系方式"的时候,输出代理机构的联系号码或联系电话或联系方式,不能使用非电话号码;
  35. 请将上述的识别结果、信息分类结果,按照JSON格式输出,
  36. 严格按照json格式
  37. {
  38. "省份":"项目所在地的省份",
  39. "城市":"项目所在地的城市",
  40. "采购单位":"采购单位",
  41. "中标单位":"项目的中标单位",
  42. "代理机构":"代理机构",
  43. "采购单位联系人":"采购单位联系人",
  44. "采购单位联系方式":"采购单位联系方式",
  45. "中标单位联系人":"中标单位联系人",
  46. "中标单位联系方式":"中标单位联系方式",
  47. "代理机构联系人":"代理机构联系人",
  48. "代理机构联系方式":"代理机构联系方式",
  49. }
  50. 请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无
  51. 正文内容:` + "\n" + `%s` + "\n结果JSON:"
  52. var pmt_field2 = `
  53. 你是一个文本处理模型,专门用于分析文本提取信息,你具备以下能力:
  54. 1、实体识别抽取
  55. 请根据我提供的正文做以下工作;
  56. 首先,根据正文进行"项目名称"、"项目编号"、"项目的预算金额"、"项目的中标金额" 进行实体抽取;
  57. 你在识别"项目的预算金额"的时候,一定不要识别业绩相关的内容。(合同内容如果没有明确指出甲方的预算金额,请不要识别)如果有多个预算金额存在,优先取预算金额含税总价。如果识别出的预算金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的预算金额,"请填写"无";
  58. 你在识别"项目的中标金额"的时候,一定不要识别业绩相关的内容。优先使用合同的金额,合同的总价当做"项目的中标金额"。如果有多个中标金额存在,优先取中标金额的含税总价。如果原文没有明确的中标金额,可以选取第一名中标候选人的投标报价(金额单位请提取完整)。如果识别出项目的中标金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的中标金额",请填写"无";
  59. 你在识别"开标日期"时,输出开标的具体时间,输出格式为:YYYY-MM-DD HH:MM:SS,如果格式不对,请转化为:YYYY-MM-DD HH:MM:SS;
  60. 你在识别"投标截止时间"时,输出投标⽂件提交的最后期限,输出格式为:YYYY-MM-DD HH:MM:SS,如果格式不对,请转化为:YYYY-MM-DD HH:MM:SS;
  61. 你在识别"开标地点"时,输出开标的具体地址;
  62. 你在识别"招标文件获取开始时间"时,输出招标文件的的具体开始时间,输出格式为:YYYY-MM-DD HH:MM:SS,如果格式不对,请转化为:YYYY-MM-DD HH:MM:SS;
  63. 你在识别"招标文件获取结束时间"时,输出招标文件的的具体结束时间,输出格式为:YYYY-MM-DD HH:MM:SS,如果格式不对,请转化为:YYYY-MM-DD HH:MM:SS;
  64. 你在识别"中标金额折扣率"时,输出中标费用的上浮率或者下浮率或者折扣率,输出格式为(上浮率:xx% 或 下浮率:xx% 或 折扣率;xx% ),如果格式不对,请转化为:(上浮率:xx% 或 下浮率:xx% 或 折扣率;xx% ),不要带具体价格费用的数据,没有识别出来,请填写"无",如果识别到多个值,请填写"无";
  65. 请将上述的识别结果、信息分类结果,按照JSON格式输出,
  66. 严格按照json格式
  67. {
  68. "预算金额":"项目的预算金额",
  69. "中标金额":"项目的中标金额",
  70. "开标日期":"开标日期",
  71. "投标截止时间":"投标截止时间",
  72. "开标地点":"开标地点",
  73. "招标文件获取开始时间":"招标文件获取开始时间",
  74. "招标文件获取结束时间":"招标文件获取结束时间"',
  75. "中标金额折扣率":"中标金额折扣率",
  76. }
  77. 请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无
  78. 正文内容:` + "\n" + `%s` + "\n结果JSON:"
  79. // :招标编号(主数据)、项目编号(子包)、标段编号(子包)、合同编号(子包);
  80. // 外围字段全抽出
  81. var pmt_field3 = `
  82. 你是一个文本处理模型,专门用于分析文本提取信息,你具备以下能力:
  83. 1、实体识别抽取
  84. 请根据我提供的正文做以下工作;
  85. 首先,根据正文进行"项目名称"、"项目编号"、"招标编号"、"标段编号"、"合同编号" 进行实体抽取;
  86. 你在识别"项目名称"的时候,请根据上下文思考,输出最佳匹配结果;如果"项目名称"前面包含实体单位,请务必提取完整;
  87. 你在识别"项目编号"的时候,请根据上下文思考,输出最佳匹配结果;项目编号和标段编号同时存在时,优先选项目编号;不要使用证书编号当做项目编号的值;
  88. 你在识别"招标编号"时,获取正文中招标过程中用于唯一标识一个特定招标项目的编号,不要使用项目编号和标段编号;
  89. 你在识别"标段编号"时,获取正文中的标段编号,是标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字;
  90. 你在识别"合同编号"时,获取正文中合同编号,不要使用证书编号当做项目编号的值;
  91. 请将上述的识别结果、信息分类结果,按照JSON格式输出,
  92. 严格按照json格式
  93. {
  94. "项目名称":"项目名称",
  95. "项目编号":"项目编号",
  96. "招标编号":"招标编号",
  97. "标段编号":"标段编号",
  98. "合同编号":"合同编号",
  99. }
  100. 请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无
  101. 正文内容:` + "\n" + `%s` + "\n结果JSON:"
  102. // 判断短文本
  103. func AcquireJudgeShortInfo(detail string) map[string]interface{} {
  104. content := PromptFieldText(detail, pmt_field_prefix)
  105. zp := ai.PostZhiPuInfo(content)
  106. return zp
  107. }
  108. // 获取抽取字段第一次
  109. func AcquireExtractFieldInfoFirst(detail string) map[string]interface{} {
  110. content := PromptFieldText(detail, pmt_field1)
  111. zp := ai.PostZhiPuInfo(content)
  112. return zp
  113. }
  114. // 获取抽取字段第二次
  115. func AcquireExtractFieldInfoSecond(detail string) map[string]interface{} {
  116. content := PromptFieldText(detail, pmt_field2)
  117. zp := ai.PostZhiPuInfo(content)
  118. return zp
  119. }
  120. // 获取抽取字段第三次
  121. func AcquireExtractFieldInfoThird(detail string) map[string]interface{} {
  122. content := PromptFieldText(detail, pmt_field3)
  123. zp := ai.PostZhiPuInfo(content)
  124. return zp
  125. }
  126. // 提示语构建
  127. func PromptFieldText(detail string, prompt string) string {
  128. content := fmt.Sprintf(prompt, detail)
  129. l := len(content)
  130. if l > ul.MaxByte {
  131. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  132. content = fmt.Sprintf(prompt, detail)
  133. }
  134. return content
  135. }
  136. // 截断文本长度
  137. func truncatedText(detail string, n int) string {
  138. if n <= 0 {
  139. if utf8.RuneCountInString(detail) > ul.MaxLen {
  140. detail = string([]rune(detail)[:ul.MaxLen])
  141. return detail
  142. }
  143. return detail
  144. }
  145. return detail[:n]
  146. }