kefu/knowledge/controller/chatglm.go

64 lines
1.6 KiB
Go
Raw Normal View History

2024-12-10 02:50:12 +00:00
package controller
import (
//"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"knowledge/utils"
"log"
"net/http"
"net/url"
"os"
)
func PostChatGLM(c *gin.Context) {
// 将响应头中的Content-Type设置为text/plain表示响应内容为文本
c.Header("Content-Type", "text/html;charset=utf-8;")
// 关闭输出缓冲,使得每次写入的数据能够立即发送给客户端
f, _ := c.Writer.(http.Flusher)
keywords, _ := url.QueryUnescape(c.Query("keywords"))
if keywords == "" {
keywords = c.PostForm("keywords")
}
system, _ := url.QueryUnescape(c.Query("system"))
if system == "" {
system = c.PostForm("system")
}
if keywords == "" {
c.Writer.Write([]byte("请求参数为空"))
return
}
//历史记录
//history := c.PostForm("history")
//匹配不到
prompt := c.PostForm("prompt")
if prompt != "" {
prompt = fmt.Sprintf("对于与知识信息无关的问题,你应拒绝并告知用户“%s”", prompt)
}
glm6Bkey := os.Getenv("CHATGLM_6B_KEY")
chatglm, err := utils.NewChatGLM(glm6Bkey)
if err != nil {
c.Writer.Write([]byte(err.Error()))
return
}
ask := fmt.Sprintf("%s%s我的问题是%s", system, prompt, keywords)
list := make([]map[string]string, 0)
//json.Unmarshal([]byte(history), &list)
list = append(list, map[string]string{"role": "user", "content": ask})
log.Println(list)
res, err := chatglm.StreamChatGLM6B(list, 0.79, 0.7, true)
for {
str, err := chatglm.StreamRecv(res)
if err != nil {
log.Println(err)
break
}
log.Println(str)
c.Writer.Write([]byte(str))
f.Flush()
}
}