100 lines
2.7 KiB
Go
100 lines
2.7 KiB
Go
|
package ai
|
|||
|
|
|||
|
import (
|
|||
|
"errors"
|
|||
|
"fmt"
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
"io"
|
|||
|
"kefu/lib"
|
|||
|
"kefu/models"
|
|||
|
"log"
|
|||
|
"net/http"
|
|||
|
)
|
|||
|
|
|||
|
func PostAiIntent(c *gin.Context) {
|
|||
|
entId, _ := c.Get("ent_id")
|
|||
|
visitorId := c.Query("visitor_id")
|
|||
|
config := models.GetEntConfigsMap(entId.(string), "chatGPTUrl", "chatGPTSecret")
|
|||
|
|
|||
|
gpt := lib.NewChatGptTool(config["chatGPTUrl"], config["chatGPTSecret"])
|
|||
|
visitorInfo := models.FindVisitorByVistorId(visitorId)
|
|||
|
messageList := ""
|
|||
|
messages := models.FindMessageByQueryPage(0, 200, "visitor_id = ?", visitorId)
|
|||
|
for i := len(messages) - 1; i >= 0; i-- {
|
|||
|
reqContent := messages[i].Content
|
|||
|
sendTime := messages[i].CreatedAt
|
|||
|
if messages[i].MesType == "visitor" {
|
|||
|
messageList += fmt.Sprintf("顾客:%s %s\n", reqContent, sendTime.Format("2006-01-02 15:04:05"))
|
|||
|
} else {
|
|||
|
messageList += fmt.Sprintf("客服:%s %s\n", reqContent, sendTime.Format("2006-01-02 15:04:05"))
|
|||
|
}
|
|||
|
}
|
|||
|
system := fmt.Sprintf(`假设你是一个消费者行为心理分析师,你正在分析客服系统中访客的消费心理,我提供给你以下顾客资料:
|
|||
|
该顾客来访%d次,首次访问时间%s,最后访问时间%s,IP归属地是%s
|
|||
|
我提供给你如下聊天记录:
|
|||
|
%s
|
|||
|
`, visitorInfo.VisitNum,
|
|||
|
visitorInfo.CreatedAt.Format("2006-01-02 15:04:05"),
|
|||
|
visitorInfo.UpdatedAt.Format("2006-01-02 15:04:05"),
|
|||
|
visitorInfo.City,
|
|||
|
messageList)
|
|||
|
userPrompt := fmt.Sprintf(`
|
|||
|
请根据顾客资料分析用户心理,按如下格式输出:
|
|||
|
1.意图辨别
|
|||
|
2.情绪辨别
|
|||
|
3.购买力辨别
|
|||
|
4.分析原因(分条列出)
|
|||
|
`)
|
|||
|
message := []lib.Gpt3Dot5Message{
|
|||
|
{
|
|||
|
Role: "system",
|
|||
|
Content: system,
|
|||
|
},
|
|||
|
{
|
|||
|
Role: "user",
|
|||
|
Content: userPrompt,
|
|||
|
},
|
|||
|
}
|
|||
|
log.Println("消费者意图分析:", message)
|
|||
|
//res, err := gpt.ChatGPT3Dot5Turbo(message)
|
|||
|
|
|||
|
// 将响应头中的Content-Type设置为text/plain,表示响应内容为文本
|
|||
|
c.Header("Content-Type", "text/html;charset=utf-8;")
|
|||
|
// 关闭输出缓冲,使得每次写入的数据能够立即发送给客户端
|
|||
|
f, _ := c.Writer.(http.Flusher)
|
|||
|
stream, err := gpt.ChatGPT3Dot5TurboStream(message, "")
|
|||
|
if err != nil {
|
|||
|
log.Printf("\ngpt3 stream error: %v\n", err)
|
|||
|
return
|
|||
|
}
|
|||
|
for {
|
|||
|
response, err := stream.Recv()
|
|||
|
if errors.Is(err, io.EOF) {
|
|||
|
log.Println("\nStream finished", err)
|
|||
|
break
|
|||
|
} else if err != nil {
|
|||
|
log.Printf("\nStream error: %v,%v\n", err, response)
|
|||
|
break
|
|||
|
} else {
|
|||
|
data := response.Choices[0].Delta.Content
|
|||
|
log.Println(data)
|
|||
|
c.Writer.Write([]byte(data))
|
|||
|
f.Flush()
|
|||
|
}
|
|||
|
}
|
|||
|
stream.Close()
|
|||
|
|
|||
|
//if err != nil {
|
|||
|
// c.JSON(200, gin.H{
|
|||
|
// "code": types.ApiCode.FAILED,
|
|||
|
// "msg": err.Error(),
|
|||
|
// })
|
|||
|
// return
|
|||
|
//}
|
|||
|
//c.JSON(200, gin.H{
|
|||
|
// "code": types.ApiCode.SUCCESS,
|
|||
|
// "msg": "ok",
|
|||
|
// "result": res,
|
|||
|
//})
|
|||
|
}
|