技术教程 · 阅读约 9 分钟

用 DeepSeek + Claude 组合,搭一个比 Claude Code 便宜 17 倍的 AI 代码审查 Agent

用 DeepSeek + Claude 组合,搭一个比 Claude Code 便宜 17 倍的 AI 代码审查 Agent

很多人不知道一件事:Claude Code 底层的 agent loop,其实可以拆开来自己搭。

DeepClaude 这个项目最近在 HN 上火了,核心思路是:用 DeepSeek V4 Pro 做推理(便宜),用 Claude 做最终输出(质量高),整体成本比直接用 Claude Code 低 17 倍。

这篇文章带你用 50 行 Python 复现这个思路,做一个能审整个 repo 的代码审查工具。


为什么这个组合有意思

Claude 的输出质量毋庸置疑,但它贵。DeepSeek V4 Pro 的推理能力现在已经非常强,而且价格是 Claude 的零头。

DeepClaude 的做法是:

1. 把问题先扔给 DeepSeek,让它做深度推理,输出一个「思考过程」

2. 把这个思考过程 + 原始问题一起喂给 Claude

3. Claude 基于已有推理直接生成高质量答案,不需要自己再从头想

这样 Claude 的 token 消耗大幅减少,因为它跳过了「思考」阶段,只做「表达」。


动手搭一个 Repo 审查工具

环境准备


pip install openai pathlib

只需要 openai 这个包,因为 DeepSeek 和 Claude 都支持 OpenAI 格式的 API。

完整代码


import os

from pathlib import Path

from openai import OpenAI



# 两个模型都走同一个 base_url,省去多账号管理的麻烦

client = OpenAI(

    api_key=os.environ.get("WULIANG_API_KEY"),

    base_url="https://api2everything.xyz/v1"

)



def collect_repo_files(repo_path: str, extensions: list[str] = None) -> dict[str, str]:

    """收集 repo 里的代码文件"""

    if extensions is None:

        extensions = [".py", ".ts", ".js", ".go", ".java", ".rs"]

    

    files = {}

    root = Path(repo_path)

    

    for ext in extensions:

        for file_path in root.rglob(f"*{ext}"):

            # 跳过常见的无关目录

            if any(part in file_path.parts for part in ["node_modules", ".git", "__pycache__", "dist", "build"]):

                continue

            try:

                content = file_path.read_text(encoding="utf-8")

                if len(content.strip()) > 0:

                    relative_path = str(file_path.relative_to(root))

                    files[relative_path] = content

            except Exception:

                continue

    

    return files



def deepseek_reason(code_context: str) -> str:

    """第一步:让 DeepSeek 做深度推理,找出潜在问题"""

    prompt = f"""你是一个资深代码审查专家。请对以下代码进行深度分析,重点关注:

1. 安全漏洞(SQL注入、XSS、未验证输入等)

2. 性能问题(N+1查询、不必要的循环、内存泄漏)

3. 代码质量(重复代码、命名不规范、缺少错误处理)

4. 架构问题(耦合过高、职责不清晰)



代码内容:

{code_context}



请详细列出你发现的所有问题,并说明原因。"""



    response = client.chat.completions.create(

        model="deepseek-r1",  # 用 DeepSeek 做推理,便宜

        messages=[{"role": "user", "content": prompt}],

        max_tokens=2000

    )

    return response.choices[0].message.content



def claude_summarize(original_code: str, deepseek_analysis: str) -> str:

    """第二步:把 DeepSeek 的推理结果喂给 Claude,生成可读报告"""

    prompt = f"""基于以下代码审查分析,生成一份结构清晰、可直接行动的审查报告。



原始代码:

{original_code[:3000]}  # 只传关键部分给 Claude,节省 token



DeepSeek 的分析结果:

{deepseek_analysis}



请输出:

1. 问题摘要(按严重程度排序:Critical / High / Medium / Low)

2. 每个问题的具体修复建议(附代码示例)

3. 整体评分(1-10)和一句话总结"""



    response = client.chat.completions.create(

        model="claude-sonnet-4-5",  # Claude 做最终输出,质量有保障

        messages=[{"role": "user", "content": prompt}],

        max_tokens=2000

    )

    return response.choices[0].message.content



def review_repo(repo_path: str):

    """主函数:审查整个 repo"""

    print(f"📂 正在扫描 {repo_path}...")

    files = collect_repo_files(repo_path)

    

    if not files:

        print("没有找到可审查的代码文件")

        return

    

    print(f"✅ 找到 {len(files)} 个文件,开始审查...\n")

    

    # 把所有文件拼成一个上下文(实际使用可以按文件分批)

    code_context = ""

    for path, content in list(files.items())[:10]:  # 先处理前10个文件

        code_context += f"\n\n### {path}\n```\n{content[:1500]}\n```"

    

    print("🤔 DeepSeek 正在深度推理...")

    analysis = deepseek_reason(code_context)

    

    print("✍️  Claude 正在生成报告...")

    report = claude_summarize(code_context, analysis)

    

    print("\n" + "="*60)

    print("📋 代码审查报告")

    print("="*60)

    print(report)

    

    # 保存报告

    output_path = Path(repo_path) / "code_review_report.md"

    output_path.write_text(f"# 代码审查报告\n\n{report}", encoding="utf-8")

    print(f"\n💾 报告已保存到 {output_path}")



if __name__ == "__main__":

    import sys

    repo_path = sys.argv[1] if len(sys.argv) > 1 else "."

    review_repo(repo_path)

运行方式


export WULIANG_API_KEY="你的key"

python review.py /path/to/your/project


成本对比

| 方案 | 审查一个中型 repo 的费用 |

|------|------------------------|

| 直接用 Claude Code | ~¥15-30 |

| DeepSeek 推理 + Claude 输出 | ~¥1-3 |

| 纯 DeepSeek | ~¥0.5,但输出格式差一些 |

这个组合的甜点在于:推理用便宜的,表达用贵的,两边都不浪费。


进一步优化方向

  • 按文件并发:用 asyncio 并行处理多个文件,速度提升 5-10 倍
  • 增量审查:结合 git diff,只审查本次改动的代码
  • CI 集成:加到 GitHub Actions,每次 PR 自动触发
  • 自定义规则:在 prompt 里加入团队的编码规范文档

关于 API 费用

代码里用的 base_url无量Api,国内直连,不需要代理。DeepSeek、Claude、GPT 等 300+ 模型都在一个 key 里,比官方便宜约 65%。注册送 ¥1 余额,够跑好几次审查了。

改一行 base_url 就能用,其他代码完全不用动。


有问题欢迎评论区留言,或者把你跑出来的审查报告截图发出来看看效果。觉得有用的话点个赞,后续还会写 CI 集成和异步并发版本。