引言
DeepSeek 是一个强大的 AI 模型平台,支持多种自然语言处理任务,如对话生成、代码补全和函数调用。为了方便 Go 开发者快速集成 DeepSeek 的功能,我开发了一个非官方的 Go 客户端库:go-deepseek。本文将详细介绍如何使用该库,从在线 API 调用到本地模型部署,帮助你快速上手。
项目简介
go-deepseek 是一个 Go 语言编写的客户端库,支持以下功能:
- Chat Completion:对话生成
- FIM (Fill-in-Middle) Completion:代码补全
- Function Calling:函数调用
- Embeddings:文本嵌入
此外,go-deepseek 还支持通过 Ollama 调用本地模型(如 deepseek-r1),为开发者提供更灵活的部署选项。
安装
使用以下命令安装 go-deepseek:
go get github.com/p9966/go-deepseek
注意:该库需要 Go 1.23 或更高版本。
快速开始
1. 使用 DeepSeek API 进行对话生成
以下是一个简单的示例,展示如何使用go-deepseek
调用 DeepSeek 的在线 API 进行对话生成:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
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)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
fmt.Println(resp.Choices[0].Message.Content)
}
使用 Ollama 调用本地模型
如果你想在本地运行模型,可以通过 Ollama 部署 deepseek-r1
,并使用以下代码调用:
package main
import (
"context"
"fmt"
"log"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.Client{
BaseUrl: "http://localhost:11434",
}
request := deepseek.OllamaChatRequest{
Model: "deepseek-r1:7b",
Messages: []deepseek.OllamaChatMessage{
{
Role: "user",
Content: "Hello!",
},
},
}
response, err := client.CreateOllamaChatCompletion(context.TODO(), &request)
if err != nil {
log.Fatalf("Error: %v", err)
}
fmt.Println(response.Message.Content)
}
获取 DeepSeek API Key
- 访问 DeepSeek 官网。
- 注册或登录你的账户。
- 进入 API Key 管理页面。
- 点击 “Create new secret key”。
- 输入 Key 的名称并确认。
- 生成的 API Key 将显示在页面上,请妥善保管。
注意:API Key 是敏感信息,请勿泄露。
本地模型部署
如果你想在本地运行模型,可以按照以下步骤操作:
- 访问 Ollama 官网。
- 下载并安装 Ollama。
- 在终端中运行以下命令下载模型:
ollama run deepseek-r1
现在你可以通过 go-deepseek
调用本地模型了。
提示:你还可以从Ollama 模型库下载其他模型,使用方法类似。
更多示例
FIM (Fill-in-Middle) Completionpackage main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
request := deepseek.FINCompletionRequest{
Model: deepseek.DeepSeekChat,
Prompt: "What is the weather like today?",
}
ctx := context.Background()
resp, err := client.CreateFINCompletion(ctx, &request)
if err != nil {
log.Fatalf("Error creating completion: %v", err)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
fmt.Println(resp.Choices[0].Text)
}
Function Calling
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
request := deepseek.ChatCompletionRequest{
Model: deepseek.DeepSeekChat,
Messages: []deepseek.ChatCompletionMessage{
{
Role: deepseek.ChatMessageRoleUser,
Content: "How's the weather in Hangzhou?",
},
},
Tools: []deepseek.Tools{
{
Type: "function",
Function: deepseek.Function{
Name: "get_weather",
Description: "Get weather of an location, the user shoud supply a location first",
Parameters: &deepseek.Parameters{
Type: "object",
Properties: map[string]interface{}{
"location": map[string]interface{}{
"description": "The location to get weather",
"type": "string",
},
},
Required: []string{"location"},
},
},
},
},
}
ctx := context.Background()
resp, err := client.CreateChatCompletion(ctx, &request)
if err != nil {
log.Fatalf("ChatCompletion failed: %v", err)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
if len(resp.Choices[0].Message.ToolCalls) == 0 {
log.Fatal("No function calls available")
}
fmt.Printf("Function name: %v, args:%s\n", resp.Choices[0].Message.ToolCalls[0].Function.Name, resp.Choices[0].Message.ToolCalls[0].Function.Arguments)
}
项目地址与许可
- GitHub 仓库:go-deepseek
- 许可证:MIT License
结语
go-deepseek
是一个功能强大且易于使用的 Go 客户端库,支持从在线 API 到本地模型的多种部署方式。无论你是想快速集成 DeepSeek
的功能,还是在本地运行模型,go-deepseek
都能满足你的需求。如果你有任何问题或建议,欢迎在 GitHub 上提交 Issue 或 PR!