ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于 HelloAgents 框架构建智能代码审查助手:CodeReviewAgent 完整实战指南

基于 HelloAgents 框架构建智能代码审查助手:CodeReviewAgent 完整实战指南 基于 HelloAgents 框架构建智能代码审查助手CodeReviewAgent 完整实战指南【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents在 Hello-Agents 开源仓库的共创项目Co-creation-projects中jjyaoao-CodeReviewAgent项目演示了如何基于 HelloAgents 框架用 Python 标准库 AST 解析与 LLM 智能分析相结合的方式构建一个可自动审查 Python 代码质量的智能体。本文将以其 项目 README 为骨架结合 主程序 main.ipynb 的逐单元格实现与 实际审查报告输出完整还原「工具定义 → 智能体组装 → 审查执行 → 报告生成」的落地链路并深入 HelloAgents 框架底层SimpleAgent 工具调用循环、HelloAgentsLLM 提供商自动识别讲解其工作原理帮助读者快速复刻一个属于自己的代码审查智能体。项目概览代码审查如何被智能化传统的代码审查依赖人工逐行阅读或静态分析工具如 flake8、pylint它们擅长发现风格与语法问题却难以理解代码语义、给出为什么这样改更好的深度建议。CodeReviewAgent 的思路是把确定性分析与语义理解结合起来确定性分析交给本地工具用 Python 内置的ast模块解析代码结构函数、类、行数用自定义规则检查 PEP 8 风格行长度、缩进结果精确、零成本、可复现深度建议交给 LLM将工具的结构化结果作为上下文交给大模型生成包含潜在 Bug、性能优化、最佳实践建议的 Markdown 审查报告。根据 README项目核心功能包含四点代码结构分析统计函数、类、代码行数、风格检查PEP 8 规范、智能建议基于 LLM 的深度分析、报告生成Markdown 格式。技术栈上它使用 HelloAgents 框架的 SimpleAgent 承载智能体逻辑Python AST 模块完成代码解析OpenAI 兼容 API默认 ModelScope 平台提供智能分析能力。技术架构与项目结构目录结构与文件职责依据 README 的项目结构章节并结合仓库实际文件项目布局如下Co-creation-projects/jjyaoao-CodeReviewAgent/ ├── README.md # 项目说明文档 ├── requirements.txt # 依赖列表 ├── .env.example # 环境变量示例LLM 配置模板 ├── main.ipynb # 主程序快速演示 完整功能 7 部分 ├── data/ │ └── sample_code.py # 待审查的示例代码用户管理系统 └── outputs/ └── review_report.md # 生成的审查报告依赖清单解析requirements.txt 中的依赖分为四类职责清晰# HelloAgents框架 hello-agents[all]0.1.0 # Jupyter环境 jupyter1.0.0 notebook7.0.0 # 环境变量管理 python-dotenv1.0.0 # 代码分析工具 ast-comments1.0.0hello-agents[all]框架本体提供SimpleAgent、HelloAgentsLLM、ToolRegistry、Tool、ToolParameter等核心类jupyter/notebookNotebook 运行环境python-dotenv用于从.env文件加载LLM_*环境变量ast-comments辅助 AST 代码分析的工具库主程序中核心解析仍使用标准库ast。安装方式非常简单在项目目录执行pip install -r requirements.txt即可。环境准备与 LLM 参数配置运行前需要配置大模型服务的三个关键参数模型 ID、API 密钥、服务地址。项目提供两种配置方式。方式一.env文件推荐复制 .env.example 为.env后编辑cp .env.example .env文件内容即 .env.example 原文如下# HelloAgents LLM配置 # 模型名称 LLM_MODEL_IDQwen/Qwen2.5-72B-Instruct # API密钥 LLM_API_KEYyour_api_key_here # 服务地址 LLM_BASE_URLhttps://api-inference.modelscope.cn/v1/ # 超时时间(可选,默认60秒) LLM_TIMEOUT60各变量含义与取值建议变量含义默认示例LLM_MODEL_ID模型名称Qwen/Qwen2.5-72B-InstructModelScope 平台通义千问 72B 指令模型LLM_API_KEYAPI 密钥替换为你的真实密钥your_api_key_hereLLM_BASE_URLOpenAI 兼容的服务地址https://api-inference.modelscope.cn/v1/LLM_TIMEOUT请求超时秒数可选60方式二Notebook 内直接设置项目已在 main.ipynb 中预配置了 ModelScope 的 API可直接运行。如需更换模型修改第 1 部分环境配置单元格中的代码os.environ[LLM_MODEL_ID] your_model os.environ[LLM_API_KEY] your_key os.environ[LLM_BASE_URL] your_api_url之所以用环境变量而非硬编码是因为 HelloAgents 的 LLM 客户端采用参数优先、环境变量兜底的设计。以仓库中 HelloAgents 框架同类实现 core/llm.py 为例HelloAgentsLLM初始化时会依次从构造参数、特定提供商环境变量如OPENAI_API_KEY、DASHSCOPE_API_KEY、MODELSCOPE_API_KEY、通用LLM_*环境变量中解析凭据并通过_auto_detect_provider根据 API 密钥前缀如ms-判定 ModelScope、base_url域名如api-inference.modelscope.cn判定 modelscope自动识别服务商。这意味着只要配置好统一的LLM_*环境变量同一份智能体代码即可无缝切换到 OpenAI、DeepSeek、通义、Kimi、智谱甚至本地 Ollama 服务这是项目可移植性的底层保障。快速演示5 个单元格跑通审查项目在 main.ipynb 的「第 0 部分快速演示」提供了一个精简版让读者最快速度感受「LLM 通过工具分析代码」的完整闭环。第 1 步导入库并配置环境from hello_agents import SimpleAgent, HelloAgentsLLM from hello_agents.tools import Tool, ToolParameter from typing import Dict, Any, List import ast import os os.environ[LLM_MODEL_ID] Qwen/Qwen2.5-72B-Instruct os.environ[LLM_API_KEY] your_api_key_here os.environ[LLM_BASE_URL] https://api-inference.modelscope.cn/v1/ os.environ[LLM_TIMEOUT] 60第 2 步定义代码分析工具快速演示版只实现一个QuickAnalysisTool核心逻辑是继承Tool基类、实现run()与get_parameters()两个抽象方法class QuickAnalysisTool(Tool): def __init__(self): super().__init__(namequick_analysis, description快速分析Python代码结构) def run(self, parameters: Dict[str, Any]) - str: code parameters.get(code, ) if not code: return 错误代码不能为空 try: tree ast.parse(code) functions [n.name for n in ast.walk(tree) if isinstance(n, ast.FunctionDef)] classes [n.name for n in ast.walk(tree) if isinstance(n, ast.ClassDef)] return f发现{len(classes)}个类、{len(functions)}个函数: {, .join(functions)} except Exception as e: return f代码解析失败: {str(e)} def get_parameters(self) - List[ToolParameter]: return [ToolParameter(namecode, typestring, description要分析的Python代码, requiredTrue)]第 3 步创建工具注册表与智能体from hello_agents import ToolRegistry quick_registry ToolRegistry() quick_registry.register_tool(QuickAnalysisTool()) quick_agent SimpleAgent( name快速审查助手, llmHelloAgentsLLM(), system_prompt你是代码审查助手,使用工具分析代码并给出简要建议。, tool_registryquick_registry )第 4 步执行审查test_code def hello(): print(Hello) def world(): print(World) class Greeter: def greet(self): hello() world() result quick_agent.run(f请分析这段代码:\n{test_code}) print(result)从Tool基类定义tools/base.py可以看到工具是一个名 描述 参数声明 执行逻辑的统一抽象name与description会被拼入系统提示词供 LLM 理解何时调用get_parameters()声明的ToolParametername/type/description/required/default定义了参数协议框架据此在调用时做类型转换如把字符串12转成整数run()则是纯函数式的执行入口输入参数字典、输出字符串结果。工具与智能体解耦、通过注册表统一管理正是 HelloAgents 支持易于添加新的检查规则这一扩展性的关键设计。完整版实现两大核心工具深入解析完整版代码审查系统位于 main.ipynb 的第 17 部分。其中第 2 部分定义了比快速演示更完善的两个工具。CodeAnalysisTool基于 AST 的结构分析class CodeAnalysisTool(Tool): 代码静态分析工具 def __init__(self): super().__init__( namecode_analysis, description分析Python代码的结构、复杂度和潜在问题 ) def run(self, parameters: Dict[str, Any]) - str: code parameters.get(code, ) if not code: return 错误代码不能为空 try: tree ast.parse(code) # 统计信息 functions [node for node in ast.walk(tree) if isinstance(node, ast.FunctionDef)] classes [node for node in ast.walk(tree) if isinstance(node, ast.ClassDef)] result { 函数数量: len(functions), 类数量: len(classes), 代码行数: len(code.split(\n)), 函数列表: [f.name for f in functions], 类列表: [c.name for c in classes] } return str(result) except SyntaxError as e: return f语法错误{str(e)} def get_parameters(self) - List[ToolParameter]: return [ToolParameter(namecode, typestring, description要分析的Python代码, requiredTrue)]实现要点ast.parse(code)先把源码解析为抽象语法树AST。Python 的ast是标准库无需额外依赖ast.walk(tree)深度优先遍历整棵语法树配合isinstance过滤出FunctionDef函数定义和ClassDef类定义节点从而统计函数数、类数、函数名列表与类名列表代码行数直接对源码按换行符split(\n)计数异常处理捕获SyntaxError让工具能识别代码存在语法错误这一审查维度实际审查报告中第一句话就是代码中没有语法错误结果序列化以str(result)把字典转成文本返回LLM 拿到的是规整的结构化描述。StyleCheckToolPEP 8 风格检查class StyleCheckTool(Tool): 代码风格检查工具 def __init__(self): super().__init__( namestyle_check, description检查代码是否符合PEP 8规范 ) def run(self, parameters: Dict[str, Any]) - str: code parameters.get(code, ) if not code: return 错误代码不能为空 issues [] lines code.split(\n) for i, line in enumerate(lines, 1): # 检查行长度 if len(line) 79: issues.append(f第{i}行超过79个字符) # 检查缩进 if line.startswith( ) and not line.startswith( ): if len(line) - len(line.lstrip()) not in [0, 4, 8, 12]: issues.append(f第{i}行缩进不规范) if not issues: return 代码风格良好符合PEP 8规范 return 发现以下问题\n \n.join(issues) def get_parameters(self) - List[ToolParameter]: return [ToolParameter(namecode, typestring, description要检查的Python代码, requiredTrue)]实现要点行长度规则PEP 8 建议单行不超过 79 个字符注释/文档字符串建议 72工具对每一行做len(line) 79判定缩进规则Python 约定 4 空格缩进。工具通过len(line) - len(line.lstrip())计算前导空格数若不属于[0, 4, 8, 12]视为缩进不规范输出约定无问题时返回正面确认信息有问题时逐行列出。这样 LLM 可以直接引用第 X 行超过 79 个字符这类精确信息写入报告。值得说明的是这类规则式检查是轻量自实现它并不试图覆盖 PEP 8 的全部规则如 E302 空行、W291 行尾空白等而是以教学目的演示如何把静态检查规则封装成 Agent 工具。实际审查报告也印证了这一点——对 sample_code.py 只报出第 1 行超过 79 个字符一个问题。若要生产级风格检查可在此基础上继续叠加 pycodestyle、flake8 等更完整的规则集。智能体组装从工具到审查专家注册工具与初始化 LLM第 3 部分完成智能体的组装main.ipynbfrom hello_agents import ToolRegistry tool_registry ToolRegistry() tool_registry.register_tool(CodeAnalysisTool()) tool_registry.register_tool(StyleCheckTool()) llm HelloAgentsLLM()ToolRegistry是工具的中枢管理器tools/registry.pyregister_tool将工具按 name 存入内部字典重复注册会告警并覆盖get_tools_description()会把所有工具的name: description汇总成提示词片段供 LLM 知道有哪些工具可用list_tools()可随时查看已注册工具。系统提示词设计审查流程的指挥棒system_prompt 你是一位经验丰富的代码审查专家。你的任务是 1. 使用code_analysis工具分析代码结构 2. 使用style_check工具检查代码风格 3. 基于分析结果提供详细的审查报告 审查报告应包括 - 代码结构分析 - 风格问题 - 潜在bug - 性能优化建议 - 最佳实践建议 请以Markdown格式输出报告。 agent SimpleAgent( name代码审查助手, llmllm, system_promptsystem_prompt, tool_registrytool_registry )这段提示词是整个智能体的工作说明书它显式规定了工具调用顺序先结构分析、再风格检查、最后综合出报告与输出格式五个固定小节 Markdown 语法。从 agents/simple_agent.py 的源码可以看到SimpleAgent在运行时会调用_get_enhanced_system_prompt()把用户给定的 system_prompt 与工具注册表生成的可用工具 工具调用格式说明拼接最终以 system 消息发给 LLM——这就是提示词工程驱动工具编排的落地方式。工具调用循环SimpleAgent 的推理-行动内核SimpleAgent.run()的核心是一个迭代式工具调用循环默认max_tool_iterations3组装消息列表增强版 system 提示 历史消息 用户输入调用llm.invoke(messages)让模型产出回复用正则\[TOOL_CALL:([^:]):([^\]])\]解析回复中的工具调用标记若存在调用标记则从回复中剥离标记、执行工具_execute_tool_call内部会做参数解析与类型转换把工具执行结果作为新消息回灌给 LLM进入下一轮迭代若回复中不再有工具调用标记说明 LLM 已基于工具结果给出最终答案循环结束。这一机制正是 ReActReasoning Acting范式的工程化实现LLM 决定何时调用什么工具框架负责执行工具并回填结果直到模型认为信息足够、输出最终报告。CodeReviewAgent 的审查流程在用户视角是一次agent.run(代码)但在框架内部实际发生了多轮思考→调用工具→读取结果→再思考的循环。完整审查流程与报告解读四步执行链路第 46 部分构成完整的审查执行链路# 第4部分读取示例代码 with open(data/sample_code.py, r, encodingutf-8) as f: sample_code f.read() # 第5部分执行代码审查 review_result agent.run(f请审查以下Python代码\n\npython\n{sample_code}\n) # 第6部分保存审查报告 with open(outputs/review_report.md, w, encodingutf-8) as f: f.write(review_result)待审查的 data/sample_code.py 是一个用户管理系统示例包含UserManager类add_user/get_user/delete_user三个方法和calculate_average_age、send_email两个辅助函数共 44 行——规模适中足以展示审查的多个维度。审查报告落盘到 outputs/review_report.md。审查报告示例五个维度的完整输出运行后生成的报告节选仓库 outputs/review_report.md 的真实内容包含五个维度1. 代码结构分析来自code_analysis工具UserManager类包含__init__、add_user、get_user、delete_user使用列表self.users存储用户add_user返回True表示成功、get_user找不到时返回None、delete_user删除失败返回Falsecalculate_average_age遍历列表求平均年龄、send_email为打印消息的模拟实现。2. 风格问题来自style_check工具第 1 行模块级文档字符串超过 79 个字符建议拆分长行或缩短注释。3. 潜在 Bugdelete_user删除元素后列表索引会变化虽然当前实现可工作但建议改用更安全的方式如列表推导。4. 性能优化建议get_user最坏情况需遍历整个列表用户量大时可改用字典存储以提升查找效率calculate_average_age每次调用都全量遍历可考虑缓存计算结果。5. 最佳实践建议为add_user/delete_user增加异常处理用logging替代print输出日志编写单元测试验证方法正确性细化复杂逻辑与边缘情况的文档字符串。报告末尾还附带了改进后的完整代码示例将用户存储从列表改为字典self.users {}、用logging.basicConfig配置日志、get_user改用dict.get、calculate_average_age增加空列表保护并使用生成器求和、补充if __name__ __main__演示入口——这份由 LLM 生成的改前/改后对比正是传统静态分析工具无法提供的增值部分。项目的可扩展性与进阶方向README 中列出的未来改进方向其实质是给读者指明如何基于同一套架构继续深化扩展方向实现思路对应现有架构支持更多编程语言新增针对 JS/Java 的解析工具类替换/扩展CodeAnalysisTool的ast.parse部分如使用对应语言的解析器安全漏洞检测新增SecurityCheckTool扫描危险函数调用、硬编码密钥等特征模式集成更多静态分析工具将 pycodestyle、bandit、mypy 等封装为Tool子类注册进ToolRegistry批量文件审查外层遍历目录调用agent.run()或扩展工具参数支持文件路径HTML 报告修改 system_prompt 要求输出 HTML或对 Markdown 结果做后处理转换这一扩展路径正是基于 HelloAgents 的插件化设计新能力 新 Tool 类 注册 可选提示词调整业务逻辑与智能体调度完全解耦符合 README 中易于添加新的检查规则和工具的项目亮点。总结CodeReviewAgent 是一个小而完整的智能体落地范例用ast标准库解决确定性代码分析用 LLM 解决语义级审查建议用 HelloAgents 的Tool/ToolRegistry/SimpleAgent把它们组装成可对话、可编排的智能审查助手。通过本文的逐步拆解读者不仅掌握了该项目的全部实现细节也理解了 ReAct 式工具调用循环与工具注册 提示词驱动的框架设计哲学——这些能力可以原样迁移到文档审查、数据质量检查、配置校验等其他分析型智能体场景中。进一步探索可以完整阅读 main.ipynb 的逐单元格实现参考 审查报告样例 与 示例代码 对照理解并回到 HelloAgents 框架源码如 SimpleAgent 实现、工具基类、LLM 客户端从底层验证本文所述机制。【免费下载链接】hello-agents 《从零开始构建智能体》——从零开始的智能体原理与实践教程项目地址: https://gitcode.com/GitHub_Trending/he/hello-agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表