首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >给所有想转Agent开发或者Agent进阶同学的一些建议

给所有想转Agent开发或者Agent进阶同学的一些建议

作者头像
王中阳AI编程
发布2026-05-29 11:04:38
发布2026-05-29 11:04:38
1400
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏

最近一直有小伙伴私信我关于Agent开发的问题:

有的同学是Java、Python后端,觉得传统开发越来越卷,想转Agent方向;

有的同学已经会调用API、能跑通demo,但感觉自己只是在"拼积木",不知道怎么进阶;

有的同学是产品、运营背景,想跨界做Agent开发,不知道从哪里切入。

聊的多了,发现这是一个共性问题,干脆整理成文章,希望对更多人有帮助。

这篇文章会结合我的经历,讲清楚三件事:

1. 传统开发转Agent开发,最大的挑战到底是什么?

2. 如何高效完成转型——从"会用"到"会做"?具体学什么、怎么学?

3. 在掌握基础之后,如何真正进阶?进阶要突破哪些关键点?

先说结论

  1. 传统开发转Agent开发,最大的挑战不是学新技术,而是思维方式的转变——从"确定性编程"切换到"概率性编程";
  2. "三刷"官方文档是高效掌握新技术的制胜法宝,下面会用一个具体例子演示如何三刷LangChain文档:
    • 1刷(1-2天):从头看到尾,建立整体认知地图,扫清概念盲点;
    • 2刷(3-5天):动手跑每一个代码示例,写注释和总结,做到"看得懂、跑得通";
    • 3刷(2-3天):先只写注释,不看文档自己实现,遇到卡点再对照原文,实现"肌肉记忆"。
  3. 推荐学习路线和免费资源(下文有详细说明):
    • 入门:langchaingo官方示例 → 吴恩达《Building Systems with the ChatGPT API》免费课程 → 动手做一个RAG问答机器人
    • 进阶:向量数据库(ChromaDB/Milvus)+ Prompt Engineering指南 + Eino/langchaingo工作流编排
    • 高阶:Multi-Agent架构设计 + Agent工程化实践 + Go+Python混合架构
  4. 要进阶,就要深入理解Multi-Agent架构Agent工程化。下文会用Mermaid架构图帮你直观理解这些概念,让大家先有个目标,心中有火,眼里有光。

下面进入正文,看看对大家有没有启发。

传统开发思维 vs Agent开发思维

无论是后端转Agent,还是前端转Agent,在有编程基础的情况下,学习新的技术栈本身并不难。

对有基础的同学来说,学Agent开发,无外乎就是:学会调用LLM API、理解工具调用机制、掌握一个框架的基本用法。认真学,两周内就能跑通第一个项目。

但是,真正的挑战在哪里?

我认为难点在思维方式的转变:从"确定性编程"到"概率性编程"的转变。

传统开发思维

传统开发是确定性的。我们来看一个简单的例子——实现"查询天气并判断是否适合户外运动":

代码语言:javascript
复制
// 传统开发:确定性逻辑
func CheckOutdoorActivity(city string) string {
    weather := GetWeatherAPI(city)  // 一定返回 {Temp, Weather, Wind}

    switch weather.Weather {
    case"晴":
        if weather.Temp >= 15 && weather.Temp <= 35 {
            return"适合户外运动"
        }
        return"温度不适宜"
    case"阴":
        return"可以做户外运动,但要注意天气变化"
    default:
        return"不适合户外运动"
    }
}

// 输入"北京",每次运行结果完全一致
// 出了问题,断点调试一路跟下去就行

这就是我们熟悉的编程方式:输入A,输出B,逻辑可预测,bug可追踪。

Agent开发思维

同样的需求,用Agent来做:

代码语言:javascript
复制
// Agent开发:概率性逻辑
// 使用 Go 版 LangChain: github.com/tmc/langchaingo
import (
    "github.com/tmc/langchaingo/agents"
    "github.com/tmc/langchaingo/tools"
    "github.com/tmc/langchaingo/llms/openai"
)

// 定义工具:查询天气
func getWeatherTool() tools.Tool {
    return tools.GenericTool{
        Name:        "get_weather",
        Description: "查询指定城市的天气,返回温度、天气状况、风力",
        Run: func(ctx context.Context, input string) (string, error) {
            return weatherAPI(input), nil
        },
    }
}

llm, _ := openai.New(openai.WithModel("gpt-4o"))

toolList := []tools.Tool{getWeatherTool()}

systemPrompt := `你是一个户外运动顾问。根据用户提供的城市天气,判断是否适合户外运动。
判断规则:
- 晴天、温度15-35度:适合
- 阴天:可以,但需注意
- 雨天/大风/高温/低温:不适合
请给出判断并解释原因。`

agent := agents.NewOpenAIFunctionsAgent(llm, toolList)
executor := agents.NewExecutor(agent)

result, _ := executor.Call(ctx, map[string]any{
    "input": "北京天气怎么样?",
})

// 同样输入"北京",可能出现:
// 第1次:"北京今天晴天,25度,非常适合户外运动!" ✅
// 第2次:"北京今天晴天,25度,非常适合户外运动。推荐去公园跑步。" ✅ 还给了建议
// 第3次:"北京今天天气不错,应该可以户外运动吧?" ⚠️ 不确定的语气
// 第4次:`{"suitable": true}` ❌ 输出格式不符合预期!

发现问题了吗? 同样的代码、同样的输入,输出却天差地别:

  • 有时候LLM会自己"加戏"(推荐跑步地点),这可能是惊喜也可能是惊吓
  • 有时候语气不确定,影响用户体验
  • 有时候输出格式完全跑偏,下游解析直接报错

更关键的是:这不是"代码bug",你没法通过断点调试来找到问题。 这是Prompt设计问题、模型温度参数问题、甚至是模型本身的行为特性。

如何应对这种不确定性?

有经验的Agent开发者会做三件事:

1. 结构化输出(Structured Output)

代码语言:javascript
复制
// 定义期望的输出结构体
type ActivityAdvice struct {
    Suitable   bool   `json:"suitable"`
    Reason     string`json:"reason"`
    Suggestion string`json:"suggestion"`
}

// 在Prompt中要求LLM输出JSON格式,然后用 json.Unmarshal 解析
systemPrompt := `你是一个户外运动顾问。请严格按照以下JSON格式输出:
{"suitable": true/false, "reason": "判断理由", "suggestion": "具体建议"}
不要输出任何其他内容。`

// 调用后解析
var advice ActivityAdvice
if err := json.Unmarshal([]byte(llmOutput), &advice); err != nil {
    // 输出格式不对,触发重试或降级
    log.Warn("输出格式解析失败", "output", llmOutput, "error", err)
}

2. 评估而非调试

代码语言:javascript
复制
// 跑100次,统计成功率
successCount := 0
for i := 0; i < 100; i++ {
    output, err := executor.Call(ctx, map[string]any{
        "input": "北京天气怎么样?",
    })
    if err != nil {
        continue
    }
    var advice ActivityAdvice
    if json.Unmarshal([]byte(output), &advice) == nil {
        successCount++
    }
}
fmt.Printf("成功率: %.2f%%\n", float64(successCount)/100*100)

3. 防御性编程

代码语言:javascript
复制
var advice ActivityAdvice
if err := json.Unmarshal([]byte(agentOutput), &advice); err != nil {
    // 降级方案:用更简单的方式重新请求,或返回兜底
    advice = ActivityAdvice{
        Suitable:   false,
        Reason:     "解析失败",
        Suggestion: "请重试",
    }
}

阶段性总结

传统开发和Agent开发的关注点是不一样的:

维度

传统开发

Agent开发

核心逻辑

if-else / 算法

Prompt + 模型推理

问题定位

断点调试

统计评估

输出特征

确定性

概率性

质量保证

单元测试

评估数据集 + 回归测试

失败处理

try-catch

降级 + 重试 + 兜底

转型的同学,要有意识地调整自己的思维角度。不要用写业务代码的方式去做Agent开发,不然会很痛苦。

"三刷"官方文档实战演示

前面说了方法论,这里我用一个真实案例演示:如何用"三刷"法吃透 langchaingo(Go版LangChain)

注:Go 生态目前最成熟的 Agent 框架是 langchaingo(13k+ Star)和字节跳动开源的 Eino。这里以 langchaingo 为例,方法同样适用于任何框架的官方文档。

1刷:建立认知地图(1-2天)

目标:不写代码,只做三件事——

  1. 浏览 langchaingo 官方示例 和文档,画出思维导图;
  2. 理解每个模块是干什么的,不必理解怎么用;
  3. 标记出自己最需要的模块,2刷时重点突破。

刷完后你应该能画出这样一张认知地图:

代码语言:javascript
复制
langchaingo(Go Agent框架)
├── llms(模型交互层)
│   ├── openai —— 调用OpenAI/GPT
│   ├── ollama —— 本地模型推理
│   └── anthropic —— 调用Claude
├── chains(链式调用)
│   ├── LLMChain —— 基础链
│   ├── ConversationalRetrievalQA —— 对话检索链
│   └── MapReduce —— 长文本总结
├── agents(智能体)
│   ├── tools —— 工具定义
│   ├── OpenAIFunctionsAgent —— 函数调用Agent
│   └── Executor —— 执行循环(ReAct模式)
├── vectorstores(向量数据库)
│   ├── chroma —— ChromaDB
│   ├── milvus —— Milvus
│   └── pgvector —— PostgreSQL向量扩展
└── documentloaders(文档加载)
    ├── PDF/Text/Markdown加载器
    └── 文档切片器

避坑提示:很多新手一上来就跟着Quickstart敲代码,结果敲完了也不知道自己敲的是什么。1刷的核心是"认知先行"——先知道有什么,再决定学什么。

2刷:动手跑通每一个示例(3-5天)

目标:按模块顺序,把官方文档中每一个代码示例跑通,并在代码中写注释。

以Agent模块为例,2刷时你应该做到:

代码语言:javascript
复制
// ===== 步骤1:定义工具 =====
// 工具是Agent的手,让LLM能执行实际操作
import"github.com/tmc/langchaingo/tools"

func searchKnowledgeBaseTool() tools.Tool {
    return tools.GenericTool{
        Name:        "search_knowledge_base",
        Description: "搜索公司内部知识库,查询产品文档、技术规范等信息",
        Run: func(ctx context.Context, query string) (string, error) {
            // 实际项目中这里接向量数据库
            return fmt.Sprintf("关于'%s'的搜索结果:...", query), nil
        },
    }
}

func createTicketTool() tools.Tool {
    return tools.GenericTool{
        Name:        "create_ticket",
        Description: "创建工单。输入格式:{\"title\": \"工单标题\", \"priority\": \"高/中/低\"}",
        Run: func(ctx context.Context, input string) (string, error) {
            var req struct {
                Title    string`json:"title"`
                Priority string`json:"priority"`
            }
            json.Unmarshal([]byte(input), &req)
            return fmt.Sprintf("已创建工单:%s,优先级:%s", req.Title, req.Priority), nil
        },
    }
}

// ===== 步骤2:创建Agent =====
// Executor是Agent的大脑:接收任务 → 思考 → 调工具 → 观察结果 → 继续思考 → 输出答案
toolList := []tools.Tool{searchKnowledgeBaseTool(), createTicketTool()}

llm, _ := openai.New(
    openai.WithModel("gpt-4o"),
    openai.WithToken("sk-xxx"),
)

agent := agents.NewOpenAIFunctionsAgent(llm, toolList)
executor := agents.NewExecutor(
    agent,
    agents.WithMaxIterations(5),    // 防止无限循环
    agents.WithCallbacksHandler(callbacks.LogHandler{}), // 打印思考过程,调试必备
)

// ===== 步骤3:运行并观察 =====
result, _ := executor.Call(ctx, map[string]any{
    "input": "客户反馈登录页面打不开,帮我查一下有没有相关文档,有的话创建工单",
})
// callbacks.LogHandler 会输出:
// > Thought: 用户想查登录问题的文档,我需要先搜索知识库
// > Action: search_knowledge_base
// > Action Input: "登录页面打不开"
// > Observation: 找到1篇相关文档:《登录模块故障排查指南》
// > Thought: 有相关文档,现在创建工单
// > Action: create_ticket
// > Action Input: {"title": "客户反馈登录页面打不开", "priority": "高"}
// > Observation: 已创建工单...
// > Final Answer: 已为您查到相关文档并创建了高优先级工单。

关键习惯:2刷时一定要打开日志回调!这是理解Agent"思考过程"最直观的方式。很多同学跑了demo但不知道Agent内部怎么运作的,就是因为没看日志。

3刷:脱离文档独立实现(2-3天)

目标:只保留自己写的注释,不看文档,独立实现。

具体做法:

  1. 把2刷时写的注释提取出来,当作"需求文档";
  2. 清空代码,对着注释自己写;
  3. 卡住了不要立刻看文档,先思考"为什么这里需要这样设计";
  4. 实在写不出来了,再对照文档,用红笔标出自己卡住的地方。

3刷后你会发现,那些让你卡住的地方,恰恰是你理解最薄弱的地方。这个"卡点清单"就是你后续深入学习的路线图。

时间投入总计:1刷1-2天 + 2刷3-5天 + 3刷2-3天 ≈ 1-2周,就能从"看过文档"到"真正掌握"。

AI应用架构演进史

理解了思维方式,掌握了学习方法,接下来需要看清整个AI应用的版图。

结合我自己的经历,介绍一下AI应用架构的演进,帮大家理解自己现在处于哪个阶段,以及下一步要去哪里。

第一阶段:单次调用(2023年初)

直接调用LLM API,输入问题,输出答案。这是最简单的形态。

典型场景:写一个"AI客服",把用户问题和预设的system prompt一起丢给GPT,拿到回复直接展示。

这个阶段的问题很明显:模型不知道你的私有数据(客户问了"我的订单什么时候到",GPT只能瞎编),无法执行操作(不能真的查物流),每次对话独立(记不住上一轮说了什么)。

第二阶段:RAG + 工具调用(2023年中-至今)

给LLM接上知识库(RAG)和工具(Tool Use),让它能查资料、能执行操作。这是目前企业级AI应用的主流形态。

典型场景:智能客服系统,用户问"我的订单到哪了",Agent调用物流查询工具获取真实数据,再结合知识库中的退换货政策,给出准确回复。

免费学习资源推荐

  • 🎓 吴恩达《LangChain for LLM Application Development》(免费,约1小时,概念通用)
  • 🎓 吴恩达《Building Systems with the ChatGPT API》(免费,约1小时,概念通用)
  • 📖 langchaingo 官方示例(Go生态首选,含完整可运行代码)
  • 📖 Eino 官方文档(字节跳动开源,Go原生AI框架)
  • 📖 Prompt Engineering Guide(免费开源,中文版)

第三阶段:Multi-Agent架构(2024-至今)

多个Agent协作,每个Agent负责一个专门的子任务,通过编排层协调工作。

典型场景:软件开发助手——一个Agent负责理解需求并拆解任务,一个Agent负责写代码,一个Agent负责写测试,一个Agent负责代码审查。四个Agent通过编排器协同工作,最终输出完整的、经过测试的代码。

免费学习资源推荐

  • 🎓 吴恩达《Multi AI Agent Systems with crewAI》(免费,约1小时)
  • 📖 CrewAI官方文档(免费开源框架)
  • 📖 Microsoft AutoGen官方文档(微软开源,学术论文级别)
  • 📖 LangGraph官方教程(免费,适合自定义Agent编排)

Multi-Agent是主流趋势,越来越多的企业级AI应用在往这个方向演进。

那么,如何从第二阶段进阶到第三阶段?答案就是:深入理解Agent工程化。

什么是Agent工程化?

很多人会调用API、会用框架,但做出来的东西只能在demo阶段,一到生产环境就各种问题。

这就是缺乏"工程化"思维的表现。

Agent工程化,就是让Agent从"能跑"到"能用"、从"能用"到"好用"的过程。

先看一张Agent工程化的全景图:

下面逐一拆解每个层面,给出具体的代码示例。

1. 可靠性设计

Agent在生产环境中会遇到各种异常:模型输出格式不对、工具调用失败、上下文超长...

具体怎么做?来看一个生产级的Agent调用封装:

代码语言:javascript
复制
// 生产级Agent封装——可靠性设计
type ProductionAgent struct {
    maxRetries      int
    fallbackResp    string
    maxInputTokens  int
}

func NewProductionAgent() *ProductionAgent {
    return &ProductionAgent{
        maxRetries:     3,
        fallbackResp:   "抱歉,系统繁忙,请稍后重试。",
        maxInputTokens: 100000,
    }
}

// InvokeWithRetry 带指数退避重试的调用
func (pa *ProductionAgent) InvokeWithRetry(ctx context.Context, executor *agents.Executor, input map[string]any) (string, error) {
    var lastErr error

    for attempt := 0; attempt < pa.maxRetries; attempt++ {
        // 1. 输入校验
        inputStr, ok := input["input"].(string)
        if !ok || len(inputStr) == 0 {
            return pa.fallbackResp, fmt.Errorf("输入不合法")
        }

        // 2. Token预算检查
        if estimatedTokens := estimateTokens(inputStr); estimatedTokens > pa.maxInputTokens {
            input["input"] = truncateText(inputStr, pa.maxInputTokens)
        }

        // 3. 调用Agent
        result, err := executor.Call(ctx, input)
        if err != nil {
            lastErr = err
            log.Warn("Agent调用失败,准备重试", "attempt", attempt+1, "error", err)
            // 指数退避:1s → 2s → 4s
            time.Sleep(time.Duration(1<<attempt) * time.Second)
            continue
        }

        // 4. 输出校验
        if !pa.validateOutput(result) {
            lastErr = fmt.Errorf("输出格式异常: %s", result)
            time.Sleep(time.Duration(1<<attempt) * time.Second)
            continue
        }

        return result, nil
    }

    return"", fmt.Errorf("重试%d次后仍失败: %w", pa.maxRetries, lastErr)
}

// SafeInvoke 最终安全调用——带兜底
func (pa *ProductionAgent) SafeInvoke(ctx context.Context, executor *agents.Executor, input map[string]any) string {
    result, err := pa.InvokeWithRetry(ctx, executor, input)
    if err != nil {
        log.Error("Agent调用彻底失败,使用兜底回复", "error", err)
        return pa.fallbackResp
    }
    return result
}

关键点:重试不是简单的for i := 0; i < 3; i++,而是指数退避(1s → 2s → 4s),避免给API造成雪崩压力。

2. 可观测性

你需要知道Agent在做什么、为什么这样做、哪个环节出了问题。

具体怎么做?使用LangSmith(免费额度)或自建追踪:

代码语言:javascript
复制
import time
import json
from functools import wraps

def trace_agent_call(func):
    """Agent调用追踪装饰器"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        trace_id = f"trace_{int(time.time() * 1000)}"
        start = time.time()
        
        log_entry = {
            "trace_id": trace_id,
            "timestamp": start,
            "input": str(kwargs.get("input", ""))[:200],  # 截断存储
        }
        
        try:
            result = func(*args, **kwargs)
            log_entry.update({
                "duration_ms": (time.time() - start) * 1000,
                "status": "success",
                "output_length": len(str(result)),
            })
            return result
        except Exception as e:
            log_entry.update({
                "duration_ms": (time.time() - start) * 1000,
                "status": "error",
                "error": str(e),
            })
            raise
        finally:
            # 写入日志(生产环境用结构化日志如JSON Lines)
            print(json.dumps(log_entry, ensure_ascii=False))
    
    return wrapper

免费工具推荐

  • LangSmith:LangChain官方出品,免费额度够个人项目用
  • Phoenix (Arize):开源,本地部署,支持LLM调用追踪和评估
  • Go 项目可直接用 slog + 结构化日志 + Grafana/Prometheus 搭建可观测性体系,轻量高效

3. 成本控制

Token是钱。一个不注意,单次对话花掉几毛钱,日活上千一天就是几百块。

具体策略

代码语言:javascript
复制
// 成本感知的Agent
type ModelCost struct {
    Input  float64// 每百万token美元
    Output float64
}

var modelCostMap = map[string]ModelCost{
    "gpt-4o":           {Input: 2.5, Output: 10.0},
    "gpt-4o-mini":      {Input: 0.15, Output: 0.6},
    "claude-3.5-sonnet": {Input: 3.0, Output: 15.0},
}

// RouteByComplexity 按任务复杂度选模型——简单任务用小模型,省钱
func RouteByComplexity(task string) string {
    simpleKeywords := []string{"总结", "分类", "提取"}
    complexKeywords := []string{"分析", "推理", "代码"}

    for _, kw := range simpleKeywords {
        if strings.Contains(task, kw) {
            return"gpt-4o-mini"// 简单任务,便宜约17倍
        }
    }
    for _, kw := range complexKeywords {
        if strings.Contains(task, kw) {
            return"gpt-4o"// 复杂任务,用大模型
        }
    }
    return"gpt-4o-mini"// 默认用小模型
}

// EstimateCost 估算单次调用成本
func EstimateCost(model string, inputTokens, outputTokens int) float64 {
    cost, ok := modelCostMap[model]
    if !ok {
        return0
    }
    returnfloat64(inputTokens)/1_000_000*cost.Input + float64(outputTokens)/1_000_000*cost.Output
}

// 实际效果示例:
// 一句话总结任务:gpt-4o ≈ $0.001,gpt-4o-mini ≈ $0.00006
// 日处理10万次总结:gpt-4o ≈ $100/天,gpt-4o-mini ≈ $6/天
// 差距是17倍!

省钱口诀:简单任务用mini,复杂推理用大模型;能缓存就缓存,Prompt能压缩就压缩。

4. 评估体系

Agent的效果怎么衡量?不能只靠"感觉好像还行"。

具体怎么做?建立评估数据集,跑批量化自动化评估:

代码语言:javascript
复制
// 评估数据集示例
type EvalCase struct {
    Input            string
    ExpectedTools    []string// 期望调用的工具
    ExpectedKeywords []string// 期望包含的关键词
    Difficulty       string
}

var evalDataset = []EvalCase{
    {
        Input:            "帮我查一下北京的天气,适合跑步吗?",
        ExpectedTools:    []string{"get_weather"},
        ExpectedKeywords: []string{"温度", "适合", "不适合"},
        Difficulty:       "easy",
    },
    {
        Input:            "客户说登录不了,帮我查文档、创工单、发通知给运维",
        ExpectedTools:    []string{"search_kb", "create_ticket", "send_notification"},
        ExpectedKeywords: []string{"工单", "通知", "文档"},
        Difficulty:       "hard",
    },
    // ... 至少准备50-100条
}

type EvalResult struct {
    Total         int
    ToolAccuracy  float64
    KeywordRecall float64
}

func EvaluateAgent(executor *agents.Executor, dataset []EvalCase) EvalResult {
    var r EvalResult
    r.Total = len(dataset)

    for _, c := range dataset {
        result, _ := executor.Call(context.Background(), map[string]any{"input": c.Input})

        // 工具调用准确率
        calledTools := extractCalledTools(result)
        if stringSliceEqual(calledTools, c.ExpectedTools) {
            r.ToolAccuracy++
        }

        // 关键词召回率
        outputLower := strings.ToLower(result)
        matched := 0
        for _, kw := range c.ExpectedKeywords {
            if strings.Contains(outputLower, kw) {
                matched++
            }
        }
        r.KeywordRecall += float64(matched) / float64(len(c.ExpectedKeywords))
    }

    r.ToolAccuracy = r.ToolAccuracy / float64(r.Total) * 100
    r.KeywordRecall = r.KeywordRecall / float64(r.Total) * 100
    return r
}

关键理念:Agent开发不是"写完了上线就行",而是"上线后持续用数据驱动迭代"。没有评估体系,迭代就是盲人摸象。

5. Multi-Agent编排

当任务复杂到单个Agent搞不定,就需要多个Agent协作。

以Go为例,用 goroutine + channel 搭建一个"技术文章写作团队":

代码语言:javascript
复制
// Multi-Agent 编排:技术文章写作团队
type ArticleTask struct {
    Topic     string
    Research  string// 研究资料
    Draft     string// 初稿
    FinalDraft string// 终稿
}

// Agent 1:研究员 —— 负责搜集资料
func researcherAgent(ctx context.Context, topic string, resultCh chan<- ArticleTask) {
    // 调用LLM做研究
    research := callLLM(ctx, fmt.Sprintf("请搜集关于'%s'的最新资料、论文和最佳实践", topic))
    resultCh <- ArticleTask{Topic: topic, Research: research}
}

// Agent 2:撰稿人 —— 根据研究资料写初稿
func writerAgent(ctx context.Context, task ArticleTask, resultCh chan<- ArticleTask) {
    prompt := fmt.Sprintf("根据以下研究资料,撰写关于'%s'的深度技术文章:\n%s", task.Topic, task.Research)
    task.Draft = callLLM(ctx, prompt)
    resultCh <- task
}

// Agent 3:审校 —— 质量把关
func reviewerAgent(ctx context.Context, task ArticleTask, resultCh chan<- ArticleTask) {
    prompt := fmt.Sprintf("审查以下文章的技术准确性、逻辑清晰度和可读性,直接输出修改后的版本:\n%s", task.Draft)
    task.FinalDraft = callLLM(ctx, prompt)
    resultCh <- task
}

// 编排器:串联执行
func orchestrateArticleWriting(ctx context.Context, topic string) *ArticleTask {
    ch1 := make(chan ArticleTask, 1)
    ch2 := make(chan ArticleTask, 1)
    ch3 := make(chan ArticleTask, 1)

    go researcherAgent(ctx, topic, ch1)
    task := <-ch1

    go writerAgent(ctx, task, ch2)
    task = <-ch2

    go reviewerAgent(ctx, task, ch3)
    task = <-ch3

    return &task
}

Go生态提示:目前 Go 语言的 Agent 框架生态还在早期阶段,主要选择有:

  • langchaingo:LangChain 的 Go 移植,GitHub 13k+ Star,最活跃
  • Eino(字节跳动开源):Go 语言 AI 应用开发框架,支持 Agent/Chain/Workflow
  • 直接调用 OpenAI/Claude API + goroutine 编排,轻量灵活,适合对可控性要求高的场景

如果项目中需要复杂 Multi-Agent 协作,也可以 Go 做业务层,Python 服务化提供 Agent 能力(通过 HTTP/gRPC 调用),这是目前较务实的混合架构方案。

注意:Multi-Agent不是银弹。每增加一个Agent,延迟和成本都会增加。判断标准:一个Prompt能解决的不用Chain,一个Chain能解决的不用Agent,一个Agent能解决的不用Multi-Agent。

免费学习资源

  • 🎓 吴恩达《Multi AI Agent Systems with crewAI》(免费,Python但概念通用)
  • 📖 langchaingo Agent 示例(Go生态Agent实践)
  • 📖 Eino Agent 使用指南(字节跳动开源,Go原生)
  • 📖 Anthropic《Building effective agents》(必读!Anthropic官方Agent设计指南)

总结

这篇文章的核心要点回顾:

主题

核心观点

思维转变

从"确定性编程"到"概率性编程",学会用评估代替调试

学习方法

"三刷"官方文档:认知地图→动手实践→独立实现

技术路线

单次调用 → RAG+工具 → Multi-Agent

工程化

可靠性 + 可观测性 + 成本控制 + 评估体系 + Multi-Agent编排

从入门到进阶,完整学习路径

代码语言:javascript
复制
第1-2周:入门打基础
├── Go基础(不熟的先补)
├── 吴恩达《Building Systems with the ChatGPT API》(免费,Python但概念通用)
├── langchaingo官方示例(GitHub: tmc/langchaingo,三刷法)
├── Eino(字节跳动开源,Go原生AI框架)
└── 实战项目:做一个RAG问答机器人

第3-4周:进阶核心能力
├── Prompt Engineering Guide(免费开源)
├── 向量数据库(ChromaDB上手最快,Milvus适合生产,Go都有SDK)
├── 工作流编排(Go用goroutine+channel / Eino框架)
└── 实战项目:做一个能调工具的智能客服

第5-8周:高阶突破
├── Multi-Agent架构设计
├── Agent工程化实践(可靠性/可观测性/成本/评估)
├── Anthropic《Building effective agents》必读
├── Go+Python混合架构(Go做业务层,Python做Agent推理层)
└── 实战项目:做一个Multi-Agent协作系统(如自动化代码审查)

Go 生态 Agent 开发资源推荐

资源

说明

地址

langchaingo

LangChain Go移植,13k+ Star

github.com/tmc/langchaingo

Eino(字节跳动)

Go原生AI应用框架

github.com/cloudwego/eino

OpenAI Go SDK

官方Go SDK

github.com/openai/openai-go

Ollama Go SDK

本地模型推理

github.com/ollama/ollama

免费资源汇总

类别

资源

链接

课程

吴恩达 LangChain for LLM App

deeplearning.ai

课程

吴恩达 Building Systems with ChatGPT API

deeplearning.ai

课程

吴恩达 Multi AI Agent with crewAI

deeplearning.ai

Go框架

langchaingo(Go版LangChain)

github.com/tmc/langchaingo

Go框架

Eino(字节跳动开源AI框架)

github.com/cloudwego/eino

Go SDK

OpenAI官方Go SDK

github.com/openai/openai-go

文档

Prompt Engineering Guide(中文)

promptingguide.ai

必读

Anthropic Building Effective Agents

anthropic.com

工具

LangSmith(可观测性)

smith.langchain.com

工具

Phoenix(开源LLM追踪)

github.com/Arize-AI

不管你现在处于哪个阶段,最重要的第一件事只有一个:动手做项目。

看再多的文章,不如自己动手做一个真实的项目。建议按这个节奏来:

  1. 第1个项目(2周内):RAG问答机器人——跑通"知识库检索+LLM回答"的全流程
  2. 第2个项目(2-4周):带工具调用的智能助手——让Agent能搜索、能计算、能操作API
  3. 第3个项目(4-8周):Multi-Agent协作系统——用CrewAI或LangGraph做一个多Agent协作项目

每一个项目都放到GitHub上,写好README。面试时直接打开演示,比简历上写"熟悉Agent开发"有说服力100倍。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王中阳 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先说结论
  • 传统开发思维 vs Agent开发思维
    • 传统开发思维
    • Agent开发思维
    • 如何应对这种不确定性?
    • 阶段性总结
  • "三刷"官方文档实战演示
    • 1刷:建立认知地图(1-2天)
    • 2刷:动手跑通每一个示例(3-5天)
    • 3刷:脱离文档独立实现(2-3天)
  • AI应用架构演进史
  • 什么是Agent工程化?
    • 1. 可靠性设计
    • 2. 可观测性
    • 3. 成本控制
    • 4. 评估体系
    • 5. Multi-Agent编排
  • 总结
    • 从入门到进阶,完整学习路径
    • Go 生态 Agent 开发资源推荐
    • 免费资源汇总
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档