手把手复刻 Claude Code!用 CrewAI 从零搭建工业级代码智能体 Harness!
但凡你自己动手搭建过编码智能体,大概率都会遇到这类问题:把大模型对接文件读写工具与终端命令工具,挂载到真实代码仓库后,往往执行十几轮工具调用就彻底崩盘。
要么读错目标文件,要么执行中途遗忘核心需求,大量无效返回内容塞满上下文窗口,彻底偏离任务目标。
但同样的需求交给 Claude Code,就能流畅闭环完成。很多人会简单归结为:Anthropic 自家模型性能更强,可这个结论完全忽略了真正起决定性作用的底层工程设计。
真正拉开差距的核心是harness(运行框架)。运行框架就是包裹在大模型外层的工程代码,全权负责任务规划、工具调度执行、上下文记忆、安全管控;大模型只需要专注决策下一步该执行什么动作。

如果把整套成型的智能体运行框架画成架构图,结构看着繁杂,但可以划分为四大核心模块:
- • Memory(记忆模块):向大模型推送当前任务上下文,同时载入跨会话沉淀的知识库信息
- • Skills(能力模块):定义智能体的运行规范,包含执行流程、约束条件、决策启发规则
- • Protocols(通信协议层):打通智能体与用户、工具、其他智能体之间的交互链路
- • 框架核心层:统筹调度子智能体、运行沙箱、结果校验、人工审批流程、可观测日志、上下文压缩
Anthropic 把这套架构通俗划分为「大脑」与「手脚」:大模型是负责判断动作的大脑,运行框架是落地执行、锚定任务进度的手脚。
所以你自研智能体和 Claude Code 之间的能力鸿沟,根源不在于模型本身,而在于模型外围整套工程化调度体系。
Claude Code 是目前生产环境中成熟度顶尖的运行框架之一,但其底层架构拆解后,核心层级远比想象中精简。为了直观厘清整套框架需要自研哪些模块,我基于开源多智能体编排框架 CrewAI 复刻了这套体系。
最终发现框架原生能力可以覆盖大部分基础能力,剩下无法直接开箱即用的部分,才是真正需要手动攻坚的工程难点。
接下来我们逐层搭建整套框架:先实现核心执行循环,再依次叠加任务规划、子智能体委派、沙箱环境、持久化记忆。每一步都会清晰区分「框架原生自带能力」和「需要自行开发定制」的边界。
Claude Code 运行框架底层原理
Claude Code 的最核心基础就是一套标准智能体循环:
-
- 向模型传入对话消息,模型输出下一步动作;要么直接回复文本结果,要么发起工具调用请求。
-
- 一旦触发工具调用,框架执行对应工具并把执行结果回填对话上下文,再交由模型进行下一轮决策。
-
- 不断循环,直到模型不再发起任何工具调用、直接输出最终答复,本轮任务宣告结束。

在这套循环里,读取文件、修改代码、执行终端命令、运行单元测试,并非拆分出多个独立运行模式,全部都是同一套循环内不同类型的工具调用。
但仅靠基础循环,编码智能体稳定性完全无法支撑真实项目开发。因此 Claude Code 在循环外层叠加了任务规划、文件操作工具集、子智能体委派、记忆系统、权限审批与沙箱隔离体系。这些模块不会替换原有主循环,而是让整套流程具备安全性与稳定性,适配工程级实际开发场景。
下面就按照这套架构分步复刻,从最基础的主循环开始,逐层对接 CrewAI 对应原生功能。
核心智能体执行循环
循环会固定重复以下流程直至任务完结:
-
- 传入任务指令交由大模型处理
-
- 模型直接输出文本回答,或是发起一项/多项工具调用
-
- 若存在工具调用,框架批量执行工具,并将返回结果回传给模型对话上下文
-
- 携带更新后的对话记录,进入下一轮循环
-
- 当模型回复内容不含任何工具调用时,任务终止并返回最终结果

伪代码实现:
while True: reply = model(messages, tools) # 筛选出所有工具调用指令 calls = [b for b in reply if b.type == "tool_use"] if not calls: # 无工具调用,直接返回最终结果,任务结束 return reply.text # 追加模型回复内容 + 所有工具执行结果,进入下一轮循环 messages += [reply, run_all(calls)]
单次简单查询可能一轮循环就能结束;但修复复杂漏洞、大规模代码重构这类场景,往往需要数十轮迭代,模型获取足够信息后才会输出最终结论。
而 CrewAI 只要创建智能体并绑定任务,就会自动内置这套执行循环,无需手动编写 while 循环逻辑,仅需定义智能体与对应任务即可。
搭建第一个基础智能体
创建一个简单的漏洞修复智能体:
from crewai import LLM, Agent, Crew, Task# 定义漏洞修复智能体bug_fixer = Agent( role="漏洞修复专员", goal="在代码仓库中定位已知漏洞,并给出对应的修复方案", backstory="会遍历目录与读取源码文件,精准梳理项目代码结构", llm="claude-sonnet-4-6",)# 定义具体任务task = Task( description="完成 {objective} 描述的漏洞修复工作", expected_output="简要说明修复方案,以及需要修改的目标文件",)# 启动编排流程并传入入参result = Crew(agents=[bug_fixer], tasks=[task]).kickoff( inputs={"objective": "修复 account.py 中的透支漏洞"})
三个核心基础概念:
- • Agent(智能体):定义执行主体,包含角色定位、目标、大模型绑定、可用工具集合
- • Task(任务):明确需要完成的具体工作与交付标准
- • Crew(编排集群):聚合智能体与任务,调用
kickoff()即可自动运行前文所述的整套执行循环,底层可无缝兼容 Anthropic、OpenAI、谷歌等任意大模型
为智能体挂载工具集
大模型本身仅能生成文本,想要操作代码仓库,必须依托工具实现文件读取、写入、终端执行、三方接口调用。
CrewAI 自带开箱即用的文件系统工具:
- • FileReadTool:读取指定文件内容
- • DirectoryReadTool:遍历列出文件夹目录结构
- • FileWriterTool:新建/覆盖写入文件
from crewai_tools import DirectoryReadTool, FileReadTool, FileWriterToolread_file = FileReadTool()write_file = FileWriterTool()list_dir = DirectoryReadTool()filesystem_tools = [read_file, write_file, list_dir]
这类工具同时可以充当外置记忆:不需要把海量检索内容全部塞进模型上下文窗口,智能体可将长文本结果写入临时文件,上下文仅留存文件路径,后续需要时再按需读取。
以此精简上下文负载,让模型注意力聚焦核心任务,这也是 Anthropic 提出的上下文工程核心思路。

内置工具仅覆盖通用常用场景,定制化工具可以通过 @tool 装饰器封装 Python 函数实现。函数文档字符串就是工具使用说明,告知模型该工具用途、适用场景与入参规范。
示例:封装 pytest 测试执行工具
from crewai.tools import toolimport subprocess@tool("run_tests")def run_tests(path: str = "tests/") -> str: """在指定路径执行 pytest 测试用例,并返回执行结果""" result = subprocess.run( ["pytest", path, "-q"], capture_output=True, text=True, timeout=120 ) output = result.stdout + result.stderr # 限制返回文本长度,避免上下文溢出 return output[-4000:] if len(output) > 4000 else output
长周期任务的任务规划机制
任务复杂度提升后,纯基础循环很容易出现上下文衰减:经过多轮文件读取、工具调用、中间结果回填后,上下文信息冗余杂乱,原始任务目标被大量无关信息淹没,智能体逐渐偏离需求。
任务规划就是用来解决该问题:智能体在正式动手执行前,先输出分步执行计划,并且全程将计划保留在上下文内。
计划不会直接执行操作,而是作为路线图锚定核心目标,对应 Claude Code 里待办清单的作用。
CrewAI 在集群层面开启规划功能即可生效,会在流程启动前生成整体执行方案:
from crewai import Crew, LLMcrew = Crew( agents=self.agents, tasks=self.tasks, planning=True, # 可自定义负责生成规划的大模型 planning_llm=LLM(model="gpt-4o-mini"),)
默认使用 gpt-4o-mini 生成规划,支持替换为任意大模型。

单个智能体还能开启自主推理,在行动前自行梳理思路:
from crewai import Agentbug_fixer = Agent( role="漏洞修复专员", goal="在代码仓库中定位已知漏洞,并给出对应的修复方案", backstory="会遍历目录与读取源码文件,精准梳理项目代码结构", tools=[FileReadTool()], reasoning=True, max_reasoning_attempts=3 # 可选:限定最多迭代思考次数)
规划与自主推理分工不同:
- • 全局规划:针对整项大任务搭建顶层步骤框架
- • 单体推理:单个智能体在执行单步操作前,先斟酌自身执行思路

两者搭配使用,能有效防止长流程任务跑偏。
通过子智能体委派拆解任务
规划能锁定任务方向,但无法减少单轮上下文承载的信息体量。面对大型代码仓库,即便有清晰规划,单次任务需要读取数十个文件,全部塞进主智能体上下文依然会超限。
子智能体委派可以拆分工作量:主智能体下发细分子任务给专项辅助智能体,子智能体拥有独立上下文完成工作后,仅向主智能体返回精简结论,中间执行过程不会污染顶层上下文。

CrewAI 依托分层执行流程实现该能力:设置一名主管智能体,向多个垂直领域专业智能体分发任务,并汇总所有结果。
原先单一个漏洞修复智能体包揽所有工作,现在拆分为四类角色:
-
- 代码仓库勘探员:遍历仓库结构,筛选和需求相关的目标文件
-
- 软件开发工程师:落地代码修改与功能实现
-
- 测试执行员:在沙箱环境运行测试,反馈用例通过/失败结果
-
- 技术主管:统筹拆解任务、分配工作、审核结果,全部修改验收完成后结束流程

from crewai import Crew, Agent, Task, Process# 仓库勘探智能体explorer = Agent( role="代码仓库勘探员", goal="梳理仓库目录结构,筛选出和当前任务强相关的文件", backstory="遍历文件夹与读取源码,搭建项目整体代码图谱", tools=[read_file, list_dir], llm=llm,)# 工程师、测试员智能体配置逻辑同上# 主管智能体manager = Agent( role="技术主管", goal="拆解需求为分步任务,指派给对应专项智能体,审核测试结果,确认需求闭环", backstory="统筹分工,校验修改内容,测试全部通过后收尾工作", llm=llm, allow_delegation=True, # 开启委派权限,默认关闭必须手动开启)# 分层编排集群crew = Crew( agents=[explorer, coder, tester], tasks=[task], manager_agent=manager, process=Process.hierarchical,)
沙箱机制:加固智能体执行安全
具备终端命令执行权限的智能体,有概率执行删除文件、篡改系统等高危指令;单纯靠提示词约束模型自律无法做到本质防护。
安全防护分为两层:
-
- 权限审批机制:高危操作必须经过人工确认才可执行
-
- 沙箱环境隔离:即便指令被审批放行,操作也只会在隔离环境内运行,无法篡改宿主机本机系统
Anthropic 也是采用这套双层防护方案。将代码执行完全移入沙箱,可以大幅降低人工审批频次,同时从底层保护宿主机环境。

CrewAI 接入沙箱执行
借助 E2B 服务实现沙箱能力:每次会话启动一台独立虚拟机,会话结束后销毁实例。所有 Shell 命令、Python 代码都在隔离环境内运行,不会影响本地机器。
from crewai_tools import E2BExecTool, E2BPythonTool# 沙箱终端执行工具、沙箱Python代码运行工具sandbox_tools = [E2BExecTool(), E2BPythonTool()]
人工介入审批流程
给 Task 开启 human_input=True,智能体产出阶段性结果后流程会暂停,等待人工审核;可选择批准放行,或是驳回并给出修改意见,让智能体迭代优化。

终端场景下会阻塞等待控制台输入;如果对接网页端/聊天窗口,可基于 Webhook 实现线上审核交互。
from crewai import Tasktask = Task( description="在 ./workspace 工作目录内完成 {objective},先梳理项目结构,完成代码修改,执行测试并输出结果", expected_output="汇总修改文件清单与最终测试执行日志", human_input=True,)
记忆持久化与断点续跑
默认情况下,单次编排任务结束后,智能体所有对话记录全部清空。隔天针对同一个项目修复新漏洞,会完全丢失之前对项目的认知,从头开始分析仓库。
两类机制可以实现跨任务信息留存,二者定位不同:
-
- Checkpoint(断点快照):单次任务执行中途保存运行状态,程序意外中断后可从快照位置恢复流程,也可以基于当前进度尝试其他修改方案
-
- 持久化记忆:跨不同会话存储项目通用规则、历史结论,例如「项目最终代码必须统一格式化后再提交」这类项目约定,后续任务自动读取记忆信息

CrewAI 持久化记忆
开启集群级 memory=True,整个集群内所有智能体共享记忆空间。每轮任务结束后,框架会调用大模型提炼本轮关键信息并入库;后续新任务启动时,自动检索匹配的历史记忆注入提示词。

from crewai import Crewcrew = Crew( agents=[explorer, coder, tester], tasks=[task], memory=True,)
单个智能体也可单独配置私有记忆,脱离集群公共记忆池。
CrewAI 断点续跑
断点会完整快照智能体配置、任务进度、记忆库、中间输出、入参与全量执行日志。

默认每完成一项 Task 自动生成断点,支持两种存储方案:
- • JsonProvider:每个断点单独生成 JSON 文件,可读性强,方便手动查看调试
- • SqliteProvider:全部断点存入单条 SQLite 数据库,高频快照、大规模任务场景稳定性更好
from crewai import Crewcrew = Crew( agents=[explorer, coder, tester], tasks=[task], checkpoint=True,)
Crew、Flow、Agent 均支持单独配置断点开关,子级组件会默认继承父级配置,可单独覆盖自定义。
全模块整合完整版代码
整合执行循环、工具集、全局规划、分层子智能体、沙箱隔离、记忆存储、断点存档全套能力:
from crewai import Agent, Crew, LLM, Process, Taskfrom crewai.tools import toolfrom crewai_tools import (DirectoryReadTool, FileReadTool, FileWriterTool, E2BExecTool, E2BPythonTool)# 绑定目标大模型llm = LLM(model="anthropic/claude-sonnet-4.6")# 限定工作根目录list_dir = DirectoryReadTool(directory="./workspace")filesystem_tools = [FileReadTool(), FileWriterTool(), list_dir]exec_tool = E2BExecTool()sandbox_tools = [exec_tool, E2BPythonTool()]# 自定义测试工具@tool("run_tests")defrun_tests(path: str = "tests/") -> str: """将本地 ./workspace 目录同步至沙箱环境,并执行pytest测试用例""" return exec_tool.run(command=sync_and_test_command(path))# 1. 仓库勘探智能体explorer = Agent( role="代码仓库勘探员", goal="梳理仓库整体结构,定位需求对应的核心关联文件", tools=[FileReadTool(), list_dir], llm=llm)# 2. 代码开发智能体coder = Agent( role="软件开发工程师", goal="根据需求落地代码修改与功能实现", tools=filesystem_tools, reasoning=True, llm=llm)# 3. 测试执行智能体tester = Agent( role="测试运行专员", goal="在沙箱环境执行自动化测试,反馈用例通过/失败情况", tools=sandbox_tools + [FileReadTool()] + [run_tests], llm=llm)# 4. 主管委派智能体manager = Agent( role="技术主管", goal="拆解任务并分配给对应专项智能体,校验测试结果,全部用例通过后结束任务", allow_delegation=True, llm=llm)# 主任务配置task = Task( description="在 ./workspace 目录内完成 {objective},先调研代码结构,执行代码修改,运行测试并汇总结果", expected_output="修改文件清单 + 完整测试输出报告", human_input=True,)# 编排集群开启所有核心能力crew = Crew( agents=[explorer, coder, tester], tasks=[task], manager_agent=manager, process=Process.hierarchical, planning=True, memory=True, checkpoint=True,)# 启动流程并传入需求result = crew.kickoff(inputs={"objective": "修复 account.py 中所有执行失败的测试用例"})
编码智能体最适合以自动化测试用例作为效果验收标准:测试套件可以给出明确可量化的目标,智能体能够自主规划、改代码、跑测试、迭代修复直至全部用例通过。
本文方案基于一套小型项目做验证:项目包含 BankAccount 账户类,预设2个程序漏洞、5条测试用例,其中3条用例执行失败。约束规则仅允许修改业务实现代码,禁止改动测试脚本。
整套运行框架最终将5条测试用例全部修复至执行通过,严格遵守不修改测试代码的限制,没有走捷径规避问题。

这套验收思路也和 Anthropic 内部评测编码智能体的方式一致:官方公开案例中,Claude 曾基于大量报错测试用例,从零复刻 claude.ai 官网前端页面。
仍需要开发者自主落地的核心工作
框架只能提供基础编排能力,以下核心环节无法通过配置一键实现,必须手动定制开发:
-
- 提示词工程:每个智能体的角色、目标、背景描述直接决定行为逻辑。提示词需要反复调试迭代优化,不存在可以一劳永逸的配置参数
-
- 执行环境搭建:无论是选用 E2B 托管沙箱,还是自行搭建虚拟机容器沙箱,都需要完成环境部署与工具链路对接
-
- 工具权限划分:哪些智能体可以调用哪些工具、权限范围如何管控,属于架构设计决策,框架不会自动做权限分配
同时整套框架本身会产生调用成本:全局规划、多子智能体委派、多轮循环重试都会额外消耗大模型接口调用次数。简单需求如果强行套用重型多智能体架构,开销会远高于单轮模型直接调用。
还有一项长期演进层面的局限:随着大模型本身能力迭代,很多框架层的冗余脚手架会被逐步淘汰。当下很多运行框架的设计,本质是为了弥补现有模型上下文记忆、长链路规划的短板,并非永久刚需架构。
例如 Anthropic 曾依靠上下文重置机制防止 Claude Sonnet 4.5 提前终止任务,而能力更强的 Claude Opus 4.5 就不再需要该兜底机制。

总结
整套编码智能体的核心竞争力绝大部分来源于外层运行框架,而非模型本身。
借助 CrewAI 这类编排框架,循环调度、任务规划、任务委派、沙箱隔离、记忆存储、断点续存都可以通过配置快速启用;而提示词设计、运行环境部署、工具权限体系,是需要开发者自主打磨的核心工程部分。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐

所有评论(0)