(四)比LangChain更优雅?DeepSeek Harness的插件化Agent设计
四比LangChain更优雅DeepSeek Harness的插件化Agent设计项目地址https://github.com/deepseek-ai/deepseek-harness⭐ 88,000 Stars | MIT License | 语言TypeScript开篇当LangChain还在链式调用时Harness已经插件化了如果你用过LangChain一定熟悉这样的代码fromlangchainimportOpenAI,LLMChain,PromptTemplatefromlangchain.chainsimportSimpleSequentialChain# 定义链llmOpenAI(temperature0.7)templatePromptTemplate(...)chainLLMChain(llmllm,prompttemplate)# 串起来overall_chainSimpleSequentialChain(chains[chain1,chain2,chain3])resultoverall_chain.run(input)链式调用——这是LangChain的核心抽象。但问题是一旦业务复杂起来链会变成一团乱麻。你想替换其中一个环节可能要重写整个链。DeepSeek Harness的做法完全不同没有链只有插件。一、两种设计哲学的根本差异1.1 LangChain链式组合Input → [Prompt] → [LLM] → [OutputParser] → [Tool] → Output ↑___________链式调用_____________↑特点组件通过链硬编码组合数据流向固定扩展需要继承/重写Chain类1.2 Harness插件化事件驱动Event: turn/start ↓ Plugin A (拦截/修改) ↓ Plugin B (处理) ↓ Event: turn/end特点组件通过事件松耦合数据流由事件驱动动态可配扩展只需注册新插件二、Harness插件系统的三大核心机制2.1 Context上下文插件的共享内存Harness中插件不直接调用彼此而是通过Context交换数据// 插件A提供服务ctx.provide(llm,newDeepSeekAdapter())// 插件B消费服务constllmctx.inject(llm)对比LangChainLangChain组件直接实例化依赖new Chain(dependency)Harness依赖通过Context注入运行时动态绑定2.2 Lifecycle生命周期插件的出生到死亡Harness的每个插件都有完整的生命周期exportdefaultclassMyPluginextendsService{asyncsetup(){// 初始化注册事件监听、分配资源this.ctx.on(turn/start,this.handleTurnStart)}asyncstart(){// 启动开始处理业务}asyncstop(){// 停止清理资源this.ctx.off(turn/start,this.handleTurnStart)}asyncdispose(){// 销毁完全释放}}关键能力热加载scope.plugin(MyPlugin)立即生效热卸载scope.dispose()完全清理无内存泄漏可逆性卸载后状态回到加载前对比LangChainLangChain链一旦构建无法动态增删组件Harness运行时随时插拔插件2.3 Event事件插件的通信协议Harness使用事件总线实现插件间通信// 发布事件ctx.emit(agent/message,{role:user,content:Hello})// 订阅事件ctx.on(agent/message,async(msg){console.log(收到消息:,msg.content)})四种事件模式模式说明用途emit广播不等待日志、通知parallel并行执行独立副作用serial串行执行有序处理bail返回首个非空策略选择waterfall可拦截修改中间件waterfall是Harness的杀手锏// 拦截并修改LLM请求ctx.on(llm/request,async(request,next){// 修改请求参数request.temperature0.5// 继续传播或调用next()returnnext(request)})对比LangChainLangChain通过回调函数callbacks实现拦截但只能观察不能修改Harnesswaterfall事件允许完全拦截和修改数据流三、实战对比实现一个日志记录功能3.1 LangChain方式fromlangchain.callbacksimportBaseCallbackHandlerclassLoggingHandler(BaseCallbackHandler):defon_llm_start(self,serialized,prompts,**kwargs):print(f[LOG] LLM调用开始:{prompts})defon_llm_end(self,response,**kwargs):print(f[LOG] LLM调用结束:{response})# 使用每个Chain都要手动传入chainLLMChain(llmllm,promptprompt,callbacks[LoggingHandler()]# ← 每个链都要加)问题每个Chain都要手动注入callback无法修改数据只能观察回调顺序不可控3.2 Harness方式exportdefaultclassLoggingPluginextendsService{setup(){// 拦截LLM请求事件this.ctx.on(llm/request,async(req,next){console.log([LOG] LLM请求:,req.messages)returnnext(req)// 继续执行})// 拦截LLM响应事件this.ctx.on(llm/response,async(res){console.log([LOG] LLM响应:,res.content)})}}// 使用注册一次全局生效ctx.plugin(LoggingPlugin)优势注册一次所有Agent生效可以修改请求/响应通过事件优先级控制顺序四、Harness插件的超能力Seam交换这是Harness独有的设计——能力边界Capability Seam。4.1 什么是Seam想象你在开发一个Agent需要执行Shell命令// 默认本地执行ctx.provide(shell,newLocalShellProvider())现在你想把Agent部署到云端但又不想改代码。Harness的做法// 换成云端执行其他代码完全不变ctx.provide(shell,newE2BCloudProvider())Seam的三角色Service Definition接口定义interface IShellProvider实现者LocalShellProvider、E2BCloudProviderConsumer使用者BashTool、FileEditor等4.2 对比LangChain的工具替换LangChain中替换工具# 原来tools[ShellTool(),FileTool()]# 改成云端需要重写每个ToolclassCloudShellTool(BaseTool):def_run(self,command):returncall_e2b_api(command)# 每个工具都要改tools[CloudShellTool(),CloudFileTool()]Harness中替换// 只需要换Provider所有Consumer自动切换ctx.provide(shell,newE2BProvider())// 一行代码这就是优雅的差距。五、性能对比谁更快指标LangChainHarness启动时间快直接实例化稍慢需初始化插件系统运行时扩展需重启热插拔内存占用低无运行时开销稍高事件总线复杂场景性能链式调用栈深事件驱动扁平化结论简单场景LangChain更快复杂/动态场景Harness架构更优六、什么时候选LangChain什么时候选Harness选LangChain如果你快速原型验证团队熟悉Python需求相对固定不想引入运行时复杂度选Harness如果你需要高度可扩展需求经常变化想构建Agent平台而非单个Agent需要热加载/热卸载能力重视代码可维护性七、Harness插件开发实战7.1 最小插件示例// plugins/hello.tsimport{Service,Context}fromcordisexportdefaultclassHelloPluginextendsService{constructor(ctx:Context){super(ctx,hello)}asyncsetup(){// 注册一个命令this.ctx.command(hello).action(()Hello from plugin!)}}7.2 插件配置# cordis.patch.ymlplugins:hello:# 插件配置greeting:Hi there!7.3 加载插件npx deepseek-ai/dsh web--patch./cordis.patch.yml结语插件化是Agent框架的未来吗LangChain的链式调用是命令式编程——你告诉计算机先做这个再做那个。Harness的插件化事件驱动是声明式编程——你定义当这个发生时做那个具体怎么流转由框架决定。在简单场景下命令式更直观。但在复杂场景下声明式的可组合性、可扩展性、可维护性优势明显。DeepSeek Harness用88K Stars证明插件化不是过度设计而是Agent框架的进化方向。下一篇预告五DeepSeek Harness来了一个让你自己「拼」出AI Agent的开源神器我们将进入实战环节手把手教你用Harness搭建第一个Agent。本文是「DeepSeek Harness源码分析」系列第4篇系列共100篇涵盖架构、源码、实战全流程。

相关新闻

1-11-奇偶排序-OddEvenSort

1-11-奇偶排序-OddEvenSort

奇偶排序 (Odd-Even Sort):可并行的冒泡变体 摘要:本文从冒泡排序"串行比较导致无法并行加速"的局限出发,图解奇偶排序如何通过"交替比较奇偶索引对"实现天然并行化。给出了支持升序/降序的 Python 完整实现(…

2026/8/23 23:14:33 阅读更多 →
紧急故障 —— 产品生命周期管理系统之六

紧急故障 —— 产品生命周期管理系统之六

王磊正在联办给小型电脑装系统,突然被叫到车间,“王磊,设备的网络怎么不通了?”经理问道。王磊看到第二台设备已经组装完成,并且用一根网线连到了车间的交换机上。他想起了几天前提的IP冲突的问题,“经理&a…

2026/8/23 23:14:33 阅读更多 →
GEO内容日历30天执行计划:生成式引擎引用机制实证研究

GEO内容日历30天执行计划:生成式引擎引用机制实证研究

文章目录 一、问题背景:AI引用机制与传统SEO的断裂 二、机制拆解:生成式引擎如何选择引用来源 三、技术实现:基于Python的GEO效果追踪与分析框架 四、数据验证:引用率提升的量化实验设计与结果 五、踩坑记录:GEO执行中的典型失败模式与规避策略 六、总结:建立可持续迭代的…

2026/8/23 23:14:33 阅读更多 →

最新新闻

程序员金三银四求职攻略:从技术栈到薪资谈判

程序员金三银四求职攻略:从技术栈到薪资谈判

1. 程序员求职季生存指南每年三四月份被业内称为"金三银四",这段时间企业释放的HC数量通常是全年的30%-40%。我经历过7次跳槽季,见过有人用两周拿下5个offer,也见过简历石沉大海的案例。这个时间段就像程序员界的"双十一"…

2026/8/24 6:39:19 阅读更多 →
从启动程序到根文件系统的排障怎样留下有效证据

从启动程序到根文件系统的排障怎样留下有效证据

从启动程序到根文件系统的排障怎样留下有效证据 1. 启动卡死在 init 进程:没有任何崩溃 Dump 的现场 在手动构建嵌入式 Linux 系统(从 U-Boot 引导程序、Linux 内核到 RootFS 根文件系统)的过程中,最让人头疼的是这种无字死机&…

2026/8/24 6:39:19 阅读更多 →
资源受限微控制器环境的性能数据该怎么看

资源受限微控制器环境的性能数据该怎么看

资源受限微控制器环境的性能数据该怎么看 1. CoreMark 跑分很高,现场数据帧依然大量丢包 在 MCU 芯片选型与方案验证阶段,研发团队经常被宣称的“高性能跑分”所误导。某物联网网关项目选用了一款主频高达 240MHz 的 RISC-V 32 位 MCU,离线运…

2026/8/24 6:39:19 阅读更多 →
资源受限无人机集群通感一体化:基于MARL的联合优化与协同决策

资源受限无人机集群通感一体化:基于MARL的联合优化与协同决策

1. 项目概述:当无人机网络既要“传”又要“看”最近在搞一个挺有意思的项目,叫JCAS-MARL。名字听起来有点唬人,但拆开来看就清晰了:JointCommunicationAndSensing,意思是“通感一体化”;Multi-AgentReinfor…

2026/8/24 6:39:19 阅读更多 →
内核驱动与板级支持包移植从最小可用方案搭起

内核驱动与板级支持包移植从最小可用方案搭起

内核驱动与板级支持包移植从最小可用方案搭起 1. 卡死在 Starting kernel... 后无串口输出的盲走现场 在拿到一块全新设计的 SOC 嵌入式主板进行 Linux 内核与 BSP 移植时,开发人员经常遇到这样一个让人绝望的现象: U-Boot 2024.01 (Aug 23 2026 - 10:00…

2026/8/24 6:39:19 阅读更多 →
MCU日志输出全攻略:从printf到SWO与自定义框架的嵌入式调试实践

MCU日志输出全攻略:从printf到SWO与自定义框架的嵌入式调试实践

1. 项目概述:MCU日志输出的核心价值与挑战在嵌入式开发,尤其是基于MCU的项目中,调试和问题追踪是贯穿整个开发周期乃至产品生命周期的核心活动。很多开发者,尤其是刚入行的朋友,可能习惯了在PC上用printf打印信息&…

2026/8/24 6:38:18 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →