<?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>推理循环 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%8E%A8%E7%90%86%E5%BE%AA%E7%8E%AF/</link><description>Recent content in 推理循环 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%8E%A8%E7%90%86%E5%BE%AA%E7%8E%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>第4章 推理循环算法</title><link>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-04/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/aiagentalgorithm/chapter-04/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Intelligence is not a single act, but an iterated loop of perception, reasoning, and action.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="41-问题引入agent-的心跳"&gt;4.1 问题引入：Agent 的心跳&lt;/h2&gt;
&lt;p&gt;当用户在终端输入一行自然语言指令——比如&amp;quot;帮我把这个函数重构成两个&amp;quot;——背后发生的事情远比想象中复杂。Claude Code 不会仅仅调用一次大语言模型就给出答案。相反，它启动了一个&lt;strong&gt;推理循环&lt;/strong&gt;（Reasoning Loop）：先理解任务，再决定调用哪个工具，然后执行工具、观察结果，之后再次推理——如此反复，直到任务完成。&lt;/p&gt;
&lt;p&gt;这个循环就像 Agent 的心跳。每一次搏动，Agent 都在感知世界（读取工具执行结果）、思考对策（调用 LLM）、采取行动（调用工具）。心跳停止，Agent 停止。心跳失控，Agent 陷入死循环。如何设计这个循环，使其既足够灵活以应对任意复杂的任务，又足够可控以避免失控和资源浪费——这是 Agent 系统最核心的工程挑战。&lt;/p&gt;
&lt;p&gt;在 Claude Code 的源码中，这个推理循环分布在两个关键模块中：&lt;strong&gt;QueryEngine&lt;/strong&gt;（&lt;code&gt;src/QueryEngine.ts&lt;/code&gt;）负责会话级别的生命周期管理，包括用户输入处理、系统提示词构建、会话持久化等；&lt;strong&gt;query&lt;/strong&gt;（&lt;code&gt;src/query.ts&lt;/code&gt;）负责核心推理循环的实际执行，包括 LLM 调用、工具执行、上下文压缩、异常恢复等。两者的关系可以类比为操作系统中的&lt;strong&gt;进程管理器&lt;/strong&gt;与&lt;strong&gt;CPU 调度器&lt;/strong&gt;——前者管理进程的创建和资源分配，后者决定每个时间片做什么。&lt;/p&gt;
&lt;p&gt;本章将深入解析这一核心循环的算法设计。&lt;/p&gt;
&lt;h2 id="42-算法思想"&gt;4.2 算法思想&lt;/h2&gt;
&lt;h3 id="421-核心-loop-算法永动的推理引擎"&gt;4.2.1 核心 Loop 算法：永动的推理引擎&lt;/h3&gt;
&lt;p&gt;推理循环的基本骨架是一个 &lt;code&gt;while(true)&lt;/code&gt; 无限循环。乍看之下这似乎很原始，但其精妙之处在于&lt;strong&gt;退出条件的分布式设计&lt;/strong&gt;——循环体内有多个出口，每个出口对应一种终止语义。&lt;/p&gt;
&lt;p&gt;让我们先看最精简的算法骨架：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;算法&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：推理循环核心骨架&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;function queryLoop(params):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;初始化&lt;/span&gt;(params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; true:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：准备&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messagesForQuery &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;预处理消息&lt;/span&gt;(state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;messages)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messagesForQuery &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;自动压缩&lt;/span&gt;IfNeeded(messagesForQuery)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：调用&lt;/span&gt; LLM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; message &lt;span style="color:#f92672"&gt;in&lt;/span&gt; streamCallModel(messagesForQuery):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yield message &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;向外部流式输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; message&lt;span style="color:#f92672"&gt;.&lt;/span&gt;type &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assistant&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;收集工具调用块&lt;/span&gt;(message)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：判断是否需要继续&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;无工具调用&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;执行停止钩子检查&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;completed&amp;#39;&lt;/span&gt; } &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;出口&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：正常完成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：执行工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolResults &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; executeTools(toolUseBlocks)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yield toolResults
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：检查终止条件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;用户中断&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;aborted&amp;#39;&lt;/span&gt; } &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;出口&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：用户中断&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;超过最大轮次&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; { reason: &lt;span style="color:#e6db74"&gt;&amp;#39;max_turns&amp;#39;&lt;/span&gt; } &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;出口&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：轮次上限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;阶段&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;：组装下一轮输入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;messages &lt;span style="color:#960050;background-color:#1e0010"&gt;←&lt;/span&gt; [&lt;span style="color:#f92672"&gt;...&lt;/span&gt;messagesForQuery, &lt;span style="color:#f92672"&gt;...&lt;/span&gt;assistantMessages, &lt;span style="color:#f92672"&gt;...&lt;/span&gt;toolResults]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; state&lt;span style="color:#f92672"&gt;.&lt;/span&gt;turnCount&lt;span style="color:#f92672"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个算法有几个值得注意的设计决策：&lt;/p&gt;</description></item></channel></rss>