package prompt import ( "data_ai/ai" "data_ai/clean" "data_ai/ul" "fmt" "github.com/google/uuid" qu "jygit.jydev.jianyu360.cn/data_processing/common_utils" "strings" ) var pmt_pkg_0 = ` 你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目: 注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外; json形式回答,急着要结果,避免解释要干脆利落: { "分包":"(是/否)", } 请回答我的问题,不要联想,不要无中生有,不要生成多余解释; 公告:` + `%s` + "\n结果JSON:" var pmt_pkg_1 = ` 公告start: %s 公告end 任务如下: 第一步、公告预处理: 将上述公告中信息拆分为两部分 标的信息:标的名称、标的编号、规格型号、数量等相关信息 其他信息:去除上述"标的信息"剩余文本内容,执行第二步、第三步、第四步 不输出内容,仅做思考,完成后输出:"已拆分完成"即可 第二步、请根据第一步拆解分后的"其他信息",精确提取并整理以下信息,形成一个便于统计的JSON: 注意:入围供应商、入围中标人、中标候选人存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无” { "项目名称":"", "分包信息":[ { "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"), "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"), "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割), "中标金额":(中标金额数值及单位,要求:不能使用预算金额。多个金额时请进行计算,非单价,如果是单价,则等于单价*数量。), "投标折扣系数":"", "包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充) }, .... ], } 第三步、审查第二步输出的结果, 0.检查"标段名称"及"标段/包号"是否真的在原文中出现, 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请删除 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果 3.检查中标金额与预算金额中的数值与单位是否正确 4.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,否则删除当前信息 5.修正答案 第四步、根据第一、二、三步结果总结得到最终正确的结果 答: 第一步结果: 第二步结果: 第三步验证: 最终正确的结果: ` var pmt_pkg_2 = ` 公告start: %s 公告end 任务如下: 第一步、请根据公告内容,精确提取并整理以下信息,形成一个便于统计的JSON: 注意:入围供应商、入围中标人、中标候选人、评标结果存在多个时,选择第一名为中标单位,忽略其他排名。请务必确保每一条记录都来源于"公告内容", 对于尚未确定或未在文中明确提供的信息,请在相应value位置填写“无” { "项目名称":"", "分包信息":[ { "标段名称":(标包名称,通常包含地理区域、专业类别、标包内容描述等内容,不可以填写"标的名称"与"项目名称"。类似"涪陵区便捷超充站建设项目一标段和二标段预算服务"含有整体招标含义,应是个整体,不能拆分), "标段/包号":(标包编号,可以来自标段名称,如果不存在写"无",比如:一标段、二标段、包一、I包、I标段、标包一、标包编号等,不可以填写"项目编号"或"标的编号"), "中标单位":(中标单位名称,要求:中标角色包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一|1名中标候选人(忽略其他中标候选人)。当流标显示流标,废标时显示废标。联合体投标时,请列出所有单位名称使用","分割), "中标金额":(中标金额数值及单位,如果公告中没有明确说明,输出"无",不能使用预算金额。), "投标折扣系数":"", "包预算金额":(预算金额数值及单位,要求:不可以用中标金额来填充) }, .... ], } 第二步、审查第一步输出的结果, 0.检查"标段名称"及"标段/包号"是否真的在原文中出现, 1.检查"标段名称"及"标段/包号"是否有明确提及,如果只有标的名称明确提及,请删除 2.检查"中标金额"是否在原文中明确提及,否则删除第一步的中标金额结果 3.检查中标金额与预算金额中的数值与单位是否正确 4.中标单位如果是候选人、评标结果,检查中标单位是否为第一名,否则删除当前信息 5.修正答案 第三步、根据第一、二步结果总结得到最终正确的结果 答: 第一步结果: 第二步结果: 最终正确的结果: ` // 获取是否为分包信息 //func AcquireIsPackageInfo(detail string) bool { // content := PromptIsPackageText(detail) // zp := ai.PostZhiPuPackageInfo(content) // if qu.ObjToString(zp["分包"]) == "是" { // return true // } // return false //} // 获取标讯多包信息 //func AcquireMultiplePackageInfo(detail string) map[string]interface{} { // content := PromptMultiplePackageText(detail) // zp := ai.PostZhiPuPackageInfo(content) // //转格式... // ai_pkg := map[string]interface{}{} // s_winner, s_bidamount, s_pkg := "", 0.0, map[string]map[string]interface{}{} // win_arr, win_temp := []string{}, map[string]string{} // pkginfo := ul.IsMarkInterfaceMap(zp["分包信息"]) // for k, v := range pkginfo { // // key := fmt.Sprintf("%d", k+1) // name := qu.ObjToString(v["标段名称"]) // code := qu.ObjToString(v["标段/包号"]) // winner := clean.CleanWinner(qu.ObjToString(v["中标单位"])) // bidamount := clean.CleanMoney([]interface{}{v["中标金额"], ""}) // if bidamount > 1000000000.0 { // bidamount = 0.0 // } // //分包信息结构 // s_pkg[key] = map[string]interface{}{ // "name": name, // "code": code, // "winner": winner, // "bidamount": bidamount, // } // //去重计算单位与总金额 // s_bidamount += bidamount // if win_temp[winner] == "" && winner != "" { // win_arr = append(win_arr, winner) // win_temp[winner] = winner // } // } // s_winner = strings.Join(win_arr, ",") // ai_pkg["s_winner"] = s_winner // ai_pkg["s_bidamount"] = s_bidamount // ai_pkg["s_pkg"] = s_pkg // return ai_pkg //} // 分包判断-提问词 func PromptIsPackageText(detail string) string { content := fmt.Sprintf(pmt_pkg_0, detail) l := len(content) if l > ul.MaxByte { detail = truncatedText(detail, len(detail)-(l-ul.MaxByte)) content = fmt.Sprintf(pmt_pkg_0, detail) } return content } // 分包信息提取 func PromptMultiplePackageText(detail string) string { pmt_pkg := "" if strings.Contains(detail, "标的名称") || strings.Contains(detail, "标的编号") { pmt_pkg = pmt_pkg_1 } else { pmt_pkg = pmt_pkg_2 } content := fmt.Sprintf(pmt_pkg, detail) l := len(content) if l > ul.MaxByte { detail = truncatedText(detail, len(detail)-(l-ul.MaxByte)) content = fmt.Sprintf(pmt_pkg, detail) } return content } // 新结构分包信息提取 func AcquireNewMultiplePackageInfo(detail string) map[string]interface{} { content := PromptMultiplePackageText(detail) zp := ai.PostZhiPuPackageInfo(content) //转格式... ai_pkg := map[string]interface{}{} s_winner, s_bidamount, s_budget, com_package := "", 0.0, 0.0, []map[string]interface{}{} win_arr, win_temp := []string{}, map[string]string{} pkginfo := ul.IsMarkInterfaceMap(zp["分包信息"]) for _, v := range pkginfo { // name := qu.ObjToString(v["标段名称"]) code := qu.ObjToString(v["标段/包号"]) winner := clean.CleanWinner(qu.ObjToString(v["中标单位"])) bidamount := clean.CleanMoney([]interface{}{v["中标金额"], ""}) budget := clean.CleanMoney([]interface{}{v["包预算金额"], ""}) if bidamount > 1000000000.0 { bidamount = 0.0 } if budget > 1000000000.0 { budget = 0.0 } //分包信息结构 package_id := uuid.New().String() package_id = strings.ReplaceAll(package_id, "-", "") com_package = append(com_package, map[string]interface{}{ "package_id": package_id, "name": name, "code": code, "budget": budget, "winner": winner, "bidamount": bidamount, }) //去重计算单位与总金额 s_bidamount += bidamount s_budget += budget if win_temp[winner] == "" && winner != "" { win_arr = append(win_arr, winner) win_temp[winner] = winner } } s_winner = strings.Join(win_arr, ",") ai_pkg["s_winner"] = s_winner ai_pkg["s_bidamount"] = s_bidamount ai_pkg["s_budget"] = s_budget ai_pkg["com_package"] = com_package return ai_pkg }