5 分钟跑通第一个 LLM 程序:从零到 Hello AI
不只是「调了一次 API」。你完成了一个程序员跟 LLM 通信的完整链路:```你的 Go 程序→ HTTP POST(JSON 格式的 Prompt + 参数)→ DeepSeek 服务器→ 模型推理← SSE 流式响应← 你的程序逐字打印```**这个链路是所有 AI 应用的基础。** 后面不管你写多复杂的 Agent,底层都是这个东西。
🦞 一只用 AI Agent 搭副业产线的程序员
前面几篇讲了概念、做了对比。我知道你在想什么——「啥时候能让我上手跑一个?」
就现在。5 分钟。从注册 API Key 到看到 AI 返回结果。
第 1 分钟:拿到 Key
打开 platform.deepseek.com,手机号注册,进「API Keys」点「新建」,复制。
DeepSeek 新用户默认送 100 万 token 免费额度。够你跑一个月实验。
设置环境变量:
export DEEPSEEK_API_KEY="sk-你的key"
第 2 分钟:装 Go(如果还没有)
Go 1.21+ 都行:
go version
# go version go1.22.0 windows/amd64
没装的话,go.dev/dl 下载安装,3 分钟的事。
第 3 分钟:新建项目
mkdir hello-ai && cd hello-ai
go mod init hello-ai
新建 main.go,贴入以下代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
const baseURL = "https://api.deepseek.com/anthropic"
type Message struct {
Role string `json:"role"`
Content string `json:"content"`
}
type Request struct {
Model string `json:"model"`
MaxTokens int `json:"max_tokens"`
Temperature float64 `json:"temperature"`
Messages []Message `json:"messages"`
}
func main() {
apiKey := os.Getenv("DEEPSEEK_API_KEY")
if apiKey == "" {
fmt.Println("请先设置 DEEPSEEK_API_KEY 环境变量")
os.Exit(1)
}
req := Request{
Model: "deepseek-v4-flash", // 先用免费的
MaxTokens: 200,
Temperature: 0.1,
Messages: []Message{
{Role: "user", Content: "你好!用 Go 写一个打印 'Hello, AI!' 的程序。"},
},
}
body, _ := json.Marshal(req)
httpReq, _ := http.NewRequest(
"POST",
baseURL+"/v1/messages",
bytes.NewReader(body),
)
httpReq.Header.Set("x-api-key", apiKey)
httpReq.Header.Set("anthropic-version", "2023-06-01")
httpReq.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(httpReq)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
os.Exit(1)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
// 提取回复内容
content, _ := result["content"].([]interface{})
if len(content) > 0 {
text, _ := content[0].(map[string]interface{})["text"].(string)
fmt.Println(text)
}
}
第 4 分钟:跑
go run main.go
3 秒后,终端输出:
当然可以!以下是一个打印 "Hello, AI!" 的 Go 程序:
package main
import "fmt"
func main() {
fmt.Println("Hello, AI!")
}
你写了 50 行代码,AI 回了 50 行代码。一个完整的对话循环跑通了。
第 5 分钟:加个流式输出,看着 AI 一个字一个字写
刚才那个是非流式,等 AI 全写完了一次返回。改成流式,看 AI 一个字一个字往外蹦,体验完全不一样。
在 main.go 里把请求改成流式 (Stream: true),然后加一个 SSE 解析器:
type Request struct {
// ... 其他字段
Stream bool `json:"stream"`
}
func main() {
// ... 前面一样
req.Stream = true
body, _ := json.Marshal(req)
// ... 发起请求一样
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
line := scanner.Text()
if !strings.HasPrefix(line, "data: ") {
continue
}
data := line[6:]
if data == "[DONE]" {
break
}
var event map[string]interface{}
json.Unmarshal([]byte(data), &event)
if delta, ok := event["delta"].(map[string]interface{}); ok {
if text, ok := delta["text"].(string); ok {
fmt.Print(text) // 一个字一个字打出来
}
}
}
fmt.Println()
}
再跑一次。你会看到终端里文字像打字机一样逐字输出——这才是 ChatGPT 那个味道。
你刚刚完成了什么
不只是「调了一次 API」。你完成了一个程序员跟 LLM 通信的完整链路:
你的 Go 程序
→ HTTP POST(JSON 格式的 Prompt + 参数)
→ DeepSeek 服务器
→ 模型推理
← SSE 流式响应
← 你的程序逐字打印
这个链路是所有 AI 应用的基础。 后面不管你写多复杂的 Agent,底层都是这个东西。
常见踩坑(刚才你可能遇到了)
Q:x-api-key header is required
没设环境变量。echo $DEEPSEEK_API_KEY 看看有没有。没有就 export 一下。
Q:connect: connection timed out
国内访问 DeepSeek 偶尔不稳定。换个时间,或者 curl 测试一下:
curl -H "x-api-key: $DEEPSEEK_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-flash","max_tokens":50,"messages":[{"role":"user","content":"hi"}]}' \
https://api.deepseek.com/anthropic/v1/messages
Q:返回了但内容是空的
MaxTokens 设得太小。试试改成 200。
Q:go run 报 no required module provides package
go mod init 忘了。在项目目录下跑一次。
接下来做什么
你现在手里有一个能跟 AI 对话的 Go 程序。接下来三条路:
- 想深入 → 下一篇做 API 价格实测,了解每次调用到底花多少钱
- 想实用 → 跳到模块二,把 Prompt 做成可复用的模板系统
- 想玩 → 把 DeepSeek 换成 Ollama 本地模型,看看不联网能跑成什么样
下一篇我们算一笔账:各家 API 每次调用的真实成本。不是官方的「每 1M token X 元」,而是你实际跑 100 次调用的账单。
关注我,别错过。
🦞 一只用 AI Agent 搭副业产线的程序员
全平台同名:虾哥不加班
需要定制 AI 工具?来聊聊 → lob_ai
更多推荐


所有评论(0)