Explorar o código

拆分提示语

zhengkun hai 9 meses
pai
achega
69f76fe660
Modificáronse 6 ficheiros con 58 adicións e 81 borrados
  1. 0 3
      clean/c_all.go
  2. 1 1
      config.json
  3. 14 1
      extract/extract.go
  4. 1 1
      main.go
  5. 42 15
      prompt/prompt_field.go
  6. 0 60
      prompt/prompt_package.go

+ 0 - 3
clean/c_all.go

@@ -55,10 +55,7 @@ func CleanFieldInfo(zhipu map[string]interface{}, fns []string) map[string]inter
 		}
 	}
 
-
 	//对于采购单位与中标单位一致的数据进行逻辑清洗
-	if 
-
 
 	return data
 }

+ 1 - 1
config.json

@@ -20,7 +20,7 @@
     "local": true,
     "l_addr": "127.0.0.1:12005",
     "addr": "172.17.189.140:27080,172.17.189.141:27081",
-    "dbname" : "qfw",
+    "dbname" : "qfw_ai",
     "username": "zhengkun",
     "password": "zk@123123"
   },

+ 14 - 1
extract/extract.go

@@ -86,7 +86,9 @@ func ResolveInfo(v map[string]interface{}) map[string]interface{} {
 	//文本格式转换
 	detail = ul.HttpConvertToMarkdown(detail)
 	//获取外围字段数据
-	f_info := prompt.AcquireExtractFieldInfo(detail, shorText)
+	f_info_1 := prompt.AcquireExtractFieldInfoFirst(detail, shorText)
+	f_info_2 := prompt.AcquireExtractFieldInfoFirst(detail, shorText)
+	f_info := MergeInfo([]map[string]interface{}{f_info_1, f_info_2})
 
 	//非短文本
 	if !shorText {
@@ -194,6 +196,17 @@ func getPurList(v map[string]interface{}, detail string, f_info map[string]inter
 	return []map[string]interface{}{}
 }
 
+// 合并字段
+func MergeInfo(infos []map[string]interface{}) map[string]interface{} {
+	info := map[string]interface{}{}
+	for _, v := range infos {
+		for k1, v1 := range v {
+			info[k1] = v1
+		}
+	}
+	return info
+}
+
 // 暂时不启用...无限重试
 func RunResetUpdateFieldInfo(arr []string, name string, s_name string) {
 	//log.Debug("开始重置更新...", len(arr))

+ 1 - 1
main.go

@@ -31,7 +31,7 @@ func main() {
 		return
 	}
 
-	extract.TestSinglePurchasingInfo("bidding", "664a2a4066cf0db42a39fb02")
+	extract.TestSingleFieldInfo("bidding", "664a2a4066cf0db42a39fb02")
 
 	lock := make(chan bool)
 	<-lock

+ 42 - 15
prompt/prompt_field.go

@@ -8,55 +8,82 @@ import (
 )
 
 var pmt_field_prefix = `
-
+	
 `
 
-var pmt_field = `
+var pmt_field1 = `
 你是一个文本处理模型,专门用于分析文本提取信息,你具备以下能力:
 1、实体识别抽取
 2、信息归属地域
 请根据我提供的正文做以下工作;
-首先,根据正文进行"项目所在地的省份"、"项目所在地的城市"、"采购单位"、"项目名称","项目编号","项目的预算金额","项目的中标单位","项目的中标金额" 进行实体抽取;
+首先,根据正文进行"项目所在地的省份"、"项目所在地的城市"、"采购单位"、"项目的中标单位" 进行实体抽取;
 
 你在识别"项目所在地的省份"的时候,如果找不到,请去找项目信息的省份、采购单位的省份,如果还找不到,请根据上下文思考,给出你认为的最佳匹配的省份;
 你在识别"项目所在地的城市"的时候,如果找不到,请去找项目信息的城市、采购单位所在的城市,如果匹配到三级区县信息,请推导出具体城市。如果还找不到,请根据上下文思考,给出你认为的最佳匹配的城市;
 你在识别"采购单位"的时候,请根据上下文思考,输出最佳匹配结果;包括但不限于采购人,采购方,甲方等;不要使用:代理机构与中标单位;
+你在识别"项目的中标单位"的时候,中标单位包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一名中标候选人、第1名中标人(忽略其他中标候选人),如果正文明确指定了中标单位,请优先选正文的中标单位。联合体投标时,请列出所有单位名称使用","分割)。如果不能准确识别出"项目的中标单位",请填写"无";注:不要采购单位,不要代理机构;
+
+请将上述的识别结果、信息分类结果,按照JSON格式输出,
+严格按照json格式
+{
+"省份":"项目所在地的省份",
+"城市":"项目所在地的城市",
+"采购单位":"采购单位",
+"中标单位":"项目的中标单位",
+}
+
+请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无
+正文内容:` + "\n" + `%s` + "\n结果JSON:"
+var pmt_field2 = `
+你是一个文本处理模型,专门用于分析文本提取信息,你具备以下能力:
+1、实体识别抽取
+请根据我提供的正文做以下工作;
+首先,根据正文进行"项目名称"、"项目编号"、"项目的预算金额"、"项目的中标金额" 进行实体抽取;
+
 你在识别"项目名称"的时候,请根据上下文思考,输出最佳匹配结果;如果"项目名称"前面包含实体单位,请务必提取完整;
 你在识别"项目编号"的时候,请根据上下文思考,输出最佳匹配结果;项目编号和标段编号同时存在时,优先选项目编号;不要使用证书编号当做项目编号的值;
 你在识别"项目的预算金额"的时候,一定不要识别业绩相关的内容。(合同内容如果没有明确指出甲方的预算金额,请不要识别)如果有多个预算金额存在,优先取预算金额含税总价。如果识别出的预算金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的预算金额,"请填写"无";
-你在识别"项目的中标单位"的时候,中标单位包括但不限于成交供应商(注:当入围供应商/中标人存在多个,选择第一位为中标单位)、中标人、中标方、承包方、中选单位、服务商、第一名中标候选人、第1名中标人(忽略其他中标候选人),如果正文明确指定了中标单位,请优先选正文的中标单位。联合体投标时,请列出所有单位名称使用","分割)。如果不能准确识别出"项目的中标单位",请填写"无";注:不要采购单位,不要代理机构;
 你在识别"项目的中标金额"的时候,一定不要识别业绩相关的内容。优先使用合同的金额,合同的总价当做"项目的中标金额"。如果有多个中标金额存在,优先取中标金额的含税总价。如果原文没有明确的中标金额,可以选取第一名中标候选人的投标报价(金额单位请提取完整)。如果识别出项目的中标金额含有单位比如万元等,请务必提取完整。如果不能准确识别出"项目的中标金额",请填写"无";
 
 请将上述的识别结果、信息分类结果,按照JSON格式输出,
 严格按照json格式
 {
-"采购单位":"采购单位",
 "项目名称":"项目名称",
 "项目编号":"项目编号",
-"省份":"项目所在地的省份",
-"城市":"项目所在地的城市",
 "预算金额":"项目的预算金额",
-"中标单位":"项目的中标单位",
 "中标金额":"项目的中标金额",
 }
 
 请回答我的问题,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写:无
 正文内容:` + "\n" + `%s` + "\n结果JSON:"
 
-// 获取外围抽取字段
-func AcquireExtractFieldInfo(detail string, shorText bool) map[string]interface{} {
-	content := PromptFieldText(detail)
+// 获取抽取字段第一次
+func AcquireExtractFieldInfoFirst(detail string, shorText bool) map[string]interface{} {
+	content := PromptFieldText(detail, pmt_field1)
+	if shorText {
+		content = PromptFieldText(detail, pmt_field1)
+	}
+	zp := ai.PostZhiPuInfo(content)
+	return zp
+}
+
+// 获取抽取字段第二次
+func AcquireExtractFieldInfoSecond(detail string, shorText bool) map[string]interface{} {
+	content := PromptFieldText(detail, pmt_field2)
+	if shorText {
+		content = PromptFieldText(detail, pmt_field2)
+	}
 	zp := ai.PostZhiPuInfo(content)
 	return zp
 }
 
-// 提示词优选
-func PromptFieldText(detail string) string {
-	content := fmt.Sprintf(pmt_field, detail)
+// 提示语构建
+func PromptFieldText(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(pmt_field, detail)
+		content = fmt.Sprintf(prompt, detail)
 	}
 	return content
 }

+ 0 - 60
prompt/prompt_package.go

@@ -118,66 +118,6 @@ var pmt_pkg_2 = `
 最终正确的结果:
  `
 
-// 获取是否为分包信息
-//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 := ""