<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Agents on Sky&#39;s Blog</title>
    <link>https://skyan.github.io/tags/agents/</link>
    <description>Recent content in Agents on Sky&#39;s Blog</description>
    <generator>Hugo -- 0.148.2</generator>
    <language>en</language>
    <copyright>2025 Sky&amp;rsquo;s Blog</copyright>
    <lastBuildDate>Sat, 25 Apr 2026 16:00:00 +0800</lastBuildDate>
    <atom:link href="https://skyan.github.io/tags/agents/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Agent实现原理与实践（一）：Agent Loop</title>
      <link>https://skyan.github.io/posts/agents-arch-1/</link>
      <pubDate>Sat, 25 Apr 2026 16:00:00 +0800</pubDate>
      <guid>https://skyan.github.io/posts/agents-arch-1/</guid>
      <description>&lt;h2 id=&#34;1-前言&#34;&gt;1. 前言&lt;/h2&gt;
&lt;p&gt;随着2022年底以ChatGPT为代表的LLM（大语言模型）爆发式发展，AI Agent（智能体）迅速从概念走向工程实践。从早期简单的单轮对话工具，到如今能够自主规划、调用工具、持续迭代的编程Agent（如Cursor、Claude Code、Codex CLI），Agent已经成为大模型应用落地的核心形态。正如OpenAI在其官方博客中所说，Agent Loop是连接用户、模型和工具的枢纽。&lt;/p&gt;
&lt;p&gt;作为Agent系统的核心机制，Agent Loop（智能体循环）决定了Agent如何思考、如何行动、如何与外部环境交互。这个循环的本质是：Agent接收用户输入，查询模型进行推理，模型要么产生最终回复，要么请求工具调用；Agent执行工具后将结果回灌到prompt中，再次查询模型——如此反复，直到模型停止发出工具调用、产出面向用户的assistant message为止。这个assistant message不仅是对用户的回应，更标志着Agent Loop的一个终止状态：从Agent的视角看，它的工作已经完成，控制权交还用户。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;agent-loop&#34; loading=&#34;lazy&#34; src=&#34;https://skyan.github.io/posts/agents-arch-1/agent-loop.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;它看似简单——不过是一个&amp;quot;调模型、执行工具、再调模型&amp;quot;的循环——但要在真实产品中稳定、高效、可扩展地运行，却涉及大量精妙的工程设计和架构取舍。比如，随着对话增长，prompt长度会不断增加，而每个模型都有上下文窗口（context window）限制，因此上下文窗口管理是Agent的核心职责之一。此外，Agent执行的工具调用会修改本地环境（如读写文件），所以Agent的&amp;quot;输出&amp;quot;远不止assistant message，还包括它实际产生的代码变更等副作用。&lt;/p&gt;
&lt;p&gt;本文是Agent实现原理系列的第一篇，将从工程实现的角度，深入剖析Agent Loop的核心原理。我们将参考Codex CLI、Claude Code、nanobot、pi等主流开源项目的实现，抽象出Agent Loop的通用模型，分析其关键设计点和工程权衡。&lt;/p&gt;
&lt;h2 id=&#34;2-agent-loop的本质&#34;&gt;2. Agent Loop的本质&lt;/h2&gt;
&lt;h3 id=&#34;21-从会调llm的程序到agent-runtime&#34;&gt;2.1 从&amp;quot;会调LLM的程序&amp;quot;到&amp;quot;Agent Runtime&amp;quot;&lt;/h3&gt;
&lt;p&gt;一个最朴素的Agent实现，可以写成下面这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;while true:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    response = call_llm(messages, tools)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    if response has tool_calls:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        results = execute_tools(response.tool_calls)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        messages += [response, results]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    else:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        return response.content
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段代码确实构成了Agent Loop的核心骨架，但它距离一个&amp;quot;能在真实产品中运行的Agent Runtime&amp;quot;还有很大差距。真实场景需要回答的问题包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具执行出错或产生副作用时，如何优雅处理？&lt;/li&gt;
&lt;li&gt;用户中途插入新指令，如何不破坏当前执行上下文？&lt;/li&gt;
&lt;li&gt;上下文窗口超限，如何压缩而不丢失关键信息？&lt;/li&gt;
&lt;li&gt;多轮迭代后历史越来越长，如何保持&amp;quot;上下文卫生&amp;quot;？&lt;/li&gt;
&lt;li&gt;流式输出如何与工具调用无缝衔接？&lt;/li&gt;
&lt;li&gt;子Agent如何复用主循环的能力？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题促使Agent Loop从一个简单的while循环，演进为一组边界清晰的组件协作系统。&lt;/p&gt;
&lt;h3 id=&#34;22-agent-loop的通用抽象&#34;&gt;2.2 Agent Loop的通用抽象&lt;/h3&gt;
&lt;p&gt;无论具体实现如何差异，所有成熟的Agent Loop都共享同一套核心抽象：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
