Compare commits
No commits in common. "6ab4b8705716da52e52cae3a84a67be2f604ea34" and "1f1b13a71ff2d21cb2487652d80b2500a7dec35a" have entirely different histories.
6ab4b87057
...
1f1b13a71f
|
|
@ -2,9 +2,7 @@ package biz
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"ai_scheduler/internal/biz/llm_service/third_party"
|
"ai_scheduler/internal/biz/llm_service/third_party"
|
||||||
dbmodel "ai_scheduler/internal/data/model"
|
|
||||||
"ai_scheduler/internal/data/mongo_model"
|
"ai_scheduler/internal/data/mongo_model"
|
||||||
"ai_scheduler/internal/entitys"
|
|
||||||
"ai_scheduler/internal/pkg"
|
"ai_scheduler/internal/pkg"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
@ -14,7 +12,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
|
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model"
|
||||||
"github.com/volcengine/volcengine-go-sdk/service/arkruntime/model/responses"
|
|
||||||
"github.com/volcengine/volcengine-go-sdk/volcengine"
|
"github.com/volcengine/volcengine-go-sdk/volcengine"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -28,6 +25,12 @@ func NewAdviceFileBiz(hsyq *third_party.Hsyq) *AdviceFileBiz {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
key = "236ba4b6-9daa-4755-b22f-2fd274cd223a"
|
||||||
|
fileModel = "doubao-seed-1-8-251228"
|
||||||
|
jsonModel = "doubao-seed-1-6-flash-250828"
|
||||||
|
)
|
||||||
|
|
||||||
var DataMap = map[string]mongo_model.AdviceData{
|
var DataMap = map[string]mongo_model.AdviceData{
|
||||||
"dialectFeatures": &mongo_model.DialectFeatures{},
|
"dialectFeatures": &mongo_model.DialectFeatures{},
|
||||||
"sentencePatterns": &mongo_model.SentencePatterns{},
|
"sentencePatterns": &mongo_model.SentencePatterns{},
|
||||||
|
|
@ -47,10 +50,7 @@ var DataMap = map[string]mongo_model.AdviceData{
|
||||||
"customer": &mongo_model.Customer{},
|
"customer": &mongo_model.Customer{},
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AdviceFileBiz) WordAna(ctx context.Context, wordContent string, projectInfo *entitys.AdvicerProjectInfoRes) (map[mongo_model.AdviceRole]map[string]mongo_model.AdviceData, error) {
|
func (a *AdviceFileBiz) WordAna(ctx context.Context, wordContent string) (map[mongo_model.AdviceRole]map[string]mongo_model.AdviceData, error) {
|
||||||
if len(projectInfo.ModelInfo.FileModel) == 0 {
|
|
||||||
return nil, fmt.Errorf("项目文件模型信息缺失")
|
|
||||||
}
|
|
||||||
timeSte := time.Now().Format("200601021504")
|
timeSte := time.Now().Format("200601021504")
|
||||||
dir := "./cache/" + timeSte
|
dir := "./cache/" + timeSte
|
||||||
os.Mkdir(dir, 0755)
|
os.Mkdir(dir, 0755)
|
||||||
|
|
@ -62,7 +62,7 @@ func (a *AdviceFileBiz) WordAna(ctx context.Context, wordContent string, project
|
||||||
os.WriteFile(dir+"/requset.json", []byte(prompt), 0644)
|
os.WriteFile(dir+"/requset.json", []byte(prompt), 0644)
|
||||||
|
|
||||||
//llm提取信息
|
//llm提取信息
|
||||||
anaContent, err := a.callLlm2(ctx, prompt, &projectInfo.ModelInfo)
|
anaContent, err := a.callLlm(ctx, prompt, fileModel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -93,12 +93,12 @@ func (a *AdviceFileBiz) cateData(data map[string]mongo_model.AdviceData) map[mon
|
||||||
|
|
||||||
func (a *AdviceFileBiz) parseResponse(ctx context.Context, responseByte []byte) (resultOutPut map[string]mongo_model.AdviceData, err error) {
|
func (a *AdviceFileBiz) parseResponse(ctx context.Context, responseByte []byte) (resultOutPut map[string]mongo_model.AdviceData, err error) {
|
||||||
//只尝试修复一次
|
//只尝试修复一次
|
||||||
//if isValid := json.Valid(responseByte); !isValid {
|
if isValid := json.Valid(responseByte); !isValid {
|
||||||
//
|
responseByte, err = a.fixJson(ctx, responseByte)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return nil, fmt.Errorf("json格式错误,修复失败:%s", err.Error())
|
return nil, fmt.Errorf("json格式错误,修复失败:%s", err.Error())
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
if isValid := json.Valid(responseByte); !isValid {
|
if isValid := json.Valid(responseByte); !isValid {
|
||||||
return nil, fmt.Errorf("json格式错误")
|
return nil, fmt.Errorf("json格式错误")
|
||||||
}
|
}
|
||||||
|
|
@ -131,17 +131,17 @@ func (a *AdviceFileBiz) parseResponse(ctx context.Context, responseByte []byte)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//func (a *AdviceFileBiz) fixJson(ctx context.Context, json []byte) ([]byte, error) {
|
func (a *AdviceFileBiz) fixJson(ctx context.Context, json []byte) ([]byte, error) {
|
||||||
// prompt := "你是一个专业的JSON修复专家。请帮我修复以下错误的JSON格式。\n\n要求:\n1. 保持原有数据的结构和内容不变\n2. 修复JSON语法错误\n3. 输出格式化的正确JSON\n4. 简要说明修复了哪些问题\n\n错误的JSON:\n" + string(json) + "\n\n请直接输出修复后的JSON。"
|
prompt := "你是一个专业的JSON修复专家。请帮我修复以下错误的JSON格式。\n\n要求:\n1. 保持原有数据的结构和内容不变\n2. 修复JSON语法错误\n3. 输出格式化的正确JSON\n4. 简要说明修复了哪些问题\n\n错误的JSON:\n" + string(json) + "\n\n请直接输出修复后的JSON。"
|
||||||
// call, err := a.callLlm(ctx, prompt, jsonModel)
|
call, err := a.callLlm(ctx, prompt, jsonModel)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return nil, err
|
return nil, err
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// return []byte(call), nil
|
|
||||||
//}
|
|
||||||
|
|
||||||
func (a *AdviceFileBiz) callLlm(ctx context.Context, prompt string, modelInfo *dbmodel.AiAdviceModelSup) (string, error) {
|
return []byte(call), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *AdviceFileBiz) callLlm(ctx context.Context, prompt string, modelName string) (string, error) {
|
||||||
var message = make([]*model.ChatCompletionMessage, 1)
|
var message = make([]*model.ChatCompletionMessage, 1)
|
||||||
message[0] = &model.ChatCompletionMessage{
|
message[0] = &model.ChatCompletionMessage{
|
||||||
Role: model.ChatMessageRoleUser,
|
Role: model.ChatMessageRoleUser,
|
||||||
|
|
@ -149,7 +149,7 @@ func (a *AdviceFileBiz) callLlm(ctx context.Context, prompt string, modelInfo *d
|
||||||
StringValue: volcengine.String(prompt),
|
StringValue: volcengine.String(prompt),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
res, err := a.hsyq.Chat(ctx, modelInfo.Key, modelInfo.FileModel, message)
|
res, err := a.hsyq.Chat(ctx, key, modelName, message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -157,24 +157,6 @@ func (a *AdviceFileBiz) callLlm(ctx context.Context, prompt string, modelInfo *d
|
||||||
return *res.Choices[0].Message.Content.StringValue, nil
|
return *res.Choices[0].Message.Content.StringValue, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AdviceFileBiz) callLlm2(ctx context.Context, prompt string, modelInfo *dbmodel.AiAdviceModelSup) (string, error) {
|
|
||||||
var message = make([]*responses.InputItem, 3)
|
|
||||||
message[0] = &responses.InputItem{
|
|
||||||
Union: &responses.InputItem_EasyMessage{
|
|
||||||
EasyMessage: &responses.ItemEasyMessage{
|
|
||||||
Role: responses.MessageRole_system,
|
|
||||||
Content: &responses.MessageContent{Union: &responses.MessageContent_StringValue{StringValue: prompt}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
res, err := a.hsyq.CreateResponse(ctx, modelInfo.Key, modelInfo.FileModel, message, "", false)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.Output[0].GetOutputMessage().Content[0].GetText().GetText(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *AdviceFileBiz) getAllExamples() map[string]mongo_model.AdviceData {
|
func (a *AdviceFileBiz) getAllExamples() map[string]mongo_model.AdviceData {
|
||||||
return DataMap
|
return DataMap
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,15 +41,21 @@ func (a *AdvicerVersionMongo) Entity() *AdvicerVersionMongoEntity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SignatureDialogues 代表性对话示例
|
||||||
|
type SignatureDialogues []struct {
|
||||||
|
Context string `json:"context"`
|
||||||
|
Dialogue string `json:"dialogue"` //解释
|
||||||
|
}
|
||||||
|
|
||||||
// DialectFeatures 方言特征
|
// DialectFeatures 方言特征
|
||||||
type DialectFeatures struct {
|
type DialectFeatures struct {
|
||||||
Region string `json:"region"` //方言使用程度
|
Region string `json:"region"` //方言使用程度
|
||||||
Intensity float64 `json:"intensity"` // 方言使用强度(0-1)
|
Intensity float64 `json:"intensity"` // 方言使用强度(0-1)
|
||||||
KeyWords []string `json:"keyWords"`
|
KeyWords []string `json:"KeyWords"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DialectFeatures) Example() string {
|
func (e *DialectFeatures) Example() string {
|
||||||
return `{"region":"四川成都话","intensity":0.4,"keyWords":["噻","要得","没得","不晓得","是不是"]}`
|
return `{"region":"四川成都话","intensity":0.4,"key_words":["噻","要得","没得","不晓得","是不是"]}`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DialectFeatures) Copy() AdviceData {
|
func (e *DialectFeatures) Copy() AdviceData {
|
||||||
|
|
@ -132,12 +138,6 @@ func (e *ToneTags) Desc() string {
|
||||||
return "语气标签"
|
return "语气标签"
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignatureDialogues 代表性对话示例
|
|
||||||
type SignatureDialogues []struct {
|
|
||||||
Context string `json:"context"`
|
|
||||||
Dialogue string `json:"dialogue"` //解释
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *SignatureDialogues) Example() string {
|
func (e *SignatureDialogues) Example() string {
|
||||||
return `[{"context":"客户质疑地块大小","dialogue":"哥,14亩确实不大,但你要在成都是2.5环内城买房,这种是个普遍存在的一个现象。你看万景和绿城都是13亩,中铁建只有8.8亩,339那个帮泰只有11亩。我们虽然地小,但楼间距开阔啊,看过去都是200多米!"},{"context":"客户担心物业费高","dialogue":"姐,我懂你意思,我们也觉得物业费是有点贵。但招商物业是铂金服务,有管家送外卖、免费宠物喂养这些增值服务。你算一下,就算贵一块钱,十年也就多14000,但好物业让房子增值不止这点!"},{"context":"客户犹豫价格","dialogue":"说实话,这个地段的地价都比28板块贵5000多,但我们单价只贵3000。你看龙湖滨江云河颂套内单价都36000了,我们才33000,真的性价比高!现在不买,以后这个板块可能就买不起了。"}]`
|
return `[{"context":"客户质疑地块大小","dialogue":"哥,14亩确实不大,但你要在成都是2.5环内城买房,这种是个普遍存在的一个现象。你看万景和绿城都是13亩,中铁建只有8.8亩,339那个帮泰只有11亩。我们虽然地小,但楼间距开阔啊,看过去都是200多米!"},{"context":"客户担心物业费高","dialogue":"姐,我懂你意思,我们也觉得物业费是有点贵。但招商物业是铂金服务,有管家送外卖、免费宠物喂养这些增值服务。你算一下,就算贵一块钱,十年也就多14000,但好物业让房子增值不止这点!"},{"context":"客户犹豫价格","dialogue":"说实话,这个地段的地价都比28板块贵5000多,但我们单价只贵3000。你看龙湖滨江云河颂套内单价都36000了,我们才33000,真的性价比高!现在不买,以后这个板块可能就买不起了。"}]`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,6 @@ import (
|
||||||
"ai_scheduler/internal/data/mongo_model"
|
"ai_scheduler/internal/data/mongo_model"
|
||||||
)
|
)
|
||||||
|
|
||||||
type WordAnaReq struct {
|
|
||||||
WordFileUrl string `json:"wordFileUrl"`
|
|
||||||
ProjectId int32 `json:"projectId"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AdvicerInitReq struct {
|
type AdvicerInitReq struct {
|
||||||
AdvicerID int32 `json:"advicerId"`
|
AdvicerID int32 `json:"advicerId"`
|
||||||
ProjectID int32 `json:"projectId"`
|
ProjectID int32 `json:"projectId"`
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ import (
|
||||||
"gitea.cdlsxd.cn/self-tools/l-dingtalk-stream-sdk-go/chatbot"
|
"gitea.cdlsxd.cn/self-tools/l-dingtalk-stream-sdk-go/chatbot"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type WordAnaReq struct {
|
||||||
|
WordFileUrl string `json:"word_file_url"`
|
||||||
|
}
|
||||||
|
|
||||||
type RequireDataDingTalkBot struct {
|
type RequireDataDingTalkBot struct {
|
||||||
Histories []model.AiChatHi
|
Histories []model.AiChatHi
|
||||||
UserInfo *DingTalkUserInfo
|
UserInfo *DingTalkUserInfo
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package advice
|
||||||
import (
|
import (
|
||||||
"ai_scheduler/internal/biz"
|
"ai_scheduler/internal/biz"
|
||||||
"ai_scheduler/internal/config"
|
"ai_scheduler/internal/config"
|
||||||
errorcode "ai_scheduler/internal/data/error"
|
|
||||||
"ai_scheduler/internal/entitys"
|
"ai_scheduler/internal/entitys"
|
||||||
"ai_scheduler/internal/pkg"
|
"ai_scheduler/internal/pkg"
|
||||||
"ai_scheduler/internal/pkg/file_download"
|
"ai_scheduler/internal/pkg/file_download"
|
||||||
|
|
@ -19,19 +18,16 @@ import (
|
||||||
type FileService struct {
|
type FileService struct {
|
||||||
adviceBiz *biz.AdviceFileBiz
|
adviceBiz *biz.AdviceFileBiz
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
adviceProjectBiz *biz.AdviceProjectBiz
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFileService
|
// NewFileService
|
||||||
func NewFileService(
|
func NewFileService(
|
||||||
adviceBiz *biz.AdviceFileBiz,
|
adviceBiz *biz.AdviceFileBiz,
|
||||||
cfg *config.Config,
|
cfg *config.Config,
|
||||||
adviceProjectBiz *biz.AdviceProjectBiz,
|
|
||||||
) *FileService {
|
) *FileService {
|
||||||
return &FileService{
|
return &FileService{
|
||||||
adviceBiz: adviceBiz,
|
adviceBiz: adviceBiz,
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
adviceProjectBiz: adviceProjectBiz,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -40,16 +36,6 @@ func (a *FileService) WordAna(c *fiber.Ctx) error {
|
||||||
if err := c.BodyParser(req); err != nil {
|
if err := c.BodyParser(req); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if req.ProjectId == 0 {
|
|
||||||
return errorcode.ParamErr("ProjectId is empty")
|
|
||||||
}
|
|
||||||
//项目信息
|
|
||||||
projectInfo, err := a.adviceProjectBiz.Info(c.UserContext(), &entitys.AdvicerProjectInfoReq{
|
|
||||||
ProjectId: req.ProjectId,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// URL 解码
|
// URL 解码
|
||||||
fileURL, err := url.PathUnescape(req.WordFileUrl)
|
fileURL, err := url.PathUnescape(req.WordFileUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -59,7 +45,7 @@ func (a *FileService) WordAna(c *fiber.Ctx) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ana, err := a.adviceBiz.WordAna(context.Background(), result, projectInfo)
|
ana, err := a.adviceBiz.WordAna(context.Background(), result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -70,9 +56,6 @@ func (a *FileService) WordAna(c *fiber.Ctx) error {
|
||||||
func (a *FileService) WordAnat(path string) ([]byte, error) {
|
func (a *FileService) WordAnat(path string) ([]byte, error) {
|
||||||
|
|
||||||
// URL 解码
|
// URL 解码
|
||||||
projectInfo, err := a.adviceProjectBiz.Info(context.Background(), &entitys.AdvicerProjectInfoReq{
|
|
||||||
ProjectId: 127,
|
|
||||||
})
|
|
||||||
fileURL, err := url.PathUnescape(path)
|
fileURL, err := url.PathUnescape(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("URL 解码失败")
|
return nil, errors.New("URL 解码失败")
|
||||||
|
|
@ -81,7 +64,7 @@ func (a *FileService) WordAnat(path string) ([]byte, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ana, err := a.adviceBiz.WordAna(context.Background(), result, projectInfo)
|
ana, err := a.adviceBiz.WordAna(context.Background(), result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue