news 2026/9/3 7:13:17

2026 Harness架构实战指南:从Agent控制平面到企业级落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026 Harness架构实战指南:从Agent控制平面到企业级落地

2026年吃透Harness架构:从入门到企业级落地的实战指南

如果你最近在逛B站或者刷技术社区,一定会频繁看到“Harness架构”这个词。但打开视频、翻完文章后,很多人反而更困惑了:有人讲它是持续交付平台,有人拿它和Agent放到一起讨论,还有人甚至把它和DeepSeek的某个工具画上等号。到底哪个才是对的?

先说结论:在2026年的技术语境里,Harness架构已经不是单纯指某个CI/CD产品,而是演变成了一套“大模型应用与Agent运行时的控制平面设计思想”。它解决的是一个非常现实的工程问题——当你的系统里出现多个大模型、多个Agent、多个执行步骤时,谁来编排、谁来控制、谁来保证安全和可观测性。如果你正准备做AI大模型应用开发,或者正在思考Agent如何落地到生产环境,这篇文章会帮你理清Harness架构的全貌,并给出可以直接复用的实践路径,让你少走很多弯路。

文章不会停留在概念层面。我会先讲清楚Harness架构的两种主流语境和核心原理,然后把环境搭建、核心流程、完整代码示例、运行验证和常见问题逐个拆开,最后给出企业级落地时的工程建议。

1. Harness架构到底是什么:先分清三种语境

很多人一上来就被“Harness”这个词搞晕了。搜索一下会发现,Harness至少指代三种完全不同的东西。

第一种是持续交付平台Harness。这是Harness公司推出的软件交付平台,主打CI/CD、Feature Flag、云成本管理等功能。在这个语境里,Harness是一个商业产品,和Jenkins、GitLab CI属于同一类工具,核心解决“代码怎么更快更稳地发布到生产环境”的问题。

第二种是AI Agent中的Harness层。这是最近半年到大模型时代频繁出现的概念,指的是一套运行Agent程序的控制框架——它负责管理Agent的输入输出、工具调用、上下文窗口、权限边界和日志追踪。简单理解,Agent是“干活的”,Harness是“管Agent的”。在大模型应用开发中,Harness层承担了类似“操作系统”的角色。

第三种是项目名称为Harness的开源工具。比如DeepSeek生态里有人提到“deepseek harness”,通常指某个针对DeepSeek模型做封装、调度或评测的脚手架工具。这类工具往往是社区的产物,命名上借用了Harness的“控制与执行分离”思想。

这篇文章重点讨论的是第二种和第三种语境交叉的部分:当你使用DeepSeek这类大模型,想把它接进自己的Agent项目时,应该如何设计Harness层。它比单纯调用模型API多了一层工程复杂度,但又没有上升到完整平台的体量,是大多数开发者真正需要掌握的技能。

为什么Harness架构在2026年突然变得重要?因为大模型应用正在从“单个Prompt的问答式应用”走向“多步骤多工具的Agent式应用”。对话式应用只要管理好上下文就行,Agent式应用却要面对工具调用、私有数据访问、权限校验、多轮执行、失败重试、审计追踪等问题。如果没有一层统一的Harness来控制整个执行过程,Agent项目很快会演变成一团乱麻。

2. 核心概念与设计原理:控制与执行分离

Harness架构最核心的设计思想可以概括为一句话:控制和执行分离。控制层负责“决定下一步做什么、由谁来做、做到什么程度算完成”,执行层负责“具体调用哪个模型、哪个工具、哪段代码来完成操作”。这和传统软件开发里的控制反转思想同源,但在Agent场景下被赋予了新的含义。

我们可以用城市交通来做类比。Agent的各种工具调用像是城市里的出租车,每辆车都能跑,但如果没有统一的调度中心,车辆之间会互相抢道、乘客会不知道坐哪辆车、出事故后也找不到责任方。Harness层就是那个调度中心,它不自己开车,但负责安排路线、确认乘客身份、记录每辆车的行驶轨迹、在异常时重新派车。

技术层面,一个标准的Harness架构通常包含如下模块:

模块职责类比
Orchestrator(编排器)决定Agent的执行步骤和流转逻辑调度中心
Executor(执行器)真正调用模型API、工具函数、脚本出租车司机
Tool Registry(工具注册中心)登记和管理Agent可用的所有工具出租车公司车辆名录
Context Manager(上下文管理器)维护整个执行过程中的上下文与状态乘客行程单
Policy & Safety Layer(策略安全层)校验权限、拦截非法操作、控制敏感操作交通规则与警察
Telemetry(可观测性)日志、追踪、指标采集行车记录仪

这六个模块合起来,就是一套完整的Agent Harness。很多人以为Agent项目就是把大模型API和几个函数绑定一下,实际上漏掉的就是这些看不见的模块。

Harness和Agent的区别在哪里?Agent是问题求解的智能体,核心是“决策”;Harness是运行Agent的基础设施,核心是“约束与支撑”。Agent负责想怎么做,Harness负责让它安全、稳定、可追踪地做出来。没有Harness的Agent只能在Demo里跑,有了Harness的Agent才能进生产环境。

再说到DeepSeek在Harness架构中的位置:DeepSeek本身是大模型,是生成语言、判断意图、输出结构化指令的“大脑”。它不负责执行工具,也不负责维护会话状态。所以在一个完整的Harness架构里,DeepSeek通常是Executor模块里的模型提供方,通过API被调用。你可以把DeepSeek换成其他模型,Harness架构本身保持不变,这也是这套设计的价值所在。

3. 环境准备与前置条件

在进入代码之前,先把环境准备好。以下以Python为主语言,因为目前Agent开发生态对Python的支持最成熟。

操作系统与运行环境

  • 操作系统:Windows 10/11、macOS 12+、Linux(Ubuntu 20.04+)均可。本文示例没有特殊系统依赖。
  • Python版本:建议3.10及以上。3.9也能运行,但部分依赖包的新版本已经放弃对3.9的支持。

模型服务

需要准备一个可调用的大模型服务。有两种选择:

  1. 使用DeepSeek官方API,通过HTTPS调用。这种方式最简单,无需本地GPU资源。
  2. 本地部署DeepSeek模型,比如通过Ollama或vLLM加载量化版本。这种方式对硬件有要求,但数据不出内网。

本文示例使用DeepSeek API的通用接口方式,也就是通过OpenAI兼容的接口来调用。这样即使API地址变化,代码逻辑也不需要大改。

依赖安装

pip install openai pydantic python-dotenv requests

版本说明:openai库建议2.x以上,pydantic建议2.x以上。具体版本以安装时最新稳定版为准,本文示例不依赖某个特殊小版本。

项目目录结构

harness-demo/ ├── .env ├── config.yaml ├── harness/ │ ├── __init__.py │ ├── core.py │ ├── executor.py │ ├── tools.py │ └── registry.py ├── agents/ │ ├── __init__.py │ └── customer_service.py └── main.py

这里用模块化方式组织代码,主要是为了让Harness的核心模块与具体业务Agent解耦。后面的代码都会沿着这个目录结构来写。

4. 核心流程拆解:从零搭建一个Harness

写代码之前,先理清设计思路。我们以一个企业常见的“智能客服Agent”场景为例:用户询问订单状态,Agent需要判断用户意图,如果需要查库就调用订单查询工具,最后把查询结果整理成自然语言返回。这是一个最典型的Agent应用,也最适合用来展示Harness架构。

整个搭建过程分为六步:

第一步:定义工具调用协议

工具是Agent的“手”。Agent不能直接执行数据库查询,它只能输出一个结构化的“希望调用某个工具、传入某些参数”的意图。Harness层负责解析这个意图,真正去执行工具函数。所以工具必须先注册,并且具备统一的输入输出格式。

第二步:设计上下文管理器

Agent在运行过程中会产生多轮对话、中间结果、临时变量。这些数据不能散落在各个模块里,需要统一由Context Manager管理。它类似于一个会话级的全局状态对象,但又比普通全局变量多了作用域和生命周期管理。

第三步:实现执行器

Executor负责真正的模型调用。它把用户问题、历史上下文、工具定义传给大模型,然后从大模型的返回中解析出“是需要继续对话,还是该调用工具”。这一步是整个Harness里最容易出问题的地方,因为不同模型对工具调用的返回格式并不完全一致。

第四步:实现编排器

编排器是大脑中的大脑。它决定流程的终止条件——当模型返回结果已经可以直接回答用户时,就停止循环;当模型返回工具调用请求时,就调度执行器去跑工具,然后把工具结果继续交给模型。

第五步:建立安全策略层

企业级应用必须考虑安全边界。哪些工具不能调用、哪些命令不能执行、外部输入是否需要脱敏,都应该在Harness层统一处理。Agent本身不感知这些限制,它只是在Harness设定的安全策略框架内行动。

第六步:配置可观测性

生产环境里,Agent的每一次决策、每一次工具调用都需要日志记录。出了问题才能回溯。Harness层应该在每个关键节点输出结构化的日志,包括时间、步骤、模型输入输出、工具调用结果等。

这六步走完,整个Harness的骨架就出来了。下面进入代码实现。

5. 完整示例代码实现

5.1 配置环境变量

# 文件路径:harness-demo/.env DEEPSEEK_API_KEY=你的API密钥 DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 DEEPSEEK_MODEL=deepseek-chat

这里使用python-dotenv加载环境变量,避免把密钥硬编码在代码里。生产环境建议直接挂到密钥管理系统,不要使用.env文件。

5.2 定义数据模型

# 文件路径:harness-demo/harness/core.py from dataclasses import dataclass, field from typing import Any, Callable, Dict, Optional @dataclass class ToolDefinition: """工具注册时需要的定义信息""" name: str description: str parameters: dict handler: Callable[..., Any] @dataclass class ToolCall: """模型输出的工具调用请求""" id: str name: str arguments: dict @dataclass class ExecutionContext: """上下文管理器:保存整个Agent运行过程中的状态""" session_id: str user_input: str = "" history: list = field(default_factory=list) tool_results: Dict[str, Any] = field(default_factory=dict) metadata: Dict[str, Any] = field(default_factory=dict) def add_tool_result(self, call_id: str, result: Any): self.tool_results[call_id] = result self.history.append({ "type": "tool_result", "call_id": call_id, "result": result })

ExecutionContext是整个Harness的“记忆中枢”。在复杂Agent场景里,它还可以扩展为维护多轮对话的Token用量、权限上下文、用户身份等信息。

5.3 实现工具注册中心

# 文件路径:harness-demo/harness/registry.py from typing import Dict from .core import ToolDefinition class ToolRegistry: """工具注册中心:管理Agent可用的所有工具""" def __init__(self): self._tools: Dict[str, ToolDefinition] = {} def register(self, name: str, description: str, parameters: dict): def decorator(func): self._tools[name] = ToolDefinition( name=name, description=description, parameters=parameters, handler=func ) return func return decorator def get(self, name: str) -> ToolDefinition: if name not in self._tools: raise KeyError(f"工具 {name} 未注册") return self._tools[name] def list_tools(self) -> list: # 提供给模型的工具列表(OpenAI Function Calling格式) tools = [] for name, tool in self._tools.items(): tools.append({ "type": "function", "function": { "name": name, "description": tool.description, "parameters": tool.parameters } }) return tools registry = ToolRegistry()

工具注册中心解决了两个问题:一是让Agent的能力清单集中可见,二是让大模型能够拿到结构化的“我有哪些工具可用”的说明。

5.4 编写一个实际工具

# 文件路径:harness-demo/harness/tools.py from .registry import registry import random import time @registry.register( name="query_order_status", description="根据订单号查询订单当前状态", parameters={ "type": "object", "properties": { "order_id": { "type": "string", "description": "订单号,例如 OD20260101001" } }, "required": ["order_id"] } ) def query_order_status(order_id: str): """模拟查询订单状态。生产环境替换为真实的数据库或外部API调用。""" # 生产环境请替换为真实的数据库或外部API调用,不要使用随机数据 time.sleep(0.1) status_list = ["已发货", "运输中", "已签收", "待支付"] return { "order_id": order_id, "status": random.choice(status_list), "updated_time": time.strftime("%Y-%m-%d %H:%M:%S") }

这里使用了random.choice来模拟状态,只是为了演示。真实项目中必须替换为数据库查询或HTTP请求,否则会得到随机结果。

5.5 实现执行器

# 文件路径:harness-demo/harness/executor.py import json import os from openai import OpenAI from dotenv import load_dotenv from .core import ToolCall load_dotenv() class LLMExecutor: """执行器:负责与大模型交互,解析模型返回""" def __init__(self): self.client = OpenAI( api_key=os.getenv("DEEPSEEK_API_KEY"), base_url=os.getenv("DEEPSEEK_BASE_URL"), ) self.model = os.getenv("DEEPSEEK_MODEL", "deepseek-chat") def chat(self, messages: list, tools: list) -> tuple: """ 调用大模型。 返回 (完成回复, 工具调用列表) """ resp = self.client.chat.completions.create( model=self.model, messages=messages, tools=tools if tools else None, ) choice = resp.choices[0] message = choice.message # 如果message没有content但有tool_calls,content可能是None content = message.content or "" tool_calls = [] if message.tool_calls: for tc in message.tool_calls: tool_calls.append(ToolCall( id=tc.id, name=tc.function.name, arguments=json.loads(tc.function.arguments or "{}") )) return content, tool_calls

执行器是Harness与模型交互的唯一通道。它把OpenAI兼容的接口返回结果转换成统一的ToolCall数据结构,这样上层编排器就不需要关心具体使用的是DeepSeek还是其他模型。

5.6 实现编排器

# 文件路径:harness-demo/harness_orchestrator.py from harness.executor import LLMExecutor from harness.registry import registry from harness.core import ExecutionContext class HarnessOrchestrator: """ 编排器:整个Harness的核心控制层 它决定流程什么时候继续、什么时候停止、什么时候调用工具 """ def __init__(self, system_prompt: str, max_rounds: int = 5): self.executor = LLMExecutor() self.system_prompt = system_prompt self.tool_registry = registry self.max_rounds = max_rounds def run(self, context: ExecutionContext) -> str: messages = [{"role": "system", "content": self.system_prompt}] messages.append({"role": "user", "content": context.user_input}) for round_index in range(self.max_rounds): print(f"[Harness] 第 {round_index + 1} 轮执行") # 调用模型 content, tool_calls = self.executor.chat( messages=messages, tools=self.tool_registry.list_tools() ) # 情况1:模型没有请求调用工具,直接返回文本,流程结束 if not tool_calls: return content # 情况2:模型请求调用工具 for tool_call in tool_calls: print(f"[Harness] 模型请求调用工具: {tool_call.name}") # 安全校验:工具必须存在 try: tool_def = self.tool_registry.get(tool_call.name) except KeyError as e: messages.append({ "role": "assistant", "content": None, "tool_calls": [{ "id": tool_call.id, "type": "function", "function": { "name": tool_call.name, "arguments": json.dumps(tool_call.arguments) } }] }) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": f"错误:{e}" }) continue # 执行工具 try: result = tool_def.handler(**tool_call.arguments) except Exception as e: result = {"error": str(e)} context.add_tool_result(tool_call.id, result) # 把工具执行结果返回给模型 messages.append({ "role": "assistant", "content": None, "tool_calls": [{ "id": tool_call.id, "type": "function", "function": { "name": tool_call.name, "arguments": json.dumps(tool_call.arguments) } }] }) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result, ensure_ascii=False) }) return "已达最大执行轮数,请稍后重试"

编排器里有一个容易被忽略的细节:在把工具结果返回给模型时,需要先把assistant的tool_calls消息写入messages,再写入role为tool的结果消息。一旦这个顺序写反,模型会返回格式错误。

5.7 编写业务Agent入口

# 文件路径:harness-demo/main.py from harness.core import ExecutionContext from harness_orchestrator import HarnessOrchestrator from harness import tools # 确保工具模块被import,触发注册 SYSTEM_PROMPT = """ 你是一个智能客服助手。你可以查询订单状态。 当用户询问订单状态时,调用 query_order_status 工具查询。 如果工具返回错误,请告知用户稍后重试。 回答请使用中文,简洁自然。 """ def main(): user_input = input("请输入问题(例如:帮我查一下订单 OD20260101001 的状态):") context = ExecutionContext( session_id="demo-001", user_input=user_input ) orchestrator = HarnessOrchestrator(system_prompt=SYSTEM_PROMPT) result = orchestrator.run(context) print("\n===== Agent最终回答 =====\n") print(result) print("\n===== 工具调用记录 =====") for record in context.history: if record["type"] == "tool_result": print(f"调用ID: {record['call_id']} -> {record['result']}") if __name__ == "__main__": main()

这里有一个关键要求:from harness import tools必须先于HarnessOrchestrator初始化执行,因为装饰器@registry.register只有在tools模块被导入时才会注册工具。如果tools模块没有被导入,工具注册表就是空的,模型调用工具时会报“工具未注册”的错误。这是新手最容易踩到的问题之一。

6. 运行结果与效果验证

完成代码后,在项目根目录执行:

cd harness-demo python main.py

程序会提示输入问题。输入:

帮我查一下订单 OD20260101001 的状态

预期输出大致如下:

请输入问题(例如:帮我查一下订单 OD20260101001 的状态):帮我查一下订单 OD20260101001 的状态 [Harness] 第 1 轮执行 [Harness] 模型请求调用工具: query_order_status [Harness] 第 2 轮执行 ===== Agent最终回答 ===== 您好,您的订单 OD20260101001 当前状态是:运输中,更新时间为 2026-01-15 14:30:22。 ===== 工具调用记录 ===== 调用ID: call_xxxx -> {'order_id': 'OD20260101001', 'status': '运输中', 'updated_time': '2026-01-15 14:30:22'}

如何判断运行成功?

第一,看是否出现模型请求调用工具的日志。如果没有出现,说明模型认为你的工具描述不够清晰,或者工具注册没有生效。

第二,看最终回答是否包含订单状态信息。如果模型直接说“我是AI,无法查询”,说明工具调用链路断了,需要检查messages的组装顺序。

第三,看工具调用记录里是否有完整结果。如果结果是{'error': ...},说明工具函数本身抛了异常。

如果运行失败,先看报错出现在哪一层。常见的定位思路:模型请求工具时出错,去查执行器;工具调用报错,去查工具函数;结果返回模型后出错,去查消息顺序。按这个思路排查,能快很多。

7. 常见问题与排查思路

| 问题现象 | 可能原因 | 排查方式 | 解决方案 | | --- | --- | --- | --- | | 启动报错:OpenAI客户端初始化失败 | API地址或密钥配置错误 | 打印env中的base_url/key | 检查.env文件,确认API密钥有效 | | 工具未注册,模型调用时报错 | tools模块未被导入 | 在main.py里打印registry.list_tools() | 确保`from harness import tools`在orchestrator初始化之前 | | 模型没有触发工具调用,直接乱答 | 工具描述不清晰,或模型不支持function calling | 检查tools参数是否传给了API | 优化工具description,换成支持函数调用的模型 | | 报错"the agent execution provider did not respond in time" | 模型API请求超时或服务端无响应 | 查看网络连通性、API状态页 | 设置合理的超时时间,增加重试机制 | | 工具参数解析失败 | 模型输出了非法JSON,或参数名不匹配 | 打印tool_call.arguments原始内容 | 在模型中用system prompt强调参数格式,或增加JSON解析容错逻辑 | | 多轮对话时工具结果被混用 | Context Manager没有隔离会话 | 检查ExecutionContext是否按session_id区分 | 将ExecutionContext绑定到每个会话实例 | | 使用本地部署模型时,工具调用返回空 | 本地模型的工具调用能力弱 | 检查模型加载参数,尝试调整temperature | 换用支持tool use的模型版本,或使用更大量级模型 |

排查时要记住一个原则:先看模型输出,再看代码逻辑,最后再看工具实现。很多时候问题不在Harness本身,而是模型在特定场景下没有输出预期的结构化调用,这种情况优化prompt比改代码更有效。

8. 最佳实践与工程建议

Harness架构从Demo走到生产环境,中间还有很长的路。下面这些实践建议,是我认为最值得注意的。

一是安全边界必须前置。Agent项目里最容易犯的错误,是把工具调用权限全部开放给模型。模型虽然聪明,但它并不知道哪些操作在生产环境里是高风险的。核心原则是:高风险动作默认拒绝,即使这个动作看起来不危险。比如删除数据、修改配置、对外发送消息,这些操作都不应该由模型自由调用。可以在Harness层增加一个审批机制,当工具被标记为高风险时,执行前必须经过人工确认。

二是所有外部调用都要有超时和重试机制。网络请求不是100%可靠的,大模型API也可能因为负载高而变慢。Harness层应该为每一次外部调用设置超时时间,默认不建议超过30秒。失败后采用指数退避重试,避免雪崩效应。在企业级项目里,还需要考虑模型API的流控配额,不要无限制地并发调用。

三是可观测性不是事后补的,是架构的一部分。很多Agent项目上线后根本没法排查问题,因为不知道模型当时看到了什么上下文、模型为什么调用某个工具、工具返回了什么数据。标准做法是:在Harness层的每个关键节点打结构化日志,包括时间戳、请求ID、模型名、prompt摘要、tool_calls内容、工具执行耗时、Token消耗等。这样配合全链路追踪系统,才能定位是哪一轮决策出了问题。

四是工具的返回值要清洗。工具返回的数据可能包含敏感信息,比如用户手机号、身份证号、内部错误堆栈。这些数据直接进入模型上下文的Prompt后,一是浪费Token,二是有泄露风险。建议在工具执行后、结果进入模型上下文前,增加一层数据脱敏和精简逻辑。只保留模型回答用户所必需的信息。

五是模型的协作策略要单独设计。如果项目里有多个大模型协作,比如一个模型负责意图识别,另一个模型负责工具调用决策,第三个模型负责最终回答润色,那么Harness层就需要为每个模型单独维护一套上下文,并且在不同模型之间传递结构化数据而不是纯文本。这会显著增加系统复杂度,但也能让不同模型各司其职,取得更好的整体效果。

六是在版本迭代上遵循灰度发布。Harness层本身有代码逻辑的迭代,也有模型配置的变更。新版模型可能改变工具调用行为,导致线上流程出错。建议先切一小部分流量到新版本,对比工具调用成功率、用户满意度等指标,再决定是否全量释放。如果发现问题,还需要有快速回滚的机制。

9. 总结与后续学习方向

通过这篇文章,你应该已经理解了Harness架构在2026年的真正含义:它不是某个固定的产品,而是大模型应用时代“控制与执行分离”的工程范式。它在传统持续交付平台的基础上,演变成了AI Agent系统的核心控制平面。

文章中的代码示例,从数据模型、工具注册、执行器到编排器,完整演示了一个最小可运行的Harness实现。这套代码可以直接作为你学习Agent开发的脚手架,也可以在此基础上扩展成企业内部的服务。关键是要抓住三个核心能力:一是工具的可插拔管理,二是模型调用的统一封装,三是执行过程的可观测性。这三个能力建立起来之后,Agent系统才具备生产环境的雏形。

如果你想继续深入,下一步有几个比较推荐的方向。

第一个方向是学习开源Agent框架的源码,看成熟的框架是怎么做实操的,里面的Harness层和本文示例有什么不同,优势在哪里。第二个方向是研究模型Function Calling机制的原理,把不同模型对工具调用的差异整理成文档,这对生产环境的稳定性非常有帮助。第三个方向是把本文的Harness示例与FastAPI结合,封装成HTTP服务,为Agent增加外部调用入口,这是走向多智能体系统的必经之路。

最后提醒一句:不要把Harness架构想得太高深,它就是一套工程约束。如果一个Agent项目不需要控制、不需要工具管理、不需要观察日志,那它确实不需要Harness。但只要你打算把Agent推向真实业务,这一层就早晚要补上。提前理解和掌握这套结构,是2026年做AI大模型应用开发的必修课。建议收藏这篇文章,搭建自己的第一个Harness架构时按步骤对照执行,能帮你省下大量调试时间。

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

慢速听力训练:利用《Mr. English》提升英语听力理解能力

在英语学习过程中,听力理解能力往往是决定学习效果的关键一环。对于小学高段以上的学生而言,传统的听力材料语速过快、内容脱离生活场景,容易导致挫败感,而过于简单的材料又无法有效提升能力。慢速听力训练作为一种折中方案&#…

作者头像 李华
网站建设 2026/9/3 7:11:02

YOLO打电话检测数据集:VOC格式转换与工业落地实战

简介:本资源是专为计算机视觉目标检测任务设计的高质量VOC格式打电话行为检测数据集,面向YOLO系列模型训练需求,适用于智能监控、行为识别等实际场景中的算法工程师与深度学习初学者。数据集共5364张JPG图像及对应XML标注文件(含1…

作者头像 李华
网站建设 2026/9/3 7:10:59

浏览器原生JSON模块导入:语法、兼容性与工程化实践

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

作者头像 李华
网站建设 2026/9/3 7:08:55

聊聊本地缓存和分布式缓存?

缓存,消息队列,分库分表是高并发解决方案三剑客。 缓存之所以能够让系统“更快”,本质上做到了如下两点: 减小 CPU 消耗 将原来需要实时计算的内容提前算好、把一些公用的数据进行复用,这可以减少 CPU 消耗&#xff0…

作者头像 李华
网站建设 2026/9/3 7:08:05

我如何从零开始掌握 agent 开发

在agent开发学习中,学到的知识运用不起来,不熟练,是我包括大家经常遇到的问题。在经过一个多月的学习后我总结了学习框架与学习方法,供大家参考学习,感觉不错就应用起来吧。 目标:掌握一个知识,…

作者头像 李华
网站建设 2026/9/3 7:07:18

Delphi 12.3数据库连接实战:ZeosDbo 8.0.0安装、配置与跨平台开发指南

简介:本资源是面向Delphi 12.3开发者的ZEOSDBO数据库访问控件包(8.0.0稳定版),专为需要跨数据库统一编程的中高级Windows桌面应用开发者设计,解决标准VCL数据库组件对MySQL、PostgreSQL、Firebird等支持不足、事务与存…

作者头像 李华