联系作品地址
1、为什么要写这个Im系统
之前写一些其他东西希望用到一个聊天系统,用于公司内部的聊天之类的,还有一个是想学习下新技术,接入下AI聊天,所以接入了下qwen2的开源大模型,
2、这里主要讲解下接入AI的时候用到的技术和踩过的坑
(1)、如何实现类似百度文心一言和chat-gpt的打字回答系统
这里面其实用到了 SSE技术,具体SSE技术有什么优势:你可以把它想象成一个简陋的webscoket,当客户端和服务端建立联系后(或换种说法客户端订阅服务端后),服务端可以不断推送信息给客户端,和websocket不同的是他是单项的推送,不是双向的。
(2)、SSE只允许GET请求建立联系,如果我有许多参数填写,如果放url上会太长,怎么办?
这里我查了下资料,其中有说的什么 fetch伪造 之类的,我没仔细看,看上去很麻烦,我用的另外一个策略,
具体流程:
1、先get请求,后端创建一条令牌数据根据用户请求信息token关联,把这个令牌存储起来并设置生命周期,
2、再根据这个令牌去get请求sse,这样就不需要填更多的信息了,
(3)、gin中如何去发送eventStream,
// 这里的c 是 gin控制器中 c *gin.Context
// 返回false的时候表示这个 sse 推送结束
c.Stream(func(w io.Writer) bool {
select {
case taskMsg, ok := <-taskCh: // taskCh是ai推送过来的流数据
if !ok {
break
}
// 获取AI回答插入数据库
if _, err := fmt.Fprintf(w, "data: %s\n\n", htmlMsg); err != nil {
// 写入错误,结束流
return false
}
case endMsg, ok := <-endCh: // 接收到endCh通道里面的数据时候表示AI回答已经结束了
if !ok {
break
}
if endMsg == "end" {
return false
}
}
return true
})