prompt_deepseek.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package prompt
  2. import (
  3. "data_ai/ai"
  4. "data_ai/ul"
  5. "fmt"
  6. )
  7. var pmt_deepseek = `
  8. # 任务1(信息抽取)
  9. 你是一位高效的信息整理专家,任务是精炼并准确抽取输入内容中的关键信息,避免任何非必要的文本,并以JSON格式输出。若信息缺失,填写"无"。
  10. 提取规则:
  11. 1、可推导上下文信息
  12. 2、排除代理机构和中标单位干扰,如果入围供应商、入围中标人、中标候选人等存在多个时,选择第一名为中标单位,忽略其他排名。
  13. 3、金额按照原文输出,不要转换量级,输出可以带单位如xx万元/xx元
  14. 4、你在识别"项目的预算金额"的时候,一定不要识别业绩相关的内容。(合同内容如果没有明确指出甲方的预算金额,请不要识别)如果有多个预算金额存在,优先取预算金额含税总价。如果识别出的预算金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的预算金额,"请填写"无";
  15. 5、你在识别"项目的中标金额"的时候,一定不要识别业绩相关的内容。优先使用合同的金额,合同的总价当做"项目的中标金额"。如果有多个中标金额存在,优先取中标金额的含税总价。如果原文没有明确的中标金额,可以选取第一名中标候选人的投标报价(金额单位请提取完整)。如果识别出项目的中标金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的中标金额",请填写"无";
  16. 6、项目编号和标段编号同时存在时,优先选项目编号;不要使用证书编号当做项目编号的值;
  17. JSON字段:
  18. {"任务1":{
  19. "项目编号":"项目编号",
  20. "采购单位": "采购方/甲方/委托人",
  21. "中标单位": "中标方/供应商(多个用逗号分隔)",
  22. "预算金额": "项目预算金额",
  23. "中标金额": "中标金额",
  24. "中标金额单位": "中标金额单位",
  25. "预算金额单位": "预算金额单位",
  26. }}
  27. 任务2 (分包提取)
  28. # 分包任务介绍
  29. 对于招投标信息,部分项目会被拆分成多个包或标段,现在你需要根据抽取字段要求,从输入的内容提取相应的数据信息并严格输出JSON格式。若字段信息缺失,填写"无"。
  30. 任务要求:
  31. - 入围供应商、入围中标人、中标候选人存在多个时,选择第一名为中标单位
  32. - 如果输入内容只有一个项目,那么则输出单个项目对应信息,如果一个项目被拆分成多个,那么输出多个被拆分的包或者标段
  33. - 注意一个项目中存在多个标的物不能算作多包
  34. - 注意面向企业采购金额不是中标金额,而是预算金额,不可以使用预算金额填充
  35. JSON字段:
  36. {"任务2":{
  37. "分包信息":[
  38. {
  39. "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"),
  40. "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"),
  41. "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割),
  42. "预算金额":(预算金额、整体预留项目金额、最高限价、面向中小企业采购金额,要求:不可以用中标金额来填充),
  43. "中标金额":(项目中标后的成交金额、合同签订金额,如果不存在则使用“无”代替,要求:不能使用预算金额填充。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。),
  44. "中标金额单位":"对应金额的单位,如果不存在输出“无”",
  45. "预算金额单位":"对应金额的单位,如果不存在输出“无”",
  46. "项目编号":(项目编号,通常具有唯一性,它能够准确无误地标识一个特定的项目,不要使用证书编号当做项目编号的值),
  47. "标段编号":(通常为标段的唯一识别码,由数字、字母或其组合构成,不要使用纯汉字),
  48. "合同编号":(通常为合同提供了一个独一无二的标识,不要使用证书编号当做项目编号的值),
  49. },
  50. ....
  51. ],
  52. }}
  53. # 输入内容:` + "\n" + `%s` + `
  54. # 合并上面两个任务,输出最终JSON结果:
  55. {"任务1":{...},
  56. "任务2":{...}
  57. }
  58. `
  59. // 获取抽取字段
  60. func AcquireExtractFieldDeepSeekInfo(detail string) map[string]interface{} {
  61. content := PromptDeepSeekFieldText(detail, pmt_deepseek)
  62. res := map[string]interface{}{}
  63. res = ai.PostDeepSeekInfo(content)
  64. return res
  65. }
  66. // 提示语构建
  67. func PromptDeepSeekFieldText(detail string, prompt string) string {
  68. content := fmt.Sprintf(prompt, detail)
  69. l := len(content)
  70. if l > ul.MaxByte {
  71. detail = truncatedText(detail, len(detail)-(l-ul.MaxByte))
  72. content = fmt.Sprintf(prompt, detail)
  73. }
  74. return content
  75. }
  76. // 判断短文本
  77. func AcquireJudgeDeepSeekShortInfo(detail string) map[string]interface{} {
  78. content := PromptFieldText(detail, pmt_field_prefix)
  79. res := map[string]interface{}{}
  80. res = ai.PostDeepSeekAI(content)
  81. return res
  82. }