在AI辅助编程领域,GitHub Copilot虽然方便,但往往只能针对当前文件进行补全,缺乏对“整个项目结构”的宏观理解。随着 Claude 3.5 Sonnet 在Coding Benchmarks(编程基准测试)中全面霸榜,以及 Gemini 1.5 Pro 开放百万级上下文窗口,我们完全有能力自己动手,构建一个比Copilot更懂业务逻辑的私人编程助手。本文将从AST(抽象语法树)解析开始,深入讲解如何利用Python构建一个RAG(检索增强生成)架构,并通过API聚合网关接入Claude 3.5,实现对遗留代码(Legacy Code)的自动化重构与审计。文末附带独家免费测试额度及完整源码。


一、 痛点:为什么我们需要“第二代”AI编程助手?

作为一名每天要写几百行代码的开发者,你是否遇到过以下场景:

  1. 接手“屎山”代码:前人留下的代码逻辑错综复杂,没有任何文档,Copilot只能补全语法,却无法告诉你“这个类是干嘛的”。
  2. 全局重构困难:当你修改了一个底层函数的参数,很难评估这对上层几十个调用方会产生什么影响。
  3. 模型幻觉:使用普通的GPT-3.5或4.0写代码,经常出现调用的库不存在,或者语法过时的问题。

Claude 3.5 Sonnet 的出现改变了游戏规则。 它在HumanEval和MBPP等代码测试集中,展现出了惊人的“一次通过率”。更重要的是,它的逻辑推理能力极其适合处理复杂的系统架构问题。而配合 Gemini 1.5 Pro 的超大上下文,我们甚至可以把整个Linux内核的一部分扔给它去分析。

今天,我们就用Python来实现一个CLI(命令行)工具,我给它取名为 Code-Auditor


二、 架构设计:基于LLM的代码分析流水线

要实现一个能读懂项目的Agent,不能简单地把代码粘贴给AI。我们需要设计一个Pipeline:

  1. 文件扫描器(File Scanner):遍历项目目录,通过 .gitignore 规则过滤掉无关文件(如 node_modules__pycache__)。
  2. 上下文压缩(Context Compressor):对于超大项目,直接发送会消耗巨额Token。我们需要对代码进行预处理(如去除注释、压缩空行)。
  3. 大模型网关(LLM Gateway):通过API调用Claude 3.5 Sonnet或Gemini 1.5 Pro。
  4. 流式响应处理(Stream Handler):实时输出分析结果,提升交互体验。
2.1 为什么选择API聚合模式?

在实战中,直接对接Anthropic(Claude的母公司)或Google的API存在两个工程难题:

  • 网络连通性:国内服务器无法直连。
  • 多模型切换:你可能希望用Claude写代码,用Gemini分析文档。维护多套SDK成本太高。

因此,本项目采用 OpenAI兼容协议 的聚合网关方案。这意味着我们可以用标准的 openai Python库,去调用Claude和Gemini,实现“一套代码,模型随意切”。


三、 环境准备与工具链

在开始Coding之前,请确保你的环境满足以下要求。

3.1 核心依赖库

我们需要安装以下Python库:

  • openai: 虽然我们要调用的不是GPT,但通过兼容协议,这是最通用的客户端。
  • pathspec: 用于解析 .gitignore 文件,避免把垃圾文件发给AI。
  • rich: 用于在终端输出漂亮的彩色文本和进度条。

bash

pip install openai pathspec rich python-dotenv

3.2 获取API Access

为了演示,我们将使用 VectorEngine 提供的算力支持。它完美支持Claude 3.5 Sonnet和Gemini 1.5 Pro,且接口格式与OpenAI完全一致。

API Key获取地址(含开发者通道):搜索向量引擎


四、 核心代码实战:编写 Code-Auditor

我们将代码分为三个模块:scanner.py(文件处理)、client.py(模型交互)、main.py(主程序)。

4.1 模块一:智能文件扫描器 (scanner.py)

这个模块的难点在于:如何像Git一样聪明地忽略文件?


python

import os import pathspec class ProjectScanner: def __init__(self, root_dir): self.root_dir = root_dir self.gitignore = self._load_gitignore() def _load_gitignore(self): """加载.gitignore规则""" gitignore_path = os.path.join(self.root_dir, ".gitignore") if os.path.exists(gitignore_path): with open(gitignore_path, "r", encoding="utf-8") as f: return pathspec.PathSpec.from_lines("gitwildmatch", f) return pathspec.PathSpec.from_lines("gitwildmatch", []) def scan(self): """遍历项目,返回所有代码文件的内容""" code_context = "" file_count = 0 # 默认忽略的目录 default_ignore = {".git", "__pycache__", "node_modules", "venv", ".idea", ".vscode"} for root, dirs, files in os.walk(self.root_dir): # 修改dirs列表以跳过忽略目录 dirs[:] = [d for d in dirs if d not in default_ignore] for file in files: file_path = os.path.join(root, file) rel_path = os.path.relpath(file_path, self.root_dir) # 检查是否被gitignore忽略 if self.gitignore.match_file(rel_path): continue # 只处理代码文件(可根据需求扩展) if not file.endswith(('.py', '.js', '.ts', '.java', '.go', '.cpp')): continue try: with open(file_path, "r", encoding="utf-8") as f: content = f.read() # 拼接上下文格式:文件名 + 代码内容 code_context += f"\n\n--- FILE: {rel_path} ---\n{content}" file_count += 1 except Exception: pass # 跳过二进制文件或编码错误的文件 return code_context, file_count

4.2 模块二:Claude模型客户端 (client.py)

这里是魔法发生的地方。注意 base_url 的配置,这是我们能够在一个SDK里调用Claude的关键。


python

from openai import OpenAI import os class AIClient: def __init__(self, api_key): # 配置VectorEngine的API地址 self.client = OpenAI( api_key=api_key, base_url="https://api.vectorengine.ai/v1" ) def analyze_code(self, code_context, prompt): """ 发送请求给Claude-3.5-Sonnet """ # 构造System Prompt,赋予AI角色 system_prompt = """ 你是一名拥有20年经验的资深架构师,精通Clean Code原则。 你的任务是分析用户提供的项目代码,找出潜在的Bug、性能瓶颈,并给出重构建议。 请直接输出Markdown格式的报告,不要废话。 """ try: stream = self.client.chat.completions.create( # 这里指定模型名称,Claude 3.5 Sonnet通常映射为 claude-3-5-sonnet-20240620 # 具体名称请参考平台文档,有时平台会简化为 "claude-3.5-sonnet" model="claude-3.5-sonnet", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"项目代码如下:\n{code_context}\n\n用户需求:{prompt}"} ], stream=True, # 开启流式输出 temperature=0.2 # 代码任务需要低创造性,高准确性 ) return stream except Exception as e: print(f"API调用错误: {e}") return None

4.3 模块三:主程序入口 (main.py)

结合 rich 库,打造极客风的终端界面。


python

import os from scanner import ProjectScanner from client import AIClient from rich.console import Console from rich.markdown import Markdown console = Console() def main(): # 1. 配置API Key # 建议去 https://api.vectorengine.ai/register?aff=qsne 获取免费测试额度 api_key = os.getenv("VECTOR_API_KEY") if not api_key: console.print("[red]错误:请设置环境变量 VECTOR_API_KEY[/red]") return # 2. 获取目标路径 target_dir = input("请输入要分析的项目路径 (默认当前目录): ").strip() or "." # 3. 扫描代码 with console.status("[bold green]正在扫描项目文件...[/bold green]"): scanner = ProjectScanner(target_dir) context, count = scanner.scan() console.print(f"[blue]扫描完成!共发现 {count} 个代码文件,字符数:{len(context)}[/blue]") if len(context) > 200000: console.print("[yellow]警告:项目过大,建议切换至 gemini-1.5-pro 模型以支持超长上下文[/yellow]") # 4. 用户交互 while True: user_query = input("\n请输入你的指令 (例如: '找出代码中的安全漏洞' 或 'q'退出): ") if user_query.lower() == 'q': break ai = AIClient(api_key) stream = ai.analyze_code(context, user_query) if stream: console.print("\n[bold cyan]--- Claude 3.5 Sonnet 分析报告 ---[/bold cyan]\n") # 流式打印结果 full_response = "" for chunk in stream: if chunk.choices[0].delta.content: content = chunk.choices[0].delta.content print(content, end="", flush=True) full_response += content print("\n") if __name__ == "__main__": main()


五、 深度解析:为什么Claude 3.5更适合写代码?

在运行上述代码时,你会发现Claude 3.5 Sonnet与GPT-4o的一个显著区别:它更懂“人话”

  1. Artifacts思维:Claude倾向于一次性生成完整的、可运行的代码块,而不是像挤牙膏一样一段段崩。
  2. 指令遵循(Instruction Following):在复杂的Prompt下(比如要求它同时遵循PEP8规范、添加类型注解、并编写单元测试),Claude 3.5的遗漏率远低于其他模型。
  3. 视觉多模态辅助:虽然本文主要演示文本代码,但Claude 3.5的视觉能力极强。你可以截图IDE的报错弹窗发给它,它能精准定位UI层面的Bug。
进阶技巧:利用 Gemini 1.5 Pro 处理超大项目

如果你的项目是一个几十万行的老旧Java工程,Token数量轻松突破10万。这时候Claude的200k上下文可能捉襟见肘。

client.py 中,你只需要将 model 参数修改为 gemini-1.5-pro。 VectorEngine平台会自动将请求路由到Google的服务器。Gemini 1.5 Pro支持高达 100万甚至200万 Token 的上下文。这意味着你可以把整个框架的源码一次性喂给它,问它:“请画出这个项目的UML类图”。这种能力在以前是无法想象的。


六、 避坑指南与性能优化

在开发这个Agent的过程中,有几个技术细节需要注意:

6.1 Token截断与成本控制

虽然是按量付费,但把整个 node_modules 发过去绝对是灾难。

  • 优化方案:务必完善 ProjectScanner 中的过滤逻辑。对于Python项目,排除 venv;对于前端,排除 dist 和 build
  • 估算:1个中文字符约等于0.7个Token,1行代码约等于5-10个Token。
6.2 提示词工程(Prompt Engineering)

针对代码重构,推荐使用 CO-STAR 框架编写Prompt:

  • C (Context): "你是一个资深Python后端工程师..."
  • O (Objective): "重构这段代码,使其符合解耦原则..."
  • S (Style): "使用Google代码风格,强制类型提示..."
  • T (Tone): "专业、严谨..."
  • A (Audience): "面向初级开发者,代码要有详细注释..."
  • R (Response): "输出Markdown格式..."
6.3 API超时处理

分析大项目时,模型思考时间可能长达30秒。确保你的HTTP Client设置了足够的 timeout 时间,或者使用流式(Stream)接收,这样可以避免连接被中间网关切断。


七、 结语

AI不会取代程序员,但“会用AI的程序员”一定会取代“不会用AI的程序员”。

从Copilot的自动补全,到我们今天构建的全局代码审计Agent,AI介入开发的深度正在不断加深。掌握API聚合技术,灵活调用Claude、Gemini等不同特性的模型,将成为未来全栈开发者的必备技能。

如果你对代码有任何疑问,或者在运行中遇到报错,欢迎在评论区留言,我会第一时间解答!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐