很多人第一次听到 Agent,会以为它是「更聪明的聊天机器人」。其实不是那么回事。Agent 是一套能自己定计划、调工具、看结果、再调整,直到把事干完的系统——它有关键的「行动」和「循环」,而不只是动嘴。
先说清楚它到底是什么
很多人第一次听到 Agent,会以为它是「更聪明的聊天机器人」。其实不是那么回事。Agent 是一套能自己定计划、调工具、看结果、再调整,直到把事干完的系统——它有关键的「行动」和「循环」,而不只是动嘴。
IBM、DeepMind、OpenAI 给 Agent 的共识定义是:一个能持续感知环境、自主推理、调用工具做事,并根据反馈不断调整,直到目标达成的系统。
光背定义没用,看它跟普通聊天机器人差在哪:
- 你跟普通聊天机器人说「帮我订明天去北京的高铁」,它要么跟你聊两句,要么直接编一段列车时刻表——因为它没有手。
- 你跟 Agent 说同样的话,它会真的去查 12306、比价、挑座位、下单(或者把订单交给你确认)。差别就在:它有「手」(工具)和「脑子里的循环」(想—做—看—再想)。
这里有个绕不开的词:ReAct,就是 Reason(想)+ Act(做)。现在主流 Agent 基本都按这个圈转:
想 → 做 → 看结果 → 再想,没干完就回到「想」,一直转到目标达成,或者踩到停止条件(任务完成 / 步数到上限 / 遇到解决不了的错误)。
把它当成一个自动驾驶系统
写前端这么多年,我觉得 Agent 最像的是自动驾驶,而不是某个具体的人。
你调一个普通 LLM,就像调用一个纯函数:传进去 prompt,返回一段 text,调用结束,状态清空。Agent 更像一套自动驾驶:你只设终点(目标),它自己感知路况(环境信息)、决策(下一步往哪走)、执行(打方向盘 / 调接口)、再根据导航反馈修正路线。你不用每一步都喊「现在左转」,你只管说去哪,剩下的它自己跑完。
还是拿那个高铁的例子:普通模型给你一段文字就结束了;Agent 会自己拆出「查车次 → 比价 → 选座 → 下单 / 让你确认」这一串动作,中间某个车次没票了,它自己换方案继续,而不是卡住问你。
它到底帮我解决了哪些麻烦
Agent 适合「步骤多、要临场判断、还得拉外部数据」的活。说几个我实际用上的,都是以前得人肉盯的事:
1. 自动盯线上,省掉人工巡检
以前线上报错靠人刷监控面板,漏了就背锅。现在 Agent 定时拉报错日志、做归类、做限频,严重的直接建 Jira 单并 @ 对应人。人不用来回切好几个系统当传声筒。
2. 让模型知道「今天」发生了什么
大模型有知识截止日期,不懂今天股价、今天天气、今天你们仓库的最新提交。Agent 通过工具实时去拉,把这块短板补上。比如问「我们这个接口今天超时了多少次」,它能真去查监控再答。
3. 把一串互不相通的工具串成一条流水线
像「抓某个领域的最新文章 → 过滤 → 生成摘要 → 发邮件」,每一步都是不同系统。Agent 自己把它们连起来,中间不用人把 A 的输出复制粘贴进 B。
4. 接得住模糊需求
你不用把每一步写死。「帮我把这个落地页转化率低的问题查一下」,Agent 会先抓数据、再看热力图、再判断是文案问题还是加载问题,而不是等你给标准答案才动。
顺手厘清几个绕口的词
Agent 相关文章里老冒出来几个词,先认个脸,免得后面看懵:
- Function Calling:模型把「要调哪个工具、参数是啥」以 JSON 形式吐出来,执行器去真调。它是 Agent 的工具接口,但不是 Agent 的全部。
- ReAct:上面讲过了,就是想—做—看的循环框架。
- RAG(检索增强生成):Agent 先从知识库 / 向量库检索相关文档,再让模型作答。企业私有问答常用。
- MCP:上一篇讲 Skill 时提过,是 Agent 连外部工具的通用协议,相当于 USB-C。
- 向量数据库:把文档、代码转成向量,方便做语义检索。常见的如 Pinecone、Milvus、Qdrant。
- HITL(Human-in-the-loop):关键动作让人拍板。生产环境里尤其重要,比如你肯定不想让 Agent 自己转账或删库。
动手写一个能跑的 Agent
落到代码上。一个最小可用 Agent,抽象出来就是下面这个循环:
import openai
def run_agent(user_goal, tools, max_steps=10):
messages = [{"role": "user", "content": user_goal}]
for step in range(max_steps):
# 1. 大模型决定:直接回答,还是调用工具
response = openai.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
)
msg = response.choices[0].message
# 2. 如果直接回答,任务结束
if not msg.tool_calls:
return msg.content
# 3. 执行工具,并把结果送回上下文
for call in msg.tool_calls:
result = execute_tool(call.function.name,
json.loads(call.function.arguments))
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
# 4. 继续下一轮思考
这个循环就是 Agent 的骨架。工程里真要用起来,还得补几块:
先把目标钉死
别给「把代码变好」这种虚词。改成「检查这个 React 组件有没有多余的 re-render,并给出修改方案」。目标越具体,Agent 越不容易跑偏。
挑个会思考的大脑
负责规划和推理的模型(GPT-4o、Claude Sonnet、DeepSeek-V3 这类)更适合当 Agent 的脑子。便宜的小模型适合做后面那些确定性处理,比如格式化、校验。
给它一点记忆
- 短期记忆:当前这轮对话的上下文;
- 长期记忆:用户偏好、项目结构、历史决策,丢进向量库或文件里;
- 任务记忆:当前执行到哪一步了,防止走着走着迷路。
把工具说明书写清楚
工具描述要写得像给同事看的 API 文档:名字、干啥的、参数、返回值、会怎么报错。Agent 全靠这些描述决定要不要调、怎么调。
让它先列个计划再干
简单任务可以「一步一想一调」。复杂任务建议先让模型输出一份计划清单,再按计划执行,中途失败了再重排,比走到哪算哪稳得多。
最后套上安全带
- 敏感操作必须走 HITL 确认;
- 单步和总步数都设上限,防死循环;
- 工具调用失败要有重试和兜底;
- 全程留日志,方便查问题。
动手案例:搭一个「每日热点日报」Agent
前面讲的都是原理,这里我拿一件自己真的会想偷懒的事,把它完整跑一遍:每天帮我从各大平台抓热点,挑出真正值得看的,再用人话解读一遍,最后打包成一份日报发到我邮箱。
这活纯靠人,每天手动刷微博、知乎、新闻 App 再整理,半小时打底,还容易漏。但它又不是「一次性任务」——有明确目标、要调好几个外部源、中间还得判断「这条值不值得收」,正好是 Agent 的菜。
它到底怎么转起来
![每日热点日报 Agent 的工作流]](https://blogimg.lieme.cn/2026/08/2026081515470799.png)
拆开看是这么一条流程:
- ① 抓取:定时去拉多个源——微博热搜、知乎热榜、几个新闻站点的 RSS、GitHub Trending。每个源一个工具函数,统一返回「标题 / 链接 / 热度 / 来源」。
- ② 聚合去重:不同平台经常撞同一条新闻。按标题相似度加语义向量聚类,把重复的并成一条,顺手标个「3 个平台都在聊」。
- ③ AI 解读:对留下来的每条热点,调模型产出三样东西——一句话说清发生了什么、为什么重要、跟咱们行业有啥关系。这一步,就是 Agent 比「纯爬虫脚本」多出来的那点脑子。
- ④ 生成日报:把解读按板块(科技 / 财经 / 社会 / 开发圈)排好,拼成一份 Markdown,带上原文链接。
- ⑤ 推送:发邮件、推飞书、或者存成公众号草稿,看你喜欢。
整个流程每天定时跑一轮,所以流程图右边画了个回头箭头——它不是跑一次就完,而是「日更」的循环。
工具清单(给 Agent 的「手」)
tools = [
fetch_weibo_hot(), # 拉微博热搜
fetch_zhihu_hot(), # 拉知乎热榜
fetch_news_rss(), # 拉新闻 RSS
dedup_and_cluster(), # 去重 + 语义聚类
llm_summarize(), # AI 解读单条热点
render_digest(), # 拼成 Markdown 日报
send_email(), # 发到邮箱
]
每个工具都要写清「干啥、入参、返回啥、失败了咋办」——前面说的「把工具说明书写清楚」就是在这儿用的。模型看不到你的代码,它只靠这些描述决定先调哪个。
核心循环:跟前面那套骨架一模一样
def run_daily_digest(tools, max_steps=20):
goal = "产出今日热点日报并发送到邮箱"
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": goal},
]
for step in range(max_steps):
resp = llm(messages, tools=tools) # 思考
if not resp.tool_calls: # 没工具要调 = 干完了
return resp.content
for call in resp.tool_calls: # 行动
result = execute(call) # 调工具
messages.append(tool_result(call, result)) # 观察 → 再思考
你会发现,这就是前面那个最小骨架,只是 tools 换成了日报专用的几个函数。Agent 抽象出来就这么点东西,难的从来不在循环,在「工具写得稳不稳、护栏全不全」。
对照前面那几条「安全准则」
- 目标钉死:不是「看看今天有啥新闻」,而是「抓 4 个源、去重后挑前 15 条、每条配一句话解读、发邮件」。越具体,越不容易跑偏。
- 给它记忆:昨天发过的热点今天不重复推(短期去重);你常瞄「开发圈」板块就多留几条(长期偏好)。
- 套安全带:抓取失败有重试,单个源挂了不影响其它源;日报生成后先存草稿人工过目再群发,别让 Agent 直接对全员推送(HITL)。
跑通这一版,你基本就把「Agent = 会自己定计划 + 调工具 + 看结果再调整」这句话,从概念变成了每天真给你发邮件的东西。
最后说点实在的
Agent 没那么玄。它就是把「模型会想」+「工程上管状态」+「能调外部工具」这三件事拧成一圈循环。
站在前端角度,你可以把它当成一套更猛的异步工作流:以前我们用 Promise 和状态机管用户操作,现在用 Agent 管 AI 的自主执行。
别一上来就想着造个全能管家。先用 LangGraph、CrewAI、Anthropic Agent SDK 或 OpenAI Assistants 跑通一个具体例子——比如「追踪你关注领域的最新动态,每周自动出一份汇总」。跑通了,再慢慢加记忆、加工具、加护栏。
下一篇聊聊一个和 Agent 强相关的新岗位:FDE。
