prompt_deepseek.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package prompt
  2. import (
  3. "data_ai/ai"
  4. "data_ai/ul"
  5. "fmt"
  6. )
  7. var pmt_deepseek = `
  8. # 角色
  9. 你是一位招投标领域的专家,你需要运用自己的知识从给出的内容中准确抽取出关键信息,避免任何非必要的文本,并以JSON格式输出。若信息缺失,填写"无"。
  10. # 任务1(信息抽取)
  11. 部分字段解释(可以根据上下推理):
  12. 0、结果分隔符统一使用','
  13. 1、金额不要转换量级,输出可以带单位如xx万元/xx元,中标金额和预算金额如果有说明含税后金额统一使用含税金额
  14. 2、预算金额说明:预算金额、整体预留项目金额、最高限价、招标预算价格、面向中小企业采购金额、采购计划金额、服务金额。
  15. - 如果有项目明确对应的预算估算价格、服务金额则优先使用,其次考虑使用项目总投资
  16. - 区间范围预算,使用最高价格
  17. 3、中标金额说明:注意招标类型的公告中不会存在中标金额,同样在结果类型,合同类型公告中会以 “中标金额”“成交金额”,“合同金额” ,'第一名候选人总报价'等表述呈现,不可以提取业绩相关的内容。
  18. - 不存在的结果不能通过其他方式累加计算,不存在则输出“无”
  19. - 如果只存在一个标的物的单价和数量,那么总价= 单价*数量
  20. 4、中标单位说明:常见表述为 “中标单位”“中标人”“成交供应商” ,注意:选取的中介服务机构或者直购企业(单位)、入围中标人信息等都是是候选人,需要执行候选人判断逻辑,
  21. -中标单位其他特例:
  22. -如果没有明确说明最终中标单位,成交单位、供应商或者联合体中标单位等明确信息,一律按候选人判断
  23. - 如果只有候选人但是没排名之类的评判标准,默认输出第一个单位名称如:aaa公司,bbb公司,ccc公司-->输出:aaa公司
  24. - 如果内容中提到了候选人,中标人优先提取顺序为"明确指定中标人">'候选第一名'>“综合评分最高的”>"报价最低的",
  25. 7、注意:项目备案审批时,主管部门不能作为采购单位,
  26. 8、注意:采购单位不可以使用人名,所谓的委托人都是公司、企业、事业单位等。审批单位(部门)、招标代理公司不是采购单位
  27. 10、项目编号(项目代码),招标标号、询价标号、招标编号等,不可以省略特殊符号如:‘<,>’,不要局限于项目编号这四个字
  28. - 不要使用证书编号、合同编号、订单编号当做项目编号的值
  29. JSON字段:
  30. {"任务1":{
  31. "项目编号":"项目编号",
  32. "采购单位": "采购单位(项目发布方、项目采购方、甲方、委托人、采购人(公司名称))",
  33. "中标单位": "中标单位",
  34. "预算金额": "预算金额",
  35. "中标金额": "中标金额(如果有多个中标金额,则只取第一个作为输出)",
  36. "中标金额单位": "中标金额单位",
  37. "预算金额单位": "预算金额单位",
  38. }}
  39. 任务2 (分包提取)
  40. # 分包任务介绍
  41. 对于招投标信息,部分项目会被拆分成多个包或标段,现在你需要根据抽取字段要求,从输入的内容提取相应的数据信息并严格输出JSON格式。若字段信息缺失,填写"无"。
  42. 任务要求:
  43. - 如果输入内容只有一个项目,那么则输出单个项目对应信息,如果一个项目被拆分成多个,那么输出多个被拆分的包或者标段
  44. - 注意一个项目中存在多个标的物不能算作多包
  45. - 注意面向企业采购金额不是中标金额,而是预算金额,不可以使用预算金额填充
  46. JSON字段:
  47. {"任务2":{
  48. "分包信息":[
  49. {
  50. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称",如果只有一个项目没有被拆分则只输出项目名称,注意同一个项目的多个标的物不算分包),
  51. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  52. "中标单位":中标单位,
  53. "预算金额":预算金额,
  54. "中标金额":中标金额,
  55. "中标金额单位":"对应金额的单位,如果不存在输出“无”",
  56. "预算金额单位":"对应金额的单位,如果不存在输出“无”",
  57. "项目编号":"项目编号"
  58. "标段编号":标段编号,
  59. "合同编号":合同编号,
  60. },
  61. ....
  62. ],
  63. }}
  64. # 输入内容:` + "\n" + `%s` + `
  65. # 合并上面两个任务,输出最终JSON结果(所有特殊符号使用英文符号):
  66. {
  67. "任务1":{...},
  68. "任务2":{...}
  69. }
  70. `
  71. // 获取抽取字段
  72. func AcquireExtractFieldDeepSeekInfo(detail string) map[string]interface{} {
  73. content := PromptDeepSeekFieldText(detail, pmt_deepseek)
  74. res := map[string]interface{}{}
  75. res = ai.PostDouBaoDSInfo(content)
  76. return res
  77. }
  78. // 提示语构建
  79. func PromptDeepSeekFieldText(detail string, prompt string) string {
  80. content := fmt.Sprintf(prompt, detail)
  81. l := len(content)
  82. if l > ul.MaxByte {
  83. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  84. content = fmt.Sprintf(prompt, detail)
  85. }
  86. return content
  87. }
  88. // 判断短文本
  89. func AcquireJudgeDeepSeekShortInfo(detail string) map[string]interface{} {
  90. content := PromptFieldText(detail, pmt_field_prefix)
  91. res := map[string]interface{}{}
  92. res = ai.PostDouBaoDSInfo(content)
  93. return res
  94. }