先说结论

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次还是不满意 → 没有偏好积累 → 加了即时偏好回写

每一个功能都不是"锦上添花",而是闭环缺失导致的真实痛点。

经验总结

  1. Agent ≠ LLM调用。调一次LLM拿结果是API,有闭环才是Agent

  2. 闭环的灵魂是"评估反馈→下一轮输入"。没有反馈的循环只是重复,有反馈的循环才是进化

  3. 从API到Agent的路径:先跑通一次调用 → 加校验 → 加反馈 → 加记忆 → 加多轮 → 闭环形成


下篇预告

下一篇讲:Prompt Engineering:让LLM听懂你的话

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐