<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Rufus&apos; ink </title><description>Stay hungry, stay foolish</description><link>https://blog.arminos.cn</link><item><title>万字长文｜一文弄懂 Harness Engineering</title><link>https://blog.arminos.cn/blog/harness-engineering</link><guid isPermaLink="true">https://blog.arminos.cn/blog/harness-engineering</guid><description>针对现在层出不穷的 AI 新概念，拒绝 Fomo！Harness Engineering 不是需要焦虑追捧的全新发明，而是对一系列现有工程实践的系统性总结与命名。</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ 针对现在层出不穷的 AI 新概念，拒绝「错失恐惧症」，也就是我们常说的 Fomo！请先对自己默念：拒绝 Fomo ！拒绝 Fomo ！拒绝 Fomo ！重要的事情说三遍呀！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Harness 并不是 AI 圈子凭空发明的新概念。作者在此前的 AI 实践中，一直在尝试总结一套完整的方法论，但发现无论是 Prompt Engineering 还是 Context Engineering，都无法很好地囊括全部实践。于是，作为前端工程师，索性自己造了个新词：&lt;strong&gt;&quot;AI 工程化&quot;或&quot;AI 基建设计&quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harness Engineering 这个词的出现，不过是用一个更形象、更生动的词语，对这类现有实践做了一次系统性的汇总和命名。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文的部分内容来源于作者多次模型评测和工程实践中的思考，行文风格可能与常见的技术文章有所不同。如有不当之处，还请大家不吝指正。在正式阅读这篇文章之前，我也给大家准备了一份术语说明，如果你在阅读过程中有任何不清楚的地方，欢迎随时查看。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;术语&lt;/strong&gt;                        | &lt;strong&gt;专业释义&lt;/strong&gt;                                          | &lt;strong&gt;类比说明&lt;/strong&gt;                                         |
| ----------------------------- | ------------------------------------------------- | ------------------------------------------------ |
| &lt;strong&gt;Harness Engineering&lt;/strong&gt;       | 围绕 AI 智能体构建约束、反馈与控制系统的工程学科，旨在将模型的智能转化为可靠的生产力。     | 一支能力超群但缺乏纪律的施工队，设计一套包含图纸、建材标准、质检流程和安全规范的工程管理体系。  |
| &lt;strong&gt;AI Agent&lt;/strong&gt;                  | 一个能基于环境感知、进行自主规划、并执行一系列动作以达成特定目标的 AI 程序。          | 一个配备了传感器、大脑和工具箱的自主机器人，能够独立完成从&quot;打扫房间&quot;到&quot;组装家具&quot;等复杂任务。 |
| &lt;strong&gt;Context Engineering&lt;/strong&gt;       | 在任务执行的恰当时机，为 AI Agent 精确提供所需信息的工程实践，强调&quot;少即是多&quot;和结构化。 | 扮演一名高效的手术室护士，在外科医生需要时，准确递上相应的手术器械，而不是把整个工具车推过去。  |
| &lt;strong&gt;Architectural Constraints&lt;/strong&gt; | 通过自动化工具强制执行的一系列编码和设计规则，用于维护系统架构的一致性与健康度。          | 城市交通系统中的红绿灯、单行线和道路护栏，它们共同确保了车流的有序与安全。            |
| &lt;strong&gt;Self-Verification&lt;/strong&gt;         | AI Agent 在完成任务的某个阶段后，自主运行测试或检查清单来验证其产出是否符合预期的过程。  | 学生在交卷前，自己逐题检查答案、验算结果，以确保没有疏漏或计算错误。               |
| &lt;strong&gt;Ralph Loop&lt;/strong&gt;                | 一种强制 AI Agent 不断迭代、直至其产出通过客观验证标准才允许终止的执行循环机制。     | 一个设定了&quot;必须命中靶心才能结束&quot;的射箭练习。只要没射中，就必须重射，直到成功为止。       |
| &lt;strong&gt;Entropy / 熵&lt;/strong&gt;               | 在软件系统中，指随着时间推移和持续修改，系统逐渐积累的混乱、无序和技术债务。            | 一个书架，如果只放书不整理，久而久之就会变得杂乱无章，难以快速找到想要的书。           |&lt;/p&gt;
&lt;p&gt;废话不多说，正文开始～&lt;/p&gt;
&lt;h2&gt;一、Harness Engineering 是什么？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;📷 文章配图&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2026 年，继提示词工程（Prompt Engineering）与上下文工程（Context Engineering）之后，软件工程领域迎来了一个新的关键词：&lt;strong&gt;Harness Engineering&lt;/strong&gt;。这个概念由 HashiCorp 联合创始人 Mitchell Hashimoto 提出，并因 OpenAI 的一篇报告而广为人知。&lt;/p&gt;
&lt;p&gt;其核心隐喻：&quot;&lt;strong&gt;马与缰绳&lt;/strong&gt;&quot;：生动地描绘了它的使命：为强大但方向不定的&quot;野马&quot;（例如 AI Agent 或任何复杂的软件系统）套上名为&quot;Harness&quot;的&quot;缰绳&quot;，通过&lt;strong&gt;约束、引导并纠正其行为，确保它能沿着预设的轨道稳定、可靠地前行&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我们通过一个形象的比喻，相信你会更加清楚：&lt;strong&gt;AI Agent = SOTA 的模型（野马） + Harness（驾驭系统） = 千里马&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI Agent 如同一匹潜力无限的&quot;野马&quot;，而 Harness Engineering 则是那套能将其驯化为&quot;千里马&quot;的完整驾驭体系。&lt;strong&gt;它不是去改变马的基因（模型本身），而是为它设计一套专业的马具和训练方法。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🌳 Harness 就是：除了 LLM 本身之外，让 Agent 真正能干活的一切&lt;strong&gt;基础设施&lt;/strong&gt;。Harness Engineering 不是&quot;更好的提示词（Prompt）&quot;，也不是&quot;更强的模型&quot;，而是优化模型运行的环境与机制。它的本质是**优化模型运行所需的环境、机制与基础设施的总和，**它是一套将 AI 的&quot;智能&quot;转化为可靠、可控、可规模化&quot;生产力&quot;的工程哲学与实践框架。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;再次明确这一点：Harness Engineering 不是一个需要焦虑追捧的全新发明，而是对一系列现有工程实践的系统性总结与命名。正如本文开篇所说，它更像是一套&quot;AI 工程化的驾驭体系&quot;，旨在解决一个核心问题：当 AI 成为我们团队的一员时，我们该如何&lt;strong&gt;管理&lt;/strong&gt;这位&quot;超级实习生&quot;？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;概念已经明晰，那么下一个自然而然的问题是：我们为什么需要它？&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;二、为什么需要 Harness Engineering？&lt;/h2&gt;
&lt;p&gt;随着 AI 从单一的&quot;应答机器&quot;向能够自主规划和执行复杂任务的智能体（AI Agent）演进，工程师的角色正在发生根本性的转变。Harness Engineering 的出现，正是为了应对这一转变带来的全新挑战。其必要性主要体现在以下几个方面：&lt;/p&gt;
&lt;h3&gt;构建更可靠的 Agent 系统&lt;/h3&gt;
&lt;p&gt;为了让 Agent 从**&quot;有趣的玩具&quot;&lt;strong&gt;变为&lt;/strong&gt;&quot;可靠的工具&quot;**，它必须满足四个核心目标，我们可以将其概括为 &lt;strong&gt;R.E.S.T&lt;/strong&gt; 模型：&lt;/p&gt;
&lt;h4&gt;可靠性（Reliability）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：系统在面对各种预期和非预期的输入、环境变化和内部故障时，能够持续、稳定地提供服务，并完成其既定任务的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键要求&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;失败可恢复&lt;/strong&gt;：任务中断后能自动从检查点恢复。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作幂等性&lt;/strong&gt;：关键的写操作可安全重试，不会弄脏状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行为一致性&lt;/strong&gt;：在相同输入下，行为应是可预测的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;效率（Efficiency）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：在满足功能和可靠性的前提下，系统使用计算、存储、网络等资源的有效性，直接关系到服务的成本和可扩展性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键要求&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;资源可控&lt;/strong&gt;：对 Token 消耗、API 调用、计算时间有精确的预算控制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低延迟响应&lt;/strong&gt;：在交互式场景中，快速给出有意义的反馈。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高吞吐量&lt;/strong&gt;：在批处理场景中，单位时间内能处理更多任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;安全性（Security）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：保护系统及其数据免受未经授权的访问、使用、泄露或破坏的能力。对于能自主行动的 Agent，安全性是不可逾越的红线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键要求&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最小权限&lt;/strong&gt;：仅授予完成当前子任务所必需的权限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沙盒执行&lt;/strong&gt;：所有不授信的代码或指令必须在严格隔离的沙盒中执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输入/输出过滤&lt;/strong&gt;：防止指令注入、敏感信息泄露和有害内容生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;可观测性（Traceability / 可追溯性）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：系统提供足够的数据（日志、指标、追踪），使开发和运维人员能够理解其内部状态、决策过程和行为轨迹的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键要求&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全链路追踪&lt;/strong&gt;：从请求到结果，每一个环节的调用链都清晰可追溯。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策可解释&lt;/strong&gt;：Agent 的每一个关键决策（如选择哪个工具）都应有明确的归因记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态可审计&lt;/strong&gt;：系统在任意历史时间点的完整状态都应可查询和审计。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Agent-First 时代对工程师的必然要求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工程复杂性持续攀升&lt;/strong&gt;：随着 AI 能力的不断增强，人们对应用场景的复杂度和预期也水涨船高。编程场景早已不再是贪吃蛇、俄罗斯方块等 Vibe Coding 小 Demo，而是从简单的程序跃迁为复杂的工程实践。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从&quot;执行者&quot;到&quot;设计者&quot;的角色跃迁&lt;/strong&gt;：当 AI 承担起代码编写等具体任务时，人类工程师的核心价值便从&quot;动手执行&quot;转向&quot;系统设计&quot;。我们不再是逐行编码的工人，而是设计蓝图、定义规则、验收最终成果的架构师：正如系列文章前文提到的 Spec Coding 理念。当然，仅靠给 AI 制定 Prompt 规则这种&quot;软约束&quot;是远远不够的。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;也是 Harness Engineering 爆火的起因：https://openai.com/zh-Hans-CN/index/harness-engineering/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;|          | &lt;strong&gt;传统工程师&lt;/strong&gt; | &lt;strong&gt;Harness 时代工程师&lt;/strong&gt;  |
| -------- | --------- | ------------------ |
| &lt;strong&gt;价值&lt;/strong&gt;   | 写代码的速度和质量 | 设计系统的能力            |
| &lt;strong&gt;核心技能&lt;/strong&gt; | 编码        | 约束设计、反馈回路设计、控制系统设计 |
| &lt;strong&gt;产出&lt;/strong&gt;   | 代码        | Agent 可靠运行的环境      |
| &lt;strong&gt;关注点&lt;/strong&gt;  | 代码本身      | 支撑结构（工具、抽象、反馈回路）   |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🌳 一个令人瞩目的行业实验印证了这一趋势：一个仅三人的小型团队，在几乎不手写任何代码的情况下，通过引导 AI Agent，于短短五个月内构建了一个&lt;strong&gt;百万行代码级别&lt;/strong&gt;的复杂产品，期间累计合并了约 1,500 个 Pull Request。这一实践有力地证明了一个趋势：当 AI 成为主要的&quot;生产力&quot;时，传统的工程管理模式已不再适用。我们不再是逐行编码的工人，而是绘制蓝图、定义规则、最终验收成果的&lt;strong&gt;架构师&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;仅通过提示词（Prompt）下达指令这种&quot;软约束&quot;远远不够，我们需要一套&quot;硬约束&quot;的工程体系&quot;来保障最终产物的质量、可靠性与可维护性：这正是 Harness Engineering 的用武之地。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;简而言之，Harness Engineering 的核心理念是：当模型遇到问题时，通过一套工程化的 Harness 机制，从根本上避免同类问题再次发生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它是这个时代的产物：随着模型的持续迭代，更多基础能力将被内化至模型本身，部分 Harness 也将随之退出历史舞台；与此同时，新的应用场景不断涌现，也必将催生新的 Harness 实践。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;明确了&quot;为什么&quot;之后，让我们进一步拆解 Harness Engineering 到底包含哪些具体内容。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;三、Harness Engineering 包含什么&lt;/h2&gt;
&lt;p&gt;在当前基于 Transformer 和自回归的 LLM 架构下，模型的原始输出本质上是随机且无序的。&lt;/p&gt;
&lt;p&gt;而 Harness Engineering 的作用，正是通过有序的约束来驾驭无序的算力，从而完成更加复杂的工程实践。&lt;/p&gt;
&lt;p&gt;要理解它&quot;包含什么&quot;，我们首先需要理解 Agent 是如何运作的。一个完备的 Agent 系统，其核心运行机制可抽象为一个持续循环的四阶段过程：感知（Perception）、规划（Planning）、行动（Action）、以及反思（Feedback / Reflection）。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;环节&lt;/strong&gt; | &lt;strong&gt;英文全称&lt;/strong&gt; | &lt;strong&gt;核心内容&lt;/strong&gt; |
|-|-|-|
| &lt;strong&gt;P - 感知&lt;/strong&gt; | Perception | Agent 通过 &quot;传感器&quot; 或接口，从外部环境和内部状态采集信息，包括用户指令、外部 API 返回数据、系统监控指标、历史对话记录等。感知的全面性、准确性和结构化程度直接决定 Agent 决策的上限。 |
| &lt;strong&gt;P - 规划&lt;/strong&gt; | Planning | 在感知基础上，由 LLM 担当的 &quot;大脑&quot; 理解当前状态与最终目标的差距，将复杂任务分解为可执行的子任务或步骤，核心是决策，涉及路径选择、资源分配、工具筛选及潜在风险预判。 |
| &lt;strong&gt;A - 行动&lt;/strong&gt; | Action | 规划完成后，Agent 通过 &quot;效应器&quot; 与外部世界互动，可调用 API、执行代码、向用户返回信息或与其他系统交互，行动的精确性和可靠性是实现目标的关键执行环节。 |
| &lt;strong&gt;F - 反思&lt;/strong&gt; | Feedback/Reflection | 行动结果作为反馈被系统捕获，Agent 比较行动结果与预期目标的差异并反思，可能触发新规划（如纠正错误、调整策略），或存入记忆影响下一轮感知和规划，形成持续学习和优化的闭环。 |&lt;/p&gt;
&lt;p&gt;Harness Engineering 将 Agent 的工程化体系解构为四个核心维度，每个维度都与 PPAF 闭环的一个或多个环节紧密耦合。这四个维度共同构成了一个完整的 Agent &quot;马具&quot;（Harness），用于驾驭、约束和提升 Agent 这匹&quot;智能之马&quot;。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;工程维度&lt;/strong&gt; | &lt;strong&gt;核心隐喻&lt;/strong&gt; | &lt;strong&gt;工程目标&lt;/strong&gt; | &lt;strong&gt;主要支撑的 PPAF 环节&lt;/strong&gt; |
|-|-|-|-|
| &lt;strong&gt;造缰（Making the Reins）&lt;/strong&gt; | 定义接口、协议与约束 | 为 Agent 的感知和行动提供清晰、稳定、安全的边界和输入/输出通道。 | &lt;strong&gt;感知（Perception）&lt;/strong&gt; |
| &lt;strong&gt;驭马（Riding the Horse）&lt;/strong&gt; | 实现策略、调度与执行控制 | 设计和实现 Agent 的核心决策与执行逻辑，确保 Agent 能够自主、高效地完成任务。 | &lt;strong&gt;规划（Planning） &amp;#x26; 行动（Action）&lt;/strong&gt; |
| &lt;strong&gt;相马（Evaluating the Horse）&lt;/strong&gt; | 建立评估、观测与选择机制 | 建立一套度量和评估体系，用于观测 Agent 的能力、性能和行为。 | &lt;strong&gt;反思（Reflection）&lt;/strong&gt; |
| &lt;strong&gt;育马（Breeding the Horse）&lt;/strong&gt; | 构建训练、迭代与记忆体系 | 设计数据回流、模型训练和知识更新的闭环机制，使 Agent 能够从经验中学习。 | &lt;strong&gt;反思（Reflection） &amp;#x26; 记忆&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;为了更系统地理解不同类型 Agent 的能力边界和工程挑战，我们可以构建一个二维的战略分析矩阵。该模型从&quot;认知循环&quot;和&quot;上下文效率&quot;两个维度对 Agent 应用进行划分。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;横轴：AI 认知循环（Cognitive Loop）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;被动响应（React）&lt;/strong&gt;：Agent 的行为主要由外部单次触发驱动，执行预定义的、确定性的任务，缺乏自主规划和反思能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主动规划与反思（Proactive Plan &amp;#x26; Reflect）&lt;/strong&gt;：Agent 能够基于长期目标，自主进行多步规划、执行、并根据结果进行反思和动态调整。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纵轴：环境系统上下文处理效率（Context Efficiency）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;低效（人工/单点投喂）&lt;/strong&gt;：Agent 运行所需的大部分上下文依赖人工手动提供，或只能通过有限的、低效的接口获取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高效（沙盒化/全自动注入）&lt;/strong&gt;：Agent 运行在一个高度集成和自动化的环境中，所需上下文能够通过系统级接口（如文件系统、API 网关、状态引擎）被高效、全面地自动捕获和注入。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;| | &lt;strong&gt;第一象限：自主智能体（Autonomous Agents）&lt;/strong&gt; | &lt;strong&gt;第二象限：专家辅助系统（Expert Assistant Systems）&lt;/strong&gt; |
|-|-|-|
| &lt;strong&gt;高上下文效率&lt;/strong&gt; | 典型形态：自动化代码生成与修复、无人值守的科学实验平台、自主市场分析与交易系统。关键能力：长期任务规划、自我纠错与反思、复杂的工具协同、与环境深度交互。 | 典型形态：IDE Copilot、对话式 BI、交互式设计工具。关键能力：在丰富的上下文理解基础上，提供精准的代码/建议生成、数据查询。 |
| &lt;strong&gt;低上下文效率&lt;/strong&gt; | &lt;strong&gt;第四象限：高阶流程自动化（Advanced RPA/Copilot）&lt;/strong&gt; 典型形态：基于自然语言的 CLI 工具、多步骤 API 调用封装、简单的信息查询机器人。 | &lt;strong&gt;第三象限：基础问答与单点工具（Basic Q&amp;#x26;A &amp;#x26; Single-shot Tools）&lt;/strong&gt; 典型形态：客服机器人、简单的 API 封装工具（如天气查询）。 |&lt;/p&gt;
&lt;p&gt;这个矩阵清晰地揭示了 Harness Engineering 的价值所在：&lt;strong&gt;Harness 的成熟度，直接决定了 Agent 应用能否从低效的、被动的第三、四象限，跃迁至高效的、主动的第一、二象限。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;理解了 Harness Engineering 的组成部分后，下一步自然要问：它是如何被设计出来的？&lt;/p&gt;
&lt;h2&gt;四、Harness Engineering 是如何设计的&lt;/h2&gt;
&lt;p&gt;理论框架为我们指明了方向，现在让我们深入工程实践，探讨如何一步步构建起一个稳健的 Harness 系统。&lt;/p&gt;
&lt;h3&gt;4.1. 顶层抽象：Harness 作为带边界控制的 REPL 容器&lt;/h3&gt;
&lt;p&gt;在架构层面，Harness 的本质可以被抽象为一个&lt;strong&gt;带有边界控制、工具路由与确定性反馈的 REPL（Read-Eval-Print Loop）容器&lt;/strong&gt;。它包裹在 LLM 这个非确定性的&quot;大脑&quot;之外，负责管理从&quot;感知&quot;到&quot;行动&quot;再到&quot;反思&quot;的完整生命周期，从而将 LLM 的推理能力接入到确定性的工程世界。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Harness 作为 REPL 容器的核心逻辑&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read（读取）&lt;/strong&gt;：Harness 通过&lt;strong&gt;上下文管理器（Context Manager）&lt;/strong&gt;，将外部世界（用户输入、API 状态）和内部记忆&quot;翻译&quot;成 LLM 可理解的、高度结构化的 Prompt。这实现了对&quot;感知&quot;环节的工程化管理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eval（评估/执行）&lt;/strong&gt;：当 LLM 生成一个规划（如 Function Calling）时，Harness 通过**调用拦截器（Call Interceptor）**捕获该意图，并将其路由到正确的工具执行器。执行过程被严密监控，包括超时、资源配额和错误捕获。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Print（打印/反馈）&lt;/strong&gt;：工具执行的结果（成功数据或异常信息）被**反馈汇编器（Feedback Assembler）**捕获，并组装成结构化的&quot;观测结果&quot;，重新注入到上下文中，供 LLM 进行下一轮的&quot;反思&quot;与&quot;规划&quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loop（循环）&lt;/strong&gt;：这个&quot;读取-评估-打印&quot;的过程不断循环，直到 Agent 达到目标状态或触发终止条件，构成了 PPAF 的核心驱动力。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.2. 底层转换机制：在无限状态与有限 Token 间架起桥梁&lt;/h3&gt;
&lt;p&gt;Agent 的智能涌现，建立在对海量状态信息的理解之上。然而，&lt;strong&gt;LLM 的核心，也就是 Transformer 架构：操作的是一个有限的、线性的 Token 序列。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🌳 因此，Harness 的核心挑战之一，就是在&quot;无限&quot;的外部世界状态与&quot;有限&quot;的 LLM 上下文 Token 之间，建立一套高效、可靠的双向映射和转化机制。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.2.1. 上下文管理：从&quot;无限状态&quot;到&quot;有限 Token&quot;&lt;/h4&gt;
&lt;p&gt;Agent 的上下文（Context）是其感知的全部来源，它包含了任务目标、历史交互、工具定义、当前状态等海量信息。如何将这些信息有效&quot;压缩&quot;到 LLM 的 Token 窗口内，是规划质量的生命线。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;映射策略&lt;/strong&gt; | &lt;strong&gt;核心机制&lt;/strong&gt; | &lt;strong&gt;适用场景&lt;/strong&gt; | &lt;strong&gt;工程挑战&lt;/strong&gt; |
|-|-|-|-|
| &lt;strong&gt;滑动窗口（Sliding Window）&lt;/strong&gt; | 保留最近的 N 轮对话或步骤，简单高效。 | 需要短期记忆的、连续性强的对话。 | 容易丢失早期的关键信息（&quot;长程遗忘&quot;）。 |
| &lt;strong&gt;检索增强生成（RAG）&lt;/strong&gt; | 将外部知识库（文档、数据库）向量化，根据当前意图检索最相关的片段注入上下文。 | 需要引用大量外部静态知识的任务。 | 检索的准确性、实时性，以及如何处理知识冲突。 |
| &lt;strong&gt;按需加载（On-demand Loading）&lt;/strong&gt; | 仅在需要时（如 Agent 提到某个特定实体）才从外部加载该实体的详细信息。 | 状态空间巨大但访问稀疏的场景。 | 需要精确的实体识别和依赖关系分析。 |
| &lt;strong&gt;分层记忆（Hierarchical Memory）&lt;/strong&gt; | 将记忆分为短期（当前对话）、中期（任务级摘要）、长期（向量化知识库）三层，按需组合注入。 | 需要兼顾短期上下文、中期目标和长期知识的复杂任务。 | 记忆的提取、融合策略，以及跨层一致性。 |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;工程决策：规约规则与注入边界&lt;/strong&gt; 上下文管理本质上是一系列**规约规则（Reduction Rules）**的集合。Harness 必须定义清晰的规则，来决定在 Token 预算紧张时，哪些信息应该被牺牲、哪些被保留。同时，**注入边界（Injection Boundary）**也至关重要，它定义了外部信息（如 RAG 结果）应在 Prompt 的哪个位置（前、中、后）注入，以达到最佳效果，避免出现&quot;大海捞针（Lost in the Middle）&quot;问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.2.2. Function Calling：从&quot;文本预测&quot;到&quot;物理执行&quot;&lt;/h4&gt;
&lt;p&gt;Function Calling（FC）是连接 LLM 规划与物理世界行动的桥梁。这个过程看似简单，实则包含了一个严密且脆弱的生命周期闭环：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Schema 序列化&lt;/strong&gt;：Harness 将可用的工具（函数）列表及其参数定义（JSON Schema）序列化为特定格式的文本，注入到 Prompt 中。这是 LLM 理解其&quot;能力边界&quot;的唯一途径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触发生成&lt;/strong&gt;：LLM 在其庞大的参数空间中进行&quot;模式匹配&quot;，当它认为某个工具能满足当前规划步骤时，会生成一段遵循特定语法的文本，其中包含工具名称和参数值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确定性反序列化&lt;/strong&gt;：Harness 捕获这段文本，并尝试将其反序列化为一个结构化的调用请求。&lt;strong&gt;这是最脆弱的环节&lt;/strong&gt;，因为 LLM 的生成可能不完全符合语法（如 JSON 格式错误、参数类型错误）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;观测注入&lt;/strong&gt;：Harness 执行该调用，并将执行结果（成功或失败）封装成一段&quot;观测&quot;文本，再次注入 Prompt，完成闭环。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;失败面与降级路径&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于 LLM 生成的非确定性，Function Calling 的每一步都可能失败。稳健的 Harness 必须为这些失败设计降级路径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;反序列化失败&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重试&lt;/strong&gt;：向 LLM 提供错误信息（如 &quot;Invalid JSON format&quot;），并要求其重新生成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回退到文本&lt;/strong&gt;：放弃 FC，转而要求 LLM 生成自然语言指令，由更传统的解析器处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行失败&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;交互式补充&lt;/strong&gt;：若因参数缺失导致失败，可向用户请求补充信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反思与重规划&lt;/strong&gt;：将详细的错误信息注入上下文，引导 Agent 在下一轮反思失败原因并选择其他路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;核心架构决策：状态分离原则&lt;/strong&gt; 必须将 LLM 严格视为一个&lt;strong&gt;无状态的计算单元（CPU）&lt;/strong&gt;，而将所有需要跨轮次保持一致性的状态（如用户会话、任务进度）存储在 **Harness 控制的外部上下文状态管理器或其他持久化引擎（内存/硬盘）**中。&lt;strong&gt;反模式&lt;/strong&gt;：试图通过 Prompt Engineering 让 LLM 在长对话中自行维护复杂状态，这会导致系统行为混乱、不可预测且难以调试。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.3. 核心约束与设计原则&lt;/h3&gt;
&lt;p&gt;在构建 Harness 时，我们必须直面三大核心约束，并以六大设计原则作为应对之道。&lt;/p&gt;
&lt;h4&gt;三大核心约束&lt;/h4&gt;
&lt;p&gt;| &lt;strong&gt;约束类别&lt;/strong&gt; | &lt;strong&gt;描述与工程影响&lt;/strong&gt; |
|-|-|
| &lt;strong&gt;模型能力的不完备性（Model Imperfection）&lt;/strong&gt; | 现象：幻觉、上下文丢失、推理不稳定。工程影响：系统不能盲目信任模型的输出，必须建立事实校验、状态维持和行为纠偏机制。 |
| &lt;strong&gt;上下文窗口的物理限制（Context Window Limitation）&lt;/strong&gt; | 原因：Transformer 的 O(n²) 复杂度、注意力稀释。工程影响：系统必须实现高效的上下文管理策略，主动&quot;构建&quot;而非被动&quot;填充&quot;上下文，将有限的 Token 预算分配给最高价值的信息。 |
| &lt;strong&gt;开放环境的不可预测性（Environment Unpredictability）&lt;/strong&gt; | 现象：外部工具失效、外部资源状态变更、用户中途干预。工程影响：系统必须具备强大的异常处理、重试、回滚和动态重规划能力，以适应环境的不确定性。 |&lt;/p&gt;
&lt;h4&gt;六大设计原则&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;💡&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;为失败而设计（Design for Failure）&lt;/strong&gt;：将异常和失败视为系统运行的常态，而非个例。所有组件和服务都应具备容错、重试和优雅降级的能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;契约优先（Contract-First）&lt;/strong&gt;：所有系统内外的交互都必须由明确的、机器可读的契约（Schema， API， Event）来定义，这是实现模块化、可测试性和系统演进的基石。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认安全（Secure by Default）&lt;/strong&gt;：安全不是事后添加的功能，而是系统设计的出发点。遵循最小权限、零信任和纵深防御原则。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决策与执行分离（Separation of Concerns: Decision vs. Execution）&lt;/strong&gt;：将&quot;决定做什么&quot;（规划）与&quot;如何做&quot;（执行）在逻辑和物理上解耦，提升系统的灵活性和可扩展性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;万物皆可度量（Everything is Measurable）&lt;/strong&gt;：系统的每一个行为、每一次决策、每一次资源消耗都应该是可度量的。没有度量，就没有分析和优化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据驱动进化（Data-driven Evolution）&lt;/strong&gt;：将 Agent 的每一次运行都视为一次学习机会。建立从数据采集、标注、回流到模型/知识更新的闭环，是实现系统长期智能增长的唯一路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.4. 关键工程位点&lt;/h3&gt;
&lt;p&gt;为了实现上述 REPL 闭环并落地设计原则，Harness 需要在架构中部署一系列关键组件（或称&quot;工程位点&quot;）。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;工程位点&lt;/strong&gt; | &lt;strong&gt;核心职责&lt;/strong&gt; | &lt;strong&gt;PPAF 环节&lt;/strong&gt; | &lt;strong&gt;设计要点&lt;/strong&gt; |
|-|-|-|-|
| &lt;strong&gt;工具网关（Tool Gateway）&lt;/strong&gt; | 统一管理工具的注册、发现、Schema 提供和权限校验。 | 规划（P） | 动态注册与发现、基于角色的访问控制（RBAC）、Schema 自动序列化与版本管理 |
| &lt;strong&gt;调用拦截器（Call Interceptor）&lt;/strong&gt; | 在工具执行前后注入通用逻辑，如日志、度量、超时、资源配额。 | 行动（A） | AOP（面向切面编程）设计、可插拔的策略模块（超时、重试、熔断） |
| &lt;strong&gt;反馈汇编器（Feedback Assembler）&lt;/strong&gt; | 将工具执行的裸结果（如 Python 异常）转换为 LLM 可理解的、结构化的观测信息。 | 反思（F） | 统一的反馈 Schema、堆栈跟踪信息裁剪与摘要、错误码与人类可读信息的映射 |
| &lt;strong&gt;上下文状态管理器（Context State Manager）&lt;/strong&gt; | 管理上下文的 Token 预算，决定哪些信息被保留、移除或归档。 | 感知（P）/ 记忆 | 滑动窗口、摘要、RAG 等策略、基于信息价值的优先级排序、短、中、长期记忆的分层存储 |
| &lt;strong&gt;异常处理器（Exception Handler）&lt;/strong&gt; | 对系统中的异常进行分类，指导重试和恢复策略。 | 行动（A）/ 反思（F） | 清晰的异常继承体系、错误码与恢复策略的映射表、可配置的重试与熔断逻辑 |&lt;/p&gt;
&lt;p&gt;Harness Engineering 本身只是大模型工程的工程手段的总称不管是 AI SDK、Agent 实现、还是应用方的 skill 以及各种插件，本身就是尝试约束模型不在同一个问题反复摔跤，随着模型能力的逐渐提升和相关工程化的演进，各种 Harness 也在被不断内化或不断更替，讲明白了 Harness 是如何设计的，我们来聊聊具体是如何实现的。&lt;/p&gt;
&lt;h2&gt;五、Harness Engineering 是如何实现的&lt;/h2&gt;
&lt;p&gt;上文更多站在&quot;概念 + 框架&quot;的层面理解 Harness Engineering。对于负责落地平台和基础设施的工程同学，还可以把 Harness 进一步视作一个完整的运行系统，从&lt;strong&gt;架构分层、关键机制、运行治理和度量演进&lt;/strong&gt;四个角度来审视。&lt;/p&gt;
&lt;h3&gt;5.1 系统架构总览：控制平面与数据平面&lt;/h3&gt;
&lt;p&gt;一个成熟的 Harness 通常会拆分为 &lt;strong&gt;控制平面（Control Plane）&lt;/strong&gt; 与 &lt;strong&gt;数据平面（Data Plane）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;控制平面&lt;/strong&gt;负责&quot;决定做什么&quot;：任务调度、资源配额、行为规划、策略与权限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据平面&lt;/strong&gt;负责&quot;如何去做&quot;：实际的 Agent 运行实例、状态存储、记忆存储和沙盒执行环境。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在此之上，可以进一步抽象出四个功能层级：&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;层级&lt;/strong&gt; | &lt;strong&gt;控制平面视角&lt;/strong&gt; | &lt;strong&gt;数据平面视角&lt;/strong&gt; |
|-|-|-|
| &lt;strong&gt;L1 呈现与集成层&lt;/strong&gt; | API 网关、事件总线，用统一入口对外暴露 Agent 能力。 | 客户端 SDK、Webhook 等集成方式，嵌入到具体业务产品中。 |
| &lt;strong&gt;L2 任务与状态管理层&lt;/strong&gt; | 任务调度器、工作流引擎，负责触发与编排长周期任务。 | 状态存储（State Storage），持久化任务上下文和检查点。 |
| &lt;strong&gt;L3 Agent 核心引擎层&lt;/strong&gt; | 行为规划器（Behavior Planner）、上下文策略器（Context Strategist）。 | Agent Runtime 进程，以及短期/长期记忆存储。 |
| &lt;strong&gt;L4 执行与治理层&lt;/strong&gt; | 策略引擎、资源管理器，负责安全与成本控制。 | 沙盒执行框架、工具库（Tool Library）。 |&lt;/p&gt;
&lt;p&gt;在具体落地时，你可以把 Harness 看成是对现有 AI 环境的一层&quot;智能胶水&quot;：上接模型 API Gateway，下接沙盒和各类服务，以工程的方式串联各个基建。&lt;/p&gt;
&lt;h3&gt;5.2 核心运行机制：循环、记忆与 Token 转化&lt;/h3&gt;
&lt;h4&gt;5.2.1 Agent 核心循环&lt;/h4&gt;
&lt;p&gt;原始材料中将 Agent 的行为抽象为一个持续的&quot;观察 → 思考 → 行动&quot;循环：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;观察（Observe）&lt;/strong&gt;：感知当前世界状态，包括用户输入、工具结果、历史对话、任务进度等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;思考（Think）&lt;/strong&gt;：基于观察信息，由规划器更新目标、拆解任务、选择下一步行动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行动（Act）&lt;/strong&gt;：执行内部操作（更新记忆、结束任务）或外部操作（调用工具、发出回复），行动结果反过来进入下一轮观察。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;工程提醒：核心循环不是一个简单的 &lt;code&gt;while (true)&lt;/code&gt;。&lt;/strong&gt; 在生产环境中，它通常需要与工作流引擎或状态机框架集成，支持暂停/恢复、幂等重试、并发事件处理以及长周期任务管理，因此也就衍生出了很多工程化手段解决上下文焦虑的问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5.2.2 记忆分层与 Token 转化&lt;/h4&gt;
&lt;p&gt;为了在有限的上下文窗口内承载尽可能多的有效信息，多数 Agent 通过各种外挂 memory 的方式进行实现。&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;记忆层级&lt;/strong&gt; | &lt;strong&gt;典型载体&lt;/strong&gt; | &lt;strong&gt;特点与治理要点&lt;/strong&gt; |
|-|-|-|
| &lt;strong&gt;L1 感官记忆（上下文窗口）&lt;/strong&gt; | Prompt / In-Context 信息 | 容量小但成本高、访问最快；需要通过规约规则精打细算 Token 预算，只保留当前决策最关键的信息。 |
| &lt;strong&gt;L2 短期/工作记忆&lt;/strong&gt; | Redis、KV 存储、会话数据库 | 保存当前任务的中间状态和交互历史，使用 TTL/会话粒度治理容量。 |
| &lt;strong&gt;L3 长期记忆&lt;/strong&gt; | 向量库、知识图谱、对象存储 | 容量大、成本低，用于沉淀长期知识和复用经验，通常通过 RAG 等方式按需检索。 |&lt;/p&gt;
&lt;p&gt;在三层记忆之上，Harness 还需要一条 &lt;strong&gt;Token 转化流水线（Token Transformation Pipeline）&lt;/strong&gt;，在每轮调用前，把多源信息规约成一个可控的 Prompt：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;信息源收集&lt;/strong&gt;：聚合用户问题、短期记忆、长期知识检索结果等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相关性排序&lt;/strong&gt;：基于时间、语义相似度等指标，对候选信息打分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;压缩与摘要&lt;/strong&gt;：对冗长低密度内容做摘要或结构化提炼。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预算分配&lt;/strong&gt;：按照预设 Token 预算，为不同信息类别分配额度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板组装&lt;/strong&gt;：使用结构化模板（例如显式标注 &lt;code&gt;[user_request]&lt;/code&gt;、&lt;code&gt;[tool_output]&lt;/code&gt; 等）拼装最终 Prompt。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;关键思想：把注意力管理变成一个外部工程问题。&lt;/strong&gt; 与其指望模型&quot;&lt;strong&gt;自己想清楚该关注什么&lt;/strong&gt;&quot;，不如通过 Token 转化机制主动构建上下文，把&lt;strong&gt;有限的窗口留给真正重要的信息。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5.3 规划模式与执行策略&lt;/h3&gt;
&lt;p&gt;在&quot;行为规划器&quot;这一层，通常实践中根据复杂程度包含以下几种：&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;规划模式&lt;/strong&gt; | &lt;strong&gt;核心机制&lt;/strong&gt; | &lt;strong&gt;主要优缺点&lt;/strong&gt; | &lt;strong&gt;典型场景&lt;/strong&gt; |
|-|-|-|-|
| &lt;strong&gt;ReAct&lt;/strong&gt; | 在单个 Prompt 中交替生成&quot;思考 + 行动&quot;。 | 实现简单，但容易迷路或陷入循环，缺乏长期规划能力。 | 一次性任务、简单工具调用。 |
| &lt;strong&gt;Plan-and-Execute&lt;/strong&gt; | 先生成结构化计划，再由确定性引擎顺序执行。 | 结构清晰、可审计，但对环境变化不敏感，需要配合重规划机制。 | 结构化工作流，如定时报表、数据流水线。 |
| &lt;strong&gt;分层规划（Hierarchical Planning）&lt;/strong&gt; | 引入&quot;元规划器&quot;拆解顶层目标，底层 Agent 各自完成子任务。 | 适合极复杂任务，但实现与运维成本高，对边界设计要求高。 | 全栈应用开发、自动化科研等大型项目。 |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;实践建议：默认用 Plan-and-Execute，按需叠加重规划与多 Agent。&lt;/strong&gt; 对大多数企业级场景，用结构化计划配合&quot;异常触发重规划&quot;已经足够稳健；只有在特别开放、长期的任务中，才需要引入多层规划与多 Agent 协作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;5.4 运行与治理：沙盒、安全与成本&lt;/h3&gt;
&lt;h4&gt;5.4.1 沙盒执行框架&lt;/h4&gt;
&lt;p&gt;为了让 Agent 可以&quot;动手做事&quot;而不破坏系统，因此需要给 Agent 一个安全的环境让他独立运行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 1 进程级隔离&lt;/strong&gt;：使用 &lt;code&gt;chroot&lt;/code&gt; / Linux namespaces / &lt;code&gt;seccomp-bpf&lt;/code&gt; 限制系统调用，启动快但仍共享内核，适用于可信内部工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2 容器级隔离&lt;/strong&gt;：Docker / containerd 等，生态成熟，是大多数工具执行的默认选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3 轻量级虚拟机&lt;/strong&gt;：如 Firecracker 等提供独立虚拟内核，适合多租户或执行不可信代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 4 完整虚拟机&lt;/strong&gt;：KVM / QEMU，安全性最高但成本最大，只在极少数特殊任务中使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;推荐策略&lt;/strong&gt;：默认采用容器级隔离（Level 2），配合严格的系统安全内核与只读根文件系统；对不可信代码或高敏感数据，引入轻量级虚拟机（Level 3）作为加强版沙盒。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;5.4.2 资源管理与弹性策略&lt;/h4&gt;
&lt;p&gt;在资源与成本控制方面，原始材料强调了几类关键机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预算与配额&lt;/strong&gt;：为 Token、外部 API 调用次数、CPU 时间分别设置配额，并支持按&quot;平台 / 租户 / Agent / 单任务&quot;多层级配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超时控制&lt;/strong&gt;：所有网络请求和工具执行都必须设置合理超时时间，&lt;strong&gt;避免因下游卡死拖垮整个 Agent&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重试策略&lt;/strong&gt;：对可恢复的临时错误使用带退避的重试，对明显的永久性错误快速失败并上报。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;熔断机制&lt;/strong&gt;：当某个依赖连续失败时暂时熔断，防止出现级联故障。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优雅降级&lt;/strong&gt;：关键能力不可用时，自动降级为&quot;弱但安全&quot;的模式，例如从&quot;可执行代码&quot;退回到&quot;只读 + 建议&quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5.4.3 安全与合规：策略门控&lt;/h4&gt;
&lt;p&gt;除了沙盒本身，Harness 还需要一个位于&quot;规划器 → 执行层&quot;之间的 &lt;strong&gt;策略门控（Policy Gateway）&lt;/strong&gt;，负责在每一次行动前做最后的安全与合规检查，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;权限检查&lt;/strong&gt;：基于 RBAC/ABAC 判定某个 Agent 是否有权访问目标资源或执行敏感操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;敏感数据过滤&lt;/strong&gt;：对参数和返回结果做 PII/密钥检测与脱敏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;指令注入防御&lt;/strong&gt;：识别潜在恶意的 Prompt/命令拼接，禁止危险模式进入执行层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;审计日志&lt;/strong&gt;：记录每一次&quot;谁在何时尝试做什么、结果如何&quot;，便于事后追溯和合规审计。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.5 度量与演进：让 Harness 在数据中成长&lt;/h3&gt;
&lt;p&gt;最后，有效合理的评测用来衡量 Agent 系统是否&quot;跑在正确的轨道上&quot;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;任务效能（Task Effectiveness）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;任务成功率（Task Success Rate）&lt;/li&gt;
&lt;li&gt;指令遵循度（Instruction Following Rate）&lt;/li&gt;
&lt;li&gt;工具使用有效性（Tool Use Effectiveness）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务质量（Quality of Service）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;端到端延迟（End-to-End Latency）&lt;/li&gt;
&lt;li&gt;首次响应延迟（Time to First Action）&lt;/li&gt;
&lt;li&gt;错误率（Error Rate）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源效率（Resource Efficiency）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;平均 Token 消耗（Avg. Token Consumption）&lt;/li&gt;
&lt;li&gt;平均工具调用次数（Avg. Tool Calls）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全与合规（Security &amp;#x26; Compliance）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;策略拒绝率（Policy Denial Rate）&lt;/li&gt;
&lt;li&gt;安全事件数（Number of Security Incidents）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些指标不是为了&quot;凑一张大表&quot;，而是用来反向驱动 Harness 的演进：当你发现任务成功率上不去时，很可能需要回到规划器和上下文策略；当错误率和成本居高不下时，多半需要反查沙盒、资源配额和熔断策略是否设计合理。&lt;/p&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Harness Engineering 从来不是又一个需要顶礼膜拜的&quot;银弹&quot;，而是一套生于实践、归于实践的工程哲学。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🌳 &lt;strong&gt;当 AI 的代码生成能力一次次突破想象，当整个行业都在狂热地谈论&quot;颠覆&quot;与&quot;取代&quot;，这套方法论冷静地提醒我们：工程师的核心职责从未消失，而是完成了一次关键的升华：从代码的创作者，变成了创造过程的守护者。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;构建一套可靠的 Harness 系统，本质上是在软件世界的&quot;混沌&quot;与&quot;秩序&quot;之间寻找那个微妙的平衡点。我们从不奢望 AI 永远正确，正如我们从不指望人类永不犯错。真正的工程智慧，&lt;strong&gt;在于构建一个能够从错误中持续学习、在不确定性中稳健前行的系统。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这套&quot;缰绳&quot;的终极目的，从来不是束缚，而是为了更安全、更彻底地释放，或许不远的将来，模型会逐渐挣脱一层层基础束缚。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;https://bytedance.larkoffice.com/wiki/RqoswuhVji9ts4kF0LBc5c0rnqf&quot;&gt;万字长文｜一文弄懂 Harness Engineering&lt;/a&gt;
作者：咸鱼（TRAE 开发者用户）&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>如何让你的 Agent 更准确：MCP 工具设计技巧（上）</title><link>https://blog.arminos.cn/blog/mcp-tool-design-tips-part1</link><guid isPermaLink="true">https://blog.arminos.cn/blog/mcp-tool-design-tips-part1</guid><description>越来越多的开发者开始为 AI Agent 开发工具，但技术上实现完全正确的工具，Agent 却用不好。本文探讨 MCP 工具设计技巧，帮助 Agent 更准确地使用工具。</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考Trae的技术文章，学习应用MCP工具&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;越来越多的开发者开始为 AI Agent 开发工具，无论是通过 MCP（Model Context Protocol）、Skills 脚本、还是直接使用 OpenAI/Claude 的 function calling。但很快大家发现了一个令人困惑的现象：&lt;strong&gt;技术上实现完全正确的工具，Agent 却用不好。&lt;/strong&gt; 工具能跑通，schema 定义正确，API 调用成功，但是 Agent 总是选错工具，传错参数，或者在明明应该调用工具的时候却回复「我无法完成这个任务」。&lt;/p&gt;
&lt;h2&gt;问题出在哪里？&lt;/h2&gt;
&lt;p&gt;问题在于：&lt;strong&gt;我们用写 API 的思维在写 Agent 工具。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你为人类设计 API 时，你可以假设他们会阅读文档、理解上下文、在出错后调试代码，但 Agent 不一样：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它只能通过工具的名称、描述和参数 schema 来「理解」这个工具能做什么&lt;/li&gt;
&lt;li&gt;它「试错」的代价很高，每次调用都消耗 token，都可能影响用户体验&lt;/li&gt;
&lt;li&gt;它需要在可能几十上百个工具中，瞬间做出选择&lt;/li&gt;
&lt;li&gt;它有一定的试错能力，但是成本高且不稳定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着，给 Agent 开发工具的真正挑战&lt;strong&gt;不是技术实现，而是设计出 Agent 能用好的工具接口&lt;/strong&gt;，这也是我们在开发 TRAE 过程中一直在思考和解决的一个问题。&lt;/p&gt;
&lt;h2&gt;核心理念：Agent 工具是 Agent 的用户界面&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这里有一个关键的思维转换：Agent 工具是 AI Agent 的用户界面（User Interface），不是已有 REST API 的封装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;传统 REST API 是为人类开发者设计的，我们假设开发者会阅读文档、理解上下文、在出错后调试代码，但 Agent 是完全不同的「用户」，它不会主动查阅文档，不擅长从上下文中推断隐含信息，每次调用都需要从头开始理解工具的用途。&lt;/p&gt;
&lt;p&gt;换句话说：&lt;strong&gt;你不是在写 API，你是在教会一个智能体如何与这个世界交互。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个智能体（LLM）有着独特的长处与局限性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它&lt;strong&gt;擅长&lt;/strong&gt;理解自然语言、推理意图、组合信息&lt;/li&gt;
&lt;li&gt;它&lt;strong&gt;不擅长&lt;/strong&gt;精确计算、记住长上下文、从模糊描述中猜测正确参数&lt;/li&gt;
&lt;li&gt;它&lt;strong&gt;看不到&lt;/strong&gt;你的代码实现，只能看到你暴露的 schema 和描述&lt;/li&gt;
&lt;li&gt;它&lt;strong&gt;只具备&lt;/strong&gt;有限的上下文，并且随着上下文被打满工具调用性能会明显下降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只有理解这个智能体的特性，你才能设计出它真正能用好的工具。本文将以 MCP 为主要切入点，因为它正在成为 Agent 工具开发的主流方式，但文中的设计原则适用于所有 Agent 工具开发场景。&lt;/p&gt;
&lt;h2&gt;LLM Tool Calling：完整的调用链路&lt;/h2&gt;
&lt;p&gt;要设计好 Agent 工具，首先需要理解它是如何被 Agent 调用的，这条调用链路决定了你的设计将如何被「消费」。&lt;/p&gt;
&lt;h3&gt;LLM 原生的 Tool Calling 机制&lt;/h3&gt;
&lt;p&gt;让我们从最底层开始：LLM 本身是如何调用工具的？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个关键的认知：LLM 本身不会「执行」任何函数。&lt;/strong&gt; 它只做一件事：生成文本，所谓的「function calling」或「tool calling」本质上是 LLM 与应用程序之间的一个多轮对话协议：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;┌─────────────┐                              ┌─────────────┐
│             │  ① 发送请求 + 工具定义         │             │
│             │ ─────────────────────────────▶│             │
│             │                              │             │
│             │  ③ 返回「工具调用请求」         │             │
│   应用程序   │ ◀─────────────────────────────│     LLM     │
│             │                              │             │
│             │  ⑤ 返回工具执行结果            │             │
│             │ ─────────────────────────────▶│             │
│             │                              │             │
│             │  ⑥ 生成最终回复（或继续调用）    │             │
│             │ ◀─────────────────────────────│             │
└──────┬──────┘                              └─────────────┘
       │
       │ ④ 执行实际的函数调用
       ▼
┌─────────────┐
│  外部工具    │
│ (API/DB/..) │
└─────────────┘

② LLM 分析用户请求，决定是否需要调用工具
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;第一步：定义工具&lt;/h4&gt;
&lt;p&gt;以 OpenAI API 为例，工具通过 &lt;code&gt;tools&lt;/code&gt; 参数传递给模型。每个工具定义包含三个核心部分：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;tools = [
    {
        &quot;type&quot;: &quot;function&quot;,
        &quot;name&quot;: &quot;get_weather&quot;,                    # 工具名称
        &quot;description&quot;: &quot;获取指定城市的当前天气&quot;,    # 工具描述 - LLM 理解工具用途的关键
        &quot;parameters&quot;: {                           # 参数的 JSON Schema
            &quot;type&quot;: &quot;object&quot;,
            &quot;properties&quot;: {
                &quot;location&quot;: {
                    &quot;type&quot;: &quot;string&quot;,
                    &quot;description&quot;: &quot;城市名称，如：深圳、北京&quot;
                },
                &quot;unit&quot;: {
                    &quot;type&quot;: &quot;string&quot;,
                    &quot;enum&quot;: [&quot;celsius&quot;, &quot;fahrenheit&quot;],
                    &quot;description&quot;: &quot;温度单位&quot;
                }
            },
            &quot;required&quot;: [&quot;location&quot;]
        }
    }]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这三个部分：&lt;code&gt;name&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt;、&lt;code&gt;parameters&lt;/code&gt;，就是 LLM「看到」的工具的全部信息。它看不到你的代码实现，不知道函数内部做了什么。&lt;/p&gt;
&lt;h4&gt;第二步：LLM 决策与返回工具调用&lt;/h4&gt;
&lt;p&gt;当用户说「深圳今天天气怎么样？」时，LLM 会分析这个请求，发现需要调用 &lt;code&gt;get_weather&lt;/code&gt; 工具。但它不会执行任何代码，而是返回一个结构化的「工具调用请求」：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;id&quot;: &quot;fc_12345xyz&quot;,
  &quot;type&quot;: &quot;function_call&quot;,
  &quot;name&quot;: &quot;get_weather&quot;,
  &quot;arguments&quot;: &quot;{\&quot;location\&quot;: \&quot;深圳\&quot;, \&quot;unit\&quot;: \&quot;celsius\&quot;}&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意 &lt;code&gt;arguments&lt;/code&gt; 是一个 JSON 字符串，LLM 本质上只是在「生成文本」，只不过这段文本遵循了特定的结构化格式，存在返回非法 JSON 格式的可能。&lt;/p&gt;
&lt;h4&gt;第三步：应用程序执行函数&lt;/h4&gt;
&lt;p&gt;应用程序解析 LLM 返回的工具调用请求，执行实际的函数，这里以 Python 代码进行示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import json

# 解析 LLM 返回的工具调用
tool_call = response.output[0]  # 获取第一个工具调用
args = json.loads(tool_call.arguments)

# 执行实际的函数（这是你的代码，不是 LLM 执行的）
weather_result = get_weather(args[&quot;location&quot;], args.get(&quot;unit&quot;, &quot;celsius&quot;))

# 返回: {&quot;temperature&quot;: 14, &quot;condition&quot;: &quot;晴&quot;, &quot;humidity&quot;: 65}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;第四步：将结果返回给 LLM&lt;/h4&gt;
&lt;p&gt;执行结果需要通过 &lt;code&gt;function_call_output&lt;/code&gt; 类型的消息返回给 LLM：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 将工具执行结果添加到对话中
input_messages.append({
    &quot;type&quot;: &quot;function_call_output&quot;,
    &quot;call_id&quot;: tool_call.call_id,  # 关联到具体的工具调用
    &quot;output&quot;: json.dumps(weather_result)
})

# 再次调用 LLM，让它基于结果生成最终回复
final_response = client.responses.create(
    model=&quot;gpt-4&quot;,
    tools=tools,
    input=input_messages
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;第五步：LLM 生成最终回复&lt;/h4&gt;
&lt;p&gt;LLM 收到工具执行结果后，会生成用户可读的最终回复：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;深圳今天天气晴朗，当前气温 14°C，湿度 65%。&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;工具定义如何被 LLM「看到」？&lt;/h3&gt;
&lt;p&gt;这是一个容易被忽视但非常重要的细节，要理解工具设计的约束，我们需要从 LLM 实现的角度来看工具调用是如何工作的。&lt;/p&gt;
&lt;h4&gt;1. JSON 只是中间格式，不是 LLM 真正「看到」的东西&lt;/h4&gt;
&lt;p&gt;当你通过 API 传入 JSON 格式的工具定义时，LLM 提供商通常会将其转换为一种内部优化的格式。这是因为 JSON 对 LLM 来说并不是一个友好的格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;边界模糊&lt;/strong&gt;：JSON 使用 &lt;code&gt;{}&lt;/code&gt;、&lt;code&gt;[]&lt;/code&gt;、&lt;code&gt;&quot;&lt;/code&gt; 等通用符号标记结构，这些符号在普通文本中也会频繁出现，容易产生歧义&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严格的语法要求&lt;/strong&gt;：少一个逗号、多一个引号就会导致解析失败，而 LLM 生成文本时很容易犯这类错误&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符串转义的噩梦&lt;/strong&gt;：JSON 字符串中的引号需要转义为 &lt;code&gt;\&quot;&lt;/code&gt;，反斜杠需要转义为 &lt;code&gt;\\&lt;/code&gt;，换行需要转义为 &lt;code&gt;\n&lt;/code&gt;。当参数内容包含代码片段时（这在 coding agent 中极为常见），LLM 需要正确处理代码中的所有引号、反斜杠和换行符，这是一个极易出错的环节&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远距离依赖&lt;/strong&gt;：嵌套结构中，匹配的括号可能相隔很远，LLM 需要「记住」开始标记才能正确闭合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺乏显式结束标记&lt;/strong&gt;：JSON 只依赖括号匹配，没有像 &lt;code&gt;&amp;#x3C;/function&gt;&lt;/code&gt; 这样语义明确的结束信号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相比之下，许多 LLM 提供商内部使用类 XML 的格式来表示工具调用，相比 JSON 格式有以下优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;明确的边界&lt;/strong&gt;：开始标签和结束标签清晰地标记了工具调用的范围&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自描述性&lt;/strong&gt;：标签名本身携带语义信息，比 JSON 的键值对更不容易与内容混淆&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练数据丰富&lt;/strong&gt;：LLM 在预训练时见过大量 HTML/XML 文档，对这种格式更「熟悉」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容错性更好&lt;/strong&gt;：即使内容中包含类似符号，也不容易与结构标记产生冲突&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际上，不同提供商采用了不同的内部格式和特殊 token。这些格式在模型训练时就被专门优化过，使模型能够更准确地识别「何时应该调用工具」以及「如何正确构造调用参数」。&lt;/p&gt;
&lt;p&gt;一些 LLM 提供商（如 OpenAI 的 Strict Mode）使用了 &lt;strong&gt;Constrained Decoding&lt;/strong&gt; 技术来保证输出一定是合法的 JSON 结构。这种技术在解码时动态限制下一个 token 的候选集，确保生成的序列符合预定义的 schema。但这种约束并非没有代价：它可能影响生成速度，在某些边界情况下也可能影响模型的表达能力。&lt;/p&gt;
&lt;h4&gt;2. 工具定义是 System Prompt 的一部分&lt;/h4&gt;
&lt;p&gt;工具定义会被注入到 LLM 的 system prompt 中，占用宝贵的 context window。这带来两个重要影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;上下文占用&lt;/strong&gt;：工具定义占用的 token 越多，留给实际对话内容的空间就越少&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Caching&lt;/strong&gt;：现代 LLM API 通常会缓存 system prompt 的 KV cache 来加速推理。如果你动态修改工具列表，就会导致缓存失效，显著增加延迟和成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. 为什么要用原生的 Function Calling？&lt;/h4&gt;
&lt;p&gt;LLM 在训练过程中已经对原生的工具调用格式进行了专门的优化。使用原生格式，模型更容易准确识别何时应该调用工具、正确选择要调用的工具、生成符合 schema 的参数。这也是为什么主流 Agent 框架都直接使用各 LLM 提供商原生的 function calling 机制。&lt;/p&gt;
&lt;h4&gt;4. 工具数量对模型效果的影响&lt;/h4&gt;
&lt;p&gt;| 工具数量 | Token 消耗 |
|---------|-----------|
| 10 个工具 | 2,500-3,000 tokens |
| 20 个工具 | 5,000-6,000 tokens |
| 50 个工具 | 12,500-15,000 tokens |
| 100 个工具 | 25,000-30,000 tokens |&lt;/p&gt;
&lt;p&gt;当工具数量增加到几十甚至上百个时，模型会面临选择困难、注意力稀释、Prompt 拥挤等问题。&lt;strong&gt;OpenAI 官方建议&lt;/strong&gt;：尽量将工具数量控制在 &lt;strong&gt;20 个以内&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;MCP 的定位：标准化的工具协议层&lt;/h2&gt;
&lt;p&gt;MCP（Model Context Protocol）并没有改变 tool calling 机制，它解决的是另一个问题：&lt;strong&gt;如何标准化地定义和暴露工具&lt;/strong&gt;。在 MCP 出现之前，你需要为每个 LLM 单独适配工具 schema，这就是经典的 &lt;strong&gt;N×M 问题&lt;/strong&gt;。MCP 引入标准化中间层，MCP Server 只需按协议暴露工具，MCP Client 负责转换成各 LLM 能理解的格式。&lt;/p&gt;
&lt;h3&gt;MCP 工具的命名约定与潜在问题&lt;/h3&gt;
&lt;p&gt;MCP 工具通常添加前缀：&lt;code&gt;mcp_&amp;#x3C;server-name&gt;_&amp;#x3C;tool-name&gt;&lt;/code&gt;。这会带来：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;与自带工具的冲突或歧义&lt;/strong&gt;aa&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具名过长&lt;/strong&gt;（如 TRAE 有 60 字符限制）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具数量爆炸&lt;/strong&gt;（多个 MCP Server 可累计超过 20 个建议上限）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命名空间污染&lt;/strong&gt;（多个 search 工具描述相似）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema 兼容性问题&lt;/strong&gt;（不同 LLM 对 JSON Schema 支持差异大）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM 参数传递的不确定性&lt;/strong&gt;（类型错误、格式不符、必填字段缺失等）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;设计建议&lt;/strong&gt;：尽量使用简单、扁平的 schema 结构，做好防御性编程。&lt;/p&gt;
&lt;h2&gt;Agent 如何「看」工具？&lt;/h2&gt;
&lt;h3&gt;Agent 眼中的工具：三元组&lt;/h3&gt;
&lt;p&gt;每个工具就是一个简单的三元组：&lt;strong&gt;工具 = (名称, 描述, 参数 Schema)&lt;/strong&gt;。没有代码实现，没有注释，没有文档链接。&lt;/p&gt;
&lt;h3&gt;Agent 依赖显式语义，而非隐含上下文&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# ❌ 依赖隐含上下文
def get_user(id):
    &quot;&quot;&quot;获取用户信息&quot;&quot;&quot;
    pass

# ✅ 显式语义化
def get_user_by_uuid(user_uuid: str):
    &quot;&quot;&quot;
    根据 UUID 获取用户信息。
    参数：user_uuid: 用户的唯一标识符，格式为 &apos;usr_xxxxxxxx&apos;
    返回：用户信息的 JSON 对象，包含 name、email、created_at 等字段
    &quot;&quot;&quot;
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设计 Agent 工具的核心原则：&lt;strong&gt;防呆式语义化&lt;/strong&gt;，假设 Agent 会完全按字面意义理解你的工具，不会做任何「显然」的推断。&lt;/p&gt;
&lt;h3&gt;Agent 的「试错」成本&lt;/h3&gt;
&lt;p&gt;Agent 需要&lt;strong&gt;尽量一次做对&lt;/strong&gt;，因为成本高昂、用户体验差、上下文被污染、且没有跨会话记忆复用。&lt;/p&gt;
&lt;h3&gt;上下文窗口：稀缺的认知资源&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;工具数量要克制（1-5 个精心设计的工具 &gt; 20 个随意堆砌的工具）&lt;/li&gt;
&lt;li&gt;描述要精准而简洁&lt;/li&gt;
&lt;li&gt;参数要必要且充分&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;如何命名：让工具「自解释」&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动词优先&lt;/strong&gt;：&lt;code&gt;create_github_issue&lt;/code&gt;、&lt;code&gt;send_slack_message&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命名即分类&lt;/strong&gt;：使用一致前缀帮助 Agent 快速筛选&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长度适中&lt;/strong&gt;：保持工具名在 30-50 字符以内&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;描述的艺术：精准的契约&lt;/h2&gt;
&lt;p&gt;好的工具描述应回答四个问题：&lt;strong&gt;做什么？什么时候用？有什么限制？返回什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;参数描述善用示例、标注必填/可选、说明默认值和失败情况、引导工具选择顺序。&lt;/p&gt;
&lt;h2&gt;关键洞察&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;设计工具的本质，是在设计 Agent 的认知体验。好的工具设计，就是不断减少 Agent 的认知负担。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;https://mp.weixin.qq.com/s/1K5Wl4pN884Us2tWzVAx9w&quot;&gt;如何让你的 Agent 更准确：MCP 工具设计技巧（上）&lt;/a&gt;
作者：小夏，TRAE 技术专家&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>XianyuFlip手册</title><link>https://blog.arminos.cn/blog/xianyuflip%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97</link><guid isPermaLink="true">https://blog.arminos.cn/blog/xianyuflip%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97</guid><description>专为闲鱼平台打造的AI值守解决方案，实现闲鱼平台7×24小时自动化值守，支持多专家协同决策、智能议价和上下文感知对话。</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;🏕️ 专为闲鱼平台打造的AI值守解决方案，实现闲鱼平台7×24小时自动化值守，支持多专家协同决策、智能议价和上下文感知对话。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;实际效果展示&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;example.png&quot; alt=&quot;聊天记录&quot;&gt;&lt;/p&gt;
&lt;h2&gt;设置代理IP&lt;/h2&gt;
&lt;p&gt;电商类的平台一般都会有风控，需要避免跨区域登陆。所以建议使用前先接入一个IP代理。&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://www.kuaidaili.com/?ref=686h4aeuduls&quot;&gt;快代理 - 企业级HTTP代理IP云服务&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐使用快代理，购买自己常用地点的固定IP地址。&lt;/p&gt;
&lt;p&gt;比如我的设备都放在杭州
&lt;img src=&quot;image1.png&quot; alt=&quot;&quot;&gt;
购买完成后，进入我的独享代理，复制IP地址、端口、秘钥，填写到XianyuFlip后台
&lt;img src=&quot;image2.png&quot; alt=&quot;&quot;&gt;
点击检测，显示连接正常，即可使用
&lt;img src=&quot;image3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 如果触发了风控，需要在浏览器登录闲鱼，手动过滑块并填写新的Cookie。当前版本正常使用还是比较稳定的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;登陆闲鱼账号&lt;/h2&gt;
&lt;p&gt;账号管理中已经支持扫码登陆，建议直接采用扫码登陆即可。
&lt;img src=&quot;image4.png&quot; alt=&quot;&quot;&gt;
要开启自动回复，还需要绑定一个AI回复方案。请参考下一节设置&lt;/p&gt;
&lt;h2&gt;设置AI回复&lt;/h2&gt;
&lt;h3&gt;大模型设置&lt;/h3&gt;
&lt;p&gt;推荐使用小米MIMO、DEEPSEEK，便宜效果好。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔗 &lt;a href=&quot;https://platform.xiaomimimo.com?ref=NBX3JZ&quot;&gt;小米MIMO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔗 &lt;a href=&quot;https://platform.deepseek.com/usage&quot;&gt;DeepSeek Platform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完成模型的充值购买后，在大模型后台创建一个APIkey
&lt;img src=&quot;image5.png&quot; alt=&quot;&quot;&gt;
填写基础URL和APIkey到XianyuFlip后台
&lt;img src=&quot;image6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deepseek：https://api.deepseek.com
XiaomiMIMO：https://api.xiaomimimo.com/v1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;填写后点击获取模型列表即可获取该服务商的全部模型，选取合适的使用即可。&lt;/p&gt;
&lt;h3&gt;帖子主导/知识库主导&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;帖子主导：&lt;/strong&gt; 大模型会基于商品帖子中的内容以及标价和用户沟通；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;知识库主导：&lt;/strong&gt; 根据用户发送的消息（以及图片）中的型号等关键词，先匹配知识库中的商品，以知识库中的信息为准。&lt;/p&gt;
&lt;p&gt;常规业务，帖子可以覆盖产品信息和报价，设置帖子主导即可；复杂实物交易，如充电机等，可以采用知识库主导。&lt;/p&gt;
&lt;h3&gt;AI回复逻辑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;意图分类提示词&lt;/strong&gt;：判断用户当前的对话意图，分配给以下专家进行具体对话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;价格专家提示词&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术专家提示词&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认回复提示词&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提示词均可根据需求自行修改，优质提示词可以参考下方 &lt;a href=&quot;#%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%8F%82%E8%80%83&quot;&gt;提示词参考&lt;/a&gt; 章节。&lt;/p&gt;
&lt;h3&gt;响应图片消息&lt;/h3&gt;
&lt;p&gt;如果业务场景中用户经常通过图片来提供产品型号，可以打开 &lt;code&gt;支持图形识别&lt;/code&gt; 按钮&lt;/p&gt;
&lt;p&gt;（注意图片上需要带型号的文字，本质是文字识别）&lt;/p&gt;
&lt;h2&gt;产品知识库&lt;/h2&gt;
&lt;h3&gt;模版知识库&lt;/h3&gt;
&lt;p&gt;如果你的产品满足以下情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;报价逻辑比较复杂&lt;/li&gt;
&lt;li&gt;涉及多sku、多品相&lt;/li&gt;
&lt;li&gt;客户来咨询的时候，并不会按照帖子里面的内容来咨询&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议开启知识库功能，目前只支持&lt;strong&gt;飞书多维表格&lt;/strong&gt;作为知识库。
&lt;img src=&quot;image7.png&quot; alt=&quot;&quot;&gt;
目前已经提供三电知识库，可以直接使用&lt;a href=&quot;https://my.feishu.cn/base/XdhGbKR2baOoK0s86XucR9F8nDg?from=from_copylink&quot;&gt;新能源汽配知识库&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;名称：任意填写
BaseURL：https://my.feishu.cn/base/XdhGbKR2baOoK0s86XucR9F8nDg
APP ID：cli_aac0100744389bee
APP secret：eu0jPSscMpFgcpD6y9zs4nn7SJ00nLtr
产品表ID：tblzbTYAzbHfVjl2
SKU报价表ID：tblDxJxsTvZABY6L
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建自己的知识库&lt;/h3&gt;
&lt;p&gt;可以参考知识库案例来制作自己的知识库。&lt;/p&gt;
&lt;p&gt;在飞书开放平台创建应用，添加多维表格读写权限，然后复制APP ID和APP secret。
&lt;img src=&quot;image8.png&quot; alt=&quot;&quot;&gt;
根据模板创建自己的多维表格，然后复制BaseURL和两张表格的ID。
&lt;img src=&quot;image9.png&quot; alt=&quot;&quot;&gt;
在XianyuFlip后台填写，保存后即可生效。&lt;/p&gt;
&lt;h2&gt;消息通知&lt;/h2&gt;
&lt;p&gt;当发生异常情况，用户下单、退款的时候，都会通过飞书去进行消息提醒。&lt;/p&gt;
&lt;p&gt;两步即可实现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建一个飞书群聊并在里面添加一个机器人&lt;/li&gt;
&lt;li&gt;把机器人的webhook填写到XianyuFlip后台
&lt;img src=&quot;image10.png&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;image11.png&quot; alt=&quot;&quot;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;提示词参考&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;🏖️ 这里收集适合各行各业的提示词，欢迎大家贡献&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://my.feishu.cn/wiki/AOoDwKFSuiFRdyk5TvscEDj7nWe?from=from_copylink&quot;&gt;三电提示词&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/thumbnail.yPnFk1tL.png"/><enclosure url="/_astro/thumbnail.yPnFk1tL.png"/></item><item><title>Using MDX</title><link>https://blog.arminos.cn/blog/using-mdx</link><guid isPermaLink="true">https://blog.arminos.cn/blog/using-mdx</guid><description>Learning how to use MDX in Astro</description><pubDate>Sun, 01 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This theme comes with the &lt;a href=&quot;https://docs.astro.build/en/guides/integrations-guide/mdx/&quot;&gt;@astrojs/mdx&lt;/a&gt; integration installed and configured in your &lt;code&gt;astro.config.ts&lt;/code&gt; config file. If you prefer not to use MDX, you can disable support by removing the integration from your config file.&lt;/p&gt;
&lt;h2&gt;Why MDX?&lt;/h2&gt;
&lt;p&gt;MDX is a special flavor of Markdown that supports embedded JavaScript &amp;#x26; JSX syntax. This unlocks the ability to &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#mdx-features&quot;&gt;mix JavaScript and UI Components into your Markdown content&lt;/a&gt; for things like interactive charts or alerts.&lt;/p&gt;
&lt;p&gt;If you have existing content authored in MDX, this integration will hopefully make migrating to Astro a breeze.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;Here is how you import and use a UI component inside of MDX.&lt;br&gt;
When you open this page in the browser, you should see the clickable button below.&lt;/p&gt;
&lt;p&gt;import { Button } from &apos;astro-pure/user&apos;&lt;/p&gt;
&lt;p&gt;Click Me&lt;/p&gt;
&lt;h2&gt;More Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mdxjs.com/docs/what-is-mdx&quot;&gt;MDX Syntax Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-and-mdx-pages&quot;&gt;Astro Usage Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&quot;https://docs.astro.build/en/reference/directives-reference/#client-directives&quot;&gt;Client Directives&lt;/a&gt; are still required to create interactive components. Otherwise, all components in your MDX will render as static HTML (no JavaScript) by default.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Markdown 语法支持</title><link>https://blog.arminos.cn/blog/markdown-zh</link><guid isPermaLink="true">https://blog.arminos.cn/blog/markdown-zh</guid><description>Markdown 是一种轻量级的「标记语言」。</description><pubDate>Wed, 26 Jul 2023 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本语法&lt;/h2&gt;
&lt;p&gt;Markdown 是一种轻量级且易于使用的语法，用于为您的写作设计风格。&lt;/p&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;p&gt;文章内容较多时，可以用标题分段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 标题 1

## 标题 2

## 大标题

### 小标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;标题预览会打乱文章的结构，所以在此不展示。&lt;/p&gt;
&lt;h3&gt;粗斜体&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_斜体文本_

**粗体文本**

**_粗斜体文本_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜体文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗体文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜体文本&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;链接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;文字链接 [链接名称](http://链接网址)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;文字链接 &lt;a href=&quot;http://%E9%93%BE%E6%8E%A5%E7%BD%91%E5%9D%80&quot;&gt;链接名称&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;行内代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条 `单行代码`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条 &lt;code&gt;行内代码&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;代码块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前使用 shiki 作为代码高亮插件，支持的语言请参考 &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;shiki / languages&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;行内公式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;这是一条行内公式 $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;公式块&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;当前使用 KaTeX 作为数学公式插件，支持的语法请参考 &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;图片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gravatar.loli.net/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;删除线&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~删除线~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;~~删除线~~&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;普通无序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;列表里可以继续嵌套语法&lt;/p&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; 枪响，雷鸣，剑起。繁花血景。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;枪响，雷鸣，剑起。繁花血景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用里也可以继续嵌套语法。&lt;/p&gt;
&lt;h3&gt;换行&lt;/h3&gt;
&lt;p&gt;markdown 分段落是需要空一行的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;如果不空行
就会在一段

第一段

第二段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;如果不空行
就会在一段&lt;/p&gt;
&lt;p&gt;第一段&lt;/p&gt;
&lt;p&gt;第二段&lt;/p&gt;
&lt;h3&gt;分隔符&lt;/h3&gt;
&lt;p&gt;如果你有写分割线的习惯，可以新起一行输入三个减号&lt;code&gt;---&lt;/code&gt; 或者星号 &lt;code&gt;***&lt;/code&gt;。当前后都有段落时，请空出一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;高级技巧&lt;/h2&gt;
&lt;h3&gt;行内 HTML 元素&lt;/h3&gt;
&lt;p&gt;目前只支持部分段内 HTML 元素效果，包括 &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt; ，如&lt;/p&gt;
&lt;h4&gt;键位显示&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;使用 &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; 重启电脑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;使用 Ctrl + Alt + Del 重启电脑&lt;/p&gt;
&lt;h4&gt;粗斜体&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown 在此处同样适用，如 _加粗_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt; Markdown 在此处同样适用，如 &lt;em&gt;加粗&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;其他 HTML 写法&lt;/h3&gt;
&lt;h4&gt;折叠块&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;点击展开&amp;#x3C;/summary&gt;它被隐藏了&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;| 表头1 | 表头2 |
| ----- | ----- |
| 内容1 | 内容2 |&lt;/p&gt;
&lt;h3&gt;注释&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;在引用的地方使用 [^注释] 来添加注释。

然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。

[^注释]: 这里是注释的内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;在引用的地方使用 &lt;a href=&quot;%E8%BF%99%E9%87%8C%E6%98%AF%E6%B3%A8%E9%87%8A%E7%9A%84%E5%86%85%E5%AE%B9&quot;&gt;^注释&lt;/a&gt; 来添加注释。&lt;/p&gt;
&lt;p&gt;然后在文档的结尾，添加注释的内容（会默认于文章结尾渲染之）。&lt;/p&gt;
&lt;h3&gt;To-Do 列表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] 未完成的任务
- [x] 已完成的任务
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未完成的任务&lt;/li&gt;
&lt;li&gt;[x] 已完成的任务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;符号转义&lt;/h3&gt;
&lt;p&gt;如果你的描述中需要用到 markdown 的符号，比如 _ # * 等，但又不想它被转义，这时候可以在这些符号前加反斜杠，如 &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; 进行避免。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_不想这里的文本变斜体\_

\*\*不想这里的文本被加粗\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览：&lt;/p&gt;
&lt;p&gt;_不想这里的文本变斜体_&lt;/p&gt;
&lt;p&gt;**不想这里的文本被加粗**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;内嵌 Astro 组件&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item></channel></rss>