news 2026/9/6 5:52:17

DeepSeek Harness 插件化架构:从零到生产级 AI 应用开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek Harness 插件化架构:从零到生产级 AI 应用开发实践

DeepSeek Harness 的官方宣传片用一句话概括了整套设计理念:一切皆插件,用解构来建构。插件化本身不是新概念,IDE、浏览器、构建工具都靠它扩展能力,但把它放到 AI 应用开发框架中,含义会具体很多:模型接入、提示词管理、工具调用、数据源、评估策略都不再是写死在业务代码里的模块,而是可以被独立开发、单独注册、按需装配的插件单元。本文从这套理念出发,先讲 Harness 的插件架构和工作机制,再讲环境准备与安装,接着实现一个最小插件,最后梳理常见问题排查和生产化改造路径。如果你正在做 agent 应用、模型工作流,或者需要把多个模型能力组装到一个统一入口,这套思路可以帮助你降低模块之间的耦合。文中所有命令和代码示例用于说明设计思路,落地前需要根据你下载到的实际版本、包名和目录结构做调整。

1. 先理解“一切皆插件”:Harness 想解决什么问题

1.1 传统 AI 应用开发里的耦合问题

直接调用模型接口开发一个智能问答工具,早期看起来并不复杂:写一个方法,传入用户问题,返回模型输出。但随着功能增多,问题会逐渐暴露。

第一类问题是模型层耦合。业务代码里到处出现model.chat(),今天接的是 A 模型,明天要换 B 模型,或者要同时支持 C 模型做路由,就得改所有调用点。如果再把温度、最大 token 数、系统提示词也散落在各处,改动范围会进一步扩大。

第二类问题是工具和上下文耦合。Agent 场景下,模型需要调用搜索、查数据库、读写文件、执行代码。这些工具如果直接写在业务代码里,每新增一个工具,都要重新发布整个服务,而且工具之间的权限、超时、错误处理往往很难统一管理。

第三类问题是评估和调试耦合。开发阶段要对比不同提示词、不同模型参数的效果,如果每次对比都要改代码重启,验证成本会非常高。

这些痛点指向同一个结论:AI 应用需要的不是一个功能堆叠的入口,而是一套能够把能力拆开、再按场景组装的基础设施。DeepSeek Harness 选择用“一切皆插件”来回应这个问题。

1.2 Harness 的定位:插件宿主,而不是业务框架

Harness 这个词在英文里有“挽具、控制装置”的意思,放到软件里通常表示一个承载和调度其他组件的运行环境。DeepSeek Harness 的核心定位不是替开发者写业务逻辑,而是做插件宿主:

  • 它负责发现插件、读取插件描述、加载插件代码。
  • 它负责管理插件生命周期:注册、激活、调用、停用。
  • 它负责向插件暴露扩展点,让插件能力可以挂到框架的固定插槽上。
  • 它负责插件之间的通信,推荐通过宿主事件或服务引用完成,而不是插件直接互相 import。

“一切皆插件”是指,凡是外围能力,都可以作为插件接入。模型连接器是插件,提示词模板是插件,工具函数是插件,数据源适配器是插件,评估器也是插件。框架本身保持精简,能力靠插件叠加。

1.3 “用解构来建构”到底指什么

“用解构来建构”可以拆成两个动作。

解构,是在设计阶段把完整需求拆成最小能力单元。比如一个 RAG 问答应用,可以拆成文档加载、文本切分、向量化、检索、重排序、提示词组织、模型调用、答案格式校验。每个单元只做一件事,通过扩展点定义输入输出。

建构,是在运行阶段把这些单元重新装配成完整能力。装配顺序可以是命令行参数,可以是配置文件,也可以是可视化编排界面。插件单元本身不关心最终服务长什么样,它们只承诺“我能处理什么输入,产出什么输出,依赖哪些扩展点”。

这种架构最大的好处是替换成本低。要换向量化模型,只换一个插件;要调整问答提示词,只改提示词插件;要把模型接入从单模型改成多模型路由,新增一个路由插件。业务主流程不需要跟着大改。

角度传统硬编码方式插件化方式
模型接入业务代码直接调用模型 SDK模型插件实现统一接口,业务只面对抽象
新增能力修改业务代码并重新发布新增插件,注册启用
提示词管理散落在代码和配置中提示词插件统一管理模板和变量
验证方式代码改动后整体回归插件级验证,按需加载
故障影响单个模块异常可能导致整体不可用插件异常被宿主隔离,主流程仍然可控制

2. 整体架构:插件、扩展点与宿主是如何协作的

2.1 三个核心概念

理解 DeepSeek Harness 的架构,先要分清三个角色。

宿主(Host):负责启动、扫描、加载和管理插件的进程。宿主本身不实现具体业务,但它提供扩展点注册表、事件总线、配置中心和日志接口。

扩展点(Extension Point):宿主定义好的插槽,声明了“这里可以接入什么能力”。例如模型调用扩展点、工具调用扩展点、文本处理扩展点。插件的职责是选择一个或多个扩展点,并提供对应实现。

插件(Plugin):实现扩展点的独立单元。一个插件至少包含插件描述文件(manifest)和实现代码。它可以只实现一个扩展点,也可以实现多个。

这三者的关系可以类比成 USB 接口:宿主是电脑,扩展点是 USB 接口标准,插件是 U 盘、键盘或摄像头。只要接口协议一致,设备可以被随时替换。

2.2 插件生命周期

一个插件从进入系统到最终停用,通常经历以下阶段:

INSTALLED -> RESOLVED -> REGISTERED -> ACTIVE -> DISABLED/UNINSTALLED
  • INSTALLED:插件文件被复制到宿主管理的插件目录,但还没有被解析。
  • RESOLVED:宿主读取 manifest,解析依赖和扩展点声明,检查版本是否匹配。
  • REGISTERED:插件代码被加载,插件实例被创建,并把自己提供的扩展点注册到宿主。
  • ACTIVE:宿主要求插件激活,插件完成初始化操作,准备接收调用。
  • DISABLED:插件被停用,资源被释放,但文件仍然保留。
  • UNINSTALLED:插件被卸载,文件被移除。

需要注意,加载和激活不是一回事。加载插件只是让宿主知道自己有什么能力,激活才会真正初始化连接、读取配置、拉起后台任务。一个插件即使被加载,也可以保持未激活状态,从而减少资源占用。

2.3 解构与建构在运行期如何完成

解构在开发期完成,表现为插件 manifest 中的扩展点声明:

extensionPoints: - id: "model.chat" inputSchema: "ChatRequest" outputSchema: "ChatResponse" - id: "tool.search" inputSchema: "SearchRequest" outputSchema: "SearchResult"

建构在运行期完成,表现为宿主按规则装配插件:

assembly: route: "model.chat" using: - plugin: "deepseek-standard" version: ">=0.4.0" - plugin: "prompt-qa"

宿主读取到装配规则后,会查找满足版本要求的插件,激活它们,并把对应扩展点的实现注入到运行链路中。

2.4 最小配置目录示意

一个典型的 DeepSeek Harness 项目目录大概长这样:

harness-project/ config/ harness.yaml assembly.yaml plugins/ deepseek-standard/ prompt-qa/ text-summary/ data/ prompts/ outputs/ logs/

其中harness.yaml是宿主本身的配置,assembly.yaml描述当前服务要装配哪些插件,plugins/目录放插件源码或符号链接。

3. 环境准备与安装:学习环境这样快速跑通

3.1 需要准备的基础环境

安装前先确认基础环境。由于 DeepSeek Harness 的插件机制与语言运行时强相关,下面以最常见的 Python 生态为例说明。如果你使用的是 Node.js 或桌面版安装包,命令会不同,但思路一致。

项目学习环境建议说明
操作系统Windows 10/11、macOS、主流 Linux 发行版桌面版对 Windows 用户更友好
语言运行时Python 3.10 及以上插件示例代码基于 Python
包管理工具pip,建议使用虚拟环境避免污染系统 Python
磁盘空间预留至少 2GB包含依赖和示例数据
网络能访问模型 API 和插件仓库安装插件和调用模型需要

这里要特别说明:不同版本的 DeepSeek Harness 对 Python 版本、操作系统和依赖库的要求可能不一样。如果原始安装文档没有明确版本,落地前先到项目发布页确认支持矩阵,不要直接使用最新版 Python 或最新版依赖,否则可能遇到二进制包不兼容的问题。

3.2 安装 Harness 主程序

以 Python 生态为例,常见安装方式有两种。

方式一,使用包管理器:

# 示例命令,具体包名以项目发布说明为准 pip install deepseek-harness

方式二,从源码安装:

git clone <官方仓库地址> cd deepseek-harness python -m venv .venv source .venv/bin/activate pip install -e .

源码安装适合需要阅读实现、修改宿主行为或开发插件作为主项目的场景。普通使用优先用包管理器,安装快,升级方便。

安装完成后,执行:

deepseek-harness --version deepseek-harness plugin list

第一条命令显示宿主版本,第二条命令列出当前已安装的插件。如果两条命令都能正常输出,说明主程序已可用。

3.3 初始化插件目录

创建一个新的 Harness 项目:

deepseek-harness init my-harness-project cd my-harness-project

init 会在当前目录下生成默认配置、插件目录和日志目录。此时可以运行:

deepseek-harness run --help

查看当前版本支持哪些子命令。

注意:学习环境的目标是尽快跑通 demo.mp4 里演示的最小链路:安装主程序、加载一个插件、调用一次完整流程。不要一上来就追求复杂的生产配置。

3.4 学习环境与生产环境的差异

维度学习环境生产环境
安装方式当前用户安装,虚拟环境独立服务账号,锁定版本,使用容器或系统服务
配置本地 yaml 文件配置外置,支持环境变量和配置中心
插件来源本地目录、示例插件私有插件仓库,做依赖锁定和签名校验
日志控制台输出统一日志采集,按 request_id 串联
异常处理直接打印堆栈按错误码分类,接入告警
监控插件加载耗时、调用量、错误率、资源占用

学习阶段可以把所有配置写在 yaml 文件里,生产环境则要考虑配置变更、回滚、权限分离和插件隔离。许多团队在 demo 阶段跑得很顺利,一进生产就出现“配置不生效”“插件加载失败”“内存持续上涨”的问题,根源往往不是插件本身,而是缺少运行时治理手段。

4. 开发第一个自定义插件:从 manifest 到业务代码

4.1 明确插件要做什么

本节实现一个文本摘要插件。它的作用是:输入一段文本和一个长度限制,输出截取后的摘要文本。这个例子足够小,能完整展示 manifest、插件类、注册、启用、调用的全过程,又不会牵涉太多模型 API 细节。

如果希望更贴近 DeepSeek 场景,可以在插件里改成调用模型 API 做语义摘要,核心代码结构不变,只是summarize方法里的实现从字符串截取换成模型请求。

4.2 插件目录结构

在项目根目录下创建插件源码目录:

plugins/ text-summary/ manifest.yaml plugin.py README.md

manifest.yaml描述插件元信息,plugin.py是插件实现,README.md记录注意事项。推荐每个插件独立目录,这样后续打包、发布、版本管理都清晰。

4.3 编写 manifest.yaml

name: text-summary version: 0.1.0 description: "A minimal text summarization plugin." entry: plugin.py extensionPoints: - id: "text.summarize" inputSchema: text: string max_length: integer outputSchema: result: string config: max_length: type: integer default: 120 description: "Maximum length of summary text."

字段说明:

字段作用说明
name插件唯一标识建议使用短横线命名,与目录名一致
version插件版本号升级插件时递增
entry入口文件宿主从该文件加载插件类
extensionPoints声明插件提供的扩展点包含扩展点 id 和输入输出描述
config插件可读配置字段类型、默认值和说明

manifest 是宿主导航的依据。如果 manifest 写错,宿主可能根本无法加载插件,因此它是排查问题时最先检查的文件。

4.4 编写 plugin.py

from harness import Plugin class TextSummaryPlugin(Plugin): name = "text-summary" version = "0.1.0" def __init__(self): self.max_length = 120 def register(self, host): # 把文本摘要能力挂到宿主暴露的扩展点上 host.provide("text.summarize", self.summarize) def activate(self, config): # 插件被启用时读取配置 max_length = config.get("max_length") if max_length: self.max_length = int(max_length) def summarize(self, text: str, max_length: int = None) -> dict: limit = max_length or self.max_length if len(text) <= limit: result = text else: result = text[:limit].rstrip() + "..." return {"result": result} def deactivate(self): # 插件停用时释放资源 self.max_length = 120

这个示例里的host.provide是注册动作,告诉宿主“我已经实现了 text.summarize 这个扩展点”。activate在插件启用时执行,适合做资源初始化和配置加载。deactivate在插件停用时执行,适合释放连接。

实际项目中,插件不应该只处理字符串截取。如果要接入模型,summarize内部会构造模型请求、设置超时、处理异常,并把模型返回内容包装成统一结果结构。

4.5 注册、启用和调用

如果是本地开发,可以直接把插件安装到当前项目:

deepseek-harness plugin install ./plugins/text-summary deepseek-harness plugin enable text-summary

执行后可以通过 list 命令确认插件状态:

deepseek-harness plugin list

预期输出中,text-summary状态应该是ACTIVE。如果状态为RESOLVED但没有激活,检查是否执行了 enable,以及activate是否抛异常。

调用插件提供的扩展点:

deepseek-harness run text.summarize \ --input-text "这是一段较长的中文文本,用于演示字符串截取逻辑。" \ --max-length 10

预期返回:

{ "result": "这是一段较长的中文..." }

这说明插件已经真正跑通了注册、加载、激活、调用、返回的全链路。

4.6 关键参数说明

参数含义默认值调大影响调小影响推荐场景
max_length摘要最大长度120返回内容更完整,但可能超出前端展示区域返回更短,信息密度下降按调用方需求动态传入
插件版本号决定依赖匹配0.1.0升级后需要宿主重新解析依赖可能不满足其他插件依赖约束每次发布递增

这个示例中,max_length同时出现在 manifest 和调用参数里,是因为 manifest 中的配置起到默认值作用,调用参数可以在运行时覆盖默认值。

5. 从“接模型”到“拼工作流”:常见插件场景

5.1 模型接入插件

模型接入插件是所有 Harness 应用里最基础的插件。它把不同模型提供方的 API 地址、鉴权方式、模型名称、请求参数封装到统一接口后面。

一个模型插件需要处理:

  • 统一请求格式:把用户输入、历史消息、系统提示词组合成模型需要的请求体。
  • 鉴权信息注入:从宿主配置或环境变量读取密钥,不在插件里硬编码。
  • 超时和重试:区分网络超时、限流错误、模型返回格式错误。
  • 流式返回:对话场景往往需要流式输出,插件要支持流式迭代器。

切换模型时,只需要替换插件配置,不需要改业务代码。这正是“一切皆插件”在模型层最直观的收益。

5.2 提示词管理插件

提示词不是简单的字符串拼接,它涉及模板变量、版本管理、不同任务的差异处理。

提示词插件可以提供:

  • 模板渲染能力:根据输入变量生成最终提示词。
  • 模板版本能力:同一个任务可以保留多个版本的提示词,方便 A/B 对比。
  • 动态指令能力:当输入是代码时切换代码解释指令,当输入是文档时切换总结指令。

这样,提示词的变更就可以在不修改插件代码的情况下完成,只需替换模板文件。

5.3 工具调用插件

Agent 场景下的核心难点是让模型使用工具。工具调用插件把外部能力统一成“工具函数注册表”,比如:

  • 搜索工具
  • SQL 查询工具
  • 文件读取工具
  • HTTP 请求工具
  • 代码执行工具

宿主可以对这些工具统一做权限控制、调用审计、超时限制和并发控制。插件本身只负责描述工具的能力和参数,宿主负责安全策略。这里要特别提醒:文件读取、代码执行这类能力涉及安全边界,生产环境要严格控制允许的路径、角色和命令白名单,不能随意开放给所有用户。

5.4 数据源与评估插件

RAG 应用需要数据源插件,评估应用需要评估指标插件。数据源插件负责文档加载、切分、向量化、检索;评估插件负责准确率、召回率、回答相关性等指标计算。它们都以扩展点方式与主流程解耦。

插件类型核心职责典型输入典型输出开发复杂度
模型接入封装模型 APIChatRequestChatResponse
提示词管理渲染和管理提示词模板任务类型、变量渲染后的提示词
工具调用把外部能力注册为工具ToolRequestToolResult
数据源加载和处理数据原始文档切分后的文本块
评估计算质量指标模型输出、参考答案指标分数

5.5 插件市场与生态管理

DeepSeek Harness 的热搜词里频繁出现“插件市场”和“推荐的插件市场”,说明很多用户需要的不是自己写插件,而是直接安装社区已有的能力。

安装第三方插件前,建议先做三项检查:

  • 插件是否声明了它需要的权限范围。
  • 插件是否来自可信维护者或官方仓库。
  • 插件是否锁定了版本和依赖范围。

插件市场降低了使用门槛,但也引入了供应链风险。生产环境不要直接从不可信渠道安装插件,至少要锁定版本并在测试环境完整验证。

6. 常见问题与排查路径

6.1 插件加载失败或扫描不到

现象:执行deepseek-harness plugin list看不到刚放入plugins/目录的插件。

排查顺序:

  1. 确认插件目录是否在宿主扫描范围内。有些版本要求把插件放在项目根目录的plugins/下,有些支持通过配置指定额外目录。
  2. 确认 manifest 文件名是否正确。通常要求是manifest.yamlmanifest.yml
  3. 用 YAML 校验工具检查 manifest 格式,缩进错误会导致解析失败。
  4. 确认entry指向的文件存在,并且文件内确实定义了插件类。
  5. 查看宿主日志中是否有解析错误。错误信息通常会指明具体文件和行号。

常见错误写法:

name: text-summary version: 0.1.0 entry: plugin.py ExtensionPoints: # 大小写错误 - ...

正确写法:

extensionPoints: - ...

6.2 插件启用后报错

现象:插件能被扫描到,但执行 enable 时失败,或者 enable 后状态仍是 RESOLVED。

可能原因:

  • activate方法里抛出了异常。
  • 插件依赖的扩展点在当前宿主或其它插件中不存在。
  • 配置项类型不合法,例如读取到的max_length是字符串,直接参与数值计算时报错。

处理建议:

  • 单独运行插件入口文件,排查 import 错误。
  • activate里打印 config 内容,确认配置是否完整。
  • 先停用所有插件,然后逐个启用,定位是哪个插件导致失败。
  • 如果activate里要连接外部服务,确认服务地址、端口、超时时间都正确。

6.3 调用插件方法时返回结果不符合预期

现象:插件已激活,调用扩展点也能返回,但结果是空值或旧数据。

排查路径:

  1. 检查是调用了新的扩展点实例,还是之前注册的旧实例。某些场景下宿主会缓存插件实例,修改代码后需要重启宿主进程。
  2. 检查参数名大小写是否正确。示例中的max_length如果传成maxLength,插件内部可能取不到值,回落到默认值。
  3. 检查插件是否处于 ACTIVE 状态。如果插件只是 REGISTERED,method 可能还未绑定。
问题现象常见原因检查方式处理建议
插件扫描不到目录不在扫描范围或 manifest 错误plugin list和 YAML 校验调整目录,修正 manifest
启用失败activate 抛异常查看宿主日志修复初始化代码
配置不生效参数名不匹配或使用默认值在插件中打印 config统一参数名和类型
返回结果旧修改代码后未重启宿主确认进程启动时间重启或触发 reload
版本冲突插件依赖版本与宿主不兼容查看依赖解析日志锁定版本范围

本节最后给出一个通用排错命令组合:

# 查看宿主日志 deepseek-harness logs --tail 100 # 查看插件详情,包括状态和配置 deepseek-harness plugin inspect text-summary # 查看所有扩展点注册情况 deepseek-harness extension list

这些命令能帮助你在“黑盒猜测”之前先拿到事实。

7. 生产环境建议与扩展方向

7.1 从 demo 到生产需要补齐哪些能力

demo.mp4 中的演示只完成了“插件能跑”的验证。真实生产环境还需要考虑:

  • 配置外置化:把模型密钥、插件开关、评估阈值等参数放到环境变量或配置中心,避免发布时修改 yaml。
  • 日志与链路追踪:每次调用生成 request_id,插件在处理过程中透传该 id,方便检索调用链路。
  • 插件隔离:插件共享进程可能导致一个插件的内存泄漏拖垮整个服务,必要时使用独立进程或容器部署插件。
  • 版本锁定:记录主程序版本、插件版本、依赖库版本,形成可回滚的发布快照。
  • 权限控制:定义插件可以访问的资源范围,尤其是文件读写、网络请求和命令执行能力。
  • 回滚策略:新插件版本出问题时,能够快速切换到上一版本。

7.2 插件设计最佳实践

写插件时不要把“能跑”当作完成标准。以下几条实践能显著降低维护成本。

第一,保持单一职责。一个插件只解决一个问题。文本摘要插件不要同时兼顾文件上传和数据库存储。插件越内聚,越容易被复用和替换。

第二,manifest 写清楚输入输出。输入输出 schema 不仅是文档,也是宿主校验和编排的依据。含糊的 schema 会导致插件组合时才发现类型不匹配。

第三,不要在插件里硬编码路径和密钥。路径交给宿主配置,密钥通过环境变量注入,插件只读取配置接口。

第四,插件间不要直接相互调用。如果插件 A 需要插件 B 的功能,应当通过宿主注册的扩展点调用,这样替换实现时不需要修改调用方。

第五,正确释放资源。deactivate方法里要关闭连接、停止定时任务、清理临时文件。插件长期运行时的内存上涨,很多是因为停用后资源没有释放。

第六,给插件写冒烟测试。至少覆盖正常输入、边界长度、空输入和异常输入四种情况。如果插件要调用外部 API,mock 掉 API 响应,保证测试可重复。

7.3 扩展方向:从命令行到可视化编排

热搜词中反复出现“deepseek harness studio”和“桌面版”,说明社区对可视化插件编排有很强需求。

从命令行跑通插件链路后,可以继续探索:

  • 把多个插件串联成一个工作流,用 assembly 配置描述执行顺序。
  • 在桌面版中可视化查看插件状态、扩展点连接关系和调用链路。
  • 把常用插件沉淀为团队内部插件市场,统一维护版本和权限。
  • 阅读源码,理解宿主扫描、加载、激活的具体实现,掌握二次开发能力。

学习路径建议按顺序推进:

  1. 跑通一个最小插件示例,理解 manifest 和插件类的关系。
  2. 修改现有插件参数,观察配置和调用结果的变化。
  3. 编写第二个插件,并通过扩展点调用第一个插件的能力。
  4. 把插件放到独立目录,模拟多人协作的插件开发流程。
  5. 阅读宿主日志和扩展点注册列表,建立排错直觉。
  6. 再决定是否做插件市场或基于 Harness 封装团队内部框架。

DeepSeek Harness 真正值得借鉴的不只是某个 API 的用法,而是“一切皆插件、用解构来建构”的模块化思路。它把 AI 应用开发从“改一个大服务”变成“组装一组小插件”,让模型、提示词、工具、数据源和评估策略各自独立演进。实际项目中,建议先用一个最小功能验证这种解耦是否真的带来效率提升,再逐步把核心流程改造成插件化结构。这样既能控制改造风险,也能在演进过程中真正理解“解构”与“建构”的边界在哪里。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 5:51:58

东崎AI208X智能温控仪表:选型、接线、调试与行业应用全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 5:50:58

二次元学习陪伴插件“猫娘计划“:AI应用架构与工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 5:50:52

基于YOLOv8与PyQt5的头盔佩戴检测系统开发实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 5:50:15

整流桥工作原理与选型实战:从AC到DC的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 5:44:34

C# 学生信息卡

题目描述 创建一个 Student 类&#xff0c;用于管理学生基本信息与成绩。要求所有数据变更必须经过安全验证&#xff0c;不允许非法状态出现。必须实现的字段 字段 类型 要求 Name string get; set;&#xff0c;set 时验证不能为空或空字符串&#xff0c;否则抛出 ArgumentExc…

作者头像 李华
网站建设 2026/9/6 5:40:59

AI Agent全栈工程师实战指南:从知识库到工具调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华