Go语言调用DeepSeek API实现流式输出和对话

 更新时间:2025年02月07日 09:24:33   作者:老大白菜  
DeepSeek是一个强大的AI模型服务平台,本文将详细介绍如何使用Go语言调用DeepSeek API实现流式输出和对话功能,感兴趣的小伙伴可以了解一下

引言

DeepSeek 是一个强大的 AI 模型服务平台,本文将详细介绍如何使用 Go 语言调用 DeepSeek API,实现流式输出和对话功能。

Deepseek的api因为被功击已不能用,本文以 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ 为例子进行讲解。

1. 环境准备

首先,我们需要准备以下内容:

Go 语言环境

DeepSeek API 访问权限

开发工具(如 VS Code)

2. 基础代码实现

2.1 创建项目结构

mkdir deepseek-go
cd deepseek-go
go mod init deepseek-go

2.2 核心代码实现

package main

import (
    "bufio"
    "encoding/json"
    "fmt"
    "net/http"
    "os"
    "strings"
    "time"
)

// 定义响应结构
type ChatResponse struct {
    Choices []struct {
        Delta struct {
            Content string `json:"content"`
        } `json:"delta"`
    } `json:"choices"`
}

func main() {
    // 创建输出文件
    file, err := os.OpenFile("conversation.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        fmt.Printf("Error opening file: %v\n", err)
        return
    }
    defer file.Close()

    // API 配置
    url := "https://api.siliconflow.cn/v1/chat/completions"
    
    for {
        // 获取用户输入
        fmt.Print("\n请输入您的问题 (输入 q 退出): ")
        reader := bufio.NewReader(os.Stdin)
        question, _ := reader.ReadString('\n')
        question = strings.TrimSpace(question)
        
        if question == "q" {
            break
        }

        // 记录对话时间
        timestamp := time.Now().Format("2006-01-02 15:04:05")
        file.WriteString(fmt.Sprintf("\n[%s] Question:\n%s\n\n", timestamp, question))

        // 构建请求体
        payload := fmt.Sprintf(`{
            "model": "deepseek-ai/DeepSeek-V3",
            "messages": [
                {
                    "role": "user",
                    "content": "%s"
                }
            ],
            "stream": true,
            "max_tokens": 2048,
            "temperature": 0.7
        }`, question)

        // 发送请求
        req, _ := http.NewRequest("POST", url, strings.NewReader(payload))
        req.Header.Add("Content-Type", "application/json")
        req.Header.Add("Authorization", "Bearer YOUR_API_KEY")  // 替换为你的 API Key

        // 获取响应
        res, _ := http.DefaultClient.Do(req)
        defer res.Body.Close()

        // 处理流式响应
        scanner := bufio.NewReader(res.Body)
        for {
            line, err := scanner.ReadString('\n')
            if err != nil {
                break
            }

            line = strings.TrimSpace(line)
            if line == "" || line == "data: [DONE]" {
                continue
            }

            if strings.HasPrefix(line, "data: ") {
                line = strings.TrimPrefix(line, "data: ")
            }

            var response ChatResponse
            if err := json.Unmarshal([]byte(line), &response); err != nil {
                continue
            }

            if len(response.Choices) > 0 {
                content := response.Choices[0].Delta.Content
                if content != "" {
                    fmt.Print(content)
                    file.WriteString(content)
                }
            }
        }
    }
}

3. 主要特性说明

3.1 流式输出

DeepSeek API 支持流式输出(Stream),通过设置 "stream": true,我们可以实现实时显示 AI 回复的效果。这带来了更好的用户体验:

  • 即时看到响应内容
  • 减少等待时间
  • 更自然的对话体验

3.2 参数配置

{
    "model": "deepseek-ai/DeepSeek-V3",
    "messages": [...],
    "stream": true,
    "max_tokens": 2048,
    "temperature": 0.7,
    "top_p": 0.7,
    "top_k": 50,
    "frequency_penalty": 0.5
}

参数说明:

  • model: 选择使用的模型
  • max_tokens: 最大输出长度
  • temperature: 温度参数,控制输出的随机性
  • top_p, top_k: 控制采样策略
  • frequency_penalty: 控制重复度

3.3 对话记录

程序会自动将所有对话保存到 conversation.txt 文件中,包含:

  • 时间戳
  • 用户问题
  • AI 回答
  • 格式化的分隔符

4. 使用示例

运行程序:

go run main.go

输入问题,比如:

请输入您的问题: 介绍一下 DeepSeek 的主要特点

观察实时输出和 conversation.txt 文件记录

5. 错误处理和最佳实践

1.API 密钥管理

  • 使用环境变量存储 API 密钥
  • 不要在代码中硬编码密钥
  • 定期轮换密钥

2.错误处理

  • 检查网络连接
  • 验证 API 响应
  • 处理流式输出中断

3.性能优化

  • 使用适当的 buffer 大小
  • 及时关闭连接
  • 处理并发请求

总结

通过本文的介绍,你应该已经掌握了如何使用 Go 语言调用 DeepSeek API 的基本方法。DeepSeek 提供了强大的 AI 能力,配合 Go 语言的高效性能,可以构建出各种有趣的应用。

到此这篇关于Go语言调用DeepSeek API的完整指南的文章就介绍到这了,更多相关Go调用DeepSeek API内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang下的GOPATH路径问题及解决

    golang下的GOPATH路径问题及解决

    为了方便,我一般使用task来管理项目的编译等事项,由于才入门go,所以碰到一个问题,以此篇为记,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • golang网络数据包捕获库gopacket详解

    golang网络数据包捕获库gopacket详解

    gopacket/pcap是Go语言网络数据包捕获库,支持实时捕获、过滤、解析pcap文件及接口统计,结合layers包可分析DNS流量,处理CNAME、多IP等复杂情况,需注意权限和性能优化,适用于网络监控与安全工具开发
    2025-07-07
  • GoLang string类型深入分析

    GoLang string类型深入分析

    string 作为 go 语言中的基础类型,其实有一些需要反复揣摩的,可能是我们使用的场景太简单,也可能是我们不需要那可怜的一点优化来提高性能,对它也就没那么上心了
    2023-01-01
  • go开源Hugo站点构建三步曲之集结渲染

    go开源Hugo站点构建三步曲之集结渲染

    这篇文章主要为大家介绍了go开源Hugo站点构建三步曲之集结渲染详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Go实现自己的网络流量解析和行为检测引擎原理

    Go实现自己的网络流量解析和行为检测引擎原理

    这篇文章主要为大家介绍了Go实现自己的网络流量解析和行为检测引擎原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go语言学习之golang-jwt/jwt的教程分享

    Go语言学习之golang-jwt/jwt的教程分享

    jwt是 json web token的简称。go使用jwt目前,主流使用的jwt库是golang-jwt/jwt。本文就来和大家讲讲golang-jwt/jwt的具体使用,需要的可以参考一下
    2023-01-01
  • 使用Go初始化Struct的方法详解

    使用Go初始化Struct的方法详解

    面向对象编程语言最基础的概念就是类(class),不过Go语言并没有类的概念,所以使用Go语言开发时,我们一般会用struct(结构体)来模拟面向对象中的类,下面我们来介绍几种创建struct类型变量的方法,需要的朋友可以参考下
    2024-01-01
  • Go通过goroutine实现多协程文件上传的基本流程

    Go通过goroutine实现多协程文件上传的基本流程

    多协程文件上传是指利用多线程或多协程技术,同时上传一个或多个文件,以提高上传效率和速度,本文给大家介绍了Go通过goroutine实现多协程文件上传的基本流程,需要的朋友可以参考下
    2024-05-05
  • GO语言实现简单的目录复制功能

    GO语言实现简单的目录复制功能

    这篇文章主要介绍了GO语言实现简单的目录复制功能,通过新建及复制内容等操作最终实现复制目录的功能效果,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • 详解go语言中并发安全和锁问题

    详解go语言中并发安全和锁问题

    这篇文章主要介绍了go语言中并发安全和锁问题,包含互斥锁解锁过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论