AI Agent 到底是什么?用3版代码看懂从API调用到Agent的进化
先说结论
AI Agent 不是单独的LLM调用,也不是LLM套个壳。
本质是:LLM + 工具 + 循环 — 感知→规划→行动→记忆→再感知的闭环。
我们日常用的ChatGPT、Kimi、豆包,看起来是"聊天工具",这只是表象。背后每一轮对话,Agent都在做:理解你的意图 → 决定调用哪个工具 → 执行 → 检查结果 → 根据反馈调整 → 再来一轮。
作为技术人,搞懂这个闭环,你才能写出真正有"智能"的Agent,而不是一个套了LLM的API。
API调用 vs Agent:本质区别在哪?
API调用:流程写死,分支写死
开发者提前编写固定流程,程序按预设逻辑执行。分支、顺序、循环全部硬编码。
缺点:无法应对变化。新增一个场景,就要改代码。
例子:查询订单API写死了。用户要求查"未支付订单" → 改SQL、改入参、改代码、发版。
Agent:流程由大脑动态决定
Agent接收输入 → 依靠大脑(LLM/规则引擎)推理决策 → 执行 → 校验结果 → 根据反馈迭代 → 多轮循环 → 输出。
关键区别:流程不是写死的,是推理出来的。
例子:查订单 → 筛选用户 → 尝试推送短信 → 推送失败 → Agent自主决策:查通道状态 → 换渠道重试 → 多次失败后汇总异常输出 → 自主决定何时放弃。
API调用遇到错误就崩,Agent遇到错误会想办法。
Agent的核心闭环
输入 → 决策 → 规划行动 → 执行行动 → 校验评估结果 → 评估反馈 → 多轮调用 → 任务完成 → 输出结果
这不是理论框架,这是每一行代码都在做的事。下面用我项目的3个版本代码,展示从"一次API调用"到"完整Agent闭环"的进化过程。
V1:最简版 — 这就是一次API调用,不是Agent
# V1:一次性调用LLM生成文章
async def generate_article(topic: str) -> str:
result = await llm.generate(
system_prompt="你是一位自媒体写手",
user_prompt=f"请写一篇关于{topic}的文章",
)
return result
这就是API调用。 调一次LLM,拿结果,结束。没有决策、没有校验、没有反馈、没有循环。
问题:
-
生成质量全凭运气,没有检查
-
风格每次随机,没有记忆
-
出错了直接崩,没有重试
-
用户想改?只能重新生成一整篇
V2:加质检 — 有了"校验评估",但还差得远
# V2:生成 + 质检
async def generate_with_check(topic: str) -> dict:
# 执行行动
result = await llm.generate(
system_prompt="你是一位自媒体写手",
user_prompt=f"请写一篇关于{topic}的文章",
)
# 校验评估结果
quality = await quality_orchestrator.check(title=topic, body=result)
return {"content": result, "quality_score": quality.score}
进步了:有了校验评估。但质检不过怎么办?V2只是把分数记下来,没有反馈、没有循环,还是一次性的。
还缺什么:
-
质检不过 → 没有自动修复
-
风格飘移 → 没有记忆
-
用户想微调 → 只能重写整篇
V3:完整闭环 — 这才是Agent
下面是项目中 pipeline/runner.py 的核心流程,每一步都对应闭环的一个环节:
# V3:完整Agent闭环 — pipeline/runner.py async def run(persona_id: str, topic_ids: list[str], auto: bool = False): # ━━━ 输入 ━━━ persona = repo.store.get_persona(persona_id) # 人设配置 hotspots = await crawler.crawl_niche(persona.niche) # 热点信号 # ━━━ 决策 ━━━ if auto: topics = await topic_gen.generate(persona, count=10) # AI决策:自动选题 else: topics = [repo.store.get_topic(t) for t in topic_ids] # 用户决策:指定选题 # ━━━ 多轮调用:每个选题走一遍完整闭环 ━━━ for topic in topics: # ━━ 规划行动 ━━ # 流水线:标题 → 正文 → 质检 → 排版 → 存储 # ━━ 执行行动 ━━ title = await title_gen.generate(persona, topic) body = await body_gen.generate(persona, topic, title) # 注入风格画像 formatted = formatter.format(title, body, persona) # ━━ 校验评估结果 ━━ quality = await orchestrator.check(title, body) # ━━ 评估反馈 ━━ content = GeneratedContent( title=title, body=body, quality_score=quality.score, # 反馈:质检分数写入内容 ) # ━━ 任务完成 ━━ repo.store.save_content(content) # ━━━ 输出结果 ━━━ return [repo.store.get_content(c.id) for c in contents]
和V1的区别:
| V1(API调用) | V3(Agent闭环) | |
|---|---|---|
| 输入 | 只有topic | 人设+选题+热点+风格画像 |
| 决策 | 无 | auto→AI选题 / manual→用户指定 |
| 规划 | 无 | 6步流水线 |
| 校验 | 无 | 4维度质检 |
| 反馈 | 无 | 质检分数回写 |
| 多轮 | 无 | for topic in topics |
| 记忆 | 无 | 风格画像跨轮注入 |
但V3还缺一个关键能力:修改闭环
V3能批量生成,但用户说"这段太正式了,活泼点"怎么办?V3只能重写整篇。
真正的Agent应该能对话修改,这是项目中最体现Agent闭环的部分:
# chat/routes/chat.py — 对话修改闭环
async def send_message(content_id: str, message: str, regenerate: bool):
# ━━━ 输入:用户的修改建议 ━━━
content = repo.store.get_content(content_id)
# ━━━ 决策:是否重新生成 ━━━
if regenerate:
# ━━━ 规划行动:组装编辑Prompt ━━━
system_prompt = "你是文章编辑,根据建议修改文章..."
user_prompt = f"# 原始标题\n{content.title}\n\n# 原始正文\n{content.body}\n\n# 修改建议\n{message}"
# ━━━ 执行行动:调用LLM编辑 ━━━
result = await llm.generate(system_prompt=system_prompt, user_prompt=user_prompt)
revised_title, revised_body = parse_result(result)
# ━━━ 校验评估:对比修改前后 ━━━
revision = RevisionRecord(
suggestion=message,
original_body=content.body, # 保留原文
revised_body=revised_body, # 修改后文
)
# ━━━ 评估反馈:即时偏好回写 ━━━
new_prefs = await learner.extract_preference_from_revision(revision)
persona.style_preferences = merge(persona.style_preferences, new_prefs)
repo.store.save_persona(persona) # ← 关键:反馈写入人设,影响下次生成!
# ━━━ 任务完成:更新内容 ━━━
content.title = revised_title
content.body = revised_body
repo.store.save_content(content)
注意最后一行 save_persona — 这是整个闭环最精妙的设计:
评估反馈 → 写入记忆 → 影响下一轮输入
用户说"活泼点" → 提取偏好 语气:活泼 → 写入人设 → 下次生成自动注入"你偏好活泼语气" → 不用再说第二次。
这就是Agent越用越懂你的秘密 — 不是魔法,是闭环。
你写的到底是API还是Agent?自检清单
| 问题 | API调用 | Agent |
|---|---|---|
| 流程是写死的还是推理的? | 写死 | LLM/规则引擎推理 |
| 出错了能自己想办法吗? | 直接崩 | 换策略重试 |
| 有校验环节吗? | 没有 | 质检/评估/打分 |
| 校验不过能自动修吗? | 不能 | 反馈→调整→重试 |
| 能记住用户偏好吗? | 不能 | 记忆→注入下次输入 |
| 能多轮迭代直到达标吗? | 不能 | 循环直到任务完成 |
如果你写的代码调一次LLM就返回了 — 那是API,不是Agent。
踩坑:我刚开始就写成了API调用
项目最早期的代码就是V1的样子 — 一个 llm.generate() 调完就返回。当时觉得"能生成文章不就行了?"
结果:
-
生成的文章风格每次都变 → 我说"怎么每次语气都不一样" → 加了风格画像记忆
-
质量参差不齐 → 加了质检模块
-
用户想改一个段落 → 只能整篇重写 → 加了对话修改闭环
-
修改了5次还是不满意 → 没有偏好积累 → 加了即时偏好回写
每一个功能都不是"锦上添花",而是闭环缺失导致的真实痛点。
经验总结
-
Agent ≠ LLM调用。调一次LLM拿结果是API,有闭环才是Agent
-
闭环的灵魂是"评估反馈→下一轮输入"。没有反馈的循环只是重复,有反馈的循环才是进化
-
从API到Agent的路径:先跑通一次调用 → 加校验 → 加反馈 → 加记忆 → 加多轮 → 闭环形成
下篇预告
下一篇讲:Prompt Engineering:让LLM听懂你的话
更多推荐



所有评论(0)