Hertz SSE 实现原理 & 在 AI ChatBot 的落地

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. Hertz SSE Hertz SSE 实现原理 & 在 AI ChatBot 的落地 讲师:万子渝 && 范舒阳 2024/03/30
2. CONTENT 目 录 01. 简介 02. 设计和实现 03. 使用 Hertz 实现 ChatBot
3. 万子渝 - 重庆邮电大学 - 计算机学院 - 2023 年接触并参与到 CloudWeGo 开源社区 - 现为 Hertz 框架 Commiter
4. 01 简介 SSE 简介
5. SSE 简介 SSE SSE(Server-Sent Events)是一种基于 HTTP 协议的协议, 它允许服务器向客户端推送事件。 这意味着客户端不再需要不断地向服务器请求数据, 服务器可以主动将数据推送给客户端。 SSE 通常用于实时更新的数据。 SSE的主要特点
6. SSE 简介 为什么使用 SSE 而不使用 WebSocket ? 1. 兼容性和易用性: SSE 不需要额外的握手过程和协议, SSE 使用简单的文本格式进行数据传输。
7. SSE 简介 为什么使用 SSE 而不使用 WebSocket ? 2. 在许多场景中,例如 ChatGPT 客户端只需要发起建立连接的请求,而服务端需要主动向客户端 发送消息,SSE 的单向通信模式足以满足需求。
8. SSE 简介 Hertz SSE 和 Kitex Thrift Streaming 的区别和联系 区别: 1,协议 2,消息格式 3,使用场景与生态 联系: Hertz SSE 和 Kitex Thrift Streaming 可以结合使用, 以实现在分布式系统中的实时通信和低延迟数据传输。
9. 02 设计和实现 Hertz 框架实现 SSE Server && Client
10. 设计和实现 Hertz-SSE 在广泛应用 AIGC 的时代,SSE 协议具有 一定的重要性,可以简单易用地用于实现 实时数据推送的功能。 作为 CloudWeGo 社区开源的 HTTP 框 架 —— Hertz,为了支持云原生 x AI 时代 的微服务架构最佳实践,在 hertz-contrib 拓展库中加入了 SSE server/client 端实 现。
11. 设计和实现 请求头格式 1. Cache-Control:设置 Cache-Control 为 "no-cache"以禁用缓存。 2. Content-Type: SSE 使用的 Content-Type 是 "text/event-stream" 3. Connection: 为了保持长连接,设置 Connection 为 "keep-alive"
12. 设计和实现 传输消息格式 其中 data 为具体信息,ID作为唯一标识, Event 作为标签,retry 是毫秒数用来实现中断重连。
13. 设计和实现 Server 新建流对象与发布消息 NewStream 用于创建一个新的流 (Stream)对象 Publish 用于将事件(Event)推送 给客户端并使用Encode函数将事件 编码并写入到流(Stream)的写入器 (Writer)中
14. 设计和实现 Client 端开启循环监听 新建 StreamReader,开启循环读 用于从事件流(EventStream)中 扫描并读取事件(event)的数据
15. 设计和实现 Client 端处理消息 将数据流按行分割,并根据特定的规则解析 每一行的内容,并将解析结果存储到相应的字段中。 •如果行以headerEvent为前缀: •如果行以headerID为前缀: •如果行以headerData为前缀: •如果行与headerData相等(不包括最后的冒号): •如果行以headerRetry为前缀: •将行的前缀去除后的内容转换为字符串,并赋值给e.Event字段。 将行的前缀去除后的内容转换为字符串,并赋值给e.ID字段。 •将行的前缀去除后的内容添加到e.Data字段中。根据规范,多个数据字段可以用换行符连接。 •将换行符添加到e.Data字段中,表示一个空的数据字段。 •将行的前缀去除后的内容转换为字符串,并使用strconv.ParseUint将其解析为无符号整数,并赋值给e.Retry字段。
16. 设计和实现 Server 端发布信息 通过简单的 sse.NewStream(*app.RequestContext) 和Publish(event) 函数能够快速构建服务端消息事件流。
17. 设计和实现 Client 端配置 设置连接服务端时触发的函数 / 服务端断开连接触发的函数 设置 sse client 连接请求的 Method 设置 sse client 的 Headers
18. 设计和实现 Client 端创建连接并接受消息 在建立起 SSE 连接之后通过 SubsribeWithContext 可以实现对接受消息的自定义处理。
19. 03 使用 Hertz 实现 ChatBot 本地大模型搭建聊天机器人
20. 范舒阳 - 墨尔本大学 - 计算机学院 - 2021 年校招加入字节跳动视频架构团队 - 早期 Hertz 框架用户 - 现为 Hertz 框架 Commiter - 负责实现了 Hertz SSE 和 Partitioned Cookie 能力
21. 安装 Ollama Ollama 简明易用的本地大模型运行框架 github.com/ollama/ollama
22. 安装 Ollama
23. 初始化 Hertz 初始化 llama2 模型 注册路由
24. 使用 SSE 流式返回 写入状态码 200 OK 收到响应后,会回调传入 StreamingFunc 函数, 将响应封装为类型为 chunk 的 SSE 事件
25. 使用 SSE 流式返回
26. Hertz 中间件 Hertz 服务端中间件是 HTTP 请求响应周期中的一个函数,提供了一种方便的机制 来检查和过滤进入应用程序的 HTTP 请求, 例如记录每个请求或者启用 CORS。
27. 记录聊天上下文 更多中间件相关信息,请参考官方文档 https://www.cloudwego.io/docs/hertz/tutorials/basic-feature/middleware/
28. 消息类型 系统提示词(System) 人设、语气和其他指令 人类消息(Human) AI 消息(AI) 人类消息(Human) AI 消息(AI)
29. 使用中间件记录上下文 从 Header 中读取或生成 UUID 作为 ChatID 获取 ChatID 对应的消息内容,存 入请求上下文 ChatID 写入 Header
30. 使用中间件记录上下文 从请求上下文中获取本轮对话的用 户提问和响应 将用户提问和响应追加到对话上下 文中并更新
31. 使用中间件记录上下文 从请求上下文中获 取消息内容 追加一条用户消息使 用完整的对话上下文, 调用模型 将本轮对话存入到请 求上下文中
32. 使用中间件记录上下文
33. 相关资料 了解 Hertz • hertz-chatbot-demo: github.com/Haswf/hertz-chatbot-demo • Hertz 仓库:github.com/cloudwego/hertz • Hertz 快速开始:cloudwego.io/zh/docs/hertz/getting-started/ • Hertz SSE:cloudwego.io/zh/docs/hertz/tutorials/basic-feature/protocol/sse/ • Hertz 中间件:cloudwego.io/zh/docs/hertz/tutorials/basic-feature/middleware/ 了解 LLM 应用 • 提示词工程:promptingguide.ai/zh • 文本嵌入模型:ollama.com/library/nomic-embed-text • 内存向量数据库:github.com/philippgille/chromem-go
34. Q&A 官网文档:https://cloudwego.cn/docs/hertz/tutorials/basic-feature/protocol/sse/ 代码地址:https://github.com/hertz-contrib/sse
35. THANKS

trang chủ - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-15 17:32
浙ICP备14020137号-1 $bản đồ khách truy cập$