浏览代码

调整···程序支持熔断udp

zhengkun 1 年之前
父节点
当前提交
32060c2c14
共有 6 个文件被更改,包括 190 次插入42 次删除
  1. 25 7
      clean/c_all.go
  2. 21 16
      extract/extract.go
  3. 133 0
      extract/test.go
  4. 1 6
      main.go
  5. 1 5
      prompt/prompt_field.go
  6. 9 8
      prompt/prompt_package.go

+ 25 - 7
clean/c_all.go

@@ -12,7 +12,7 @@ var (
 	pcodeReg2 = regexp.MustCompile("([\\*]+)")
 )
 
-func CleanFieldInfo(zhipu map[string]interface{}, pkg map[string]interface{}) map[string]interface{} {
+func CleanFieldInfo(zhipu map[string]interface{}) map[string]interface{} {
 	data := map[string]interface{}{}
 	if s_area, s_city := CleanRegion(qu.ObjToString(zhipu["省份"]), qu.ObjToString(zhipu["城市"])); s_area != "" || s_city != "" {
 		data["s_area"] = s_area
@@ -22,10 +22,10 @@ func CleanFieldInfo(zhipu map[string]interface{}, pkg map[string]interface{}) ma
 		data["s_buyer"] = s_buyer
 	}
 	if s_pname := CleanPname(qu.ObjToString(zhipu["项目名称"])); s_pname != "" {
-		data["s_pname"] = s_pname
+		data["s_projectname"] = s_pname
 	}
 	if s_pcode := CleanPcode(qu.ObjToString(zhipu["项目编号"])); s_pcode != "" {
-		data["s_pcode"] = s_pcode
+		data["s_projectcode"] = s_pcode
 	}
 	if s_budget := CleanMoney(zhipu["预算金额"]); s_budget > 0.0 && s_budget < 1000000000.0 {
 		data["s_budget"] = s_budget
@@ -40,12 +40,30 @@ func CleanFieldInfo(zhipu map[string]interface{}, pkg map[string]interface{}) ma
 		data["s_biddiscount"] = s_biddiscount
 	}
 
-	data["s_pkg"] = pkg
+	//分包字段
+	if zhipu["s_pkg"] != nil {
+		data["s_pkg"] = zhipu["s_pkg"]
+	}
+	if zhipu["ispkg"] != nil {
+		data["ispkg"] = zhipu["ispkg"]
+	}
+
+	//分类字段
+	s_toptype := qu.ObjToString(zhipu["s_toptype"])
+	s_subtype := qu.ObjToString(zhipu["s_subtype"])
+	data["s_toptype"] = s_toptype
+	data["s_subtype"] = s_subtype
+
+	if s_subtype == "合同" || s_subtype == "中标" || s_subtype == "成交" {
+		if qu.Float64All(data["s_budget"]) == qu.Float64All(data["s_bidamount"]) && qu.Float64All(data["s_budget"]) > 0.0 {
+			delete(data, "s_budget")
+		}
+	}
 
 	return data
 }
 
-// 最终逻辑校验
+// 最终逻辑校验--暂时舍弃...最终判断在需要
 func CleanFinallyInfo(data map[string]interface{}) map[string]interface{} {
 	s_toptype := qu.ObjToString(data["s_toptype"])
 	s_subtype := qu.ObjToString(data["s_subtype"])
@@ -59,8 +77,8 @@ func CleanFinallyInfo(data map[string]interface{}) map[string]interface{} {
 	if s_subtype == "单一" || s_subtype == "合同" || s_subtype == "中标" || s_subtype == "成交" || (s_subtype == "" && s_toptype == "") {
 
 	} else {
-		delete(data, "s_winner")
-		delete(data, "s_bidamount")
+		//delete(data, "s_winner")
+		//delete(data, "s_bidamount")
 	}
 	return data
 }

+ 21 - 16
extract/extract.go

@@ -10,7 +10,7 @@ import (
 	"unicode/utf8"
 )
 
-// 抽取结构字段
+// 识别结构化字段
 func ExtractFieldInfo(sid string, eid string, name string) {
 	q := map[string]interface{}{
 		"_id": map[string]interface{}{
@@ -38,30 +38,36 @@ func ExtractFieldInfo(sid string, eid string, name string) {
 			}()
 			tmpid := ul.BsonTOStringId(v["_id"])
 			data := ResolveInfo(v)
-			if data == nil || tmpid == "" {
-
+			if len(data) > 0 || tmpid == "" {
+				ul.SourceMgo.UpdateById(name, tmpid, map[string]interface{}{
+					"$set": map[string]interface{}{"ai_zhipu": data},
+				})
 			}
 		}(v)
 	}
 	wg_mgo.Wait()
+	log.Debug("is over ...", sid, "~", eid)
 }
 
 // 获取处理数据...
 func ResolveInfo(v map[string]interface{}) map[string]interface{} {
 	detail := qu.ObjToString(v["detail"])
 	title := qu.ObjToString(v["title"])
+	f_data := map[string]interface{}{}
 	if utf8.RuneCountInString(detail) < 100 {
-		return map[string]interface{}{}
+		return f_data
 	}
-	//分包判断,获取信息
+
+	//获取外围字段数据
+	f_info := prompt.AcquireExtractFieldInfo(detail)
+	//分包判断-获取信息
 	ispkg, pkg := false, map[string]interface{}{}
 	if ispkg = prompt.AcquireIsPackageInfo(detail); ispkg {
-		pkg = prompt.AcquireMultiplePackageInfo(detail)
+		f_info["ispkg"] = ispkg
+		if pkg = prompt.AcquireMultiplePackageInfo(detail); len(pkg) > 0 {
+			f_info["s_pkg"] = pkg
+		}
 	}
-	//获取外围字段数据
-	f_info := prompt.AcquireExtractFieldInfo(detail)
-	//外围字段清洗
-	f_data := clean.CleanFieldInfo(f_info, pkg)
 	//获取分类字段数据
 	s_toptype, s_subtype := "", ""
 	if qu.ObjToString(v["toptype"]) == "拟建" {
@@ -69,12 +75,11 @@ func ResolveInfo(v map[string]interface{}) map[string]interface{} {
 	} else {
 		s_toptype, s_subtype = prompt.AcquireClassInfo(detail, title)
 	}
-	if s_toptype != "" {
-		f_data["s_toptype"] = s_toptype
-		f_data["s_subtype"] = s_subtype
-	}
-	//此次最终校验
-	f_data = clean.CleanFinallyInfo(f_data)
+	f_info["s_toptype"] = s_toptype
+	f_info["s_subtype"] = s_subtype
+
+	//字段清洗
+	f_data = clean.CleanFieldInfo(f_info)
 
 	return f_data
 }

+ 133 - 0
extract/test.go

@@ -14,6 +14,11 @@ import (
 
 func TestSingleFieldInfo(name string, tmpid string) {
 	tmp := ul.SourceMgo.FindById(name, tmpid)
+	if len(tmp) == 0 || tmp == nil {
+		log.Debug("未查询到数据...", tmpid)
+
+		return
+	}
 	data := ResolveInfo(tmp)
 	//最终结果...
 	for k, v := range data {
@@ -21,6 +26,134 @@ func TestSingleFieldInfo(name string, tmpid string) {
 	}
 }
 
+func TestIsPackage() {
+	tmpArr := []string{
+		"669e83fe66cf0db42a6520b3",
+		"669e892066cf0db42a652c9b",
+		"669e904966cf0db42a653b5d",
+		"669f16f466cf0db42a669069",
+		"669f186c66cf0db42a669bf0",
+		"669efb6766cf0db42a65e0b4",
+		"669f004266cf0db42a65f201",
+		"669f02a666cf0db42a65fff3",
+		"669f172766cf0db42a669193",
+		"669ec89566cf0db42a659020",
+		"669e86b266cf0db42a6526ac",
+		"669e86e466cf0db42a6527b7",
+		"669e87b766cf0db42a652a3e",
+		"669f082d66cf0db42a662323",
+		"669e95e966cf0db42a654dd1",
+		"669ea39466cf0db42a656311",
+		"669f140366cf0db42a66772f",
+		"669ee59466cf0db42a65b8aa",
+		"669f05a166cf0db42a66117b",
+		"669e90d666cf0db42a653e0a",
+		"669f08c466cf0db42a66273c",
+		"669f155166cf0db42a6682c7",
+		"669ef0ff66cf0db42a65c83a",
+		"669efdc166cf0db42a65e8f3",
+		"669f090066cf0db42a6629d0",
+		"669f111366cf0db42a665ce7",
+		"669f15fb66cf0db42a668901",
+		"669f0baa66cf0db42a663a72",
+		"669f039766cf0db42a66044e",
+		"669eff3e66cf0db42a65ee73",
+		"669f12c366cf0db42a666b9d",
+		"669e913b66cf0db42a653ffc",
+		"669e833466cf0db42a651e3a",
+		"669f071e66cf0db42a661b03",
+		"669f1a1266cf0db42a66a892",
+		"669f0aec66cf0db42a6635e8",
+		"669f169c66cf0db42a668e1d",
+		"669ed6c966cf0db42a65a75d",
+		"669f072866cf0db42a661b26",
+		"669f185866cf0db42a669af0",
+		"669f15d366cf0db42a6687aa",
+		"669f182466cf0db42a669960",
+		"669f0ed066cf0db42a664e5c",
+		"669f076466cf0db42a661cd4",
+		"669f172966cf0db42a6691c0",
+		"669f198466cf0db42a66a385",
+		"669f1ad366cf0db42a66afb9",
+		"669f156666cf0db42a668403",
+		"669f093c66cf0db42a662c08",
+		"669f0d8266cf0db42a6646cb",
+		"669f06e866cf0db42a661a1d",
+		"669f1bd766cf0db42a66b86e",
+		"669efcd066cf0db42a65e4f4",
+	}
+	pkgArr := []int{
+		1,
+		1,
+		1,
+		1,
+		0,
+		1,
+		1,
+		1,
+		1,
+		1,
+		1,
+		1,
+		1,
+		0,
+		0,
+		1,
+		1,
+		1,
+		1,
+		1,
+		0,
+		0,
+		0,
+		1,
+		0,
+		0,
+		0,
+		1,
+		0,
+		1,
+		0,
+		0,
+		1,
+		0,
+		1,
+		0,
+		1,
+		1,
+		0,
+		1,
+		0,
+		0,
+		1,
+		1,
+		1,
+		1,
+		1,
+		1,
+		0,
+		1,
+		1,
+		0,
+		1,
+	}
+	ok := 0
+	for k, v := range tmpArr {
+		data := ul.SourceMgo.FindById("ai_41411", v)
+		if len(data) == 0 {
+			data = ul.SourceMgo.FindById("ai_294", v)
+		}
+		detail := qu.ObjToString(data["detail"])
+		ispkg := prompt.AcquireIsPackageInfo(detail)
+		if (ispkg && pkgArr[k] == 1) || (!ispkg && pkgArr[k] == 0) {
+			ok++
+		} else {
+			log.Debug("错误~", v)
+		}
+	}
+	log.Debug("is over ~ ", len(tmpArr)-ok)
+}
+
 func TestPackageInfo() {
 	query := map[string]interface{}{
 		"new_pkg": map[string]interface{}{

+ 1 - 6
main.go

@@ -13,12 +13,7 @@ func init() {
 }
 
 func main() {
-
-	//extract.TestPackageInfo()
-	//extract.ExtractFieldInfo("ai_294", "ai_294_zhipu_test")
-	//extract.ExtractFieldInfo("ai_41411", "ai_41411_zhipu")
-	extract.TestSingleFieldInfo("ai_41411", "669e86d066cf0db42a652745")
-
+	extract.ExtractFieldInfo("100000000000000000000000", "900000000000000000000000", "zktest_bidding_ai")
 	lock := make(chan bool)
 	<-lock
 }

+ 1 - 5
prompt/prompt_field.go

@@ -23,7 +23,7 @@ func PromptFieldText(detail string) string {
 1、实体识别抽取
 2、信息归属地域
 请根据我提供的正文做以下工作;
-首先,根据正文进行"项目所在地的省份"、"项目所在地的城市"、"采购单位"、"项目名称","项目编号","项目的预算金额","项目的中标单位","项目的中标金额","项目的投标折扣系数" 进行实体抽取;
+首先,根据正文进行"项目所在地的省份"、"项目所在地的城市"、"采购单位"、"项目名称","项目编号","项目的预算金额","项目的中标单位","项目的中标金额" 进行实体抽取;
 
 你在识别"项目所在地的省份"的时候,如果找不到,请去找项目信息的省份、采购单位的省份,如果还找不到,请根据上下文思考,给出你认为的最佳匹配的省份;
 你在识别"项目所在地的城市"的时候,如果找不到,请去找项目信息的城市、采购单位所在的城市,如果匹配到三级区县信息,请推导出具体城市。如果还找不到,请根据上下文思考,给出你认为的最佳匹配的城市;
@@ -33,9 +33,6 @@ func PromptFieldText(detail string) string {
 你在识别"项目的预算金额"的时候,一定不要识别业绩相关的内容。(合同内容如果没有明确指出甲方的预算金额,请不要识别)如果有多个预算金额存在,优先取预算金额含税总价。如果识别出的预算金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的预算金额,"请填写"无";
 你在识别"项目的中标单位"的时候,中标单位包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一名中标候选人、第1名中标人(忽略其他中标候选人),如果正文明确指定了中标单位,请优先选正文的中标单位。联合体投标时,请列出所有单位名称使用","分割)。如果不能准确识别出"项目的中标单位",请填写"无";注:不要采购单位,不要代理机构;
 你在识别"项目的中标金额"的时候,一定不要识别业绩相关的内容。优先使用合同的金额,合同的总价当做"项目的中标金额"。如果有多个中标金额存在,优先取中标金额的含税总价。如果原文没有明确的中标金额,可以选取第一名中标候选人的投标报价(金额单位请提取完整)。如果识别出项目的中标金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的中标金额",请填写"无";
-你在识别"项目的投标折扣系数"的时候,一定不要识别业绩相关的内容。请根据上下文思考,输出最佳匹配结果;如果不能准确识别出"项目的投标折扣系数",请填写"无";
-
-
 
 请将上述的识别结果、信息分类结果,按照JSON格式输出,
 严格按照json格式
@@ -48,7 +45,6 @@ func PromptFieldText(detail string) string {
 "预算金额":"项目的预算金额",
 "中标单位":"项目的中标单位",
 "中标金额":"项目的中标金额",
-"投标折扣系数":"项目的投标折扣系数",
 }
 
 请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无

+ 9 - 8
prompt/prompt_package.go

@@ -62,14 +62,15 @@ func PromptIsPackageText(detail string) string {
 		detail = string([]rune(detail)[:ul.MaxLen])
 	}
 	content := `
-你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目:
-注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外;
-json形式回答,急着要结果,避免解释要干脆利落:
-{
-"分包":"(是/否)",
-}
-请回答我的问题,不要联想,不要无中生有,不要生成多余解释;
-公告:` + detail + "\n结果JSON:"
+	你是一名"招标工程师",拥有写标书及阅读理解公告的能力。请帮我判断下方公告中出现了几个项目:
+	注意:多个项目通常会以多个分包、多个标段的形式出现。业绩关联的项目要排除在外;
+	json形式回答,急着要结果,避免解释要干脆利落:
+	{
+	"分包":"(是/否)",
+	}
+	请回答我的问题,不要联想,不要无中生有,不要生成多余解释;
+	公告:` + detail + "\n结果JSON:"
+
 	return content
 }