# Go 语言调用 OpenAI API 实战指南
## 背景
大语言模型现在火得不行,OpenAI 的 API 基本上是开发者接触 AI 的第一选择。Go 语言写起并发来顺手,部署也简单,用它来调 OpenAI API 是个挺自然的选择。
这篇文章讲讲怎么用 Go 调用 OpenAI API,从环境配置到代码跑通,带你写一个自己的聊天机器人。
## 常见问题
开发过程中通常会遇到这么几个坎:
1. **API Key 怎么拿**:很多人不知道上哪儿找 Key,也不清楚环境变量怎么设
2. **HTTP 请求太麻烦**:自己手写请求头、签名、超时控制,代码量一下就上去了
3. **JSON 响应难解析**:返回结构嵌套好几层,取个值要写一堆类型断言
4. **错误处理写不好**:网络抖动、API 限流的情况没考虑周全,程序说崩就崩
5. **流式输出怎么做**:想实现打字机效果,但不知道 SSE 怎么接
## 动手操作
### 第一步:准备环境
先搞定 OpenAI 的 API Key:
1. 打开 https://platform.openai.com/
2. 登录账号
3. 找到 API Keys 页面,点 Create new secret key
4. Key 只显示一次,赶紧复制保存
再检查一下 Go 版本,要求 1.18 以上:
“`bash
go version
“`
没装的话上 https://go.dev/dl/ 下载。
### 第二步:建项目装依赖
“`bash
mkdir openai-chatbot
cd openai-chatbot
go mod init openai-chatbot
“`
装 SDK:
“`bash
go get github.com/sashabaranov/go-openai
“`
这个包是 Go 社区里用得最多的 OpenAI 客户端,接口设计得比较干净,错误处理也封装好了。
### 第三步:写代码
建个 main.go,把下面的代码贴进去:
“`go
package main
import (
“context”
“fmt”
“log”
“os”
“github.com/sashabaranov/go-openai”
)
// 配置结构体
type Config struct {
APIKey string
Model string
MaxTokens int
Temperature float64
}
// 初始化配置
func initConfig() *Config {
apiKey := os.Getenv(“OPENAI_API_KEY”)
if apiKey == “” {
log.Fatal(“请设置 OPENAI_API_KEY 环境变量”)
}
return &Config{
APIKey: apiKey,
Model: openai.GPT4oMini,
MaxTokens: 1000,
Temperature: 0.7,
}
}
// 创建客户端
func createClient(cfg *Config) *openai.Client {
config := openai.DefaultConfig(cfg.APIKey)
config.BaseURL = “https://api.openai.com/v1”
client := openai.NewClientWithConfig(config)
return client
}
// 简单对话请求
func simpleChat(client *openai.Client, ctx context.Context, message string) error {
resp, err := client.CreateChatCompletion(
ctx,
openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: message,
},
},
MaxTokens: 1000,
Temperature: 0.7,
},
)
if err != nil {
return fmt.Errorf(“请求失败: %v”, err)
}
fmt.Println(“AI 回复:”)
fmt.Println(resp.Choices[0].Message.Content)
return nil
}
// 带上下文的对话
func chatWithContext(client *openai.Client, ctx context.Context, messages []openai.ChatCompletionMessage) error {
resp, err := client.CreateChatCompletion(
ctx,
openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: messages,
MaxTokens: 1000,
Temperature: 0.7,
},
)
if err != nil {
return fmt.Errorf(“请求失败: %v”, err)
}
fmt.Println(“AI 回复:”)
fmt.Println(resp.Choices[0].Message.Content)
return nil
}
// 流式输出
func streamChat(client *openai.Client, ctx context.Context, message string) error {
stream, err := client.CreateChatCompletionStream(
ctx,
openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: message,
},
},
MaxTokens: 1000,
Temperature: 0.7,
Stream: true,
},
)
if err != nil {
return fmt.Errorf(“流式请求失败: %v”, err)
}
defer stream.Close()
fmt.Print(“AI 回复: “)
for {
response, err := stream.Recv()
if err != nil {
break
}
if len(response.Choices) > 0 {
fmt.Print(response.Choices[0].Delta.Content)
}
}
fmt.Println()
return nil
}
// 使用系统提示词
func chatWithSystemPrompt(client *openai.Client, ctx context.Context, systemPrompt, userMessage string) error {
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: systemPrompt,
},
{
Role: openai.ChatMessageRoleUser,
Content: userMessage,
},
}
resp, err := client.CreateChatCompletion(
ctx,
openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: messages,
MaxTokens: 1000,
Temperature: 0.7,
},
)
if err != nil {
return fmt.Errorf(“请求失败: %v”, err)
}
fmt.Println(“AI 回复:”)
fmt.Println(resp.Choices[0].Message.Content)
return nil
}
// 交互式聊天机器人
func interactiveChatbot(client *openai.Client) {
ctx := context.Background()
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: “你是一个友好的聊天机器人,请用简洁有趣的方式回答问题。”,
},
}
fmt.Println(“=== 智能聊天机器人 ===”)
fmt.Println(“输入你的问题,输入 quit 或 exit 退出”)
fmt.Println()
for {
fmt.Print(“你: “)
var input string
fmt.Scanln(&input)
if input == “quit” || input == “exit” {
fmt.Println(“再见!”)
break
}
if input == “” {
continue
}
messages = append(messages, openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: input,
})
err := chatWithContext(client, ctx, messages)
if err != nil {
log.Printf(“错误: %v”, err)
continue
}
}
}
func main() {
cfg := initConfig()
client := createClient(cfg)
ctx := context.Background()
// 示例 1: 简单对话
fmt.Println(“=== 示例 1: 简单对话 ===”)
err := simpleChat(client, ctx, “用一句话解释什么是机器学习”)
if err != nil {
log.Printf(“错误: %v”, err)
}
fmt.Println()
// 示例 2: 流式输出
fmt.Println(“=== 示例 2: 流式输出 ===”)
err = streamChat(client, ctx, “写一首关于春天的短诗”)
if err != nil {
log.Printf(“错误: %v”, err)
}
fmt.Println()
// 示例 3: 系统提示词
fmt.Println(“=== 示例 3: 带系统提示词 ===”)
err = chatWithSystemPrompt(client, ctx, “你是一个专业的 Python 程序员,用中文回答问题”, “如何用 Python 读取 JSON 文件”)
if err != nil {
log.Printf(“错误: %v”, err)
}
}
“`
### 第四步:跑起来
设置环境变量:
“`bash
export OPENAI_API_KEY=”你的API密钥”
“`
运行:
“`bash
go run main.go
“`
## 输出效果
跑通之后大概长这样:
“`
=== 示例 1: 简单对话 ===
AI 回复:
机器学习是一种人工智能的分支,通过让计算机从数据中学习并改进性能,而无需明确编程。
=== 示例 2: 流式输出 ===
AI 回复:
春风拂面花千树,
绿意盎然草自生。
燕子归来寻旧垒,
万物复苏迎新春。
=== 示例 3: 带系统提示词 ===
AI 回复:
在 Python 中,可以使用内置的 json 模块来读取 JSON 文件。以下是基本方法:
import json
# 读取 JSON 文件
with open(“data.json”, “r”, encoding=”utf-8″) as f:
data = json.load(f)
print(data)
“`
## 进阶用法
### DALL-E 生图
“`go
func generateImage(client *openai.Client, ctx context.Context) error {
resp, err := client.CreateImage(
ctx,
openai.ImageRequest{
Prompt: “一只可爱的橘猫坐在窗台上”,
Size: openai.CreateImageSize1024x1024,
N: 1,
ResponseFormat: openai.CreateImageResponseFormatURL,
},
)
if err != nil {
return err
}
fmt.Println(“生成的图片 URL:”)
fmt.Println(resp.Data[0].URL)
return nil
}
“`
### Whisper 语音转文字
“`go
func transcribeAudio(client *openai.Client, ctx context.Context, audioPath string) error {
resp, err := client.CreateTranscription(
ctx,
openai.AudioRequest{
FilePath: audioPath,
Model: openai.Whisper1,
},
)
if err != nil {
return err
}
fmt.Println(“识别结果:”)
fmt.Println(resp.Text)
return nil
}
“`
### 稳妥的错误处理
“`go
func safeChat(client *openai.Client, ctx context.Context, message string) {
resp, err := client.CreateChatCompletion(ctx, openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: message},
},
})
if err != nil {
switch err.(type) {
case *openai.APIError:
apiErr := err.(*openai.APIError)
fmt.Printf(“API 报错: %d – %s\n”, apiErr.StatusCode, apiErr.Message)
default:
fmt.Printf(“出错了: %v\n”, err)
}
return
}
fmt.Println(resp.Choices[0].Message.Content)
}
“`
## 总结
这篇文章覆盖了:
1. API Key 怎么获取、Go 环境怎么装
2. 简单对话怎么写
3. 上下文怎么维护
4. 流式输出怎么实现打字机效果
5. 系统提示词怎么用来定制 AI 角色
6. DALL-E 和 Whisper 这种扩展功能
7. 错误处理的写法
实际开发中注意几点:
– Key 千万别提交到 Git,用环境变量或者 .env 文件
– max_tokens 设小点,省点钱
– API 限流很常见,写个指数退避的重试逻辑
– 长对话记得裁剪历史消息,不然容易超 token 限制
Go 写并发应用本来就顺手,配上 OpenAI 的能力,能玩的花样挺多的。代码拷过去跑起来试试,有问题再调整。