尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

基于SSE技术加 deepseek 实现打字机回复效果

基于SSE技术加 deepseek 实现打字机回复效果
📅 发布时间:2026/6/22 19:57:56

具体代码,已上传到厂库

git clone https://gitee.com/rush_peng/sse-deepseek-demo.git

SSE 技术

go 后端实现

package mainimport ("bufio""bytes""encoding/json""fmt""log""net/http""strings""time"
)// Message 表示聊天消息结构
type Message struct {Role    string `json:"role"`Content string `json:"content"`
}// GenerateRequest 生成请求结构
type GenerateRequest struct {Model    string         `json:"model"`Prompt   string         `json:"prompt"`Stream   bool           `json:"stream"`Options  map[string]any `json:"options"`Messages []Message      `json:"messages"`
}// ResponseMessage 响应消息结构
type ResponseMessage struct {Role     string `json:"role"`Content  string `json:"content"` // chat模式下返回的内容Thinking string `json:"thinking"`
}// DeepseekResponse Deepseek API响应结构
type DeepseekResponse struct {Model      string          `json:"model"`Done       bool            `json:"done"`CreateAt   time.Time       `json:"create_at"`ResMessage ResponseMessage `json:"message"`Response   string          `json:"response"` // completion模式下返回的内容
}// cat 模式下, 需要存储历史聊天消息
var chartHistory []Messageconst (AskTypeCompletion = "completion"AskTypeChat       = "chat"
)// deepseekStream 通过Deepseek API进行流式生成响应
func deepseekStream(w http.ResponseWriter, prompt string, askType string) (err error) {var apiURL stringvar completeResponse strings.Builder // 存储模型完整回复,使用strings.Builder 高效拼接字符串var getResContest func(resp DeepseekResponse) stringreqBody := GenerateRequest{Model:  "deepseek-r1:8b",Stream: true,Options: map[string]any{"max_tokens":  1024,"temperature": 0.3,"top_p":       0.9,"raw":         true, // 这个如果false,会屏蔽 Thinking 字段},}switch askType {case AskTypeCompletion:apiURL = "http://localhost:11434/api/generate"reqBody.Prompt = promptgetResContest = func(resp DeepseekResponse) string {return resp.Response}case AskTypeChat:apiURL = "http://localhost:11434/api/chat"chartHistory = append(chartHistory, Message{Role: "user", Content: prompt})// 加入模型回复到历史记录defer func() {if err == nil {fmt.Println("模型的完整回复:", completeResponse.String())chartHistory = append(chartHistory, Message{Role: "assistant", Content: completeResponse.String()})}}()reqBody.Messages = chartHistorygetResContest = func(resp DeepseekResponse) string {return resp.ResMessage.Content}}fmt.Printf("接受到了发送到的请求....%+v\n", reqBody)data, _ := json.Marshal(reqBody)resp, err := http.Post(apiURL, "application/json", bytes.NewReader(data))if err != nil {return err}defer resp.Body.Close()reader := bufio.NewReader(resp.Body)flusher, _ := w.(http.Flusher)for {line, err := reader.ReadBytes('\n')if err != nil {break}lineStr := strings.TrimSpace(string(line))if lineStr == "" {continue}var part DeepseekResponseif err := json.Unmarshal(line, &part); err != nil {continue}fmt.Printf("原始返回:%+v\n", part)// 检查是否完成,输出完了,跳出循环if part.Done {break}if content := getResContest(part); content != "" {// 一般浏览器都兼容,直接发送字符串即可,不需要逐字符发送// for _, ch := range content {// 	fmt.Fprintf(w, "data: %c\n\n", ch) //将字节写入 io.write 中// 	flusher.Flush()// 	fmt.Println("输出后端返回结果:", content)// 	time.Sleep(1 * time.Millisecond) // 可调节打字机速度// }fmt.Fprintf(w, "data: %s\n\n", content) //将字节写入 io.write 中flusher.Flush()completeResponse.WriteString(content) // 累加模型回复}}fmt.Fprintf(w, "data: \n\n")fmt.Fprintf(w, "data: __END__\n\n") //自定义的结束符,前端代码根据这个结束符判断是否结束flusher.Flush()return nil
}// chatHandler 处理聊天请求的HTTP处理器
func chatHandler(w http.ResponseWriter, r *http.Request) {flusher, ok := w.(http.Flusher)if !ok {http.Error(w, "Streaming not supported", http.StatusInternalServerError)return}// sse 响应头设置,基本都是固定的w.Header().Set("Access-Control-Allow-Origin", "*")  // 测试过程中,允许所有域名跨域访问w.Header().Set("Content-Type", "text/event-stream") // 要实现打字机效果,事件流格式比如为 text/event-streamw.Header().Set("Cache-Control", "no-cache")         // 禁用缓存,确保实时更新w.Header().Set("Connection", "keep-alive")          // sse 保持连接userMessage := r.URL.Query().Get("msg")if userMessage == "" {userMessage = "Hello DeepSeek"}err := deepseekStream(w, userMessage, AskTypeChat)if err != nil {fmt.Fprintf(w, "data: %s\n\n", err.Error())flusher.Flush()}
}func main() {http.HandleFunc("/chat", chatHandler)fmt.Println("Server started at :8080")log.Fatal(http.ListenAndServe(":8080", nil))
}

相关新闻

  • 龙哥量化:初版简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)
  • 代码随想录算法训练营第三章 哈希表part02
  • 龙哥量化:简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

最新新闻

  • FinalShell卡顿根源与2026年四大现代SSH工具选型指南
  • 望江县黄金回收靠谱店铺实测排行:2026本地门店实测,规避隐形扣费套路及联系方式推荐 - 前途无量YY
  • 果洛藏族自治州班玛县厂区洼地吸污抽粪排空大面积积水污水,基建工程抽泥浆转运施工产生大量淤泥沙土 - 天堂海洋
  • 哈尔滨卖表必看!2026道里卡地亚名表回收实测排行 - 名奢变现站
  • 明溪县黄金回收靠谱店铺实测排行:2026本地门店实测,规避隐形扣费套路及联系方式推荐 - 前途无量YY
  • 龙南县黄金回收靠谱店铺实测排行:2026本地门店实测,规避隐形扣费套路及联系方式推荐 - 前途无量YY

日新闻

  • Arduino-ESP32项目深度解析:解锁隐藏芯片支持与架构演进
  • 2026年 系统窗厂家/品牌推荐榜单:隔音系统窗+高端系统门窗的核心优势与选购指南 - 品牌发掘
  • NVBench:首个双语非言语发声语音合成评测基准详解与实践

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号