第一篇:入门必看!还原Agent核心逻辑+Go原生实现

2026-04-01 56 0

作为Go后端开发者,你肯定听过「Agent智能体」,但大概率被Python生态、复杂框架绕得晕头转向。

其实Agent和咱们写的Go服务逻辑完全相通,没有任何玄学。今天这篇,完全从零开始,不依赖任何第三方Agent框架,精准拆解Agent的核心本质,还能亲手跑通对齐Go原生Demo,彻底搞懂Agent到底是什么、怎么跑。


一、先分清:普通ChatBot 和 Agent,本质差在哪?

这是学习Agent的第一核心前提,也是开篇重点讲透的知识点——90%的人学不会Agent,就是没分清这俩的区别。

1. 普通ChatBot:被动挨打的「问答机器」

咱们平时用的聊天机器人、简单AI客服,都属于这类,核心特点:

  • 完全被动:你问一句,它答一句,绝不主动做任何事;
  • 无自主能力:只能基于大模型本身的知识输出文本,不能调用任何外部工具
  • 无推理能力:不会拆解复杂任务,只会简单的一问一答;
  • 无状态管理:多轮对话靠硬拼上下文,没有自主记忆能力。

举个例子:你问「100+200等于多少」,它直接靠自身知识算完回复,全程是「接收问题→输出答案」。

2. LLM Agent:主动干活的「智能执行者」

Agent的全称是大模型驱动的智能体,它的核心是 「用大模型当大脑,自主推理、调用工具、完成任务」,而不是单纯聊天。

它的核心能力只有4个:

  1. 1. 推理能力(大脑):拿到任务先思考「怎么做、要不要用工具」;
  2. 2. 工具能力(手脚):能调用计算器、搜索、数据库、API等外部能力;
  3. 3. 记忆能力(笔记本):记住对话历史、工具执行结果,不会失忆;
  4. 4. 执行闭环:推理→调用工具→记忆→再推理,直到完成任务。

还是刚才的例子:你问「100+200等于多少」,Agent会先推理「这是计算任务,需要计算器工具」→ 调用计算器工具 → 记住工具结果 → 最后输出答案。

一句话总结:
普通ChatBot是「你问我答」,Agent是「自主推理+动手干活」


二、Agent的核心灵魂:ReAct循环(所有Agent的底层逻辑)

反复强调:所有工业级Agent,底层都遵循ReAct范式

ReAct = Reasoning(推理) + Acting(行动),这是Agent的核心执行流程,没有多余步骤,精准闭环:

ReAct 2核心环节+3步落地

  1. 1. Reasoning(推理):大模型当大脑,分析任务,判断「是否需要调用工具、用什么工具」;
  2. 2. Acting(行动):执行工具,把结果返回给大模型;
  3. 3. 循环:大模型根据工具结果,继续推理,直到任务完成,输出最终答案。

落地版3步流程

  1. 1. 用户提问:给Agent下达任务;
  2. 2. LLM推理:大模型判断是否调用工具;
    • • 不需要工具→直接输出答案;
    • • 需要工具→生成工具调用指令;
  3. 3. 执行+循环:调用工具→结果回传LLM→重复推理,直到任务完成。

这就是Agent的底层运行逻辑,没有任何复杂概念,就是「推理→行动→循环」。


三、Go原生实现:修复版!模拟LLM的极简Agent

用函数模拟LLM推理,让「大脑」自主决定用不用工具,完全不写死执行逻辑,零依赖、可直接运行。

实现目标

做一个「计算器Agent」,模拟LLM做推理决策,严格遵循ReAct循环,不写死工具调用逻辑。

完整可运行代码

package main

import (
    "fmt"
)

// ==================== 1. Agent 核心结构体 ====================

// Agent 保存 Agent 运行时的状态与记忆,对应 ReAct 的「记忆组件」。
type Agent struct {
    Prompt      string // 用户计算指令(如:100+200)
    Memory      string // 工具执行结果记忆
    FinalAnswer string // 最终答案
}

// ==================== 2. 四则运算解析工具 ====================

// parseCalculation 从文本中扫描解析「数字1 运算符 数字2」。
// 解析失败时返回错误。
func parseCalculation(text string) (num1 float64, op rune, num2 float64, err error) {
    _, err = fmt.Sscanf(text, "%f%c%f", &num1, &op, &num2)
    return num1, op, num2, err
}

// ==================== 3. 四则运算工具函数 ====================

// calculator 执行四则运算,返回计算结果和错误。
func calculator(num1 float64, op rune, num2 float64) (string, error) {
    var res float64
    switch op {
    case '+':
        res = num1 + num2
    case '-':
        res = num1 - num2
    case '*':
        res = num1 * num2
    case '/':
        if num2 == 0 {
            return "", fmt.Errorf("错误:除数不能为 0")
        }
        res = num1 / num2
    default:
        return "", fmt.Errorf("不支持运算符:%c", op)
    }
    return fmt.Sprintf("%.2f", res), nil
}

// ==================== 4. 模拟 LLM 推理(Agent 大脑) ====================

// mockLLM 模拟大模型推理决策。
// 在真实 Agent 中,这一步由云端 LLM 完成;这里用函数模拟,由它决定是否调用工具。
func mockLLM(prompt string) string {
    return "需要调用计算器工具"
}

// ==================== 5. Agent ReAct 执行流程 ====================

// Run 运行 Agent 的 ReAct 循环:推理 → 行动 → 记忆 → 完成。
func (a *Agent) Run() {
    fmt.Println("===== Go Agent 四则运算 =====")
    fmt.Printf("用户指令:%s\n", a.Prompt)

    // 1. 推理:模拟 LLM 决策是否调用工具
    decision := mockLLM(a.Prompt)
    fmt.Printf("\n【1. 推理】LLM 决策:%s\n", decision)

    // 2. 行动:解析 + 计算
    fmt.Println("\n【2. 行动】执行计算")
    num1, op, num2, err := parseCalculation(a.Prompt)
    if err != nil {
        a.Memory = fmt.Sprintf("解析失败:%v", err)
    } else {
        res, calcErr := calculator(num1, op, num2)
        if calcErr != nil {
            a.Memory = calcErr.Error()
        } else {
            a.Memory = fmt.Sprintf("%.2f %c %.2f = %s", num1, op, num2, res)
        }
    }
    fmt.Printf("执行结果:%s\n", a.Memory)

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

// ==================== 6. 主函数测试 ====================

func main() {
    testList := []string{"100+200", "500-100", "10*20", "100/2", "20/0"}
    for _, prompt := range testList {
        agent := &Agent{Prompt: prompt}
        agent.Run()
        fmt.Println("最终输出:", agent.FinalAnswer)
        fmt.Println("----------------------------------------")
    }
}

代码运行结果

===== Go Agent 四则运算 =====
用户指令:100+200

【1. 推理】LLM 决策:需要调用计算器工具

【2. 行动】执行计算
执行结果:100.00 + 200.00 = 300.00

【3. 完成】生成最终答案
最终输出: 计算结果:100.00 + 200.00 = 300.00
----------------------------------------
===== Go Agent 四则运算 =====
用户指令:500-100

【1. 推理】LLM 决策:需要调用计算器工具

【2. 行动】执行计算
执行结果:500.00 - 100.00 = 400.00

【3. 完成】生成最终答案
最终输出: 计算结果:500.00 - 100.00 = 400.00
----------------------------------------
===== Go Agent 四则运算 =====
用户指令:10*20

【1. 推理】LLM 决策:需要调用计算器工具

【2. 行动】执行计算
执行结果:10.00 * 20.00 = 200.00

【3. 完成】生成最终答案
最终输出: 计算结果:10.00 * 20.00 = 200.00
----------------------------------------
===== Go Agent 四则运算 =====
用户指令:100/2

【1. 推理】LLM 决策:需要调用计算器工具

【2. 行动】执行计算
执行结果:100.00 / 2.00 = 50.00

【3. 完成】生成最终答案
最终输出: 计算结果:100.00 / 2.00 = 50.00
----------------------------------------
===== Go Agent 四则运算 =====
用户指令:20/0

【1. 推理】LLM 决策:需要调用计算器工具

【2. 行动】执行计算
执行结果:错误:除数不能为 0

【3. 完成】生成最终答案
最终输出: 计算结果:错误:除数不能为 0
----------------------------------------

代码精准拆解

  1. 1. Agent结构体:Agent的记忆+状态,存储用户任务、工具结果,对应「记忆组件」;
  2. 2. calculator函数:Agent的工具,就是普通Go函数,对应「工具组件」;
  3. 3. mockLLM函数模拟大模型推理(修复核心错误),由它决定用不用工具,不是写死逻辑;
  4. 4. Run()方法:严格实现ReAct循环(推理→行动→记忆→完成),完全对齐流程。

四、本篇核心总结(必背)

  1. 1. 核心区别:普通ChatBot被动问答,Agent是LLM推理+工具调用的主动执行者;
  2. 2. 核心逻辑:所有Agent都遵循ReAct(推理+行动) 循环;
  3. 3. Go本质:Agent = Go结构体(记忆)+ Go函数(工具)+ LLM(推理大脑);
  4. 4. 无玄学:Agent就是咱们熟悉的「状态管理+函数调用+逻辑决策」,Go后端零成本上手。

相关文章

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

发布评论