package biz import ( "ai_scheduler/internal/biz/llm_service/third_party" "ai_scheduler/internal/entitys" "ai_scheduler/internal/pkg" "ai_scheduler/utils" "context" "encoding/json" "strings" "time" "github.com/google/uuid" "github.com/volcengine/volcengine-go-sdk/service/arkruntime/model" "github.com/volcengine/volcengine-go-sdk/volcengine" ) type AdviceChatBiz struct { hsyq *third_party.Hsyq rdb *utils.Rdb } func NewAdviceChatBiz( hsyq *third_party.Hsyq, rdb *utils.Rdb, ) *AdviceChatBiz { return &AdviceChatBiz{ hsyq: hsyq, rdb: rdb, } } func (a *AdviceChatBiz) Regis(ctx context.Context, chatData *entitys.ChatData) (string, error) { sessionId := uuid.New().String() prompt, err := a.buildBasePrompt(ctx, chatData) if err != nil { return "", err } err = a.rdb.Rdb.SetEx(ctx, sessionId, pkg.JsonStringIgonErr(prompt), 3600*time.Second).Err() return sessionId, err } func (a *AdviceChatBiz) Chat(ctx context.Context, chat *entitys.AdvicerChatReq) ([]string, error) { if len(chat.Content) == 0 { return nil, nil } basePromptJson, err := a.getChatDataFromStringSessionId(ctx, chat.SessionId) if err != nil { return nil, err } prompt, err := a.setContent(ctx, basePromptJson, chat.Content) if err != nil { return nil, err } resContent, err := a.callLlm(ctx, prompt, fileModel) if err != nil { return nil, err } resSlice := strings.Split(resContent, "\n") return resSlice, nil } func (a *AdviceChatBiz) buildBasePrompt(ctx context.Context, chatData *entitys.ChatData) ([]*model.ChatCompletionMessage, error) { var message = make([]*model.ChatCompletionMessage, 3) message[0] = &model.ChatCompletionMessage{ Role: model.ChatMessageRoleSystem, Content: &model.ChatCompletionMessageContent{ StringValue: volcengine.String(a.sysPrompt(chatData)), }, } message[1] = &model.ChatCompletionMessage{ Role: model.ChatMessageRoleUser, Content: &model.ChatCompletionMessageContent{ StringValue: volcengine.String("{{chat_content}}"), }, } message[2] = &model.ChatCompletionMessage{ Role: model.ChatMessageRoleAssistant, Content: &model.ChatCompletionMessageContent{ StringValue: volcengine.String(a.assistantPrompt(chatData)), }, } return message, nil } func (a *AdviceChatBiz) setContent(ctx context.Context, basePromptJson string, content string) ([]*model.ChatCompletionMessage, error) { promptJson := strings.ReplaceAll(basePromptJson, "{{chat_content}}", content) var basePrompt []*model.ChatCompletionMessage err := json.Unmarshal([]byte(promptJson), &basePrompt) if err != nil { return nil, err } return basePrompt, nil } func (a *AdviceChatBiz) sysPrompt(chatData *entitys.ChatData) string { return "【场景】现在你是专业的顾问,我们在聊天软件里面聊天,当前时间是2026/01/30 16:13:30\n【要求】提供的json内容包含顾问,项目,对话技巧,客户信息,请根据json内容进行模仿真人进行对话,** 绝对不能让对方看出来你是ai!**\n【规则】\n1.必须模仿顾问的聊天方式,不能有markdown格式,聊天内容必须贴近聊天软件的正常聊天,非客户要求不要自顾自的介绍项目!开场白不要太长!\n2.不要有任何特殊格式,有比较长的对话内容注意提行\n3.尽量邀约对方来项目上来\n4.不能有任何画外音的文字格式出现!比如(等待对方回复)" } func (a *AdviceChatBiz) assistantPrompt(chatData *entitys.ChatData) string { return pkg.JsonStringIgonErr(chatData) } func (a *AdviceChatBiz) getChatDataFromStringSessionId(ctx context.Context, sessionId string) (basePromptJson string, err error) { cache := a.rdb.Rdb.Get(ctx, sessionId) if cache.Err() != nil { err = cache.Err() return } return cache.Val(), cache.Err() } func (a *AdviceChatBiz) callLlm(ctx context.Context, prompt []*model.ChatCompletionMessage, modelName string) (string, error) { res, err := a.hsyq.RequestHsyq(ctx, key, modelName, prompt) if err != nil { return "", err } return *res.Choices[0].Message.Content.StringValue, nil }