第二篇:接入第三方云端大模型!API Key打造ReAct智能体

2026-04-01 75 0

在上一篇文章中,我们实现了从模拟LLM到真实LLM的跨越,跑通了ReAct智能体的核心闭环。这一篇我使用第三方云端大模型API Key(OpenAI/DeepSeek/通义千问/月之暗面等,所有兼容OpenAI接口的模型都能用),零本地部署、零环境配置,拿API Key就能直接运行,打造纯云端推理的工业级Agent。

全程依旧Go原生开发,无复杂框架,代码简洁可直接运行,完美贴合Go后端开发习惯。


一、本篇核心升级:纯云端LLM,零本地依赖

本地模型方案:

  • • 需要本地装 Ollama、拉模型,门槛高、耗资源;
  • • 推理速度受本地硬件限制。

本篇云端Agent方案

  • • 无任何本地模型部署,仅需一个第三方大模型API Key
  • • 推理全在云端完成,速度快、稳定性高;
  • • 兼容所有OpenAI接口规范的第三方大模型(通用无门槛);
  • • 保留完整ReAct范式:自然语言理解→云端推理→工具调用→记忆闭环

这才是企业级生产环境最常用的Agent方案!


二、3步准备:零门槛,拿Key就能用

1. 安装Go OpenAI兼容SDK

所有第三方云端模型都兼容这个SDK,一行命令安装:

go get github.com/sashabaranov/go-openai

2. 获取第三方大模型API Key

任选一个支持OpenAI接口的平台,申请API Key:

  • • OpenAI(官方)
  • • DeepSeek(深度求索)
  • • 通义千问(阿里云)
  • • Kimi(月之暗面)
  • • 智谱AI

所有平台获取的API Key,都能直接用在我们的代码里,无需修改逻辑。

3. 安全配置:环境变量传入API Key

绝对不要把API Key硬编码在代码里!用环境变量安全传入:

  • • Mac/Linux终端执行:
    export OPENAI_API_KEY="你的第三方API Key"
  • • Windows终端执行:
    set OPENAI_API_KEY=你的第三方API Key

    比如:我使用 Mac 开发环境,使用 DeepSeek API KEY

    export DEEPSEEK_API_KEY="sk-我的第三方API Key"

三、核心代码:纯云端API版ReAct Agent

仅靠API Key调用云端LLM,逻辑更简洁、更贴近生产环境,注释拉满,一看就懂:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "os"
    "strings"

    "github.com/sashabaranov/go-openai"
)

// ==================== 1. Agent 核心结构体:状态 + 记忆 ====================

// Agent 保存 Agent 运行时的状态与记忆(工业级标准)。
type Agent struct {
    UserPrompt  string // 用户自然语言指令(如:帮我算150加250)
    Memory      string // 工具执行结果记忆
    FinalAnswer string // 最终输出答案
}

// ==================== 2. 核心工具:四则运算 ====================

// parseCalculation 从文本解析「数字1 运算符 数字2」。
func parseCalculation(text string) (num1 float64, op rune, num2 float64, err error) {
    _, err = fmt.Sscanf(strings.TrimSpace(text), "%f %c %f", &num1, &op, &num2)
    return num1, op, num2, err
}

// calculator 执行加减乘除四则运算,返回可读的计算结果字符串。
func calculator(expression string) string {
    num1, op, num2, err := parseCalculation(expression)
    if err != nil {
        return fmt.Sprintf("解析失败:%v", err)
    }

    var res float64
    switch op {
    case '+':
        res = num1 + num2
    case '-':
        res = num1 - num2
    case '*':
        res = num1 * num2
    case '/':
        if num2 == 0 {
            return "错误:除数不能为0"
        }
        res = num1 / num2
    default:
        return fmt.Sprintf("不支持运算符:%c", op)
    }
    return fmt.Sprintf("%.2f %c %.2f = %.2f", num1, op, num2, res)
}

// ==================== 3. 工具定义:给云端 LLM 看的工具清单 ====================

// agentTools 声明 Agent 可用的工具,云端 LLM 据此自主决策调用。
var agentTools = []openai.Tool{
    {
        Type: openai.ToolTypeFunction,
        Function: &openai.FunctionDefinition{
            Name:        "calculator", // 工具名(LLM 通过这个名调用)
            Description: "四则运算计算器,支持加减乘除计算",
            Parameters: map[string]interface{}{
                "type": "object",
                "properties": map[string]interface{}{
                    "expression": map[string]interface{}{
                        "type":        "string",
                        "description": "数学计算表达式,例如:100 + 200、500 - 100、10 * 20、100 / 2",
                    },
                },
                "required": []string{"expression"}, // 必传参数
            },
        },
    },
}

// ==================== 4. 云端 LLM 调用(Agent 的真正大脑) ====================

// callCloudLLM 调用云端大模型,返回推理结果。
func (a *Agent) callCloudLLM() (openai.ChatCompletionResponse, error) {
    // 初始化云端 LLM 客户端(仅用 API Key,无本地配置)
    apikey := os.Getenv("DEEPSEEK_API_KEY")
    if apikey == "" {
        return openai.ChatCompletionResponse{}, fmt.Errorf("DEEPSEEK_API_KEY 环境变量未设置")
    }
    cfg := openai.DefaultConfig(apikey)
    cfg.BaseURL = "https://api.deepseek.com"
    client := openai.NewClientWithConfig(cfg)

    messages := []openai.ChatCompletionMessage{
        {
            Role:    openai.ChatMessageRoleSystem,
            Content: "你是一个专业的四则运算计算器,只能处理加减乘除计算,不能处理其他类型的任务",
        },
        {
            Role:    openai.ChatMessageRoleUser,
            Content: a.UserPrompt,
        },
    }

    return client.CreateChatCompletion(
        context.Background(),
        openai.ChatCompletionRequest{
            Model:       "deepseek-v4-flash", // DeepSeek 官方模型名,第三方模型替换对应名称
            Messages:    messages,
            Tools:       agentTools, // 把工具清单传给云端 LLM
            Temperature: 0.1,        // 低温度,保证推理精准
        },
    )
}

// ==================== 5. ReAct 核心循环:云端推理 → 工具调用 → 记忆闭环 ====================

// Run 运行 ReAct 循环:云端推理 → 工具调用 → 记忆闭环。
func (a *Agent) Run() {
    fmt.Println("===== 纯云端 API 版 ReAct Agent 启动 =====")
    fmt.Printf("用户指令:%s\n", a.UserPrompt)

    // 1. 推理:云端 LLM 分析任务
    fmt.Println("\n【1. 推理】云端大模型分析任务...")
    llmResp, err := a.callCloudLLM()
    if err != nil {
        a.FinalAnswer = fmt.Sprintf("云端 LLM 调用失败:%v", err)
        return
    }
    if len(llmResp.Choices) == 0 {
        a.FinalAnswer = "云端 LLM 未返回任何结果"
        return
    }

    msg := llmResp.Choices[0].Message

    // 2. 行动:执行 LLM 决策的工具调用
    if len(msg.ToolCalls) == 0 {
        // 未触发工具调用,直接使用 LLM 返回的内容
        if msg.Content != "" {
            a.Memory = msg.Content
        } else {
            a.Memory = "未触发工具调用,且无返回内容"
        }
    } else {
        for _, toolCall := range msg.ToolCalls {
            fmt.Printf("【2. 行动】云端 LLM 决策:调用【%s】工具\n", toolCall.Function.Name)

            if toolCall.Function.Name != "calculator" {
                fmt.Printf("未知工具:%s\n", toolCall.Function.Name)
                continue
            }

            // 解析 LLM 返回的计算表达式:{"expression": "150 + 250"}
            var cal struct {
                Expression string `json:"expression"`
            }
            if err = json.Unmarshal([]byte(toolCall.Function.Arguments), &cal); err != nil {
                a.Memory = fmt.Sprintf("解析失败:%v", err)
                continue
            }

            fmt.Printf("计算表达式:%s\n", cal.Expression)
            a.Memory = calculator(cal.Expression)
            fmt.Printf("工具执行结果:%s\n", a.Memory)
        }
    }

    // 3. 完成:生成最终答案
    fmt.Println("\n【3. 完成】Agent 生成最终答案")
    a.FinalAnswer = "✅ " + a.Memory
}

// ==================== 主函数:测试云端 Agent ====================

func main() {
    // 传入自然语言指令,云端 LLM 自主理解
    agent := &Agent{UserPrompt: "帮我算150加250等于多少"}
    agent.Run()

    fmt.Println("\n===== Agent 最终输出 =====")
    fmt.Println(agent.FinalAnswer)
}

四、代码核心关键点

1. 纯云端LLM客户端

// 仅用环境变量的API Key初始化客户端,零本地配置
client := openai.NewClient(os.Getenv("OPENAI_API_KEY"))
  • • 没有任何本地模型地址、端口配置;
  • • 完全依赖第三方云端API,开箱即用。

2. 工具定义:LLM的「操作手册」

agentTools是Agent的核心:

  • • 告诉云端大模型有什么工具、怎么用、传什么参数
  • • 大模型根据这个描述,自主生成工具调用指令,不用我们写死逻辑。

3. ReAct闭环(真正的智能体逻辑)

  1. 1. 推理:用户发自然语言指令 → 云端LLM理解并决策;
  2. 2. 行动:LLM返回工具调用参数 → Go执行工具函数;
  3. 3. 记忆:存储工具结果 → 生成最终答案。

五、运行说明(100%可跑通)

  1. 1. 先在终端配置你的第三方API Key
  2. 2. 直接运行代码;
  3. 3. 支持任意自然语言计算指令:
    • • 「帮我算300乘以15」
    • • 「500减120等于几」
    • • 「1000除以8是多少」

运行效果演示

===== 纯云端 API 版 ReAct Agent 启动 =====
用户指令:帮我算150加250等于多少

【1. 推理】云端大模型分析任务...
【2. 行动】云端 LLM 决策:调用【calculator】工具
计算表达式:150 + 250
工具执行结果:150.00 + 250.00 = 400.00

【3. 完成】Agent 生成最终答案

===== Agent 最终输出 =====
✅ 150.00 + 250.00 = 400.00

六、第三方模型切换

如果不用OpenAI,想用其他第三方模型,只改模型名即可

// DeepSeek模型
Model: "deepseek-v4"
// 通义千问模型
Model: "qwen3.8-max"
// Kimi模型
Model: "Kimi-K3"

SDK和逻辑完全不用动,兼容所有OpenAI规范接口。


七、本篇核心总结

  1. 1. 生产级标准:纯云端API Key方案,无本地依赖,是企业Agent开发的首选;
  2. 2. 核心逻辑:Go负责工具执行、状态管理、工程逻辑,云端LLM负责自然语言理解、推理决策
  3. 3. ReAct落地:真正实现「自主思考→自主调用工具→自主完成任务」的智能体;
  4. 4. 通用性强:一行代码切换任意第三方大模型,无适配成本。

到这里,你已经掌握了企业级真实LLM Agent的核心开发能力

相关文章

第十六篇:Eino入门——核心组件总览与场景选型总结
第十五篇:Eino ChatModelAgent 模型自己决定是否调用工具
第十四篇:Eino ToolsNode 工具调用执行器
第十三篇:InvokableTool-把Go函数包装成模型可调用的工具
第十二篇:Eino ToolInfo工具-给模型看的说明书
第十一篇:Eino Message与Prompt上下文编排

发布评论