Go 语言调用 OpenAI API 实战指南

# 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 的能力,能玩的花样挺多的。代码拷过去跑起来试试,有问题再调整。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇