第二天 – 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) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "msg": err.Error(), }) return } 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(), }) }
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, }) }
|
函数逻辑
这个函数中就是对于前端的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中就是接收前端消息,初始化消息模型,初始化大模型,把前端消息格式化后传入给大模型再返回大模型的消息即可