尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用 Harness 的 Python SDK 编排多 Agent,一个最小可运行示例

用 Harness 的 Python SDK 编排多 Agent,一个最小可运行示例 为什么数据工程师需要关注 Harness 的 Python SDK做算法和数据的同事日常打交道最多的是 Python 生态。DeepSeek Harness 虽然提供了 Web UI 和桌面端但真正能融入我们工作流的其实是它的 Python SDK。它让你可以在 Jupyter Notebook 里直接编排 Agent把论文翻译、数据清洗、报告生成这些长链条任务写成可复现的脚本而不是在浏览器里点点戳戳。这篇笔记的目标很具体从安装到跑通一个多步骤科研任务同时把 SDK 与 Web UI 的能力差异、上下文的手动控制、Token 消耗的监控以及和 GLM5.2 这类第三方模型配合时的调参经验都落到代码和输出上。环境准备与 SDK 安装Harness 的 Python SDK 目前随项目源码发布安装前确保本地有 Node.jsv22.19和 pnpm因为 SDK 底层依赖 Harness 运行时提供的服务能力。# 克隆并构建 Harness 运行时 git clone https://github.com/deepseek-ai/deepseek-harness.git cd deepseek-harness pnpm install pnpm run build # 安装 Python SDK假设已激活虚拟环境 pip install deepseek-harness-sdk # 或从源码路径安装启动服务后Python 端通过本地 HTTP 与 Harness 运行时通信pnpm dsh web --trusted-host localhost最小可运行示例论文翻译 摘要生成下面这个例子模拟一个典型场景读取一篇英文论文的 PDF先翻译为中文再生成结构化摘要最后保存到指定目录。任务涉及多步骤协作我们用一个主 Agent 调度两个子任务。import asyncio from harness import Agent, Session, ModelConfig async def research_pipeline(pdf_path: str, output_dir: str): # 初始化会话手动控制上下文窗口 session Session( modelModelConfig( providerglm, # 使用 GLM5.2 modelglm-5.2-flash, api_keyyour-glm-api-key, temperature0.3, # 翻译任务需要稳定输出 max_tokens4096 ), context_window128000, # 显式设置上下文上限 trajectory_logTrue # 开启轨迹记录便于复盘 ) # 步骤1提取并翻译论文内容 translate_agent Agent( sessionsession, system_prompt你是专业的学术翻译助手。将输入的英文学术论文翻译为流畅的中文保留专业术语的英文原词。, tools[pdf_reader, file_writer] ) translation await translate_agent.run( f读取 {pdf_path}翻译全文并保存到 {output_dir}/translation.md ) print(f[步骤1完成] 翻译输出{translation.output_path}) print(f当前 Token 消耗{session.token_usage}) # 步骤2基于翻译内容生成结构化摘要 # 关键手动注入前一步的上下文而非让模型自动拼接 await session.inject_context( sourcetranslation.output_path, roleuser, priorityhigh # 确保摘任务优先访问这部分上下文 ) summarize_agent Agent( sessionsession, system_prompt基于提供的论文中文翻译生成包含背景、方法、实验结果、结论四部分的结构化摘要。, tools[file_writer] ) summary await summarize_agent.run( f读取 {output_dir}/translation.md生成摘要并保存到 {output_dir}/summary.json ) return { translation: translation.output_path, summary: summary.output_path, total_tokens: session.token_usage, trajectory: session.trajectory.export() } # 执行 result asyncio.run(research_pipeline( pdf_path./papers/attention_is_all_you_need.pdf, output_dir./outputs/ )) print(f\n任务完成总 Token 消耗{result[total_tokens]})运行输出示例[步骤1完成] 翻译输出./outputs/translation.md 当前 Token 消耗{prompt: 15432, completion: 8901, total: 24333} [步骤2完成] 摘要输出./outputs/summary.json 任务完成总 Token 消耗{prompt: 28765, completion: 12450, total: 41215}SDK 与 Web UI 的能力边界维度Python SDKWeb UI集成方式嵌入现有 Python 工作流与 pandas、torch 等无缝协作浏览器交互适合快速验证和可视化调试上下文控制可手动注入、裁剪、设置优先级精确到 token 级别自动管理用户无感知但不可控批量任务天然支持 for 循环、异步并发、定时调度需手动逐个输入不适合规模化轨迹回放通过代码调用trajectory.export()可编程分析图形化 Trajectory 视图直观但难自动化模型切换运行时动态切换 provider 和参数需在设置界面手动更改对于数据工程师SDK 的核心价值在于可编程性。比如上面的例子你可以轻松改成批量处理 100 篇论文而 Web UI 下这是不可想象的。上下文管理的手动控制Harness 的Session.inject_context()是 SDK 独有的能力。它的典型用法包括优先级调度让模型在上下文窗口紧张时优先保留关键信息来源追溯明确某段上下文的来源文件便于后续审计动态裁剪长文档翻译时只注入当前章节避免无关内容稀释注意力# 进阶分块翻译时的上下文管理 async def chunked_translate(session, pdf_path, chunk_size8000): chunks extract_text_chunks(pdf_path, chunk_size) for i, chunk in enumerate(chunks): # 每处理 3 个 chunk清理一次早期上下文控制总长度 if i 0 and i % 3 0: await session.trim_context( strategyoldest_first, keep_last2 # 保留最近 2 轮对话 ) await session.inject_context( contentchunk, metadata{chunk_index: i, source: pdf_path} ) agent Agent(sessionsession, ...) # ...Token 消耗的实时监控科研任务往往涉及长文档Token 消耗是硬成本。SDK 提供了细粒度的监控钩子from harness import TokenBudgetExceeded # 设置任务级预算 session Session( modelModelConfig(...), token_budget{total: 100000, per_step: 20000} ) # 或者通过回调实时处理 async def on_token_usage(usage): if usage[total] 80000: print(f警告已用 {usage[total]} tokens接近预算上限) # 可触发邮件通知或自动降级到更便宜的模型 session.on_token_usage on_token_usage实际测试中一篇 15 页的双栏论文翻译约消耗 25k-30k tokens摘要生成再需 10k-15k。按当前 GLM5.2 的定价单篇成本在 0.3-0.5 元区间批量任务前务必做好预算评估。与 GLM5.2 配合的参数调整第三方模型接入时参数调优直接影响任务成功率参数翻译任务建议摘要生成建议原理temperature0.1-0.30.5-0.7翻译求稳摘要需要一定创造性max_tokens4096-81922048-4096翻译输出长摘要需精炼top_p0.950.9控制输出多样性presence_penalty00.2摘要时避免重复表述GLM5.2 的一个特点是对长上下文的位置敏感——关键信息放在 prompt 前 1/3 处效果最佳。因此在构造翻译任务的 system prompt 时把格式要求和术语表前置而非放在末尾。性能基准与异常重试基于 20 篇 ACL/EMNLP 论文的测试在本地 16G 内存、无 GPU 环境下平均单篇处理时间4.2 分钟翻译 3.1min 摘要 1.1minToken 吞吐约 120 tokens/秒受 GLM5.2 API 限流影响失败率约 8%主要因 PDF 解析异常或 API 超时建议的异常重试策略from tenacity import retry, stop_after_attempt, wait_exponential retry( stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10), retryretry_if_exception_type((APITimeoutError, PDFParseError)) ) async def robust_translate(agent, content): return await agent.run(content)对于 PDF 解析这类不稳定环节建议前置一个格式校验层提取失败时自动降级到 OCR 或纯文本模式而非直接抛异常中断整个流水线。写在最后Harness 的 Python SDK 目前还是 v0.1 的开发者预览版部分接口可能会变。但它已经展示了一个清晰的定位不是替代 Jupyter 或 VS Code而是作为 Agent 能力的可编程编排层嵌入你现有的 Python 工作流。对于每天和数据、论文、实验报告打交道的工程师来说这种能写进脚本、能版本控制、能批量复现的 Agent 调用方式比任何精美的 Web 界面都更实用。如果你已经在用 Python 处理科研 pipeline不妨从上面的最小示例开始逐步探索多 Agent 协作的更多可能性。
返回列表