DeepSeek Harness、Codex、Claude Code、LangGraph 怎么选:先判断你缺的是产品、底盘还是工作流
1. 引言:先别急着选工具,先判断你缺什么
很多开发者面对 DeepSeek Harness、Codex、Claude Code、LangGraph 这四个名字时,第一反应是「哪个更好用」。但更准确的问法是:你当前缺的是产品、底盘,还是工作流?
这四个工具并不在同一层:
- DeepSeek Harness:面向模型评测与推理压测的工程框架,属于「底盘」层。
- Codex:OpenAI 的编码智能体产品,属于「产品」层。
- Claude Code:Anthropic 的终端编码智能体产品,属于「产品」层。
- LangGraph:构建有状态、可编排的 LLM 应用框架,属于「工作流」层。
本文用一张选型决策表、四个实战案例和一组对比实验,帮你把「缺什么」翻译成「选什么」。
2. 四者定位:产品、底盘、工作流
先建立统一坐标系。下面这张表从定位、核心能力、适用人群三个维度做区分。
| 工具 | 定位 | 核心能力 | 适用人群 |
|---|---|---|---|
| DeepSeek Harness | 底盘 | 模型评测、推理压测、多数据集管理 | 算法工程师、模型平台团队 |
| Codex | 产品 | 云端编码智能体、沙箱执行、PR 自动生成 | 追求开箱即用的开发者 |
| Claude Code | 产品 | 终端内编码智能体、长上下文、工具调用 | 偏好本地终端工作流的开发者 |
| LangGraph | 工作流 | 有状态图编排、人机协同、可恢复执行 | 需要自定义 Agent 流程的工程师 |
一句话总结:要开箱即用选产品,要评测模型选底盘,要编排复杂流程选工作流。
3. 决策表:按你的场景直接查
下面这张决策表覆盖了最常见的 8 种场景,可以直接对照。
| 你的核心诉求 | 推荐工具 | 理由 |
|---|---|---|
| 快速让 AI 帮我改代码、提 PR | Codex | 云端沙箱,零配置,直接对接 GitHub |
| 在本地终端里深度重构项目 | Claude Code | 长上下文 + 终端内交互,适合大仓库 |
| 对比 DeepSeek 不同版本的推理质量 | DeepSeek Harness | 内置评测集与指标,可量化对比 |
| 压测自建模型的并发与延迟 | DeepSeek Harness | 支持自定义请求脚本与并发配置 |
| 构建多步骤 Agent,如「检索→推理→写报告」 | LangGraph | 有状态图,节点可编排、可恢复 |
| 需要人工审批后再执行关键操作 | LangGraph | 内置 interrupt 机制,支持人机协同 |
| 既要编码智能体,又要自定义评测 | Claude Code + DeepSeek Harness | 产品负责干活,底盘负责验证 |
| 既要工作流编排,又要编码能力 | LangGraph + Codex | 工作流负责调度,产品负责执行 |
4. 实战一:DeepSeek Harness——评测你的模型底盘
假设你部署了 DeepSeek 的蒸馏模型,想对比它和原版在数学推理上的差距。DeepSeek Harness 的核心用法是「配数据集、跑评测、看指标」。
下面是一个最小可运行的评测配置示例。
from deepseek_harness import Harness, Dataset, Metric
1. 定义评测数据集
dataset = Dataset.from_jsonl(
"math_500.jsonl",
input_key="question",
output_key="answer"
)
2. 定义评测指标
metric = Metric.composite([
Metric.exact_match(),
Metric.llm_judge(model="deepseek-chat")
])
3. 初始化 Harness 并运行
harness = Harness(
model_endpoint="http://localhost:8000/v1",
model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
dataset=dataset,
metric=metric,
concurrency=16
)
report = harness.run()
print(report.summary())
输出示例:
exact_match: 0.72
llm_judge_pass_rate: 0.85
关键点:Harness 解决的是「我的模型到底行不行」的问题。它不帮你写业务代码,但能帮你量化模型能力,是典型的底盘工具。
5. 实战二:Codex——开箱即用的编码产品
Codex 的典型场景是「给我一个 Issue,还你一个 PR」。它把模型、沙箱、Git 操作封装成了完整产品。
下面是一个通过 Codex CLI 完成任务的示例。
# 1. 在仓库根目录启动 Codex
codex
2. 输入自然语言任务
> 修复 src/utils/date.ts 中时区转换的 bug,
> 并补充对应的单元测试。
3. Codex 自动完成:
- 定位 bug
- 修改代码
- 运行测试
- 生成 commit 和 PR
Codex 的核心价值是产品化:你不需要关心模型调用、上下文管理、沙箱安全,它把这一切封装成了「输入任务、输出 PR」的体验。
6. 实战三:Claude Code——终端里的深度重构
Claude Code 更适合在本地终端里处理大型仓库。它的优势是长上下文和工具调用能力。
下面是一个典型的重构会话示例。
# 1. 在项目目录启动
claude
2. 提出重构需求
> 把整个 services/ 目录下的 HTTP 客户端
> 从 axios 迁移到 fetch,保持接口不变。
3. Claude Code 会:
- 扫描 services/ 下所有文件
- 逐个迁移并保持导出签名一致
- 运行类型检查确认无破坏
Claude Code 的定位是深度编码产品:它不只是一个补全工具,而是一个能理解项目结构、执行多文件修改的终端智能体。
7. 实战四:LangGraph——编排你的工作流
LangGraph 解决的是「多个步骤如何编排、如何恢复、如何人工介入」的问题。它把 Agent 流程建模成一张有向图。
下面是一个「检索→推理→人工审批→生成报告」的完整示例。
from langgraph.graph import StateGraph, END
from typing import TypedDict, List
class AgentState(TypedDict):
query: str
docs: List[str]
draft: str
approved: bool
1. 定义节点
def retrieve(state: AgentState) -> AgentState:
state["docs"] = search(state["query"])
return state
def reason(state: AgentState) -> AgentState:
state["draft"] = llm.generate(state["query"], state["docs"])
return state
def human_approval(state: AgentState) -> AgentState:
# 中断等待人工审批
return interrupt({"draft": state["draft"]})
def finalize(state: AgentState) -> AgentState:
return {"report": state["draft"]}
2. 构建图
graph = StateGraph(AgentState)
graph.add_node("retrieve", retrieve)
graph.add_node("reason", reason)
graph.add_node("human", human_approval)
graph.add_node("finalize", finalize)
graph.set_entry_point("retrieve")
graph.add_edge("retrieve", "reason")
graph.add_edge("reason", "human")
graph.add_edge("human", "finalize")
graph.add_edge("finalize", END)
app = graph.compile()
3. 执行并支持恢复
result = app.invoke({"query": "分析Q3营收趋势"})
在 human 节点暂停,人工确认后继续
result = app.invoke(None, config={"resume": True})
LangGraph 的核心价值是工作流编排:它不关心你用哪个模型,也不替你写业务代码,但它能让你把复杂的多步骤流程变成可维护、可恢复的图。
8. 组合实战:产品 + 底盘 + 工作流协同
真实项目中,这三层往往需要组合使用。下面是一个完整的协同架构示例。
# 架构:LangGraph 编排 + Claude Code 执行 + Harness 验证
from langgraph.graph import StateGraph, END
class DevFlowState(TypedDict):
issue: str
patch: str
test_report: str
def plan(state):
# 用 Claude Code 生成修改方案
state["patch"] = claude_code.plan(state["issue"])
return state
def implement(state):
# 用 Claude Code 执行代码修改
state["patch"] = claude_code.apply(state["patch"])
return state
def verify(state):
# 用 DeepSeek Harness 跑回归评测
state["test_report"] = harness.run_suite()
return state
def human_review(state):
return interrupt({"patch": state["patch"]})
构建协同图
flow = StateGraph(DevFlowState)
flow.add_node("plan", plan)
flow.add_node("implement", implement)
flow.add_node("verify", verify)
flow.add_node("review", human_review)
flow.set_entry_point("plan")
flow.add_edge("plan", "implement")
flow.add_edge("implement", "verify")
flow.add_edge("verify", "review")
flow.add_edge("review", END)
app = flow.compile()
这个组合的价值在于:LangGraph 负责流程控制,Claude Code 负责代码执行,Harness 负责质量验证。每一层只做自己最擅长的事。
9. 选型总结:一张图记住
最后用一张对比表收尾,方便你保存。
| 判断维度 | DeepSeek Harness | Codex | Claude Code | LangGraph |
|---|---|---|---|---|
| 层级 | 底盘 | 产品 | 产品 | 工作流 |
| 核心问题 | 模型行不行 | 谁能开箱即用 | 谁能深度重构 | 流程怎么编排 |
| 上手成本 | 中 | 低 | 中 | 高 |
| 适合阶段 | 模型上线前 | 日常开发 | 大型重构 | 复杂 Agent |
| 可组合性 | 可作验证层 | 可作执行层 | 可作执行层 | 可作编排层 |
最终建议:先判断你缺的是产品、底盘还是工作流,再决定选型。如果只是日常写代码,选 Codex 或 Claude Code;如果要评测模型,选 DeepSeek Harness;如果要编排复杂流程,选 LangGraph。多数真实项目,最终会组合使用其中两到三个。
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐



所有评论(0)