单人九个月20万行代码:Harness架构与Agent开发工程方法论
1. 先搞清楚这个项目到底在做什么一个人九个月20万行代码每个月消耗40亿以上的token最终交付的是一款基于Harness架构的应用。这组数字放在任何一个技术社区里都足够炸裂但真正值得拆解的不是这些数字本身而是数字背后那套工程方法论——一个人怎么在没有团队协作的情况下把代码量推到20万行这个级别同时还能保持架构不崩、逻辑不乱、迭代不停。先说清楚Harness架构是什么。这个词在Agent开发圈子里最近被反复提及但很多人对它的理解停留在“一个框架”或者“一个工具”的层面。实际上Harness的核心思想是把Agent的能力边界、工具调用、上下文管理、状态流转全部抽象成可编排的组件让开发者像搭积木一样去组装一个完整的智能体应用。它不绑定特定的大模型也不限制你用什么语言写业务逻辑重点在于它提供了一套标准化的“挂载”机制——你可以把Markdown文档、代码文件、数据库查询、API调用统统挂上去让Agent在需要的时候自己去取、自己去用。这个项目之所以选择Harness架构我推测核心原因有三个。第一单人开发的维护成本必须压到最低。20万行代码如果按照传统的MVC或者分层架构来写一个人根本维护不过来光是模块之间的依赖关系就能把人拖垮。Harness的组件化思路让每个功能模块可以独立开发、独立测试、独立替换改一个地方不会引发连锁反应。第二Agent应用天然需要动态编排。用户的输入千变万化Agent需要调用的工具也千变万化硬编码的流程根本应付不了Harness的编排层正好解决这个问题。第三token消耗量巨大意味着上下文管理必须极其精细。每个月40亿token平均下来每天超过1.3亿这个量级下如果上下文管理做得粗糙成本会失控而Harness提供的上下文抽象层可以让开发者精确控制每次调用携带多少信息、哪些信息优先保留、哪些信息可以丢弃。适合谁来参考这个项目如果你正在做Agent相关的开发不管是个人项目还是公司内部工具这个项目的架构思路都值得细看。如果你只是对AI应用感兴趣但还没动手写过代码那至少可以理解一件事一个人做出大规模应用不是靠堆时间而是靠选对架构、用对工具、把重复劳动自动化。2. 九个月20万行代码的工程逻辑拆解2.1 为什么代码量能冲到20万行很多人看到20万行这个数字的第一反应是“是不是注水了”。我一开始也这么想但仔细拆解一下Agent应用的实际构成这个数字其实很合理。一个完整的Harness架构应用至少包含以下几个层面的代码核心编排层负责解析用户意图、决定调用哪个工具、管理多轮对话的状态流转。这部分代码量不大但逻辑密度极高通常需要反复重构。工具适配层每一个外部工具比如Markdown解析器、文件读写、搜索接口、数据库连接都需要一个适配器把工具的原始接口转换成Harness能识别的标准格式。这个项目里如果挂载了几十个工具光适配器代码就能到几万行。上下文管理模块包括token计数、上下文窗口的动态裁剪、历史消息的摘要压缩、优先级排序等。这部分是Agent应用里最容易被低估的模块写起来非常琐碎。业务逻辑层具体到应用要解决的问题比如文档管理、知识库检索、自动化写作等每个业务场景都需要独立的处理逻辑。配置与元数据Harness架构强调可配置性每个组件的参数、每个工具的权限、每个流程的触发条件都需要用配置文件或元数据来描述。测试与调试工具一个人开发20万行代码如果没有配套的测试和调试工具根本不可能保证质量。这部分代码往往被忽略但实际上占了相当大的比例。把这几个层面加起来20万行并不夸张。关键在于这20万行不是一次性写完的而是在九个月里持续迭代、持续重构的结果。我自己的经验是Agent项目的代码量增长曲线不是线性的而是阶梯式的——每当你新增一个工具或者新增一个业务场景代码量就会跳一个台阶。2.2 单人开发的架构选型逻辑一个人开发最大的敌人不是技术难度而是复杂度失控。团队开发的时候不同的人负责不同的模块复杂度被分散了单人开发的时候所有复杂度都压在你一个人身上一旦架构没选好写到第三个月就会陷入“改一个bug引出三个新bug”的恶性循环。这个项目选择Harness架构本质上是在用组件化来对抗复杂度。每个组件有明确的输入输出边界组件之间通过标准化的接口通信不直接依赖对方的内部实现。这样做的好处是当你需要修改某个功能时只需要改对应的组件不用担心影响到其他部分。具体到实操层面我推测这个项目的组件划分大概是这样的组件类型职责典型代码量编排引擎解析意图、调度工具、管理状态1-2万行工具适配器封装外部工具的标准接口5-8万行上下文管理token计数、窗口裁剪、摘要压缩2-3万行业务逻辑具体场景的处理流程4-6万行配置系统组件参数、权限、触发条件1-2万行测试与调试单元测试、集成测试、日志3-5万行这个划分不是固定的但核心思路是让每个组件的职责尽可能单一。我试过把编排和业务逻辑混在一起写结果就是每次改业务逻辑都要动编排代码改到最后自己都不敢改了。2.3 每月40亿token背后的上下文管理策略40亿token是什么概念按照目前主流大模型的定价即使按最便宜的档位算每个月的成本也是六位数起步。这个量级下上下文管理不是“优化项”而是“生存项”。这个项目能做到每月40亿token的消耗量说明它在上下文管理上有一套非常精细的策略。我推测核心手段包括以下几个第一分层上下文。把上下文分成“系统级”“会话级”“轮次级”三层。系统级的提示词和工具描述只在会话开始时加载一次后续轮次不再重复携带会话级的历史消息按需加载不是每轮都全量带上轮次级只包含当前用户输入和必要的临时状态。这样可以把每轮调用的token量压到最低。第二动态摘要。当历史消息超过一定长度时不是简单截断而是用一个小模型或者规则引擎生成摘要把摘要作为历史信息的压缩表示。摘要的粒度可以控制比如每10轮生成一个摘要或者当token数超过阈值时触发摘要。第三工具描述的按需加载。Harness架构下可能挂载了几十个工具但每次调用不需要把所有工具的描述都带上。可以根据用户意图先做一轮粗筛只加载最相关的几个工具的描述。这个策略能省下大量token。第四缓存与复用。对于重复性高的调用比如同样的系统提示词、同样的工具描述可以用缓存机制避免重复计算。虽然大模型本身不提供缓存但在应用层可以做请求去重和结果复用。注意上下文管理策略需要根据具体模型的行为特点来调整。不同模型对上下文长度的敏感度不一样有的模型在上下文超过一定长度后性能会急剧下降有的则相对稳定。建议在项目早期就建立token消耗的监控体系按天、按周统计及时发现异常。3. 核心工具链的选型与配置实操3.1 Claude Code在项目中的角色定位Claude Code在这个项目里扮演的是代码生成与重构助手的角色。九个月20万行代码如果全靠手敲即使每天写1000行也写不完。Claude Code的价值在于它能理解项目上下文根据你的描述生成符合项目风格的代码并且在重构时能保持逻辑一致性。安装Claude Code的流程不复杂但有几个关键点需要注意。首先确保你的开发环境满足基本要求Node.js版本不能太低否则会出现依赖冲突。其次安装完成后需要配置API密钥这个密钥的权限要控制好不要用最高权限的密钥建议单独创建一个项目级别的密钥。配置完成后我建议先在一个小项目上试跑熟悉它的交互模式。Claude Code支持多种调用方式可以直接在终端里对话也可以集成到VS Code里。如果你习惯用VS Code装好插件后在设置里配置好路径和密钥就能用。实际使用中有几个技巧能显著提升效率提供足够的上下文在让Claude Code生成代码之前先把相关的文件内容、接口定义、数据结构贴给它。它看到的上下文越完整生成的代码越贴合项目实际。分步骤生成不要一次性让它生成几百行代码而是拆成小步骤每步生成几十行验证后再继续。这样即使出错也容易定位。利用它的重构能力当你需要修改某个模块的接口时可以让它帮你批量修改所有调用点比手动改快得多也不容易漏。3.2 Obsidian作为知识管理中枢的配置方法Obsidian在这个项目里承担的是知识库和文档管理的职责。Harness架构应用需要大量的文档支撑——工具说明、业务规则、用户手册、开发笔记这些内容如果散落在各个地方查找和维护都是灾难。Obsidian的本地Markdown存储和双向链接特性正好适合管理这种结构化的知识。Obsidian的下载和安装很直接官网下载对应平台的安装包即可。安装完成后第一件事是创建仓库Vault建议把仓库放在一个独立的目录下不要和代码仓库混在一起。然后配置几个核心插件Dataview用类SQL的语法查询笔记内容适合做项目台账、任务列表、进度追踪。Templater模板插件可以快速创建格式统一的笔记比如每次新建工具说明时自动填充标题、日期、标签等字段。Markdown表格转换虽然Obsidian原生支持Markdown表格但如果你需要把表格导出到Excel需要额外的转换工具。我试过几个方案比较稳的是先用Obsidian的导出功能生成HTML再用脚本转成Excel格式。关于如何将Zotero的笔记导入Obsidian这个流程我实际操作过。Zotero本身支持导出为Markdown格式但导出的文件结构可能不符合Obsidian的链接规范。我的做法是先用Zotero的导出功能生成Markdown文件然后用一个简单的Python脚本处理文件中的引用格式把Zotero的引用标记转换成Obsidian的双链格式。脚本不长核心逻辑就是正则替换但能省下大量手动调整的时间。Obsidian创建项目管理台账的实操步骤在仓库里新建一个文件夹命名为“项目管理”。用Templater创建一个模板文件包含项目名称、开始日期、当前阶段、待办事项、已完成事项等字段。每启动一个新项目就用模板生成一个新笔记填写基本信息。用Dataview写一个查询把所有项目笔记汇总到一个总览页面按状态分组显示。定期更新每个项目笔记的状态总览页面会自动刷新。这套流程看起来简单但坚持用下来项目管理的效率提升非常明显。我踩过的坑是初期没有统一模板每个项目笔记的格式都不一样导致Dataview查询写起来很麻烦。后来强制自己用模板问题就解决了。3.3 Markdown在Harness架构中的核心作用Markdown在这个项目里的地位被严重低估了。很多人觉得Markdown只是写文档用的但在Harness架构下Markdown实际上是Agent的输入输出格式。用户输入可以是MarkdownAgent的输出也可以是Markdown工具的描述、上下文的组织、状态的记录全都可以用Markdown来表达。Markdown换行和Markdown语法这两个热搜词反映了实际使用中的痛点。Markdown的换行规则在不同解析器下行为不一致有的把单个换行当成空格有的当成换行。在Agent应用里这个差异会导致输出格式混乱。我的做法是统一用两个空格加换行来表示强制换行并且在解析器配置里明确指定换行规则。Markdown表格转换Excel是另一个高频需求。Agent生成的表格数据如果直接给用户用户可能需要在Excel里进一步处理。我试过几种转换方案比较靠谱的是用Python的pandas库先把Markdown表格解析成DataFrame再导出为Excel。代码不复杂但要注意处理表格中的特殊字符和合并单元格的情况。Markdown数学公式插件和Markdown数学符号在技术类文档里很常用。Obsidian原生支持LaTeX语法但需要开启对应的设置。如果你在Agent应用里需要输出数学公式建议统一用LaTeX格式这样在Obsidian、Typora等编辑器里都能正常渲染。4. Agent开发中的并发与稳定性问题4.1 AI Agent怎么扛并发Agent应用的并发问题和传统的Web应用不一样。传统Web应用的并发瓶颈通常在数据库连接或者网络IOAgent应用的并发瓶颈在大模型API的调用频率和token配额。每个月40亿token的消耗量意味着平均每秒要处理几千个token的请求这个量级下如果并发控制没做好要么被API限流要么成本失控。我推测这个项目在并发控制上采取了以下策略第一请求队列与优先级调度。不是所有请求都同等重要用户的实时交互请求优先级最高后台的批量处理请求优先级最低。用一个队列来管理所有请求高优先级的先出队低优先级的排队等待。第二token预算控制。给每个请求分配一个token预算超过预算的请求要么被拒绝要么被降级处理比如用更短的上下文、更简单的模型。这样可以防止单个请求消耗过多资源影响其他请求。第三结果缓存与复用。对于相同或相似的请求如果之前已经处理过直接返回缓存结果不再调用大模型。这个策略在Agent应用里特别有效因为很多请求实际上是重复的或者高度相似的。第四异步处理与流式输出。对于耗时较长的请求不要阻塞等待而是异步处理处理完成后通知用户。如果用户需要实时看到输出可以用流式输出的方式边生成边返回提升用户体验。提示并发控制策略需要根据实际业务场景来调整。如果你的应用主要是实时交互那响应速度是第一位如果是后台批处理那吞吐量是第一位。两者对并发控制的要求完全不同。4.2 Harness failed to load plugins的排查思路“Harness failed to load plugins”这个报错在实际开发中出现频率很高原因也多种多样。我整理了一个排查清单按优先级从高到低排列排查项可能原因解决方法插件路径路径配置错误或路径不存在检查配置文件中的插件路径确保路径正确且插件文件存在插件依赖插件依赖的库未安装或版本不匹配查看插件文档安装所需依赖注意版本要求权限问题插件文件没有读取权限检查文件权限确保运行用户有读取和执行权限插件冲突多个插件之间有冲突逐个禁用插件定位冲突的插件对版本兼容插件版本与Harness版本不兼容查看插件和Harness的版本兼容性说明升级或降级到兼容版本配置格式插件配置文件格式错误用JSON或YAML校验工具检查配置文件格式我踩过最坑的一次是插件路径里包含了中文目录名导致加载失败。排查了半天才发现是编码问题。从那以后所有项目路径一律用英文避免不必要的麻烦。4.3 Codex无法发送消息与Agent沙盒更新问题“Codex无法发送消息”和“显示更新agent沙盒”这两个问题通常出现在Agent运行环境需要更新或者网络通信出现异常的时候。Codex作为代码执行环境如果无法发送消息首先检查网络连接是否正常然后检查Codex的版本是否过旧。有时候Codex的更新会改变消息发送的接口旧版本的调用方式可能不再被支持。Agent沙盒的更新问题通常和权限有关。沙盒环境为了安全考虑会限制某些操作如果Agent尝试执行被限制的操作就会触发沙盒更新提示。解决方法是检查Agent的操作是否超出了沙盒的权限范围如果是要么调整沙盒配置放宽权限要么修改Agent的行为避免触发限制。我个人的经验是沙盒配置不要一开始就放得太宽而是从最严格的配置开始遇到权限不足再逐步放宽。这样能避免Agent意外执行危险操作。5. 从DeepSeek Harness到通用Agent框架的思考5.1 DeepSeek Harness的安装与配置要点DeepSeek Harness是最近热度很高的一个Agent开发框架它的核心优势是对DeepSeek系列模型的深度适配同时保持了Harness架构的通用性。安装DeepSeek Harness的流程和安装其他Harness框架类似但有几个DeepSeek特有的配置项需要注意。首先是模型选择。DeepSeek提供了多个版本的模型不同版本在能力、速度、成本上各有侧重。如果你的应用对推理能力要求高选能力强的版本如果对响应速度要求高选速度快的版本。我建议在项目早期就确定模型版本不要频繁切换因为不同模型的行为差异可能导致应用表现不稳定。其次是API密钥的管理。DeepSeek的API密钥有配额限制如果多个应用共用同一个密钥容易出现配额争抢。建议每个应用单独申请密钥并且设置好配额告警避免超额。最后是插件配置。DeepSeek Harness支持插件扩展但插件的质量和稳定性参差不齐。我试过几个社区插件有的能用但性能一般有的直接导致框架崩溃。建议只使用官方维护的插件或者自己写插件不要随便用来源不明的插件。5.2 Agent框架选型的核心考量因素Agent框架这个领域现在处于爆发期几乎每个月都有新框架出现。选型的时候不要被“新”和“热”迷惑核心考量因素应该是以下几个第一与你的技术栈是否匹配。如果你的项目主要用Python那就选Python生态的框架如果用TypeScript就选TypeScript生态的。跨语言适配的成本很高除非有特别强的理由否则不要跨。第二社区活跃度和文档质量。一个人开发最怕遇到问题找不到答案。社区活跃的框架你遇到的问题大概率别人也遇到过搜一下就能找到解决方案。文档质量也很关键文档写得清楚的框架上手成本低很多。第三扩展性和可维护性。框架是否支持自定义组件是否容易替换底层模型是否有清晰的升级路径。这些因素决定了你的项目能不能长期维护。第四性能和成本。框架本身的性能开销有多大是否支持流式输出是否有token优化机制。这些直接影响你的运营成本。我个人的选型原则是不选最热的选最稳的。热门的框架可能几个月后就没人维护了稳定的框架才能陪你走完整个项目周期。5.3 吴恩达Agent教程的核心方法论吴恩达的Agent教程在圈子里口碑很好核心方法论可以概括为**“反思-工具-规划-多智能体”**四个层次。反思是指Agent能够审视自己的输出发现错误并修正工具是指Agent能够调用外部工具来扩展能力规划是指Agent能够把复杂任务拆解成子任务并逐步完成多智能体是指多个Agent协作完成一个任务。这套方法论在实际项目中的落地方式因人而异。我的做法是先实现反思和工具两个层次这两个层次的技术难度相对低但效果立竿见影。规划层次需要更复杂的编排逻辑可以等前两个层次稳定后再加。多智能体层次适合大型项目单人开发的话除非必要否则不建议过早引入因为多智能体的调试和协调成本很高。6. 实操中的常见问题与避坑经验6.1 环境配置类问题速查问题现象可能原因解决方法Claude Code安装后无法启动Node.js版本过低升级Node.js到18以上Obsidian插件安装后不生效插件未启用或版本不兼容在设置中启用插件检查版本兼容性Markdown表格导出Excel乱码编码格式不匹配统一用UTF-8编码导出时指定编码格式Agent响应速度突然变慢token消耗超限或API限流检查token消耗统计调整并发策略沙盒环境频繁更新权限配置过严或Agent行为异常检查Agent操作日志调整沙盒权限6.2 我踩过的几个大坑第一个坑是过早优化。项目初期我就花了很多时间在上下文管理的优化上结果后来发现业务逻辑变了之前的优化方案完全不适用。教训是先让功能跑通再考虑优化。第二个坑是忽视日志。Agent应用的行为很复杂如果没有详细的日志出了问题根本不知道从哪里查。我后来加了一套完整的日志系统每个工具调用、每次上下文裁剪、每个决策点都记录日志排查问题的效率提升了好几倍。第三个坑是token预算没有监控。项目中期有一次token消耗突然暴涨查了半天才发现是一个循环调用导致的。如果早点建立token监控和告警机制这个问题可以在发生时就发现而不是等到账单出来才知道。第四个坑是插件版本不锁定。有一次自动更新了一个插件结果新版本改了接口导致整个应用崩溃。从那以后所有依赖的版本都锁定升级前先在测试环境验证。6.3 单人开发的效率提升技巧一个人开发20万行代码效率是生死线。我总结的几个技巧自动化重复劳动代码格式化、测试运行、部署发布能自动化的全部自动化。我写了一套脚本一条命令就能完成从代码检查到部署的全流程。模板化常用代码把常用的代码模式做成模板需要的时候直接生成不用从头写。Claude Code在这方面帮了很大忙。定期重构不要等到代码烂得没法改了才重构。我每个月会花一天时间专门做重构清理死代码、统一接口、更新文档。保持文档同步代码改了文档也要改。我用Obsidian管理所有文档每次代码变更后同步更新对应的文档页面。虽然花时间但长期来看省下了大量沟通和回忆的成本。7. 这个项目给我的几点真实体会九个月、20万行代码、每月40亿token这些数字背后是一个人在Agent开发这条路上的持续投入。我自己的体会是Agent开发的门槛不在技术而在工程。技术方案网上都能搜到但怎么把技术方案落地成一个稳定运行的系统怎么在资源有限的情况下做出可用的产品这些是搜不到的只能自己一步步踩出来。Harness架构的价值在于它提供了一套对抗复杂度的工具。组件化、标准化接口、动态编排这些概念听起来不新鲜但在实际项目中坚持执行下去效果是实实在在的。我见过太多项目因为架构混乱而半途而废也见过一些项目因为架构清晰而越做越顺。最后分享一个小技巧如果你也在做Agent开发建议从第一天就建立token消耗的监控体系。不用很复杂一个简单的表格每天记录消耗量、调用次数、平均每次调用的token数坚持记录一个月你就能对自己的应用有非常清晰的成本认知。这个认知会直接影响你的架构决策和优化方向。