ARTICLE DETAIL

资讯详情

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

DeepSeek Harness:构建可验证的自动化AI编程闭环

DeepSeek Harness:构建可验证的自动化AI编程闭环 很多人用 DeepSeek打开网页或 IDE 插件问一句“帮我写个排序算法”把代码复制进项目运行报错了再贴回去问。这个流程在简单任务上很好用但一旦任务变成“实现一个带测试的模块”“给十几个接口补异常处理”“修复 CI 上的随机失败”对话式 AI 就撑不住了上下文越来越乱生成的代码没有人真正跑过改到一半还经常把之前的功能改坏。问题不在于 DeepSeek 的能力而在于使用方式。把模型当聊天窗口用它只是一支会说话的笔把模型放进“任务定义、生成、执行、验证、反馈、提交”的闭环里它才真正变成能交付结果的开发协作者。这个闭环就是本文要讲的 Harness 思路而 Vibe Coding 则是驱动这个闭环最自然的人机协作姿势。先说判断DeepSeek Harness 并不是某个神秘的桌面插件也不是换一个模型入口那么简单。它本质上是一种工程模式——用代码把 AI 的生成能力约束在可执行、可验证、可回滚的工作流中。谁先理解这一点谁就能从“让 AI 写代码片段”升级到“让 AI 完成一个任务单元”。下面的内容会从 Harness、Agent、Vibe Coding 三者的概念对比讲起然后带你用 DeepSeek API 和 GitHub Actions 搭出一个最小可运行的 Harness 工作流。全程包含完整代码、预期输出、常见报错排查和工程建议。读完你至少能实现一个“生成代码 → 自动执行测试 → 失败反馈 → 自动修复 → 提交结果”的闭环。1. 这篇文章真正要解决的问题1.1 聊天式 AI 的三个硬伤先复盘一下大多数人的 DeepSeek 用法打开对话框输入任务描述复制代码运行有错再复制错误信息回去问。这种模式有三个明显的硬伤。第一个是上下文失控。DeepSeek 的上下文窗口再大也经不住多轮“稍微改一下”“不对是这里报错”“你再看看第 30 行”式的拉扯。任务越接近真实项目背景信息越多模型就越容易顾此失彼最后给出的代码跟项目风格、依赖版本、目录结构完全脱节。第二个是没有执行环境。模型只会生成文本它不知道自己写的代码能不能跑。你贴一段“应该能用的函数”它永远回答“应该没问题”。除非你把这段代码真正丢进 Python 解释器、pytest、编译器或者 CI 里跑一遍否则所有的“应该”都只是猜测。聊天窗口恰恰缺少这层验证。第三个是不可回滚。AI 改完代码以后你很难精准知道它改了什么、为什么改、改坏了对不对。项目越大这种“黑盒修改”越危险。如果 AI 在无意识中删掉了某个分支逻辑而你恰好没有做版本管理排查起来会比手写代码更痛苦。1.2 Harness 补上的是哪块拼图Harness 的英文原意是“挽具、安全带”用在 AI 工程里就是指“给模型戴上安全绳把它固定在一条可控的轨道上执行任务”。对比聊天窗口Harness 工作流至少多出四样东西约束模型每一步的输入、输出格式、工具范围都是确定的。反馈模型生成的代码会被真实执行执行结果会作为下一轮的依据。校验有自动测试、lint、编译检查等硬性门槛。回滚所有变更先产生补丁或 commit出问题可以退回。这四样东西合在一起解决的根本问题是让模型从“生成者”变成“被验证的执行者”。生成者只对文本负责执行者必须对结果负责。1.3 什么样的读者应该读这篇文章想用 DeepSeek 处理真实项目任务而不是只写零散代码片段的开发者。正在了解 Vibe Coding、Agent 编程但不确定怎么落地的技术团队。已经在用 GitHub Actions 或类似 CI 工具想给自动化流程加入 AI 能力的工程师。如果你只是想找一个“输入需求就出来完整项目”的工具这篇文章会让你失望。因为现实里不存在那样的好东西只有一套把模型、执行环境、反馈机制组合起来的方法论。2. 核心概念Harness、Agent 与 Vibe Coding 的关系在展开实操之前先把三个高频词讲透。网上很多人把这几个词混在一起用实际上它们描述的是不同层面的东西。2.1 三个概念一句话理解Agent智能体让 AI 自主规划任务、调用工具、决定先做什么后做什么。核心特征是“自主决策”。Harness约束流程为 AI 定义好执行轨道比如输入什么、调用什么工具、怎样的结果算成功、失败后怎么处理。核心特征是“受控可靠”。Vibe Coding氛围编程一种人机协作节奏开发者用自然语言持续给 AI 描述需求、感受和反馈AI 连续生成修改人的主要精力放在判断方向上。核心特征是“快速反馈、持续迭代”。2.2 Harness 与 Agent 到底有什么区别两者不是对立关系而是侧重不同。这里用一个表格说清楚对比维度AgentHarness决策方式模型自己规划步骤人在流程中预先定义步骤工具调用模型自主决定何时调用流程规定在哪个节点调用失败处理模型尝试自行纠错流程触发重试、回滚或告警可预测性较低依赖模型能力较高边界清晰适用阶段探索型任务可重复、可验收的生产任务一个比较形象的类比是Agent 相当于把车钥匙交给 AI让它自己找路开过去Harness 相当于在赛道上装好护栏、转弯标志和刹车系统AI 仍然在驾驶但偏离轨道时会立刻被拉回来。2.3 DeepSeek Harness 到底是什么从社区和真实项目实践来看“DeepSeek Harness”通常指一类工作流以 DeepSeek 模型为核心结合任务编排、代码执行、反馈校验等机制把一次完整的软件任务封装成可重复运行的流程。有些开源项目把这类流程做成 CLI、插件或桌面客户端所以你会看到各种名称和入口但它们背后的骨架是同一条模型 API 执行环境 反馈循环。因此如果有人告诉你“装了某个 DeepSeek Harness 桌面版就万事大吉”建议先冷静下来看两件事第一它是否只换了 API 入口而没有真正加入执行验证环节第二它的代码和配置是否透明模型权限边界是否清晰。把 Harness 理解成“工程模式”而不是“某个软件”你的判断力会高很多。2.4 Vibe Coding 的正确姿势Vibe Coding 这个词最近很火但很多人理解成了“完全放手让 AI 乱写人负责欣赏”。这是对它的误读。真正能落地的 Vibe Coding 有三条纪律小步骤推进。一次只让 AI 完成一个小的、可验证的任务而不是丢给它整个项目。闭环验证。AI 每给出一个版本你至少运行一次测试或构建把真实结果反馈回去。人控方向。AI 负责生成细节实现你负责判断“这个方向对不对”“这次改动是否引入风险”。本文后面的示例就是把这三条纪律变成自动化脚本模型生成代码pytest 执行验证失败信息自动反馈模型自己修。你只需要在成功门槛满足后确认提交。3. 环境准备与前置条件动手搭建之前先确认环境。下表是完整清单依赖项用途说明DeepSeek API Key调用模型在 DeepSeek 开放平台申请按 token 计费Python 3.10 及以上运行示例脚本也可替换为 Node 或其他语言本文使用 Pythonrequests / pytest调用 API、执行测试通过 pip 安装Git 仓库承接生成结果本地仓库或 GitHub 仓库皆可GitHub Actions做云端 Harness需要 GitHub 仓库和 secrets 配置3.1 DeepSeek API 配置要点DeepSeek 对外提供 OpenAI 兼容的接口这意味着你不需要引入专属 SDK只要配置好三个参数就能调用API Key在平台后台创建请求时放在 Authorization 请求头。Base URL官方兼容端点常见写法是https://api.deepseek.com/v1也有文档写https://api.deepseek.com具体以官方最新文档为准如果某个端点返回 404换另一个试试。模型名官方接口常用deepseek-chat需要更强推理能力时可选deepseek-reasoner。模型名不要照抄社区里来路不明的叫法只认官方模型名。一个基础原则不要把 API Key 写进代码或提交到 Git 仓库。本地开发用环境变量云端流程用 CI 的 secrets 机制。3.2 本地环境校验安装依赖pip install requests pytest设置环境变量Windows 可使用set命令Linux/macOS 使用exportexport DEEPSEEK_API_KEY你的API Key然后运行一个最小请求脚本确认 API 连通性。4. 核心流程拆解从聊天窗口到 Harness 工作流把一次“让 AI 生成并交付代码”的任务拆开你会看到 Harness 解决的不只是“生成”环节而是覆盖全流程的编排。下面用表格列出核心阶段阶段输入输出关键动作常见失败点任务定义自然语言需求结构化任务描述拆小、明确验收标准任务太大无法验证模型生成任务描述 上下文代码文本要求输出格式明确输出内容偏离主题执行验证生成的代码测试报告/错误日志在隔离环境运行环境依赖缺失反馈修复错误日志修复后的代码把日志喂回模型上下文被历史污染提交结果通过验证的代码补丁/commit/PR版本管理、格式化未做回滚保护对一个标准任务来说流程只有五步但每一步都可能失败。Harness 的核心价值就是让每个失败点都有明确的处理策略而不是靠运气祈盼模型一次写对。4.1 任务定义阶段最容易犯的错很多人在这一步就输了。让“实现一个回文判断函数”听起来很简单但它缺少验收标准输入是什么类型空字符串怎么算大小写敏感吗是否需要测试用例没有这些约束模型只能靠猜测写代码后面无论怎么反馈都是盲人摸象。正确的做法是把验收门槛写进系统提示词你是 TDD 工程师。 请实现 is_palindrome(s) 函数并附带 pytest 测试。 要求 1. 输入为字符串输出为布尔值 2. 空字符串视为回文 3. 忽略大小写但保留字符顺序 4. 代码中不要包含 main 调用 5. 只输出 Python 代码块。任务定义越精确后面的执行验证越有意义。4.2 执行验证必须使用真实环境不要相信模型说“这段代码已经测试过了”也不要相信你的眼睛。把生成的代码写入临时文件调用 pytest 或编译器真实跑一遍。这一步筛选出来的错误才是值得反馈给模型的有效信息。反馈时同样要注意信息质量。直接把 2000 行错误日志全部塞回去会让上下文很快膨胀。正确做法是截取失败摘要、堆栈顶部和关键断言语录控制在 2000 字符内并明确要求模型只输出修复后的完整代码。5. 完整示例用 DeepSeek API 搭建一个最小 Harness这一节给出三个可以直接运行的示例。它们按难度递进先验证 API 连通再加入反馈循环最后放进 GitHub Actions 做云端 Harness。5.1 示例一DeepSeek API 最小调用文件路径deepseek_minimal.pyimport os import requests api_key os.environ[DEEPSEEK_API_KEY] url https://api.deepseek.com/v1/chat/completions headers { Authorization: fBearer {api_key}, Content-Type: application/json, } payload { model: deepseek-chat, messages: [ {role: system, content: 你是一个精通 Python 的工程师。}, {role: user, content: 写一个函数判断字符串是否为回文并给出两个测试用例。}, ], temperature: 0.2, max_tokens: 1024, } resp requests.post(url, jsonpayload, headersheaders, timeout120) resp.raise_for_status() data resp.json() print(data[choices][0][message][content])运行命令python deepseek_minimal.py成功时你会看到模型输出的代码和测试用例。如果返回 404把 URL 中的/v1去掉再试如果返回 401先检查环境变量是否注入到了当前终端进程。5.2 示例二带反馈循环的 Harness 脚本这是本文的核心示例。它模拟一个最小 Harness模型生成代码pytest 跑测试失败则把错误信息反馈给模型最多重试 5 轮。文件路径harness_demo.pyimport json import os import re import subprocess import sys import requests DEEPSEEK_API_KEY os.environ[DEEPSEEK_API_KEY] BASE_URL https://api.deepseek.com/v1 MODEL deepseek-chat MAX_ROUNDS 5 OUTPUT_FILE solution.py def ask_deepseek(conversation): url f{BASE_URL}/chat/completions headers {Authorization: fBearer {DEEPSEEK_API_KEY}} payload { model: MODEL, messages: conversation, temperature: 0.2, max_tokens: 2048, } resp requests.post(url, jsonpayload, headersheaders, timeout120) resp.raise_for_status() return resp.json()[choices][0][message][content] def extract_code(text): match re.search(r(?:python)?\s*(.*?), text, re.S) return match.group(1).strip() if match else text.strip() def run_code(code): with open(OUTPUT_FILE, w, encodingutf-8) as f: f.write(code) proc subprocess.run( [sys.executable, -m, pytest, -q, OUTPUT_FILE], capture_outputTrue, textTrue, ) return proc.returncode, proc.stdout proc.stderr system_prompt ( 你是一名 TDD 工程师。 只输出可运行的 Python 代码代码必须包含函数实现和 pytest 测试用例。 不要输出 main 调用不要输出解释性文字不要使用不存在的依赖。 ) task ( 实现 is_palindrome(s) 函数判断字符串是否为回文。 要求忽略大小写空字符串视为回文并附带 pytest 测试。 ) conversation [ {role: system, content: system_prompt}, {role: user, content: task}, ] for round_no in range(1, MAX_ROUNDS 1): print(f[Round {round_no}] 请求模型生成代码...) raw ask_deepseek(conversation) code extract_code(raw) print(f[Round {round_no}] 在隔离环境执行 pytest...) returncode, output run_code(code) if returncode 0: print([PASS] 测试全部通过) with open(OUTPUT_FILE, w, encodingutf-8) as f: f.write(code) break print(f[FAIL] 测试未通过错误信息将反馈给模型) conversation.append({role: assistant, content: raw}) conversation.append( { role: user, content: ( 运行上述代码后测试失败请修复并重新输出完整代码。\n f错误信息\n{output[:2000]} ), } ) else: print([ABORT] 轮次耗尽未得到可用补丁) sys.exit(1)这段代码的逻辑并不复杂但恰好体现了 Harness 的三个关键设计模型从未直接操作真实文件或执行命令它只负责产出文本执行由脚本控制。错误信息形成结构化反馈回路而不是让模型凭感觉乱猜。有最大轮次限制防止无限循环烧光 token。运行命令python harness_demo.py如果本地没有 pytest脚本会在第一轮执行阶段报错如果 API 不可用会在请求阶段报错。无论哪种失败你都能从输出日志里看到具体位置。5.3 示例三把 Harness 工作流放进 GitHub Actions本地循环跑通后下一步把它搬上云端让 Harness 在 CI 环境中执行。这样可以做到任何人推送代码、创建 issue、或者手动触发系统都会自动启动一次 AI 任务。文件路径.github/workflows/deepseek-harness.ymlname: deepseek-harness-demo on: workflow_dispatch: jobs: harness: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkoutv4 - name: 安装 Python uses: actions/setup-pythonv5 with: python-version: 3.12 - name: 安装依赖 run: | pip install requests pytest - name: 运行 Harness 流程 env: DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }} run: python harness_demo.py - name: 提交结果 run: | git config user.name github-actions[bot] git config user.email github-actions[bot]users.noreply.github.com git add solution.py git diff --cached --quiet || git commit -m chore: auto-generate solution by DeepSeek Harness git push使用前需要在 GitHub 仓库的 Settings → Secrets and variables → Actions 中新增一条DEEPSEEK_API_KEY值填你的 API Key。需要注意这个 YAML 把结果直接 push 回触发分支。生产环境的更稳妥做法是改成创建 Pull Request让真人 review 后再合并。最小演示先保证跑通。5.4 三个示例之间的关系用一个图来理解会更清晰示例一验证“模型能答”。示例二验证“模型给出的代码能被自动验证失败还能自修复”。示例三把示例二放进可重复的云环境让整个闭环变成团队可用的流程。从工程角度说示例二才是 Harness 的核心示例三只是给它加了一层“远程运行 权限隔离”的外壳。如果你只能记住一个示例记住示例二就足够了。6. 运行结果与效果验证运行harness_demo.py的预期输出大概是这样的模式[Round 1] 请求模型生成代码... [Round 1] 在隔离环境执行 pytest... [FAIL] 测试未通过错误信息将反馈给模型 [Round 2] 请求模型生成代码... [Round 2] 在隔离环境执行 pytest... [PASS] 测试全部通过最终目录会多出solution.py文件里面是模型生成并经过 pytest 验证的代码和测试用例。判断成功有三个标准脚本最终输出[PASS]退出码为 0。生成的solution.py能被 pytest 独立执行通过。生成代码中不包含硬编码的 API Key、临时路径等环境相关内容。如果失败第一步要看日志中的[FAIL]和[ABORT]标记。[ABORT]意味着模型连续多轮没有交付通过测试的代码这时优先检查任务定义是否太模糊其次检查系统提示是否给定了过严或过松的约束。7. 常见问题与排查思路问题现象可能原因排查方式解决方案请求返回 401API Key 无效或没有注入环境变量检查环境变量是否为空重新生成 Key确认 export 后重启终端请求返回 404Base URL 路径不符合当前接口版本查看错误响应体中的路径提示在/v1和根路径之间切换测试请求超时网络链路不稳定或模型负载过高观察超时时间与响应状态码增大 timeout加入重试与退避策略生成的代码带 Markdown 标记提示中没有约束输出格式打印模型原始返回值在 system prompt 中要求“只输出代码块”pytest 报模块不存在本地依赖未安装查看 pytest 输出首行先执行 pip install pytest无限循环烧 token没有设置最大轮次检查循环条件是否固定增加 MAX_ROUNDS 上限和 token 预算网页插件出现 failed to load plugins插件入口未激活或平台过滤条件不匹配查看插件元数据的 entry 配置和启动日志统一入口命名重装或升级插件版本web boot 显示多入口未激活依赖加载顺序错误或启动策略过严按 boot 日志逐个检查入口状态调整启动顺序跳过不兼容入口这里要特别提醒网上会出现各种“第三方镜像”“桌面端整合包”它们可能修改了 Base URL、模型名甚至私自记录 API Key。建议一律优先使用 DeepSeek 官方接口不要轻信来路不明的封装。代码里的 Base URL 和模型名始终以官方文档为准。8. 最佳实践与工程建议8.1 永远保留人工确认节点Harness 可以自动执行、自动提交但“自动提交”不等于“自动上线”。生产级流程应该让 AI 修改停留在 Pull Request 或补丁阶段由人 review 后合入。CI 里加上测试门槛比任何提示词都有效。8.2 一次任务只验证一件事不要试图让 AI 在一个任务里同时做“重构、加测试、改文档、优化性能”。任务粒度越大验证门槛就越难定义模型就越容易迷失。把“实现回文函数”拆成“实现函数 写测试 跑测试”每个小步骤都是最小可验证单元。8.3 把错误信息做成结构化反馈反馈给模型的错误信息应当包含三部分失败摘要、关键堆栈、预期行为。不要只贴一个截图式的完整日志。实践中可以用一个截断函数统一处理限制在 2000 字符左右既保留关键信息又避免上下文膨胀。8.4 设置硬性预算成本控制是 Harness 落地时绕不开的问题。建议在脚本中显式增加三个预算上限最大轮数、最大 token 数、最大超时时间。轮次耗尽后的策略应该是“失败退出 生成报告”而不是继续消耗 token 做无意义的自愈。8.5 重视安全边界Harness 里的模型应该按最小权限运行不直接访问生产数据库。不在未经授权的服务器上执行命令。不读取包含密钥的配置文件。API Key 只通过环境变量或 secrets 传入。这些边界不是限制模型能力而是保护你自己的系统不被难以预测的文本生成结果破坏。8.6 把 Prompt 模板当成代码管理任务描述、系统提示、反馈模板都是 Harness 的一部分。把它们放入版本控制和代码一起演进。当模型输出质量发生变化时你能快速定位是模型版本问题还是提示变化问题。9. 总结与后续学习方向这篇文章真正想做的是纠正一个普遍误区DeepSeek 的价值不在聊天窗口而在 “DeepSeek Harness 编排 真实执行验证” 的组合。从概念上你知道了 Agent 偏向自主决策Harness 偏向受控流程Vibe Coding 是两者可以共存的协作节奏。从实践上你拿到了一个最小闭环示例模型生成代码pytest 真实执行失败信息自动反馈通过后输出补丁。从工程上你看到了如何把闭环搬进 GitHub Actions以及每一步可能出现的典型故障。建议你接下来的实践顺序是先把示例二在本地跑通理解反馈循环的日志结构。把任务换成你自己项目里的一个小模块比如“补齐某个接口的输入校验 单元测试”。再把流程搬进 CI加上 Pull Request 审查节点。如果继续深入可以关注三个方向一是让模型自动拆解子任务从单轮 Harness 进化到多阶段流水线二是引入代码评测和覆盖率为验证标准而不是只看测试是否通过三是记录每次任务的输入输出日志积累成自己的评估数据集用来比较不同模型和提示词的效果。最后提醒一句所有涉及 API Base URL、模型名、版本号的配置都以 DeepSeek 官方文档为准不要照抄任何第三方整合包里的参数。先跑通最小闭环再谈大规模应用这是 AI 工程化最稳妥的路径。
返回列表