简介:本教程基于最新AI代码智能体教学理念,帮助开发者掌握从底层LLM调用循环、工具链集成到上下文工程的核心技术,最终用约200行通用代码复现一个轻量级代码智能体。适合有基础编程能力、希望转型AI原生开发的工程师阅读,涵盖环境准备、核心模块实现、开源项目协作与验证方法。
本教程旨在帮助读者理解并动手实现一个轻量级的AI代码智能体(Code Agent),核心能力包括:
适合读者:具备Python或类似语言基础的后端/全栈开发者、希望转型AI原生开发的工程师、技术负责人或对Agent架构感兴趣的运维人员。
| 场景 | 说明 |
|---|---|
| 个人学习与技能转型 | 快速理解AI智能体开发范式,为职业转型做准备 |
| 团队技术预研 | 评估代码智能体在团队研发流程中的可行性与边界 |
| 开源项目协作 | 通过向真实开源仓库提交PR,积累生产级代码审查经验 |
| 企业内部工具建设 | 为企业内部研发效能平台提供Agent模块的参考实现 |
在开始之前,请确认以下环境与知识储备:
做什么:在动手写代码前,先建立对代码智能体整体架构的认知。
为什么做:代码智能体不是简单的”调用LLM”,而是一个包含感知→推理→行动→反馈循环的完整系统。理解架构才能避免后续开发中的逻辑混乱。
核心组件:
通用架构示意:
用户指令↓┌─────────────────────────┐│ 上下文管理器(组装输入) │└───────────┬─────────────┘↓┌─────────────────────────┐│ LLM 推理引擎 ││ (生成结构化工具调用指令) │└───────────┬─────────────┘↓┌─────────────────────────┐│ 工具调度器 ││ (解析指令 → 执行对应工具) │└───────────┬─────────────┘↓执行结果反馈回上下文↓判断是否完成任务 → 否 → 回到LLM推理
做什么:编写一个基础函数,完成”发送用户指令+系统提示词→获取LLM响应”的功能。
为什么做:这是智能体的”大脑”,所有后续逻辑都建立在此之上。
关键配置说明:
通用伪代码示例:
import osimport jsonimport httpxdef call_llm(system_prompt: str, user_message: str, context: list[dict]) -> str:"""调用大语言模型API,返回模型的文本输出。context: 历史消息列表,每条包含 role 和 content 字段。"""messages = [{"role": "system", "content": system_prompt}]messages.extend(context)messages.append({"role": "user", "content": user_message})payload = {"model": os.getenv("LLM_MODEL_NAME", "default-model"),"messages": messages,"temperature": 0.2,"max_tokens": 4096,}api_key = os.getenv("LLM_API_KEY")headers = {"Authorization": f"Bearer {api_key}"}resp = httpx.post(os.getenv("LLM_API_ENDPOINT"),headers=headers,json=payload,timeout=60,)resp.raise_for_status()return resp.json()["choices"][0]["message"]["content"]
注意事项:
做什么:实现文件读取、文件写入、终端命令执行三个核心工具函数,以及一个调度器来解析LLM输出并调用对应工具。
为什么做:智能体如果不能操作文件和执行命令,就无法真正完成编程任务。工具是智能体的”手脚”。
工具定义规范:
每个工具需要在系统提示词中用结构化方式声明,包括:
通用代码示例(工具调度器核心逻辑):
import subprocessimport osTOOLS = {"read_file": {"desc": "读取指定路径的文件内容","params": {"path": "string, 必填, 文件绝对路径"},},"write_file": {"desc": "将内容写入指定路径的文件(覆盖或创建)","params": {"path": "string, 必填", "content": "string, 必填"},},"run_command": {"desc": "在终端执行Shell命令并返回输出","params": {"command": "string, 必填, Shell命令字符串"},},}def execute_tool(tool_name: str, params: dict) -> str:"""根据工具名称和参数执行对应操作,返回执行结果。"""if tool_name == "read_file":path = params.get("path", "")if not os.path.exists(path):return f"Error: File not found at {path}"with open(path, "r", encoding="utf-8") as f:return f.read()elif tool_name == "write_file":path = params.get("path", "")content = params.get("content", "")os.makedirs(os.path.dirname(path), exist_ok=True)with open(path, "w", encoding="utf-8") as f:f.write(content)return f"Successfully wrote {len(content)} chars to {path}"elif tool_name == "run_command":cmd = params.get("command", "")try:result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=30)return f"stdout:\n{result.stdout}\nstderr:\n{result.stderr}"except subprocess.TimeoutExpired:return "Error: Command timed out"return f"Unknown tool: {tool_name}"
注意事项:
run_command 在生产环境中存在严重安全风险,务必限制可执行命令的范围(如仅允许在指定工作目录下操作);做什么:实现上下文组装逻辑和主推理循环,使智能体能够多轮迭代直到完成任务。
为什么做:单次LLM调用无法完成复杂编程任务,需要通过循环不断将执行结果反馈给LLM,形成”思考→行动→观察→再思考”的闭环。
上下文管理策略:
主循环通用代码示例:
def run_agent(task_description: str, work_dir: str = "./workspace"):"""运行代码智能体,完成指定编程任务。"""os.makedirs(work_dir, exist_ok=True)os.chdir(work_dir)system_prompt = build_system_prompt() # 组装包含工具定义的系统提示词context = [] # 历史消息context.append({"role": "user", "content": task_description})max_iterations = 20for i in range(max_iterations):# 1. 调用LLM获取下一步行动response = call_llm(system_prompt, task_description, context)context.append({"role": "assistant", "content": response})# 2. 解析LLM输出,提取工具调用tool_call = parse_tool_call(response) # 需实现解析逻辑if tool_call is None:# LLM认为任务完成或无法继续if "TASK_COMPLETE" in response:print(f"Task completed at iteration {i+1}")return responseprint("Agent could not determine next action.")return response# 3. 执行工具result = execute_tool(tool_call["name"], tool_call["params"])print(f"Tool [{tool_call['name']}] result: {result[:200]}...")# 4. 将结果反馈回上下文context.append({"role": "tool", "content": result})# 5. 上下文长度管理context = truncate_context(context, max_tokens=4000)print("Max iterations reached, task may be incomplete.")return responsedef parse_tool_call(response: str) -> dict | None:"""从LLM输出中解析结构化的工具调用指令。简易实现:查找JSON格式的工具调用块。实际项目中可使用JSON模式输出或正则提取。"""import repattern = r'```json\s*(\{.*?\})\s*```'match = re.search(pattern, response, re.DOTALL)if match:try:return json.loads(match.group(1))except json.JSONDecodeError:passreturn None
做什么:将前述所有模块整合,编写完整的系统提示词模板,确保整体代码量控制在200行左右。
为什么做:200行的约束迫使开发者聚焦核心逻辑,去掉冗余封装,理解每一行的价值。这也是检验是否真正理解Agent机制的试金石。
整合要点:
build_system_prompt()、truncate_context()、parse_tool_call()等辅助函数精简实现;run_agent作为入口,驱动整个流程。验证200行达成的方法:使用代码行数统计工具检查,核心逻辑文件(不含注释和空行)应接近200行。
完成代码后,按以下方式验证智能体是否正常工作:
| 验证项 | 方法 |
|---|---|
| 基本调用 | 输入”在当前目录创建一个hello.py,输出Hello World”,观察是否生成文件 |
| 工具链 | 输入”读取刚才创建的文件并显示内容”,验证read_file工具 |
| 多轮迭代 | 输入”将hello.py改为输出当前时间”,验证写文件与执行能力 |
| 上下文记忆 | 连续提问,验证历史上下文是否被正确传递 |
| 安全边界 | 尝试危险命令,验证是否被拦截或提示 |
| 问题 | 可能原因 | 排查思路 |
|---|---|---|
| LLM不返回工具调用格式 | 系统提示词中工具定义不够清晰 | 检查提示词是否包含明确的输出格式示例 |
| 工具执行报错 | 路径不存在或权限不足 | 检查工作目录、文件权限、命令是否在允许范围内 |
| 上下文超限报错 | 历史消息过长未截断 | 实现或完善truncate_context函数 |
| 循环不终止 | LLM反复调用同一工具无进展 | 增加最大迭代次数限制,在提示词中强调任务完成标记 |
| API调用失败 | 密钥过期或网络不通 | 检查环境变量和网络连通性 |
完成智能体原型后,建议通过以下方式积累真实工程经验:
这一过程能帮助开发者建立对”AI辅助开发+人工把关”协作模式的深刻理解。
本教程围绕”从零构建AI代码智能体”这一核心目标,逐步讲解了架构理解、LLM调用、工具集成、上下文管理和主循环控制五大关键模块。通过约200行代码的约束,读者可以聚焦本质、快速验证。后续可关注的方向包括:多智能体协作调度、RAG增强的上下文检索、安全沙箱机制以及与企业级DevOps流水线的集成。
AI原生开发正在重塑软件工程的工作方式,掌握代码智能体的构建与应用能力,将成为未来开发者的核心竞争力之一。建议读者在完成本教程后,持续关注行业最新进展,并积极参与开源协作以保持技术敏锐度。