通过Golang使用DeepSeek的最佳实践指南

通过Golang使用DeepSeek的最佳实践指南

Go DeepSeek

Go Reference Go Report Card

这个库为 DeepSeek 提供了非官方的 Go 客户端。我们支持:

  • deepseek-chat

安装

go get github.com/p9966/go-deepseek

目前,go-deepseek 要求 Go 版本为 1.23.5 或更高。

使用

使用示例:

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/p9966/go-deepseek"
)

func main() {
	client := deepseek.NewClient(os.Getenv("deepseek token"))
	request := deepseek.ChatCompletionRequest{
		Model: deepseek.DeepSeekChat,
		Messages: []deepseek.ChatCompletionMessage{
			{
				Role:    deepseek.ChatMessageRoleUser,
				Content: "Hello!",
			},
		},
	}

	ctx := context.Background()
	resp, err := client.CreateChatCompletion(ctx, &request)
	if err != nil {
		log.Fatalf("ChatCompletion failed: %v", err)
	}

	fmt.Println(resp.Choices[0].Message.Content)
}

获取 DeepSeek API 密钥:

  1. 访问 DeepSeek 网站 https://www.deepseek.com/
  2. 如果您没有账户,请点击“注册”创建一个。如果有,请点击“登录”。
  3. 登录后,导航到您的 API 密钥管理页面。
  4. 点击“创建新的密钥”。
  5. 为您的新密钥输入一个名称,然后点击“创建密钥”。
  6. 您的新 API 密钥将会显示。使用此密钥与 DeepSeek API 进行交互。

注意: 您的 API 密钥是敏感信息。请勿与任何人共享。


更多关于通过Golang使用DeepSeek的最佳实践指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

@p9966 感谢你的工作,但这并非必需。很可能所有LLM API调用都可以使用Go的标准库,通过一个简单的类似Promise的包装器来封装。 😎

更多关于通过Golang使用DeepSeek的最佳实践指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


关于go-deepseek库的使用实践

这个库封装了DeepSeek API的调用,使用起来比较简洁。以下是一些实际使用中的关键点和示例:

1. 基础聊天完成示例

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    
    "github.com/p9966/go-deepseek"
)

func main() {
    // 从环境变量获取API密钥
    apiKey := os.Getenv("DEEPSEEK_API_KEY")
    if apiKey == "" {
        log.Fatal("DEEPSEEK_API_KEY environment variable is required")
    }
    
    client := deepseek.NewClient(apiKey)
    
    // 创建聊天请求
    request := deepseek.ChatCompletionRequest{
        Model: deepseek.DeepSeekChat,
        Messages: []deepseek.ChatCompletionMessage{
            {
                Role:    deepseek.ChatMessageRoleSystem,
                Content: "你是一个专业的Go语言助手",
            },
            {
                Role:    deepseek.ChatMessageRoleUser,
                Content: "请解释Go中的context包的作用",
            },
        },
        MaxTokens: 1000,
        Temperature: 0.7,
    }
    
    ctx := context.Background()
    resp, err := client.CreateChatCompletion(ctx, &request)
    if err != nil {
        log.Fatalf("ChatCompletion failed: %v", err)
    }
    
    fmt.Printf("回复: %s\n", resp.Choices[0].Message.Content)
}

2. 流式响应处理

func streamChatCompletion(client *deepseek.Client) error {
    request := deepseek.ChatCompletionRequest{
        Model: deepseek.DeepSeekChat,
        Messages: []deepseek.ChatCompletionMessage{
            {
                Role:    deepseek.ChatMessageRoleUser,
                Content: "用Go写一个简单的HTTP服务器",
            },
        },
        Stream: true,
    }
    
    ctx := context.Background()
    stream, err := client.CreateChatCompletionStream(ctx, &request)
    if err != nil {
        return err
    }
    defer stream.Close()
    
    for {
        response, err := stream.Recv()
        if err != nil {
            if err == io.EOF {
                break
            }
            return err
        }
        
        if len(response.Choices) > 0 {
            fmt.Print(response.Choices[0].Delta.Content)
        }
    }
    
    fmt.Println()
    return nil
}

3. 带错误重试的封装函数

type ChatClient struct {
    client *deepseek.Client
    maxRetries int
}

func NewChatClient(apiKey string, maxRetries int) *ChatClient {
    return &ChatClient{
        client: deepseek.NewClient(apiKey),
        maxRetries: maxRetries,
    }
}

func (c *ChatClient) SendMessageWithRetry(ctx context.Context, messages []deepseek.ChatCompletionMessage) (string, error) {
    request := deepseek.ChatCompletionRequest{
        Model: deepseek.DeepSeekChat,
        Messages: messages,
        MaxTokens: 2000,
    }
    
    var lastErr error
    for i := 0; i < c.maxRetries; i++ {
        resp, err := c.client.CreateChatCompletion(ctx, &request)
        if err != nil {
            lastErr = err
            time.Sleep(time.Duration(i+1) * time.Second) // 指数退避
            continue
        }
        
        if len(resp.Choices) > 0 {
            return resp.Choices[0].Message.Content, nil
        }
    }
    
    return "", fmt.Errorf("failed after %d retries: %v", c.maxRetries, lastErr)
}

// 使用示例
func main() {
    client := NewChatClient(os.Getenv("DEEPSEEK_API_KEY"), 3)
    
    messages := []deepseek.ChatCompletionMessage{
        {
            Role:    deepseek.ChatMessageRoleUser,
            Content: "帮我优化这段Go代码",
        },
    }
    
    response, err := client.SendMessageWithRetry(context.Background(), messages)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println(response)
}

4. 并发请求处理

func batchProcessQueries(client *deepseek.Client, queries []string) ([]string, error) {
    var wg sync.WaitGroup
    results := make([]string, len(queries))
    errs := make([]error, len(queries))
    
    for i, query := range queries {
        wg.Add(1)
        go func(idx int, q string) {
            defer wg.Done()
            
            request := deepseek.ChatCompletionRequest{
                Model: deepseek.DeepSeekChat,
                Messages: []deepseek.ChatCompletionMessage{
                    {
                        Role:    deepseek.ChatMessageRoleUser,
                        Content: q,
                    },
                },
            }
            
            ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
            defer cancel()
            
            resp, err := client.CreateChatCompletion(ctx, &request)
            if err != nil {
                errs[idx] = err
                return
            }
            
            if len(resp.Choices) > 0 {
                results[idx] = resp.Choices[0].Message.Content
            }
        }(i, query)
    }
    
    wg.Wait()
    
    // 检查是否有错误
    for _, err := range errs {
        if err != nil {
            return nil, err
        }
    }
    
    return results, nil
}

5. 结构化输出解析

type CodeReview struct {
    Issues     []string `json:"issues"`
    Suggestions []string `json:"suggestions"`
    Score      int      `json:"score"`
}

func reviewGoCode(client *deepseek.Client, code string) (*CodeReview, error) {
    prompt := fmt.Sprintf(`请审查这段Go代码,以JSON格式返回结果:
{
    "issues": ["问题1", "问题2"],
    "suggestions": ["建议1", "建议2"],
    "score": 85
}

代码:
%s`, code)
    
    request := deepseek.ChatCompletionRequest{
        Model: deepseek.DeepSeekChat,
        Messages: []deepseek.ChatCompletionMessage{
            {
                Role:    deepseek.ChatMessageRoleUser,
                Content: prompt,
            },
        },
        ResponseFormat: &deepseek.ResponseFormat{
            Type: "json_object",
        },
    }
    
    ctx := context.Background()
    resp, err := client.CreateChatCompletion(ctx, &request)
    if err != nil {
        return nil, err
    }
    
    var review CodeReview
    if err := json.Unmarshal([]byte(resp.Choices[0].Message.Content), &review); err != nil {
        return nil, fmt.Errorf("failed to parse response: %v", err)
    }
    
    return &review, nil
}

关键注意事项:

  1. API密钥管理:建议使用环境变量或安全的密钥管理服务
  2. 错误处理:API调用可能因网络或服务问题失败,需要适当的重试机制
  3. 上下文管理:为长时间运行的请求设置超时
  4. 速率限制:注意DeepSeek API的调用频率限制
  5. 资源清理:流式响应需要显式关闭连接

这个库的接口设计遵循了OpenAI SDK的模式,对于熟悉OpenAI Go客户端的开发者来说上手很快。实际使用中需要注意错误处理和资源管理。

回到顶部