上周五下午,组里一个平时挺上进的同事跑到我工位旁。 "老大,我那个Agent又抽风了。"他挠着头,"调了两天prompt,换了三版工具定义,还是不行——该查wiki的时候去发邮件,该汇总的时候乱搜网页。"
我打开他提交的代码。LangChain的createAgent,工具注册、记忆接入,表面看着都没问题。
"跑的时候加trace了吗?"我指着终端输出,"你看这一步——模型返回的tool_calls,下一轮ReAct循环里是怎么喂进去的?"
他愣了一下:"……不知道,框架自动处理的吧?"
"那如果模型返回的格式不规范,或者工具返回的结果太长被截断了,你的Agent会怎么处理?"
他沉默了两秒,声音小了半截:"还有这种情况?我以为框架都封装好了……"
我拍了拍他肩膀:"框架封装了细节,方便上手,但也埋了坑。今天正好把这块讲透——从底层原理到如何从零手搓一个AI Agent,你搞清楚了,以后就不慌了。"
读完这篇文章,你会得到:
- 底层原理:从Function Calling → Few-shot/COT → ReAct → Harness Engineering,把Agent的认知闭环打通
- 核心组件:Tool & MCP标准协议、记忆系统、RAG检索增强,每个都能直接落地
- 实战项目:基于LangChain从零构建Agent,再用MateChat快速搭建可视化Agent应用界面
- 前沿拓展:接入个人知识库、Agent Skills技能系统、OpenCode工程化实践
不管你是刚接触Agent,还是像那位同事一样能跑但心里没底,这篇文章都能给你一条从原理到实践的完整路径。
Agent入门基础
Agent是什么?
Anthropic定义:由大语言模型动态指导自身流程和工具使用情况的系统,它能自主控制完成任务的方式。 Google定义:AI Agent是一种能够感知环境、进行决策和执行动作的智能实体。其表现出了推理、规划和记忆能力,并且具有一定的自主性,能够自主学习、适应和做出决定。
Agent架构中有三个核心组件:模型(model)、工具(tool)、编排层(orchestration)。当然,现在AI圈子有一个更新的概念是Agent = Model + Harness,该概念最早由LangChain 2026年3月10日在官方博客中提到。
这个公式可以用一个非常贴切的比喻来理解:
- 模型(Model)是一台性能强悍的发动机,它提供了核心动力(智能)
- 驾驭层(Harness)则是底盘、方向盘、刹车、传动系统和车身
Harness Engineering
Harness Engineering(驾驭工程)是一套围绕AI Agent构建的约束、反馈与控制系统,让Agent在人类设定的边界内自主、可靠、可持续地工作——它不优化模型本身,而是优化模型运行的"环境"。
AI工程技术的演进路径:
- Prompt Engineering(2023 - 2024):指令设计,包括措辞优化、角色设定、格式约束
- Context Engineering(2025):上下文设计,包括信息架构、渐进披露、记忆管理
- Harness Engineering(2026 - ):系统工程,包括约束机制、反馈回路、工作流控制、持续改进
Function Calling
Function Call通常指模型主动调用外部工具、API或自定义函数来获取信息、执行操作或扩展自身能力。Function Call是大模型从"纯文本生成器"迈向"智能行动者"的关键桥梁。它让AI不仅能"说",还能"做"——通过安全、可控的方式与外部世界互动。
大模型在面对实时性问题、数学计算等问题时可能效果不佳。Function Call通过引入外部工具,让大模型可以回答原本无法解决的问题。
Function Call的完整流程:
- 用户提出问题
- 应用端根据用户问题发起第一次模型调用,同时传递工具信息
- 大模型判断是否需要调用工具
- 如果需要,模型输出工具名称和入参
- 应用端解析工具入参,根据工具名称和入参运行工具
- 应用端根据工具结果和用户问题发起第二次模型调用
- 大模型接收工具返回结果,生成最终响应
- 应用端将最终回复返回给用户
Few-Shot & COT
这两个概念是大语言模型提示工程中提升模型回答质量的核心技巧。简单来说,Few-shot是通过"举例"告诉模型怎么做,而CoT是教模型"一步步思考"。
Few-Shot是一种提示策略,通过在输入中提供少量示例(通常为3–5个),引导LLM完成目标任务,在Agent中常作为基础提示技术,用于初始化或辅助其他更复杂的Agent框架。
COT是一种提示技术,引导模型通过生成中间推理步骤来分解问题,促使其在最终答案前先列举思考过程,这种框架可以增强模型解决复杂问题时的准确性,有效缓解幻觉问题。
ReAct架构
《ReAct: Synergizing Reasoning and Acting in Language Models》最早于2022年10月由普林斯顿大学和谷歌研究提出。在ReAct提出之前,AI主要流行两种模式,但都有缺陷:
- 仅推理(如Chain-of-Thought):擅长逻辑推理,但因为不查资料,容易产生幻觉
- 仅行动(如早期的任务型对话系统):能调工具,但缺乏灵活的高层规划能力
ReAct将两者结合,既能让AI像人一样思考(提高可解释性),又能让它动手查资料(提高准确性和实时性)。这也成为了后来LangChain、AutoGPT等热门框架的底层理论基础。
核心思想:将推理(Reasoning)与行动(Action)交替进行,形成"思考-行动-观察"循环。ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。
ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:
- Thought(思考):智能体的"内心独白",分析当前情况、分解任务、制定下一步计划或反思上一步结果
- Action(行动):智能体决定采取的具体动作,通常是调用一个外部工具
- Observation(观察):执行Action后从外部工具返回的结果
ReAct模式相比传统Function Calling的优势:
- 突破"想不能做"的限制
- 解决复杂任务的长程规划问题
- 减少幻觉,基于真实工具反馈
- 动态纠错,执行失败可重试
- 处理多步骤依赖关系
标准的ReAct Prompt模板如下:
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:{agent_scratchpad}
Agent设计模式
核心交互模式
| 模式 | 核心思想 | 适用场景 |
|---|---|---|
| ReAct | 交替进行"推理-行动-观察"循环,每次决策都基于当前状态和环境反馈 | 通用型任务、需要工具调用的场景 |
| 思维链(CoT) | 通过逐步推理生成中间步骤,增强复杂问题的推理能力 | 数学推理、逻辑分析、多步计算 |
| 反思(Reflection) | Agent对自身输出进行自我批评和改进,生成更优版本 | 代码生成、内容创作、质量敏感任务 |
| 结构化响应 | 强制模型按预设格式(如JSON)输出,便于后续解析 | 工具调用、系统集成、确定性输出场景 |
规划与推理模式
| 模式 | 核心思想 | 特点 |
|---|---|---|
| Plan-and-Execute | 先规划完整计划,再逐步执行,执行后可根据结果调整 | 结构化、可追溯 |
| ReWOO | 一次性生成完整计划,中途不调整,执行后返回结果 | 减少LLM调用次数,成本更低 |
| LLM Compiler | 将任务构建为有向无环图(DAG),识别可并行执行的子任务 | 最大化并行度,降低延迟 |
| Tree of Thoughts | 将问题展开为多路径搜索树,探索多种思路 | 适合需要多角度探索的问题 |
| LATS | 结合蒙特卡洛树搜索,在复杂空间中进行规划 | 性能最优,但计算量大 |
| Self-Discover | Agent自动为任务设计推理策略,无需人工预设 | 通用性强,可迁移复用 |
核心组件详解
工具系统 Tools & MCP
工具(tools)是模型与外部世界之间的桥梁,使得Agent可以访问并处理真实信息。
MCP全称模型上下文协议(Model Context Protocol),该协议旨在为大型语言模型和AI助手提供一个统一、标准化的接口,使AI模型能够轻松获取外部数据源或者操作外部工具并完成更复杂的任务。
MCP支持多种类型的服务接入:
- 官方参考服务器:Google Map、GitHub、Google Drive、GitLab、SQLite、BraveSearch等
- 第三方服务器:Slack、PostgreSQL、Grafana、Cloudflare等
- 社区服务器:AWS、Google Calendar、Spotify、ElasticSearch、AWS S3等
需要注意的是:Tools和MCP本质上都是通过Function Calling触发的,在Thought时需要将完整信息传递给LLM,若tools过多,会导致占用过多的上下文,消耗Token。一个好的Agent不需要过多的工具,Bash是最好的工具,Agent会自己编写code通过Bash执行。
记忆系统
大语言模型本质上是一个"无状态"(Stateless)的函数,所有的"记忆"其实都是通过工程手段(外部存储和拼接)强行赋予它的。
记忆系统是负责为模型提供上下文信息的关键组件,直接影响推理(Thought)的质量与执行效果。它通常被称为上下文工程,核心目标是确保模型在每一步都能获得充分、准确且低干扰的信息。
在ReAct框架中,每一个Thought的质量,严重依赖于CoT,而CoT又严重依赖于记忆系统提供的信息是否充足、是否准确、是否干扰最小,也就是输入上下文的信息质量。
| 类型 | 说明 | 典型实现 |
|---|---|---|
| 短期记忆(Short-Term Memory) | 当前会话内的上下文,包括用户输入、模型回复、中间推理轨迹、工具调用结果等 | 由编排层维护对话状态,直接拼接进Prompt |
| 长期记忆(Long-Term Memory) | 跨会话的知识,如用户画像、历史记录、企业文档、领域知识库 | 通过向量检索(RAG)、知识图谱或数据库查询,在运行时动态召回并注入上下文 |
RAG
RAG(Retrieval Augmented Generation)即检索增强生成,一般用于LLM整合知识库,模糊搜索非结构化数据,找到相似的结构以后,再交给LLM去处理,这样会大大增加搜索结果的准确性。
这种技术通过从外部存储中检索相关信息、工具和示例来动态填充模型提示词。
RAG的工作原理:
- 文档加载:从本地文件或网页加载文档
- 文本分割:将文档分割为可管理的chunks
- 向量存储:将chunks转换为向量并存储
- 检索:根据用户查询检索相关chunks
- 生成:基于检索结果生成回复
Agent应用实践
基于LangChain.js构建AI智能体
LangChain是开始构建完全定制的LLM驱动的应用程序的简单方式。只需不到10行代码,你就能连接到OpenAI、Anthropic、Google等。LangChain提供预构建的代理架构和模型集成,帮助您快速启动并无缝地将大型语言模型整合到您的代理和应用中。
以下是一个简单的示例:
// First install: npm install langchain @langchain/anthropic
import { z } from "zod";
import { createAgent, tool } from "langchain";
const getWeather = tool(
({ city }) => `It's always sunny in ${city}!`,
{
name: "get_weather",
description: "Get the weather for a given city",
schema: z.object({
city: z.string(),
}),
},
);
const agent = createAgent({
model: "anthropic:claude-sonnet-4-6",
tools: [getWeather],
});
console.log(
await agent.invoke({
messages: [{ role: "user", content: "What's the weather in Tokyo?" }],
})
);
搭建完Agent后,我们可以基于readline创建一个简单CLI交互程序,方便进行测试和调试。
使用MateChat创建Agent应用界面
MateChat是一套专为智能化场景打造的前端交互解决方案,提供开箱即用的对话组件与高度可定制的交互框架。无论是智能客服、AI助手,还是多模态交互应用,MateChat都能帮助开发者在极短时间内构建出体验流畅、风格统一、扩展性强的对话界面。
我们可以通过MateChat Cli快速创建智能对话应用,也可以直接在现有Web项目中接入MateChat组件。
以下是两个自定义工具的示例:
import { tool } from '@langchain/core/tools'
// 1. 创建自定义工具-获取当前时间
export const getCurrentTime = tool(
async () => {
const now = new Date()
console.log('getCurrentTime:', now.toLocaleString('zh-CN'))
return '当前时间:2026年6月8日祝您工作顺利'
},
{
name: 'get_current_time',
description: '获取当前的日期和时间'
}
)
// 2. 创建自定义工具-计算数学表达式
export const calculateMath = tool(
async (input) => {
try {
// 使用Function构造器安全计算数学表达式
const result = new Function('return ' + input)()
return `计算结果:${result}`
} catch (error) {
return `计算错误:${error.message}`
}
},
{
name: 'calculate_math',
description: '计算数学表达式,接受一个字符串形式的数学表达式作为输入'
}
)
在Agent中接入个人Agent
A2A协议
基于协议的协作架构,Agent2Agent (A2A) Protocol,是一种标准化的通信协议,旨在让不同来源、不同能力、甚至由不同开发者构建的智能体之间能够自主、安全、高效地交互与协作。该协议最初由谷歌(Google)于2025年4月发布。
核心特点:
- 对等通信:所有智能体地位平等,可主动发起请求或响应
- 标准化接口:通常基于消息格式(如JSON-RPC、OpenAPI)或新兴标准(如A2A协议草案)
- 跨平台互操作性:支持不同框架(LangChain、AutoGen、CrewAI等)的智能体互通
- 动态发现与协商:智能体可动态发现其他可用智能体,并协商任务分配、权限等
核心设计思路:
- 用Agent Card声明能力
- 用Task跟踪任务生命周期
- 用Message/Part/Artifact承载交互内容
Agents as Tools
分层编排架构,将其他智能体封装为工具(Tool),由主智能体(Orchestrator)按需调用,类似于函数调用。这是当前主流框架(如LangChain、LlamaIndex)中常见的模式。
核心特点:
- 主从架构:主智能体控制流程,子智能体作为"黑盒工具"被动执行
- 单向调用:主智能体决定何时、如何调用子智能体,子智能体不主动发起交互
- 工具化抽象:子智能体被注册为一个Tool,具有明确输入/输出schema
- 低耦合但弱自治:子智能体失去自主决策权,仅作为功能模块
基于OpenCode的AI工作流实践
对于个人开发者而言,从零手搓一个Agent并非明智之举,更推荐直接使用OpenCode,进行Agent在工程应用上的实践。OpenCode是一款开源的AI Coding Agent,内置免费模型,支持连接任意服务商提供的任意模型,配置灵活自由。目前该项目在GitHub上已累计获得超过13.5万颗星标。
安装和使用非常简单:
npm install -g opencode-ai
安装完成后,终端输入opencode即可启动。你可以用JS接入OpenCode,把AI工作流跑成自动化任务,实现24小时不间断工作。
Agent Skills「技能」
Agent Skill是于2025年确立的开放式AI代理构建标准,其本质是将复杂的Prompt工程、外部知识库(Reference)与执行逻辑(Script)封装为标准化的本地文件结构(如SKILL.md)。简单来说就是:给模型的一份可复用「操作说明书 + 流程模板」,解决专业场景问题。
Agent Skill采用渐进式披露机制,确保任何给定时间只有相关内容占据上下文窗口:
- 1级:元数据,始终加载(启动时),用于判断哪个技能与当前任务相关
- 2级:指令,触发Skill时加载,当Agent确定需要某个技能时,才会读取该技能的详细指令
- 3级+:资源,按需加载,只有在执行过程中确实需要时,才会加载脚本或参考文档等资源
总结与推荐
AI Agent技术正在快速发展,从最初的简单工具调用到现在的复杂多智能体协作,已经展现出了巨大的应用潜力。掌握Agent的底层原理和核心组件,能够帮助你构建更加可靠、高效的智能应用。
在实际开发过程中,你可能会遇到需要管理多个API接口、统一处理请求和响应的情况。这里推荐使用TreeRouter作为你的API中转站,能够帮助你更好地组织和管理Agent与各种外部工具、服务之间的通信,提升开发效率和系统稳定性。




