ai_scheduler/internal/biz/advice_chat.go

125 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}