首页 › LLM大语言模型 › Deepseek › DeepSeek Harnrss 实战手册 › 第 10 章 实战:把知识串成能力

第 10 章 实战:把知识串成能力

案例 A:让 Harness 自动修复失败的测试​

场景:你有一个出问题的仓库,想快速知道 agent 能不能自己定位并修复。​

做法(无头模式,适合 CI 和本地一次运行):​

​

代码块​

Plain Text

dsh --profile headless "run the test suite, analyze the failures, fix them, then rerun to confirm"​

​

看点:​

•

agent 会先读仓库、跑测试、看失败输出;​

•

它在工作区里改文件,是真实操作——所以请用 git checkout 或可丢弃的副本;​

•

跑完后,用 --dump-config 检查它实际用到的配置层。​

进阶:把这条命令放进 GitHub Actions,PR 时自动让 agent 试修一遍并附上报告。​

案例 B:用 Python SDK 批量处理多个仓库​

场景:10 个仓库都要"升级依赖并跑通测试",人工逐个做很费时。​

做法(第 5 章批量例子的完整版):​

​

代码块​

Plain Text

from pathlib import Path​

from deepseek_harness import DeepSeekHarness​

​

repos = {​

"svc-auth": "Upgrade all dependencies to latest compatible, run tests, fix issues.",​

"svc-billing": "Upgrade all dependencies to latest compatible, run tests, fix issues.",​

"svc-notify": "Upgrade all dependencies to latest compatible, run tests, fix issues.",​

}​

​

with DeepSeekHarness(​

provider="deepseek-official",​

model="deepseek-v4-flash",​

cwd="/workspaces",​

session_root="/sessions",​

cordis=Path("minimal.cordis.yml").resolve(),​

) as harness:​

for repo, task in repos.items():​

result = harness.run(task, session_id=repo)​

print(f"### {repo}\n{result.final_response}")​

​

看点:​

•

每个仓库独立 session id,Bash 状态和对话互不污染;​

•

/sessions 下每个 session 一份 JSONL,出事可以回放"模型到底看到了什么、干了什么";​

•

别忘了:这个组合默认 danger-full-access,务必在容器或可丢弃环境里跑。​

案例 C:给 Harness 加一个"文档检索"工具​

场景:你有一个内部知识库,想让 agent 回答问题时能查文档,而不是瞎猜。​

思路:写一个工具插件,execute 里调用你的检索服务(比如向量库或 Elasticsearch),返回命中片段。模型会在需要时自动调用它。​

骨架:​

​

代码块​

Plain Text

import type { Context } from '@deepseek-ai/cordis'​

import { defineTool } from '@deepseek-ai/dsh-tools'​

​

export const name = 'docs-search'​

export const inject = ['tools']​

​

export function apply(ctx: Context) {​

ctx.tools.register(defineTool({​

name: 'search_docs',​

description: 'Search internal docs and return relevant snippets.',​

parameters: {​

query: { type: 'string', required: true, description: 'Search query' },​

limit: { type: 'number', description: 'Max results, default 5' },​

},​

output: {​

schema: { type: 'array', items: { type: 'string' } },​

render: (_args, value) => [{ type: 'text', text: value.join('\n---\n') }],​

},​

async execute(args) {​

// 在这里调用你的检索服务​

return fetchSearch(args.query, args.limit ?? 5)​

},​

}))​

}​

​

关键设计:​

•

output.render 把检索结果渲染成模型可读的文本——这是"模型体验"的落点;​

•

检索服务的地址、密钥等做成配置字段(第 7 章的约定),别硬编码;​

•

需要权限审批的操作,可以在 tools/pre-execute 事件上做策略。​

效果:agent 遇到"某某接口怎么用"时,会先 search_docs,再基于检索结果回答,比裸模型的幻觉率低一个量级。​

案例 D(彩蛋):做一个"自动化研究循环"​

社区里已经有 Loops(auto-research) 类插件:让 agent 自己规划步骤、反复搜索、产出报告。原理其实就是本书第 9 章说的——**在 agent/* 事件上挂一个"续跑"策略**:只要目标未完成且预算未耗尽,就让轮次继续。​

想动手的话,从 docs/agent-lifecycle.md 和 docs/subsystems/core.md 读起,那里有续跑机制的完整说明。​

本章小结​

•

无头模式适合"一次性的真实修复",配合 git/CI 使用;​

•

Python SDK 适合"批量编排",session id 是状态边界;​

•

工具插件是给模型"接世界"的标准姿势,检索类工具能显著降低幻觉;​

•

更复杂的自动化(循环、研究、编排)本质都是在事件扩展点上做策略。​

下一章:生态、坑和 FAQ——让你少走弯路。​

​