news 2026/8/31 12:08:25

DeepSeek Harness与Cordis插件架构:构建可扩展AI工具链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek Harness与Cordis插件架构:构建可扩展AI工具链

1. 背景与核心概念

1.1 什么是 DeepSeek Harness

先从一个开发场景说起。

最近在折腾 AI 编码工作流时,我经常需要把大模型接入到本地命令行工具中,让模型能够调用终端命令、读取项目文件、执行测试脚本。一开始直接用 Python 脚本调 API,功能倒是能跑通,但随着需求越来越复杂——需要支持多个 Profile、需要动态加载工具、需要让第三方的工具以“插件”形式介入——脚本很快就变得不可维护。

DeepSeek Harness 这类工具链的出现,正是为了解决这个问题。你可以把它理解成一个专门为 DeepSeek 系列模型设计的“工作台”:它把模型能力、工具调用、上下文管理、任务编排封装成统一的运行环境,开发者只需要把精力放在插件逻辑上,而不必每次重复搭建模型调用的底层链路。

简单来说,Harness 的定位是“模型与工具之间的胶水层”。它不像 LangChain 那样强调链式编排,也不像普通 SDK 那样只提供 API 封装,而是更接近一个可扩展的本地运行时:你启动它,它替你管理会话上下文、调用模型、解析工具请求,然后把结果回传给模型。而这一切能力,都被设计成可以通过插件来扩展。

1.2 为什么需要插件架构

如果你只是自己写几个脚本调用 DeepSeek API,确实不需要插件架构。但在下面的场景里,插件架构几乎是必选项:

  • 团队统一使用同一套 Harness,但不同成员需要的工具不同。
  • 你需要把内部系统(数据库、CI、监控平台)接入模型工具链,但又不希望把这些逻辑写死在 Harness 主进程里。
  • 你希望像安装 VSCode 扩展一样,通过命令安装新能力,例如接入代码搜索、接入某个 MCP 服务、加入自定义 Prompt 模板。
  • 你维护多个项目,每个项目依赖不同版本的插件,需要隔离和动态切换。

插件架构的核心价值,是把“稳定的核心”和“易变的功能”分开。核心负责模型调用、事件分发、上下文管理,插件则负责具体的工具实现。这样不但降低了主程序的复杂度,也让生态中的第三方开发者能够参与贡献。

1.3 Cordis 在其中的角色

Cordis 是一个轻量级的 Node.js 插件框架,它的设计目标非常明确:用依赖注入和声明式配置来组织插件系统。它的核心思路是——插件不是被简单“注册”的,而是运行在一个Context之中,Context负责提供各种 Service,插件之间通过事件和 Service 交互。

如果说 DeepSeek Harness 是汽车主体,那 Cordis 就是那套“标准化接口”:它规定了引擎怎么装、方向盘怎么接、仪表盘怎么通信。在 Cordis 的架构下,DeepSeek Harness 的每个插件都能获得独立的生命周期、可复用的 Service 注入、统一的事件总线。这让插件开发者在编写 DeepSeek Harness 插件时,不必关心 Harness 内部实现细节,只需要遵循 Cordis 的插件规范。

本篇文章将围绕“Cordis + DeepSeek Harness 的插件架构”展开,重点分析插件模型、环境搭�建、插件开发、市场管理等几个环节,并给出可以直接运行的示例代码与常见排错思路。

2. 环境准备与版本说明

在开始开发之前,先把环境准备好。DeepSeek Harness 是 Node.js 生态下的工具链,因此你需要先配置 Node.js 和包管理器。

2.1 安装 Node.js 与 pnpm

Cordis 插件体系通常依赖较新的 Node.js 特性(如 ES Module、可选链、原生 fetch),建议使用 Node.js 18 以上版本。如果你还没有安装,可以使用 nvm 管理版本:

# 安装 nvm 后执行 nvm install 20 nvm use 20 node -v npm -v

DeepSeek Harness 官方推荐使用 pnpm 作为包管理器,一方面因为它对 workspace 的支持更好,另一方面在安装 Cordis 依赖时可以避免一些 peerDependency 解析问题。安装 pnpm:

npm install -g pnpm pnpm -v

2.2 安装 DeepSeek Harness

安装 Harness 本身的方式,取决于你使用的版本。以目前社区常见的做法为例,可以通过以下方式初始化一个基于 Harness 的项目:

# 创建项目目录 mkdir dsh-workspace cd dsh-workspace # 初始化 package.json pnpm init # 安装核心依赖(示例思路,需按实际发布的包名调整) pnpm add @dsh/core @dsh/cli

如果你拿到的是桌面版压缩包,通常只需解压后运行启动脚本即可。需要注意的是,DeepSeek Harness 迭代速度较快,不同版本的内置命令和插件 API 可能存在差异,因此本文示例更侧重于架构与配置思路,具体包名和版本号请以官方文档为准。

2.3 环境变量配置

Harness 在调用 DeepSeek 模型时,需要配置 API Key 和模型端点。一般建议通过环境变量注入,避免写死在代码里:

export DEEPSEEK_API_KEY="sk-xxxx" export DEEPSEEK_BASE_URL="https://api.deepseek.com" export DSH_PROFILE="dev"

如果你使用本地部署的 DeepSeek 模型,则可以将DEEPSEEK_BASE_URL指向本地推理服务的地址,例如http://localhost:11434或其他兼容 OpenAI 协议的服务端点。这样,Harness 的工具链和插件机制可以做到“云端模型和本地模型无缝切换”。

3. Cordis 插件架构核心机制

3.1 从依赖注入说起

Cordis 的核心设计可以用一个词概括:依赖注入。传统的模块加载方式,通常是模块 A 直接 require 模块 B,然后调用 B 的函数。这种方式的缺点是 A 和 B 强耦合,测试和替换都比较麻烦。

Cordis 改变了这一模式。在 Cordis 应用中,所有功能都变成 Service,Service 被注册到Context上。插件不需要手动require某个模块,而是通过 Context 实例获取:

// 从 Context 获取 logger 服务 const logger = ctx.logger('my-plugin'); logger.info('plugin started');

这里的关键概念是:

  • Context:整个应用的运行时容器,所有插件和 Service 都挂载在 Context 上。
  • Service:可复用的功能单元,例如日志、数据库连接、HTTP 客户端、模型调用客户端。
  • Plugin:一个功能模块,插件可以消费 Service,也可以注册新的 Service。

这种设计带来的好处很明显:插件不需要关心 Service 是怎么被创建的、生命周期如何管理,只需要在启动时声明“我需要什么”,Cordis 就会在合适的时机把依赖注入过来。

3.2 插件生命周期

Cordis 插件并不是“加载文件”那么简单,它有一个完整的生命周期。理解这个生命周期,对后续排查问题非常有帮助。

通常一个插件会经历以下阶段:

阶段说明常见工作
加载插件代码被导入,模块开始执行解析配置、注册 Schema
应用apply函数被调用,插件真正生效注册命令、监听事件、创建 Service
运行插件持续提供服务响应事件、执行工具调用
卸载插件被移除时执行释放定时器、断开连接、取消监听

在 Cordis 中,插件的基本形态是一个函数或一个对象。最简单的方式是导出一个函数,函数接收Context参数:

// 文件路径:src/plugins/hello.ts import { Context } from 'cordis'; export function apply(ctx: Context) { ctx.on('ready', () => { ctx.logger('hello').info('Hello from DeepSeek Harness plugin!'); }); }

apply函数在插件被加载时调用。如果配置中启用了插件,Cordis 会调用apply,并在应用关闭时自动触发清理。为了在插件卸载时释放资源,你可以返回一个清理函数:

export function apply(ctx: Context) { const timer = setInterval(() => { ctx.logger('heartbeat').info('tick'); }, 5000); // 插件被卸载时执行 return () => { clearInterval(timer); }; }

这种优雅的清理机制,是 Cordis 插件架构相较于普通模块加载最明显的优势之一。

3.3 事件系统与 Service

Cordis 内置了一个简单但强大的事件系统。插件可以订阅事件,也可以派发事件,从而实现插件之间的松耦合通信。

// 订阅事件 ctx.on('tool/request', (payload) => { // 处理工具调用请求 console.log(payload.toolName, payload.args); }); // 派发事件 ctx.emit('tool/response', { ok: true, result: '...' });

在 DeepSeek Harness 的插件架构里,事件系统承担了一个关键职责:把模型的“工具调用意图”转成插件可处理的事件。例如,当模型决定调用一个名为query_database的工具时,Harness 内部会派发事件,订阅了该事件的插件就会收到请求,执行 SQL 查询,然后通过事件把结果返回给 Harness。

Service 则是一类更正式的可复用能力。Cordis 推荐通过定义 Service 来封装跨插件共享的逻辑。例如,多个插件都可能需要调用 DeepSeek 模型,你可以将模型调用封装成一个 Service:

// 文件路径:src/services/deepseek.ts import { Context, Service } from 'cordis'; class DeepSeekService extends Service { constructor(ctx: Context, private config: any) { super(ctx, 'deepseek'); } async chat(messages: any[]) { const response = await fetch(this.config.baseUrl + '/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.config.apiKey}`, }, body: JSON.stringify({ model: this.config.model, messages }), }); return response.json(); } }

这样,任何插件只需要ctx.deepseek.chat(...)就能调用模型,而不需要自己维护 API 请求逻辑。

4. 完整实战:开发一个 DeepSeek Harness 插件

下面我们开发一个完整的插件。这个插件的功能是:向 Harness 注册一个run_shell工具,让 DeepSeek 模型可以请求执行指定的 shell 命令,并获取输出结果。为了防止安全风险,插件默认只允许执行白名单目录下的命令,并加入权限确认机制。

4.1 创建插件工程

我们先基于 pnpm workspace 创建一个插件工程:

# 回到工作区根目录 cd dsh-workspace # 创建插件目录 mkdir plugins cd plugins # 初始化插件 package.json mkdir dsh-plugin-shell cd dsh-plugin-shell pnpm init

修改package.json,声明插件元信息:

{ "name": "dsh-plugin-shell", "version": "0.1.0", "description": "A DeepSeek Harness plugin that provides shell command execution", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "build": "tsc", "dev": "tsc --watch" }, "dependencies": { "cordis": "^3.0.0" }, "devDependencies": { "typescript": "^5.0.0", "@types/node": "^20.0.0" } }

4.2 编写插件入口

插件入口文件负责定义插件的核心逻辑。

// 文件路径:plugins/dsh-plugin-shell/src/index.ts import { Context, Schema } from 'cordis'; import { exec } from 'child_process'; import { promisify } from 'util'; const execAsync = promisify(exec); // 插件的配置 Schema,使用 Cordis 内置的类型校验 export const Config: Schema<Config> = Schema.object({ allowedPaths: Schema.array(Schema.string()).default(['/tmp', process.cwd()]) .description('允许执行命令的目录白名单'), commandTimeout: Schema.number().default(10000) .description('命令执行超时时间(毫秒)'), }); // 插件主函数 export function apply(ctx: Context, config: Config) { ctx.logger('shell'); // 注册工具:run_shell // 在真实 Harness 中,应使用平台注册 API,这里以事件监听示意 ctx.on('tool/run_shell', async (payload, reply) => { const { cwd, command } = payload; // 安全检查:只允许在配置目录下执行 const allowed = config.allowedPaths.some((p) => cwd.startsWith(p)); if (!allowed) { reply({ ok: false, error: `cwd ${cwd} is not allowed` }); return; } try { const { stdout, stderr } = await execAsync(command, { cwd, timeout: config.commandTimeout, maxBuffer: 1024 * 1024 * 10, }); reply({ ok: true, stdout, stderr }); } catch (err) { reply({ ok: false, error: String(err) }); } }); }

这里需要注意几点:

  • 插件接收config参数,这是由 Cordis 根据ConfigSchema 解析后的配置对象。
  • 在真实 Harness 环境中,插件注册工具通常有更正式的 API(比如ctx.tool.register(...)),上述代码使用事件监听的方式演示,方便你理解消息循环的流程。实际开发时请参考目标平台的 SDK 文档。
  • 安全边界非常重要,这里要求执行命令时必须传入cwd,并且只能在该目录在白名单内的情况下执行。

4.3 编写构建配置

为了让 TypeScript 代码能正确编译,需要添加tsconfig.json

{ "compilerOptions": { "target": "ES2020", "module": "CommonJS", "moduleResolution": "node", "declaration": true, "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["src"] }

然后执行编译:

cd plugins/dsh-plugin-shell pnpm install pnpm build

编译后,dist/index.js会被生成,这就是后续 Harness 加载插件时的入口文件。

4.4 在 Harness 中加载插件

插件开发完成之后,需要让 Harness 加载它。通常有两种方式。

方式一:在配置文件中声明插件路径。例如,在dsh.config.yml中:

plugins: - path: ./plugins/dsh-plugin-shell config: allowedPaths: - /tmp - /home/user/projects commandTimeout: 15000

方式二:如果插件已经发布到 npm 或私有 registry,可以通过命令行安装。Harness 类工具通常会提供统一的插件管理命令,社区常见的用法类似:

dsh plugin add dsh-plugin-shell dsh plugin enable dsh-plugin-shell

具体命令名与参数以你使用的 Harness 版本为准。核心思路是一致的:插件的加载过程分为“安装依赖”“注册配置”“启用插件”三个步骤。

4.5 运行与验证

启动 Harness 后,我们应该能够看到插件加载日志,例如:

[shell] plugin started

接下来,向模型发送一个请求,让模型调用run_shell工具。模型会返回工具调用请求,Harness 将其派发给插件。插件执行命令后,把输出结果返回给模型,模型再基于输出生成回答。

例如,用户提问:“列出当前目录下的文件”,模型可能会生成如下工具调用:

{ "tool": "run_shell", "args": { "cwd": "/home/user/projects", "command": "ls -la" } }

插件执行后返回 stdout,模型拿到结果后,自然语言回复用户。整个过程对用户来说是透明的,这就是插件架构带来的体验一致性。

5. 插件市场与配置管理

5.1 添加插件市场

在实际使用中,手工下载插件不是一种可持续的方式。更常见的做法是通过插件市场统一分发。社区实践中,Harness 类工具会提供类似dsh plugin的子命令来管理插件市场。

例如,向当前 Profile 添加一个名为dshmarket的插件市场:

dsh plugin --profile web add dshmarket

这个命令把dshmarket作为插件源添加到web这个 Profile 下面。这样,你后续安装插件时,Harness 会优先从该市场拉取插件信息。

这里的--profile参数体现了一个重要的配置管理思想:不同场景使用不同 Profile。比如你可以维护三个 Profile:

Profile用途插件集
dev本地开发调试调试工具、日志增强、Mock 服务
webWeb 项目开发前端脚手架、代码审查、HTTP 测试
data数据分析SQL 工具、可视化、报表生成

插件按 Profile 隔离,避免一个项目装了一堆无关插件,启动速度变慢,配置也变得更加清晰。

5.2 安装与启用插件

假设我们已经添加了 dshmarket,接下来可以搜索并安装插件:

# 搜索插件 dsh plugin search deepseek # 安装插件 dsh plugin install dsh-plugin-shell # 启用插件 dsh plugin enable dsh-plugin-shell

在 Cordis 架构下,“安装”和“启用”是两件不同的事情。安装只是把插件代码下载到本地,启用才是真正在 Context 中注册并触发apply。这样做的好处是,你可以随时切换启用的插件组合,而不必反复下载依赖。

5.3 配置持久化

插件配置通常会被持久化到配置文件中。Harness 启动时,会先读取配置文件,然后初始化 Context,并按照配置加载插件。

配置管理的常见最佳实践是:

  • 敏感信息(API Key、数据库密码)走环境变量,不写在配置文件中。
  • 插件的非敏感配置写在 Profile 配置中,随项目共享。
  • 不同环境通过环境变量切换 Profile,而不是维护多份配置文件。

例如:

export DSH_PROFILE=production

然后在配置目录下生成dsh.config.production.yml,Harness 会根据 Profile 名称加载对应配置。

6. 常见问题与排查思路

6.1 pnpm 安装依赖时卡住

现象:

deepseek harness 卡在 pnpm dsh web

原因:

安装过程中 pnpm 需要从 npm registry 拉取大量依赖,网络不稳定时容易长时间无响应。另外,Cordis 生态包的 peerDependency 比较多,pnpm 在解析依赖树时也可能出现假死。

排查步骤:

  1. 检查网络连通性,确认 registry 是否可达。
  2. 查看是否使用了公司内部镜像或私有 registry,配置是否正确。
  3. 尝试清理 pnpm 缓存:pnpm store prune
  4. 如果项目里有pnpm-lock.yaml,删除后重新安装,排除 lock 文件冲突。

更稳妥的办法是设置国内镜像源(以实际网络环境为准),或者把依赖安装过程拆成多次执行,避免一次性安装大量依赖。

6.2 插件加载成功但事件不触发

现象:

插件日志显示启动成功,但模型调用工具时没有任何响应。

原因:

最常见的是事件名称不匹配。Harness 内部派发的事件名与你监听的事件名不一致,或者注册工具时使用的插件 API 要求更严格,而你只监听了事件。

排查步骤:

  1. 确认插件监听的名称与 Harness 文档中的工具调用事件名一致。
  2. 开启 Harness 的调试模式,观察事件是否被派发。
  3. 检查插件是否早期 return,导致 reply 没有触发。
  4. 查看是否有另一个插件捕获了同一事件并阻止了后续监听器执行。

6.3 插件执行命令返回权限错误

现象:

run_shell工具返回cwd is not allowed

原因:

插件的allowedPaths配置中未包含目标目录,或配置项没有正确传递给插件。

排查步骤:

  1. 在插件apply中打印config,确认配置值。
  2. 检查目标路径是否包含符号链接,导致startsWith判断失败。
  3. 如果将配置写在 YAML 中,检查缩进是否正确。

解决方案:

plugins: - path: ./plugins/dsh-plugin-shell config: allowedPaths: - /home/user/projects

6.4 Cordis 依赖冲突

现象:

多个插件依赖不同版本的 cordis,启动时报错。

原因:

Cordis 使用全局唯一的Context,如果同一个应用中出现两份 cordis 包,会导致 Service 注册失效。

解决方案:

在 workspace 根目录统一管理 cordis 版本:

pnpm add -w cordis

然后在各插件中配置 peerDependency:

{ "peerDependencies": { "cordis": "^3.0.0" } }

这样,所有插件共享同一个 cordis 实例,避免出现“双 Cordis”的经典问题。

6.5 常见问题速查表

问题现象常见原因解决思路
启动时插件报cannot find module依赖未安装完整在插件目录重新执行pnpm install
模型频繁请求同一个工具Prompt 上下文不清晰在插件描述中明确工具的适用场景和参数
插件执行结果不返回给模型响应格式不对确认 reply 的数据结构与文档要求一致
插件启动时报 Schema 校验失败配置缺少必填项dsh config validate检查配置
SQL 工具执行慢查询耗时较长调大commandTimeout或改用异步任务
DOM 操作白屏前端开发过程中页面异常检查浏览器控制台报错,回退最近安装的前端插件

7. 最佳实践与工程建议

7.1 插件划分粒度

在 Cordis 插件架构中,插件的粒度需要刻意把控。一个插件尽可能只做一件事。例如,数据库工具就只负责 SQL 查询,不要把文件操作、HTTP 请求也塞进去。这样带来的直接收益是:

  • 插件可以独立升级,不影响其他功能。
  • 遇到问题时,定位路径更短。
  • 多个项目可以复用同一批插件,按需自由组合。

7.2 安全边界设计

给大模型开放工具调用权限,是一种非常有价值但风险较高的能力。建议遵循以下原则:

  • 最小权限:插件默认不开放任何能力,只在配置中显式声明。
  • 白名单机制:执行命令时校验目录,访问数据库时限制数据库名和表名。
  • 操作确认:对于删除、更新、写入类操作,在 Harness 中增加人工确认环节。
  • 超时控制:所有工具调用必须设置超时,避免模型循环调用导致资源耗尽。
  • 审计日志:记录每次工具调用的参数和结果,方便问题复盘。

例如,在执行 shell 命令时,限制命令超时和输出大小:

const { stdout, stderr } = await execAsync(command, { cwd, timeout: config.commandTimeout, maxBuffer: 1024 * 1024 * 10, });

7.3 日志与可观测性

插件架构下,问题往往发生在“模型 -> Harness -> 插件 -> 外部系统”这条链路的某个环节。没有日志,排查会非常痛苦。建议在插件关键路径上增加结构化日志:

ctx.logger('shell').debug('executing command', { cwd, command }); ctx.logger('shell').info('command finished', { exitOk: true }); ctx.logger('shell').warn('command timeout, killing process');

日志级别建议这样划分:

级别使用场景
debug详细的参数、中间变量、工具调用入参
info插件启动、命令成功执行、服务注册
warn超时、重试、配置降级
error插件异常、工具调用失败

7.4 配置集中管理

插件的配置项会随着插件数量增长而膨胀。建议约定统一的配置结构,例如:

plugins: shell: enabled: true allowedPaths: [] commandTimeout: 10000 database: enabled: true allowedTables: []

Harness 加载插件时,应该能够自动把shell段的配置传给对应的dsh-plugin-shell插件。这样,所有插件的配置都在一个文件里,可读性和可维护性都会好很多。

7.5 版本与发布策略

插件是代码,就有版本管理的问题。建议在发布插件时遵循语义化版本规范:主版本号变化代表不兼容更新,次版本号代表新增功能,补丁号代表向后兼容的修复。

同时,在插件包中声明与 Cordis 版本的兼容范围:

{ "peerDependencies": { "cordis": ">=3.0.0 <4.0.0" } }

这样,当 Cordis 发布大版本更新时,插件不会因为依赖不匹配而静默失效。

7.6 性能优化

插件数量一多,启动速度和运行性能都可能成为问题。几个优化思路:

  • 插件懒加载:仅在第一次被使用时才初始化,而不是 Harness 启动时全部加载。
  • 异步化:长任务不要阻塞事件循环,尽量使用异步 API。
  • 结果缓存:对于重复的工具调用,可以在插件内部实现简单缓存,减少外部系统压力。
  • 控制并发:大模型可能会并行发起多个工具调用,插件需要处理并发安全问题,尤其是数据库连接和文件写入场景。

8. 总结:插件开发的三个思维转变

写到这里,整个 Cordis + DeepSeek Harness 插件架构已经梳理完毕。最后想强调三个开发思维上的转变。

第一个转变是从“脚本思维”到“服务思维”。不要在插件里把所有逻辑都写在apply函数中,而是把可复用的能力抽象为 Service,让多个插件共享。这样当你有多个插件都需要调用 DeepSeek 模型时,只需要实现一次。

第二个转变是从“调用思维”到“事件思维”。插件不是被 Harness 直接调用的函数库,而是通过事件与 Harness 协作的参与者。模型要调用工具,Harness 派发事件,插件响应事件并返回结果。理解这条消息链路,所有疑难问题都会变得清晰。

第三个转变是从“功能思维”到“安全思维”。给大模型开放工具能力,本质上是在为模型增加“手”,而手可以做好事也可以做坏事。白名单、权限确认、审计日志、超时控制,这些不是可选项,而是生产环境的底线。

接下来你可以继续探索这些方向:如何把插件发布到自己的插件市场,如何使用 Cordis 的 Service 机制封装更复杂的业务能力,如何为插件编写自动化测试,以及如何结合本地部署的 DeepSeek 模型,构建一套完全内网的 AI 工具链。每一步尝试,都会让你对“Harness Engineering”有更深入的理解。

这篇文章的内容比较长,建议先收藏,在真正动手开发插件时再对照查阅。如果你在实践过程中遇到了问题,欢迎在评论区聊聊你的报错信息和排查过程,也许下一次更新就能帮你把坑填平。

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

RTS寻路工程实践:A*、JPS与Wall-tracing的组合优化

简介&#xff1a;这是一份面向游戏开发初学者与中级C程序员的实时战略&#xff08;RTS&#xff09;游戏路径规划实战代码包&#xff0c;聚焦于网格地图下的高效寻路问题&#xff0c;涵盖A*、JPS及JPS三种离散层粗略搜索算法&#xff0c;以及源自《Dota 2》的Wall-tracing连续空…

作者头像 李华
网站建设 2026/8/31 12:07:00

8.3 开发流程与测试方法

邓立国多模态Agent开发必读书《多模态AI Agent开发实践》全文试读~持续更新-CSDN博客 目录 8.3.1 标准化开发流程&#xff08;6步落地&#xff09; 8.3.2 核心测试方法 基于前文的需求分析与架构设计&#xff0c;本节将明确多模态智能体的标准化开发流程&#xff0c;结合指…

作者头像 李华
网站建设 2026/8/31 12:06:51

RAG检索增强生成:RRF融合BM25与向量检索的混合检索实践

在实际的 RAG 检索增强生成问答系统中&#xff0c;检索质量往往比 Prompt 技巧更早决定答案上限。很多项目第一次跑通时&#xff0c;用的是“文档切块 向量化 向量数据库召回 拼接 Prompt 让大模型回答”这条链路。演示环境里效果不错&#xff0c;一旦换成真实知识库&#x…

作者头像 李华
网站建设 2026/8/31 12:05:44

VGPU机箱与高风量机箱怎么选?HAVN HS420对比酷冷HAF 500

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

作者头像 李华
网站建设 2026/8/31 11:59:38

智能体与开源模型落地实践:从选型到部署的六步实操指南

柏林 GTC 的议题还没正式开始&#xff0c;技术社区里围绕“智能体”和“开源模型”的讨论热度已经很高。我的判断很直接&#xff1a;这两个词放在一起&#xff0c;不是又一个概念热点&#xff0c;而是开发方式正在发生的变化。过去我们调模型接口&#xff0c;拿到的只是“一段文…

作者头像 李华
网站建设 2026/8/31 11:59:05

Claude API结构化输出实战:从工具调用到认证备考

这次我们来看 Claude Certified Architect 认证备考路上的硬前置&#xff1a;用 Claude API 把工程化能力补齐。很多人在认证前栽在“API 会调用&#xff0c;但工程化不会做”这个坎上。启动对话没问题&#xff0c;一到流式输出、结构化输出、批量任务、错误处理就卡住。这篇是…

作者头像 李华