package main import ( "context" "encoding/json" "fmt" "github.com/PuerkitoBio/goquery" zhipu "github.com/itcwc/go-zhipu/model_api" "github.com/volcengine/volcengine-go-sdk/service/arkruntime" "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model" "github.com/volcengine/volcengine-go-sdk/volcengine" util "jygit.jydev.jianyu360.cn/data_processing/common_utils" "log" "regexp" "strings" "time" ) func HtmlToText(content string) string { doc2, _ := goquery.NewDocumentFromReader(strings.NewReader(content)) //log.Println(doc2.Html()) doc2.Find("h1").Each(func(i int, selection *goquery.Selection) { selection.AfterHtml(string(rune(10))) }) //log.Println(doc2.Html()) return doc2.Text() } // getLastMonthFirstDayTimestamp 获取上月 1 号的时间戳 func getLastMonthFirstDayTimestamp() int64 { now := time.Now() // 获取上月 lastMonth := now.AddDate(0, -1, 0) // 设置为上月 1 号的 0 点 0 分 0 秒 firstDayOfLastMonth := time.Date(lastMonth.Year(), lastMonth.Month(), 1, 0, 0, 0, 0, lastMonth.Location()) // 返回时间戳 return firstDayOfLastMonth.Unix() } // isOutData 判断数据是否符合排除规则 func isOutData(tmp map[string]interface{}) (bool, int) { title := util.ObjToString(tmp["title"]) detail := util.ObjToString(tmp["detail"]) if GF.Env.TitleOut != "" { titleOutReg := regexp.MustCompile(GF.Env.TitleOut) titleOutMatchs := titleOutReg.FindAllString(title, -1) //标题排除词 if len(titleOutMatchs) > 0 { return true, 0 } } if GF.Env.DetailOut != "" { //内容排除词 detailOutReg := regexp.MustCompile(GF.Env.DetailOut) detailOutMatchs := detailOutReg.FindAllString(detail, -1) if len(detailOutMatchs) > 0 { return true, 0 } } titleMatchReg := regexp.MustCompile(GF.Env.TitleMatch) titleMatchs := titleMatchReg.FindAllString(title, -1) if len(titleMatchs) > 0 { return false, 1 } else { return false, 3 } } // ZpRelated 调用智普,获取相关度和权重 func ZpRelated(apiKey, model, title, content string) (rest map[string]interface{}) { expireAtTime := int64(1719803252) // token 过期时间 sys := "你是一名嗅觉敏感的商人,根据新闻描述,判断是否存在一下情况:\n1、存在医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\n2、存在公司或机构的办公地点变更\n3、存在公司注册资金增资、合并、收购等\n4、存在医院、学校、银行、公司、商场、事业单位等成立分支机构或部门等\n5、存在相关企事业单位招聘新员工\n6、存在所有行业竞得用地、竞拍所得土地等\n7、存在建筑类工程项目开工、投产、封顶等类似场景,并且不得存在:桥梁建设、小区建设等场景\n8、文中要真实明确的存在上述情况,不要联想猜测\n9、输出结果格式如下:\n{\"type_ai\": \"(存在/不存在)\",\n\"type_weight\": (0-1之间),\n\"name\":\"(新建的组织机构名称、企业单位名称)\"\n}\n\n输出结果以JSON形式返回;相关标签 只有存在和不存在二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个。我的标题是:%s。我的内容是:%s" text := fmt.Sprintf(sys, title, content) //text := fmt.Sprintf(`你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重;同时把主体单位给出来,主体单位只要一个。通常需要新购打印机的场景有:通常需要新购打印机的场景有:\\n1、相关医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\\n2、相关新公司成立、公司变更地址等\\n3、相关公司注册资金增资、公司合并或收购其他公司等\\n4、相关医院、学校、银行、公司、商场、事业单位拓展成立新增分支机构或部门等\\n5、相关企事业单位招聘新员工公告等\\n6、相关所有行业竞得用地、竞拍所得土地等\\n7、相关建筑类工程项目开工、投产、封顶等类似场景。 输出结果格式如下:\n\n {"type_ai": "相关", "type_weight": 0.9, "name": "优领域创作者"} \n 输出结果以JSON形式返回;相关标签 只有相关和不相关二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个。我的标题是:%s。我的内容是:%s `, title, content) mssage := zhipu.PostParams{ Model: model, Messages: []zhipu.Message{ { Role: "user", // 消息的角色信息 详见文档 Content: text, }, }, } postResponse, err := zhipu.BeCommonModel(expireAtTime, mssage, apiKey) if err != nil { fmt.Println(err) return } if choices, ok := postResponse["choices"].([]interface{}); ok { if choice, ok2 := choices[0].(map[string]interface{}); ok2 { if message, ok3 := choice["message"].(map[string]interface{}); ok3 { if content, ok4 := message["content"].(string); ok4 { content = strings.ReplaceAll(content, "\n", "") content = strings.ReplaceAll(content, "json", "") content = strings.ReplaceAll(content, "`", "") err = json.Unmarshal([]byte(content), &rest) if err != nil { log.Println("Unmarshal err", err, "content:", content) } } } } } return } // CozeChat coze 扣子模型 func CozeChat(title, content string) (rest map[string]interface{}) { client := arkruntime.NewClientWithApiKey("f9fd581f-8bea-488a-86b1-49c7d46176b5") ctx := context.Background() fmt.Println("----- standard request -----") req := model.ChatCompletionRequest{ Model: "ep-20240726175416-5x8pq", Messages: []*model.ChatCompletionMessage{ { Role: model.ChatMessageRoleSystem, Content: &model.ChatCompletionMessageContent{ //StringValue: volcengine.String("你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重。\n通常需要新购打印机的场景有:\n1、医院、学校、事业单位的办公楼新建、扩建、搬迁\n2、新公司成立、公司变更地址\n我的正文如下:"), StringValue: volcengine.String(`你是一家打印机供应商,请根据我给你提供的线索评测是否有购入打印机的需求,并给出权重;同时把主体单位给出来,主体单位只要一个。通常需要新购打印机的场景有:通常需要新购打印机的场景有:\\n1、相关医院、学校、银行、事业单位的办公楼新建、扩建、搬迁等\\n2、相关新公司成立、公司变更地址等\\n3、相关公司注册资金增资、公司合并或收购其他公司等\\n4、相关医院、学校、银行、公司、商场、事业单位拓展成立新增分支机构或部门等\\n5、相关企事业单位招聘新员工公告等\\n6、相关所有行业竞得用地、竞拍所得土地等\\n7、相关建筑类工程项目开工、投产、封顶等类似场景。 输出结果格式如下:\n\n {"type_ai": "相关", "type_weight": 0.9, "name": "优领域创作者"} \n 输出结果以JSON形式返回;相关标签 只有相关和不相关二个结果;相关权重是0-1之间的数字;严格按照JSON的格式返回我三个字段 type_ai、type_weight和name 。按照以上要求输出,不要联想,不要无中生有,不要生成解释,对于尚未确定或未明确的信息请在JSON对应的值填写;不要给我返回多个主体单位,我只要一个 `), }, }, { Role: model.ChatMessageRoleUser, Content: &model.ChatCompletionMessageContent{ StringValue: volcengine.String(fmt.Sprintf("我的标题是: %s。我的内容是:%s", title, content)), }, }, }, } resp, err := client.CreateChatCompletion(ctx, req) if err != nil { fmt.Printf("standard chat error: %v\n", err) return } //fmt.Println(*resp.Choices[0].Message.Content.StringValue) err = json.Unmarshal([]byte(*resp.Choices[0].Message.Content.StringValue), &rest) if err != nil { log.Println("Unmarshal err", err, "content:", content) } return }