首页 › AI Agent › Agent 入门 › 从零开始搞定AI Agent 搭建全流程

从零开始搞定AI Agent 搭建全流程

本文全面介绍AI Agent的生态,结合实践剖析,解答以下问题​

​

•

什么是真正复杂的AI Agent?​

•

如何开发复杂AI Agent?​

​

一、Agent协议​

分为 Context-Oriented (面向上下文) 和 Inter-Agent (面向 Agent 间) 两种。​

​

​

​

飞书文档 - 图片

​

44%

​

​

​

飞书文档 - 图片

​

56%

​

​

​

面向上下文的协议以 MCP 为代表,面向 Agent 间的协议以 A2A 为代表。​

​

1.1面向上下文协议​

​

​

​

飞书文档 - 图片

​

60%

​

​

​

飞书文档 - 图片

​

40%

​

​

MCP解决 Agent 如何从外部世界(数据、工具、服务)获取完成任务所需信息(上下文)的问题。​

MCP主要采用 Client - Server 架构,其核心架构主要包括以下内容:​

​

⭕

•

主机(Host):​

​

通常是发起连接的 LLM 应用程序,如 Claude Desktop、IDE 插件等。它负责管理客户端实例和安全策略,是用户与 AI 模型进行交互的平台,同时也承担着集成外部工具、访问多样化数据资源的任务。​

​

•

客户端(Client):​

​

是主机内的连接器,与服务器建立 1:1 会话。它负责处理协议协商和消息路由,充当主机与外部资源之间的桥梁,通过标准化的协议接口协调数据传输和指令交互,确保信息的实时性与一致性。​

​

•

服务器(Server):​

​

是独立运行的轻量级服务,通过标准化接口提供特定功能,如文件系统访问、数据库查询等。服务器连接外部资源与 AI 模型,向 LLMs 暴露来自不同数据源的内容和信息。​

​

​

1.2面向Agent间协议:A2A​

单个 Agent 能力有限,多 Agent 协作成为趋势。面向Agent间的协议主要是为了规范 Agent 之间的沟通、发现和协作。​

​

⭕

​

1.3MCP 和 A2A 关系​

举个实际的例子使用 MCP 和使用 A2A 的都可以实现:​

​

假如 AI Agent 需要完成一个"规划 5 天深圳到厦门旅行"。​

​

​

飞书文档 - 图片

​

​

📌

MCP:像个大总管。​

​

一个中央 Agent (MCP Travel Client) 负责调用所有外部服务(机票、酒店、天气),然后汇总信息生成计划。优点是简单可控,缺点是中心化依赖高,不易扩展。​

​

A2A:像个部门协作。​

​

任务被分配给专门的 Agent(交通、住宿、活动),这些 Agent 可以直接相互沟通(比如机票 Agent 直接问天气 Agent 获取信息),也可以和用户进行沟通(比如机票Agent完成初筛之后询问用户是否满足需求,对用户给出的建议进行迭代修改),这种方式更灵活,适合企业内复杂协作。​

​

​

​

二、Agent思考框架​

构建能够自主规划、执行和适应复杂任务的智能体,其核心在于其"思考"能力。​

​

Agent思考框架,正是为了赋予Agent这种结构化的推理和决策能力而设计的。​

​

2.1思维链(CoT)​

​

​

​

📌

一种增强大型语言模型(LLM)处理复杂推理任务能力的关键技术。​

​

其核心在于引导模型在给出最终答案前,先生成一系列结构化的中间推理步骤——这如同模拟人类解决问题时的逐步思考过程。​

通过这种方式,LLM能够更深刻地理解问题结构,有效分解复杂任务,并逐步推导出解决方案。​

​

​

50%

​

​

​

​

50%

​

​

2.2ReAct​

ReAct(Reasoning and Action)框架通过将"推理"(Reasoning)与"行动"(Action)相结合,有效地解决了这一问题。​

​

​

这种动态的交互赋予了模型一种"边思考边行动、边观察边调整"的能力,​

其核心运作机制可以概括为思考(Thought)→ 行动(Action)→ 观察(Observation)的迭代循环。​

​

📌

思考 (Thought)​

​

​

2.3Plan-and-Execute​

Plan-and-Execute 是一种对标准 ReAct 框架的扩展和优化,旨在处理更复杂、多步骤的任务。​

​

​

​

📌

它将 Agent 的工作流程明确划分为两个主要阶段:​

​

•

规划阶段:Agent 首先对接收到的复杂任务或目标进行整体分析和理解。然后,它会生成一个高层次的计划,将原始任务分解为一系列更小、更易于管理的子任务或步骤。​

•

执行阶段:计划制定完成后(可能已采纳用户意见),Agent 进入执行阶段。它会按照规划好的步骤逐一执行每个子任务。在执行每个子任务时,Agent 可以采用标准的 ReAct 循环来处理该子任务的具体细节。​

​

​

​

📌

与标准的 ReAct 相比,Plan-and-Execute 模式的主要优势在于:​

​

​

三、开发框架​

​

📌

在掌握了Agent的基本原理后,需要将这些理论转化为实际可用的代码实现。​

​

虽然开发框架并非技术瓶颈,但一个优秀的开发框架能够为提供流程编排、状态管理、工具调用等核心能力,大大加速生产级Agent应用的开发进程。​

​

​

3.1Eino​

Eino 框架由以下几个部分组成,其中Eino为核心框架逻辑。​

​

​

​

Eino框架有以下几个核心特点:​

​

📌

•

高可维护性和高可扩展性并存​

​

3.2组件(Component)​

组件是大模型应用能力的提供者,提供原子能力的最小单元,是构建AI Agent的砖和瓦,组件抽象的优劣决定了大模型应用开发的复杂度。​

​

📌

Eino 的组件抽象秉持着以下设计原则:​

​

常用的组件类型可以大致分成一下对话处理类组件、文本语义处理类组件、决策执行类组件和自定义组件这几类。​

​

3.3对话处理类组件​

ChatTemplate​

​

模板化处理和大模型交互参数的组件抽象。​

主要作用是将用户提供的变量值填充到预定义的消息模板中,生成用于与语言模型交互的标准消息格式。​

例如结构化的System Prompt、多轮对话模板等场景。​

​

​

​

​

ChatModel​

​

直接和大模型交互的组件抽象,它的主要作用是将用户的输入消息发送给语言模型,并获取模型的响应。​

提供了非流式的Generate和流式的Stream方法获取大模型输出内容。​

​

​

代码块​

Go

type BaseChatModel interface {​

Generate(ctx context.Context, input []*schema.Message, opts ...Option) (*schema.Message, error)​

Stream(ctx context.Context, input []*schema.Message, opts ...Option) (​

*schema.StreamReader[*schema.Message], error)​

}​

​

​

​

3.4文本语义处理类组件​

Document.Loader、Document.Transformer​

​

主要用于获取和处理文本文档,从不同来源(如网络 URL、本地文件等)加载文档内容,并将其转换为标准的文档格式。​

​

​

代码块​

Go

​

​

Embedding​

​

将文本转换为向量表示,它的主要作用是将文本内容映射到向量空间,使得语义相似的文本在向量空间中的距离较近。一般用于语义检索场景。​

​

​

代码块​

Python

type Embedder interface {​

EmbedStrings(ctx context.Context, texts []string, opts ...Option) ([][]float64, error)​

}​

​

​

Indexer​

​

存储和索引文档的组件。它的主要作用是将文档及其向量表示存储到后端存储系统中,并提供高效的检索能力。主要用于构建向量数据库。​

​

​

​

代码块​

Python

type Indexer interface {​

Store(ctx context.Context, docs []*schema.Document, opts ...Option) (ids []string, err error)​

}​

​

​

Retriever​

​

从各种数据源检索文档的组件。它的主要作用是根据用户的查询(query)从文档库中检索出最相关的文档,主要用于RAG场景。​

​

​

​

代码块​

Python

type Retriever interface {​

Retrieve(ctx context.Context, query string, opts ...Option) ([]*schema.Document, error)​

}​

​

​

3.5决策执行类组件​

ToolsNode​

​

是一个用于扩展模型能力的组件,它允许模型调用外部工具来完成特定的任务。​

​

​

代码块​

Go

// 基础工具接口,提供工具信息​

type BaseTool interface {​

​

​

四、自定义组件​

​

📌

Lambda​

​

Lambda 组件底层是由输入输出是否流所形成的 4 种运行函数组成,对应 4 种交互模式。​

也是流式编程范式: Invoke、Collect、Transform。​

​

​

​

代码块​

Go

type Invoke[I, O, TOption any] func(ctx context.Context, input I, opts ...TOption) (output O, err error)​

type Stream[I, O, TOption any] func(ctx context.Context, input I, opts ...TOption) (output *schema.StreamReader[O], err error)​

type Collect[I, O, TOption any] func(ctx context.Context, input *schema.StreamReader[I], opts ...TOption) (output O, err error)​

type Transform[I, O, TOption any] func(ctx context.Context, input *schema.StreamReader[I], opts ...TOption) (output *schema.StreamReader[O], err error)​

​

4.1编排(Compose)​

​

📌

Eino提出了基于有向图(Graph)模型的编排解决方案。​

​

每个节点承担特定职责,节点间以上下游数据类型对齐为基本准则,实现类型安全的数据传递。​

​

​

从以下几个维度对比了使用Eino编排框架与传统开发的优势:​

​

​

​

4.2Graph:运行图​

以一个简单的查询天气的例子介绍如何使用图编排​

​

​

​

代码块​

Go

func main() {​

ctx := context.Background()​

// 创建运行图​

g := compose.NewGraph[map[string]any, *schema.Message](​

compose.WithGenLocalState(func(ctx context.Context) *state {​

return &state{}​

}))​

// Prompt模板​

promptTemplate := prompt.FromMessages(​

schema.FString,​

schema.SystemMessage("你是一个智能助手,请帮我解决以下问题。"),​

​

​

4.3Callbacks:切面​

Callback有以下几个触发时机,分别对应了Handler里边的回调方法:​

​

代码块​

Java

​

​

​

​

​

​

58%

​

​

​

Eino通过数据复制的方式。​

保证了在Callbacks的处理过程中数据流的并发安全性。​

每个Handler都能消费到一份独立的数据流。​

​

42%

​

​

​

4.4Checkpoint:检查点​

Human In The Loop(HITL)是一种让人类用户能够实时参与和干预AI Agent执行过程的机制。​

​

HITL可以实现以下重要功能:​

​

📌

•

质量审核​

​

在人机协同工作中,用户可以在重要决策节点实时干预,例如审核AI生成的内容、修改推荐结果等,确保关键任务(如数据库敏感数据、运维操作等)的准确性和安全性。​

​

​

​

Eino框架通过Checkpoint(检查点)机制优雅地实现了Human In The Loop的能力。​

​

​

​

以下展示使用CheckPoint的能力实现Human In The Loop的效果:​

​

代码块​

Go

func main() {​

_ = compose.RegisterSerializableType[myState]("state")​

ctx := context.Background()​

g := compose.NewGraph[map[string]any, *schema.Message](​

compose.WithGenLocalState(​

func(ctx context.Context) *myState {​

return &myState{}​

},​

​

​

五、tRPC-A2A-Go​

在实际的多智能体系统开发中,将 Agent 封装为支持 A2A 协议的服务具有诸多优势。​

​

📌

tRPC-A2A-Go 框架为开发者提供了完整的 A2A 协议客户端和服务端实现.​

​

帮助开发者快速将 Agent 封装为标准的 A2A 服务,兼容主流的智能体生态,显著降低了多Agent协同系统集成和运维的难度。​

​

​

​

​

​

5.1A2A Server​

​

📌

将Eino框架的Agent使用A2A协议对外提供服务有以下几个步骤:​

​

​

完成AgentCard描述Agent的能力,创建A2A Server​

​

代码块​

Go

func NewA2AServer(agent *Agent) (*server.A2AServer, error) {​

var err error​

agentCard := getAgentCard() // 按照A2A协议标准生成AgentCard,描述Agent能力​

redisCli, err := tgoredis.New("trpc.redis.deepresearch")​

if err != nil {​

return nil, fmt.Errorf("failed to create redis client: %w", err)​

}​

// 创建基于Redis的任务管理器​

​

将A2A Server注册到tRPC服务上,并启动服务​

​

代码块​

Go

func main() {​

s := trpc.NewServer()​

agt, err := deepresearch.NewAgent()​

if err != nil {​

log.Fatal(err)​

}​

​

​

5.2A2A Client​

创建一个A2A客户端使用A2A协议向Agent发起任务分为以下几个步骤:​

①创建A2A客户端​

​

代码块​

Python

// 客户端​

a2aClient, err := a2aclient.NewA2AClient(agentConfig.ServerURL, a2aclient.WithTimeout(time.Minute*10))​

​

②调用StreamTask发起流式任务​

​

代码块​

Python

taskChan, err := a2aClient.StreamTask(c, protocol.SendTaskParams{​

ID: taskID,​

Message: initMessage,​

})​

​

③流式处理任务执行结果​

​

代码块​

Go

for v := range taskChan {​

switch event := v.(type) {​

​

​

六、从零开发多Agent协同系统​

接下来,将结合实际Demo,从整体架构到核心模块的实现,完整展现一个多Agent协同系统的开发过程。​

​

​

6.1Agent设计​

下面以Demo中的几个典型Agent为例,详细介绍设计思路与实现方式,基于Eino框架快速落地多智能体协作系统。​

6.2旅行规划​

​

​

​

旅行规划 Agent 使用经典的 ReAct 框架实现。主要集成了高德地图 MCP 能力,实现了路线规划、交通方式推荐、实时路况查询等功能,以及 Tavily 进行 AI 搜索,能够检索目的地的景点介绍、游玩攻略、美食推荐等内容。在此之上,通过增加了Lambda:user_input节点等待用户下一轮对于行程规划的建议和追问。​

6.3深度搜索​

​

​

​

深度搜索 Agent 利用大模型对复杂问题进行多角度分析,边推理边搜索。在执行流程内部,通过ChatModel:think进行问题分析,并判断上下文的资料是否足够回答用户问题,如果不够那么输出关键词借助搜索工具获取资料补充上下文,如果足够,通过ChatModel:summary模型,输出对于问题的分析总结报告。​

6.4意图识别​

​

​

​

​

📌

这种设计让意图识别Agent具备了高度的灵活性和可扩展性。​

​

•

一方面,它能够根据用户需求动态选择并对接不同类型的下游专家Agent,实现多智能体间的高效协作与任务流转;​

•

另一方面,专家Agent采用标准化A2A协议进行封装,具备天然的可插拔能力,通过AgentCard描述能力让意图识别Agent进行判断当前的任务类型,支持在系统运行时无缝添加、替换或扩展新的专家Agent。​

​

​

​

​

6.5连接生态​

Connector是A2A多Agent系统实现"能力复用"和"生态扩展"的关键。​

​

它的核心目标是将标准化的Agent能力,通过协议适配、接口封装等方式,快速对接到不同的外部平台和应用场景,实现"写一次,处处可用"。​

​

​

📌

•

解耦​

​

Agent本身只关注业务逻辑和A2A协议实现,不直接依赖于任何具体平台。Connector负责协议转换、消息编解码、上下游适配,最大程度降低Agent与外部生态的耦合度。​

​

•

标准​

​

所有对接均基于A2A协议的标准输入输出格式,保证能力的可组合性和可迁移性。无论是对接IM、Web、App还是第三方API,均通过统一的协议层进行交互。​

​

•

可扩展​

​

Connector采用插件化、模块化设计,支持按需扩展新的平台适配器。只需实现对应的适配接口,即可将Agent能力无缝接入新的生态系统。​

​

​

​

6.6接入Cherry Studio​

​

​

​

​

📌

通过实现 OpenAI 兼容的 Connector,将 Agent 能力以标准 chat/completion 协议对外暴露,可以直接在 Cherry Studio 客户端中便捷地接入和调试 Agent,实时体验其交互效果与能力表现,极大提升了开发和测试的效率与直观性。​

​

​

实现chat/completion接口,获取model作为Agent名字,调用A2AServer,将任务执行结果,使用SSE协议流式输出到chat/completion响应里​

​

代码块​

Go

func (s *Server) chatHandler(c *gin.Context) {​

var req api.ChatRequest​

if err := c.ShouldBindJSON(&req); errors.Is(err, io.EOF) {​

c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"})​

return​

} else if err != nil {​

c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})​

​

​

配置Cherry Studio模型,连接 connector 服务​

​

​

​

6.7Agent观测​

数据看板:通过Dashboard,可以实时查看LLM应用的质量、成本、延迟等多维度指标,全面监控和分析智能体系统的运行状态。​

​

​

八、总结​

以上系统梳理了 AI Agent 的核心理念、主流协议(MCP、A2A)、思考框架(CoT、ReAct、Plan-and-Execute),并结合 Golang 生态下的 Eino、tRPC-A2A-Go 等工程化框架,结合实际例子详细讲解了如何优雅地开发、编排和观测复杂的智能体系统。​

​

•

协议标准化是 Agent 生态的基础:​

​

MCP、A2A 等协议的出现,极大降低了工具和 Agent 的集成门槛,让"能力复用"成为可能。未来,协议的进一步融合和演进,将推动智能体生态走向真正的互联互通。​

​

​

•

思考框架决定 Agent 的智能上限:​

​

从 CoT 到 ReAct,再到 Plan-and-Execute,结构化的推理与行动流程,是 Agent 胜任复杂任务的关键。合理选择和实现思考框架,是打造高鲁棒性、高可解释性 Agent 的核心。​

​

​

•

工程化框架让复杂 Agent 开发变得高效:​

​

Eino、tRPC-A2A-Go 等框架,通过组件化、强类型、编排与切面机制,极大提升了开发效率和系统可维护性。无论是单体智能体,还是多 Agent 协作,都能快速落地生产级应用。​

​

​

•

可观测与人机协同是生产级 Agent 的基础能力:​

​

只有让 Agent 的推理过程、工具调用、任务状态对用户和开发者透明,实现高质量的交付和持续优化。Human In The Loop 机制,则为关键场景下的安全性和可控性提供了保障。​

​

​

•

选择适合自身场景的协议与框架:​

​

没有万能的协议和框架,只有最适合当前业务和团队的技术选型。理解协议的边界、框架的能力,结合实际需求做出权衡,才能真正发挥 AI Agent 的价值。​

​

​