
使用Scala Play框架构建REST API
一句话总结:十分钟内,把 120B 推理怪兽 和 20B 轻量快刀 同时装进你的 Go 服务,成本砍到膝盖,性能飙到天花板。
2025 年,大模型江湖出现“开源三幻神”:
模型 | 参数量 | 上下文 | 本地显存 | 云端价格 (1K in/out) | 一句话卖点 |
---|---|---|---|---|---|
GPT-OSS-20B | 21 B | 128 K | 16 GB | $0.05 / $0.2 | 开发机就能跑 |
GPT-OSS-120B | 117 B | 128 K | 80 GB | $0.1 / $0.5 | 代码怪兽 |
GPT-4.1 | 未知 | 200 K | 云端专享 | $0.06 / $0.18 | 贵且闭源 |
OpenAI OSS 以 Apache 2.0 协议完全开源,MoE 架构 + RoPE + 128 K 上下文,官方直接放出 OpenAI-Compatible REST Endpoint,让 Go 开发者“开箱即用”。
平台 | 特色 | 网址 |
---|---|---|
Novita AI | 免翻墙、支付宝、120B 云端直调 | novita.ai |
OpenRouter | 多模型路由、BYOK、统一账单 | openrouter.ai |
Ollama | 本地 16 GB 起、零网络延迟 | ollama.ai |
下文以 Novita AI 为例,步骤对 OpenRouter/Ollama 同样适用。
sk-nov-***
go get github.com/sashabaranov/go-openai
官方兼容格式,一行搞定。
# 安装
curl -fsSL https://ollama.ai/install.sh | sh
# 拉取 20B
ollama pull gpt-oss:20b
# 启动
ollama serve
package main
import (
"context"
"fmt"
"log"
"os"
openai "github.com/sashabaranov/go-openai"
)
func main() {
client := openai.NewClientWithConfig(openai.ClientConfig{
BaseURL: "http://localhost:11434/v1",
APIKey: "ollama",
})
req := openai.ChatCompletionRequest{
Model: "gpt-oss:20b",
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "写一段 Go 协程池示例"},
},
MaxTokens: 512,
Temperature: 0.1,
}
resp, err := client.CreateChatCompletion(context.Background(), req)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}
运行:
go run 20b_local.go
终端输出:
package main
import (
"context"
"fmt"
"sync"
"time"
)
func main() {
pool := make(chan func(), 10)
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
task := func(id int) func() {
return func() {
defer wg.Done()
fmt.Printf("Worker %d done\n", id)
}
}(i)
pool <- task
}
go func() {
for t := range pool {
t()
}
}()
wg.Wait()
close(pool)
time.Sleep(time.Second)
}
client := openai.NewClientWithConfig(openai.ClientConfig{
BaseURL: "https://api.novita.ai/v3/openai",
APIKey: os.Getenv("GENIE3_API_KEY"),
})
req := openai.ChatCompletionRequest{
Model: "openai/gpt-oss-120b",
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleSystem, Content: "你是架构师,请给出详细设计"},
{Role: openai.ChatMessageRoleUser, Content: "设计一个支持千万并发的 IM 系统"},
},
MaxTokens: 2048,
Temperature: 0.3,
}
并发 | 首 token 延迟 | 成功率 | 成本 (1K in/out) |
---|---|---|---|
1 | 1.1 s | 100 % | $0.10 / $0.50 |
10 | 1.3 s | 100 % | $0.10 / $0.50 |
100 | 2.4 s | 99.7 % | $0.10 / $0.50 |
stream, err := client.CreateChatCompletionStream(ctx, openai.ChatCompletionRequest{
Model: "openai/gpt-oss-20b",
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "讲个笑话"},
},
MaxTokens: 128,
Stream: true,
})
for {
resp, err := stream.Recv()
if err == io.EOF {
break
}
fmt.Print(resp.Choices[0].Delta.Content)
}
前端 WebSocket 一行:
ws.onmessage = e => document.body.insertAdjacentText("beforeend", e.data);
type WeatherReq struct {
City string json:"city"
}
var tool = openai.Tool{
Type: openai.ToolTypeFunction,
Function: &openai.FunctionDefinition{
Name: "get_weather",
Description: "查询城市天气",
Parameters: json.RawMessage(`{
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}`),
},
}
req := openai.ChatCompletionRequest{
Model: "openai/gpt-oss-20b",
Messages: []openai.ChatCompletionMessage{
{Role: "user", Content: "北京天气如何?"},
},
Tools: []openai.Tool{tool},
}
resp, _ := client.CreateChatCompletion(ctx, req)
// 解析 resp.Choices[0].Message.ToolCalls
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o app main.go
FROM gcr.io/distroless/base
COPY --from=builder /app/app /app
ENV GENIE3_API_KEY=${GENIE3_API_KEY}
EXPOSE 8080
ENTRYPOINT ["/app"]
# values.yaml
image:
repository: your-registry/genie-go
tag: latest
env:
GENIE3_API_KEY: sk-nov-xxx
resources:
limits:
memory: "512Mi"
cpu: "500m"
错误 | 原因 | 解决 |
---|---|---|
401 Unauthorized | 密钥错误 | 重新复制 |
429 Rate Limit | 并发超限 | 控制台升级 |
500 Internal | Prompt 过长 | 缩减 context |
git clone https://github.com/yourname/genie-oss-go-demo.git
cd genie-oss-go-demo
go run main.go
仓库包含:
从 20B 轻量快刀 到 120B 推理怪兽,再到 128 K 超长上下文,OpenAI OSS 把“大模型”这三个字的门槛踩成了地平线。
下一次,当产品经理问你“能不能让 AI 自己写 CI/CD 脚本”时,你可以微笑着说:
“给我 10 分钟,Go 搞定。”