125 lines
4.0 KiB
Go
125 lines
4.0 KiB
Go
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
|
||
}
|