Go的ai对话网页详解-第二天

lkpalu Lv3

第二天 – Dochat回调函数详解

先把函数贴上来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
func (this *Chat) Dochat(c *gin.Context) {
var body model.Chat
err := c.ShouldBindJSON(&body)
//fmt.Println(body.Text)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": err.Error(),
})
return
}
//open, err := sql.Open("sqlite3", "C:\\Users\\lkpalu\\GolandProjects\\ai_web\\internal\\SQL\\message.db")
//if err != nil {
// log.Println("打开数据库失败")
//}
//defer open.Close()
//_, err = open.Exec("INSERT INTO messages(name,time,text) VALUES (?,?,?)", user.U.Name, time.Now(), body.Text)
prompt := util.CreatePrompt()

data := map[string]any{
"text": body.Text,
}

messages, err := prompt.FormatMessages(data)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": err.Error(),
})
}

//fmt.Println(messages)
contents := []llms.MessageContent{
llms.TextParts(messages[0].GetType(), messages[0].GetContent()),
llms.TextParts(messages[1].GetType(), messages[1].GetContent()),
}
llm := util.CteateModel(c, "qwen")
resp, err := llm.GenerateContent(context.Background(), contents)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"msg": err.Error(),
})
}

c.JSON(http.StatusOK, gin.H{
"code": 0,
"msg": "ok",
"data": resp.Choices[0].Content,
})
//fmt.Println(resp.Choices[0].Content)
//_, err = open.Exec("INSERT INTO messages(name,time,text) VALUES (?,?,?)", "AI", time.Now(), resp.Choices[0].Content)
}

函数逻辑

这个函数中就是对于前端的json接收以及处理的一个过程,一开始的ShouldBindJSON方法让前端

1
2
3
4
5
{

“text” : messages

}

绑定到结构体中,结构体格式如下

1
2
3
type Chat struct {
Text string `json:"text"`
}

json:"text"是go中在json字符串中的键名称,json中会把Text这个键变为text

绑定之后初始化提词器模板,将结构体中的消息放入模板中格式化,变为格式化语句,再将格式化语句按照大模型的输入要求传入模型中

最后返回大模型的回答内容,即resp.Choices[0].Content

这样一个Dochat就完成了。

模板初始化

**util.CreatePrompt()**这个函数为初始化模板的函数,代码如下

1
2
3
4
5
6
7
8
func CreatePrompt() prompts.ChatPromptTemplate {
return prompts.NewChatPromptTemplate([]prompts.MessageFormatter{
prompts.NewSystemMessagePromptTemplate("", nil),
prompts.NewHumanMessagePromptTemplate("{{ .text }}", []string{
"text",
}),
})
}

这里初始化的时候不需要给系统提示词,因为我们并不需要给模型一个具体场景下的角色,

人类的提示词即我们在前端输入的语句,这里使用go语言的模板初始化,代表这里要填的内容为后续text的内容

大模型初始化

**util.CteateModel(c, “qwen”)**这个函数为初始化大模型的函数,代码如下

1
2
3
4
5
6
7
8
9
10
func CteateModel(c *gin.Context, ModelName string) *ollama.LLM {
llm, err := ollama.New(ollama.WithModel(ModelName))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
})
return nil
}
return llm
}

就是调用接口**ollama.New()**创建一个大模型的指针即可

小结

Dochat中就是接收前端消息,初始化消息模型,初始化大模型,把前端消息格式化后传入给大模型再返回大模型的消息即可

  • 标题: Go的ai对话网页详解-第二天
  • 作者: lkpalu
  • 创建于 : 2024-11-06 12:29:15
  • 更新于 : 2024-11-07 15:45:40
  • 链接: https://redefine.ohevan.com/2024/11/06/Go的ai对话网页详解-第二天/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
Go的ai对话网页详解-第二天