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