news 2026/5/15 10:46:05

TaskWeaver:让大模型通过代码执行连接真实世界数据与系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TaskWeaver:让大模型通过代码执行连接真实世界数据与系统

1. 项目概述:当大模型需要“手”和“眼”

最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:大语言模型(LLM)本身是个“超级大脑”,知识渊博,逻辑清晰,但它没有“手”去执行代码,也没有“眼”去直接读取数据库或调用API。你让它帮你分析一下最近的销售数据趋势,它可能会给你一段完美的分析思路,但数据在哪?怎么获取?它无能为力。这就是所谓的“规划与执行”之间的鸿沟。

微软开源的TaskWeaver,就是为了填平这道鸿沟而生的。你可以把它理解为一个专为LLM打造的“全能执行器”或“代码解释器”。它的核心思想非常直接:让LLM(比如GPT-4、Claude等)专注于它最擅长的“规划”和“逻辑分解”,而把具体的“执行”任务,交给一个安全、可控、可扩展的代码执行环境。TaskWeaver充当中间的“翻译官”和“调度员”,将用户用自然语言描述的复杂任务(例如:“帮我对比上个月和这个月A产品的销售额,并生成一个柱状图”),拆解成一系列可执行的代码片段(可能是Python代码去查询数据库、处理数据,再用matplotlib画图),然后在一个沙箱环境中运行这些代码,最终将结果以文本、图表甚至文件的形式返回给用户。

这不仅仅是另一个简单的“AI Agent”框架。TaskWeaver的独特之处在于其“以代码为核心”的设计哲学。它不满足于让LLM生成一些模糊的指令,而是强制其生成具体、可验证、可复现的代码。这种做法带来了几个显著优势:首先是结果精确可控,代码执行的结果是确定性的;其次是能力边界无限扩展,理论上任何能用代码实现的功能(连接新的数据库、调用内部API、操作特定硬件)都可以通过编写相应的“插件”(在TaskWeaver里叫Plugin)来融入;最后是安全性,代码在沙箱中运行,与主系统隔离,避免了LLM“胡说八道”可能带来的直接风险。

简单来说,如果你正在构建一个需要LLM与真实世界数据、系统进行深度交互的智能应用——比如数据分析助手、自动化报告生成、企业内部知识问答与操作平台——那么TaskWeaver提供了一个极其扎实、企业级的起点。它把天马行空的LLM想法,稳稳地落地成了可运行的代码。

2. 核心架构与设计哲学拆解

要玩转TaskWeaver,不能只停留在调用层面,必须理解其内部是如何运转的。它的架构清晰地分为了三层,这种设计确保了灵活性和安全性。

2.1 三层架构:Planner, Code Interpreter, 与 Plugin System

第一层:Planner(规划器)这是LLM大显身手的地方。Planner的核心职责是理解用户意图,并将一个复杂的自然语言请求,分解成一个结构化的执行计划(Plan)。这个计划不是一个简单的待办列表,而是一个有向无环图(DAG),其中每个节点都是一个Task(任务)。每个Task有明确的输入、输出描述,以及执行它所需要的Plugin(插件)或Code Interpreter(代码解释器)的能力。

例如,用户说:“获取北京和上海过去一周的天气,计算平均温度并告诉我哪里更暖和。” Planner可能会生成这样一个计划:

  1. Task 1: 调用WeatherPlugin,获取北京过去7天的温度列表。
  2. Task 2: 调用WeatherPlugin,获取上海过去7天的温度列表。
  3. Task 3: 调用Code Interpreter,编写一段Python代码,计算两个列表的平均值。
  4. Task 4: 调用Code Interpreter,编写另一段代码,比较两个平均值并生成结论文本。

Planner的提示词(Prompt)工程是这里的核心,它需要引导LLM按照固定的JSON格式输出计划,确保下游组件能够无歧义地解析。

第二层:Code Interpreter(代码解释器)这是TaskWeaver的“执行引擎”。它接收来自Planner的、需要代码执行的Task,通常是一个Python代码片段。Code Interpreter会在一个安全的沙箱环境(例如Docker容器或严格的子进程)中执行这段代码。这个环境是预先配置好的,包含了常用的数据科学库(如pandas, numpy, matplotlib)和TaskWeaver自身的工具函数。

它的关键能力在于“状态管理”。一次对话中,之前执行的代码所创建的变量(比如一个名为df的DataFrame)会保留在会话上下文中,后续的代码可以直接引用。这使得多轮、复杂的交互成为可能,就像在一个持久的Jupyter Notebook会话中一样。

第三层:Plugin System(插件系统)这是TaskWeaver能力扩展的基石。不是所有操作都适合或需要用裸代码从头编写。对于常见的、封装好的操作,比如发送邮件、查询数据库、调用第三方API,就应该实现为Plugin。一个Plugin由三部分组成:

  1. 声明:一个YAML或Python装饰器,描述这个插件能做什么(自然语言描述)、需要什么参数。
  2. 实现:具体的Python函数,包含真正的业务逻辑。
  3. 示例:提供给LLM的调用示例,帮助Planner学会在什么场景下使用这个插件。

当Planner识别出某个任务可以通过现有插件完成时,它就会生成一个插件调用指令,而不是一段原始代码。Code Interpreter会解析这个指令,动态调用对应的插件函数。这种设计极大地降低了LLF生成代码的复杂度和出错率,也使得集成企业内部系统变得标准化和安全。

2.2 为什么是“代码优先”?

很多AI Agent框架倾向于让LLM输出JSON或某种自定义的中间语言来描述动作。TaskWeaver坚持“代码优先”,这是一个深思熟虑的权衡。

  • 表达能力极强:Python是一门图灵完备的语言,理论上可以表达任何逻辑。这给了LLM最大的灵活性来解决未知问题。
  • 生态丰富:可以直接利用庞大的Python软件包生态(PyPI),瞬间获得成千上万种能力,无需为每个功能单独开发插件。
  • 易于调试和验证:生成的代码是可见、可审查、可复现的。如果结果不对,开发者可以直接检查代码,这比调试一个黑盒的“动作”要容易得多。
  • 降低幻觉:让LLM生成具体代码,比让它“幻想”出一个不存在的API调用更靠谱。代码语法错误会在执行时立即暴露。

当然,风险与收益并存。“代码优先”的最大挑战是安全性。执行任意代码是危险的。TaskWeaver通过严格的沙箱机制来应对:限制网络访问、文件系统访问、进程创建等。在生产环境中,沙箱的配置是需要重点加固的部分。

注意:在初步实验阶段,为了方便,TaskWeaver可能允许一些宽松的设置。但一旦计划部署到可访问敏感数据或系统的环境,必须重新评估和加固沙箱策略,例如使用更严格的Docker配置、用户权限隔离等。

3. 从零开始:环境搭建与快速上手

理论讲得再多,不如动手跑一遍。我们从一个最简单的本地安装开始,完成一个“Hello World”级别的交互。

3.1 基础环境准备

TaskWeaver是一个Python项目,因此你需要一个Python环境(推荐3.9或以上版本)。为了避免包冲突,强烈建议使用虚拟环境。

# 1. 克隆仓库 git clone https://github.com/microsoft/TaskWeaver.git cd TaskWeaver # 2. 创建并激活虚拟环境(以conda为例) conda create -n taskweaver python=3.10 conda activate taskweaver # 3. 安装核心依赖 pip install -e .

安装过程会拉取一系列依赖,包括openai(用于调用GPT)、pandasnumpy等。如果只想用Code Interpreter功能,安装到此即可。如果需要用到一些高级插件(如数据库、矢量搜索),可能还需要安装额外的可选依赖。

3.2 关键配置:连接你的大模型

TaskWeaver默认配置使用OpenAI的GPT模型。你需要准备一个OpenAI API Key。

项目根目录下有一个taskweaver_config.json文件,这是核心配置文件。我们重点关注LLM相关部分:

{ "llm": { "api_type": "openai", "model": "gpt-4", // 或 "gpt-3.5-turbo" "api_key": "你的OpenAI API Key", "api_base": "https://api.openai.com/v1", // 如果你使用Azure OpenAI或代理,需修改此处 "temperature": 0.2 // 较低的温度使输出更稳定、更倾向于生成代码 }, "code_interpreter": { "kernel_mode": "local", // 代码执行模式:local(本地子进程)或 docker(更安全) "sandbox": { "timeout": 30 // 代码执行超时时间(秒) } } }

api_key替换为你自己的Key。如果你使用Azure OpenAI服务,需要将api_type改为azure,并正确配置api_baseapi_version等参数。

3.3 启动并完成第一次对话

配置好后,可以通过命令行启动一个交互式会话:

taskweaver start

启动后,控制台会显示一个本地Web服务的地址(通常是http://127.0.0.1:5678),同时在命令行打开一个聊天界面。我们可以在命令行直接输入指令。

让我们尝试一个经典任务,看看TaskWeaver如何将自然语言转化为代码并执行:

你: 请计算从1加到100的和。 TaskWeaver: (Planner开始工作,它判断这是一个纯计算任务,无需插件,直接调用Code Interpreter) (Code Interpreter生成并执行代码) 结果是:5050。

背后发生了什么?我们可以在会话日志或Web UI中看到生成的计划(Plan)和代码(Code)。对于这个简单任务,Planner可能生成了一个直接调用Code Interpreter的Task。Code Interpreter则生成了类似下面的Python代码:

# 这是TaskWeaver的Code Interpreter可能生成的代码 sum_result = sum(range(1, 101)) sum_result

代码在沙箱中执行,最后一行表达式的值(sum_result)会自动作为执行结果返回。

3.4 初体验的注意事项

第一次运行,你可能会遇到几个常见问题:

  1. 网络问题:如果无法连接OpenAI API,请检查网络和API Key是否正确,以及api_base配置。
  2. 包缺失:如果执行涉及matplotlib画图的代码,可能会报错缺少tkinter。在Ubuntu上可以通过sudo apt-get install python3-tk解决。这体现了沙箱环境与本地环境共享基础依赖的特点。
  3. 执行超时:如果代码陷入死循环,会在配置的timeout时间后中断。对于可能长时间运行的任务,需要在代码中做好优化,或适当调整超时设置。

这个简单的例子展示了最核心的链路:用户输入 -> Planner规划 -> Code Interpreter生成并执行代码 -> 返回结果。接下来,我们要探索更强大的功能:使用和创建插件。

4. 能力扩展实战:插件开发与集成

只用Code Interpreter,TaskWeaver已经是一个强大的数据分析工具。但它的真正威力在于Plugin系统,这允许你将任何内部工具、API或流程封装起来,让LLM去调度。

4.1 使用内置插件:文件操作示例

TaskWeaver自带了一些示例插件,比如文件读写。假设我们有一个data.csv文件在项目目录下。我们可以这样操作:

你: 读取当前目录下的data.csv文件,告诉我它有多少行数据。

Planner会识别出“读取文件”这个意图,并选择使用read_textread_csv插件(如果已启用并配置)。它会生成一个插件调用计划。Code Interpreter执行这个调用,插件函数被触发,读取文件并返回信息。

要使用这类插件,首先需要确认它们在project/plugins目录下存在,并且在配置中已被加载。插件加载通常是在taskweaver_config.jsonplugin部分配置。

4.2 动手开发一个自定义插件

让我们开发一个最简单的自定义插件:一个获取当前时间的插件。这虽然简单,但涵盖了插件开发的全流程。

第一步:创建插件文件project/plugins目录下(如果没有则创建),新建一个文件current_time.py

第二步:编写插件代码

# project/plugins/current_time.py from datetime import datetime import pytz # 需要先安装 pip install pytz from taskweaver.plugin import Plugin, register_plugin @register_plugin class CurrentTimePlugin(Plugin): def __init__(self): super().__init__() # 插件的自然语言描述,至关重要,用于引导Planner self.description = "获取指定时区的当前日期和时间。当用户询问‘现在几点’、‘北京时间’、‘纽约时间’时使用此插件。" def get_current_time(self, timezone: str = "Asia/Shanghai") -> str: """ 获取指定时区的当前时间。 参数: timezone: 时区字符串,例如 'Asia/Shanghai', 'America/New_York'。默认为上海时间。 返回: 格式化的时间字符串。 """ try: tz = pytz.timezone(timezone) current_time = datetime.now(tz) # 返回一个对LLM友好的自然语言描述 return f"在时区 {timezone} 的当前时间是:{current_time.strftime('%Y-%m-%d %H:%M:%S %Z%z')}" except pytz.exceptions.UnknownTimeZoneError: return f"错误:未知的时区 '{timezone}'。请提供有效的时区名称,例如 'Asia/Shanghai'。" # 必须实现的方法,定义插件对外暴露的函数 def get_functions(self): return { "get_current_time": { "method": self.get_current_time, "description": "获取当前时间", "args": { "timezone": { "type": "string", "description": "时区名称", "required": False, "default": "Asia/Shanghai" } }, "returns": { "type": "string", "description": "当前时间的描述" } } }

第三步:注册插件确保你的taskweaver_config.json中包含了插件扫描路径。通常默认配置已经包含了project/plugins

第四步:测试插件重启TaskWeaver服务,然后尝试提问:

你: 现在纽约是几点?

Planner会解析你的问题,匹配到CurrentTimePluginget_current_time函数,并自动将“纽约”映射为参数timezone="America/New_York",然后执行调用。你会得到类似这样的回答:“在时区 America/New_York 的当前时间是:2023-10-27 14:30:15 EDT-0400”。

4.3 插件开发的核心心得

  1. 描述(Description)就是一切:插件的description和函数、参数的description是LLM理解何时以及如何使用插件的唯一依据。务必用清晰、全面、包含示例的自然语言来编写。好的描述应该涵盖用户可能的各种问法。
  2. 参数设计要稳健:使用类型注解(type),设置合理的默认值(default)和是否必填(required)。对于枚举值,可以在描述中列出。这能减少LLM调用时的参数错误。
  3. 错误处理要友好:插件函数内部必须有充分的异常捕获,并返回对用户和LLM都有意义的错误信息,而不是抛出Python异常导致整个链路中断。
  4. 考虑复合插件:一个复杂的业务操作(如“生成周报”)可能涉及多个步骤(查数据、分析、画图、发邮件)。可以将其拆分为多个小插件,由Planner组合;也可以在一个插件内封装整个流程。前者更灵活,后者更内聚。需要根据业务逻辑的复杂度和复用性来权衡。

通过插件系统,你可以将企业内部的CRM、ERP、数据库、邮件系统、监控平台等全部连接起来,构建一个真正能用自然语言指挥的“企业级数字员工”。

5. 高级场景与生产化考量

当你想把TaskWeaver从实验玩具变成生产系统的一部分时,有几个关键问题必须解决。

5.1 会话管理与状态持久化

默认情况下,TaskWeaver的会话状态(聊天历史、Code Interpreter中的变量)保存在内存中。服务重启后,状态就丢失了。在生产环境中,你需要实现持久化存储。

TaskWeaver设计了会话管理器(SessionManager)抽象。你可以通过实现自定义的SessionRepository来将会话数据保存到数据库(如SQLite、PostgreSQL、Redis)中。这通常需要修改启动配置或扩展代码,将会话管理器指向你的自定义实现。

# 简化的自定义会话存储示例(概念性代码) class DatabaseSessionRepository: def save_session(self, session_id: str, session_data: dict): # 序列化session_data并存入数据库 pass def load_session(self, session_id: str) -> dict: # 从数据库加载并反序列化 pass

5.2 安全性加固:沙箱的牢笼

这是生产部署的生命线kernel_mode: local模式意味着代码在你的服务器用户权限下运行,风险极高。

  • 首选Docker模式:将kernel_mode设置为docker。TaskWeaver会为每个代码执行任务启动一个临时的Docker容器。你需要提前构建一个包含必要Python库的Docker镜像。
  • 限制能力:在Docker容器中,可以限制CPU、内存、网络(禁用或只允许访问特定白名单)、文件系统(只读挂载或使用内存盘)。彻底杜绝代码访问主机敏感文件或发起网络攻击的可能。
  • 代码静态分析:在执行前,可以对LLM生成的代码进行简单的静态安全检查,例如禁止导入os,subprocess,sys等危险模块,或者使用AST(抽象语法树)分析来检测危险操作。TaskWeaver本身有一些基础过滤,但你可能需要根据自身业务加强。

5.3 性能优化与成本控制

  • LLM调用优化:Planner的每次调用、Code Interpreter生成代码都可能消耗LLM的Token。对于复杂任务,Planner可能会进行多轮“自我反思”和“计划调整”,这会导致Token消耗激增。可以通过以下方式优化:
    • 缓存:对相似的查询,缓存Planner生成的Plan。
    • 设置思考上限:在Planner的Prompt中明确限制其“反思”的轮次。
    • 使用更经济的模型:对于简单的、模式固定的任务,可以让Planner使用GPT-3.5-turbo,而只在需要复杂推理时使用GPT-4。
  • 代码执行优化:避免在循环中频繁进行文件I/O或网络请求。鼓励LLM生成使用向量化操作(如pandas)的高效代码。这需要在给Code Interpreter的示例和Prompt中加以引导。

5.4 与现有系统集成:以API形式提供服务

TaskWeaver自带的Web UI和CLI适合演示和调试,但生产环境通常需要以API形式集成到其他应用(如聊天机器人、内部工作台)。

TaskWeaver提供了底层的SessionOrchestrator对象,你可以很容易地将其封装成一个FastAPI或Flask服务:

from taskweaver import App, Session from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI() taskweaver_app = App() class ChatRequest(BaseModel): session_id: str message: str @app.post("/chat") async def chat(request: ChatRequest): try: session: Session = taskweaver_app.get_session(request.session_id) response = await session.send_message(request.message) return {"reply": response} except Exception as e: raise HTTPException(status_code=500, detail=str(e))

这样,你的前端应用就可以通过REST API与TaskWeaver后端进行交互了。

6. 避坑指南与常见问题排查

在实际开发和部署中,我踩过不少坑,这里总结几个最具代表性的问题和解决方案。

6.1 Planner“不理解”我的插件

现象:你开发了一个插件,但无论怎么问,Planner总是选择让Code Interpreter写代码,而不是调用插件。排查

  1. 检查插件描述:这是最常见的原因。回到插件的description和函数的description,用最直白、覆盖各种用户表达方式的语言重写。例如,不要只写“处理订单”,要写成“当用户需要查询订单状态、创建新订单或取消订单时使用此插件。用户可能会说‘我的订单怎么样了’、‘我要下单’、‘取消订单123’”。
  2. 提供示例:在插件声明中增加examples字段,给出几个用户query和对应插件调用的例子,这对Few-shot Learning非常有效。
  3. 检查插件加载:查看启动日志,确认你的插件文件被成功扫描和加载。检查是否有Python语法错误导致插件注册失败。
  4. 调整LLM温度:过高的temperature可能导致Planner决策不稳定。尝试将其调低(如0.1)。

6.2 生成的代码执行报错

现象:Code Interpreter生成的代码运行时出现NameError,ModuleNotFoundError或逻辑错误。排查

  1. 缺失依赖:错误信息如果提示找不到模块(如import yfinance),说明沙箱环境中没有安装该包。你需要将依赖添加到TaskWeaver的依赖列表,或者构建自定义的Docker镜像包含这些包。
  2. 上下文变量丢失:在多轮对话中,如果代码试图引用上一轮创建的变量(如df)但失败了,可能是会话状态异常。检查会话持久化是否正常工作,或者代码是否意外地在一个新的、隔离的上下文中执行。
  3. LLM的“幻觉”:LLM可能会生成调用不存在的函数或使用错误API的代码。这需要通过更精准的Prompt工程来缓解。在给Code Interpreter的System Prompt中,明确列出可用的内置函数和库,并给出正确的使用示例。
  4. 数据格式问题:例如,插件返回的数据格式与代码期望的不符。确保插件返回的是标准Python数据类型(如dict, list, str),并且有清晰的文档说明。

6.3 会话响应缓慢

现象:简单的查询也需要等待很长时间才有回复。排查

  1. 网络延迟:首先确认是否是LLM API调用(如OpenAI)的网络延迟。可以尝试在相同网络下直接调用API进行对比。
  2. 复杂规划:对于模糊或复杂的请求,Planner可能会进行多轮“思考-规划-验证”的内部循环。可以在Planner的Prompt中增加约束,如“请直接给出最终计划,不要进行内部讨论”。
  3. 代码执行耗时:如果生成的代码本身执行就很慢(如处理大量数据),考虑优化生成的代码逻辑,或者提示用户缩小数据范围。
  4. 资源竞争:如果使用Docker模式,频繁创建和销毁容器会有开销。可以考虑使用容器池技术来复用容器。

6.4 如何调试复杂的任务流?

当任务执行结果不符合预期时,需要查看详细的执行轨迹。TaskWeaver提供了丰富的日志功能。

  • 启用详细日志:在配置中设置logging.levelDEBUG
  • 查看Web UI:TaskWeaver的Web界面不仅用于聊天,通常还包含一个“会话详情”或“调试”面板,可以可视化地看到整个执行过程:用户输入 -> Planner生成的Plan -> 每个Task的详细信息(是插件调用还是代码生成)-> 代码执行结果/插件返回结果 -> 最终回复。
  • 关注“思考过程”:LLM在生成Plan和Code时,可能会有内部的“Chain of Thought”。这些思考过程有时会以[THOUGHT]或类似标记出现在日志或中间结果中,是理解LLM决策逻辑的宝贵资料。

TaskWeaver将一个宏大的愿景——让自然语言成为人机交互的终极接口——拆解成了一个可工程化实现的框架。它没有追求一步到位的“魔法”,而是选择了“代码”这条务实、可控的路径。这条路意味着更多的工程工作(插件开发、沙箱安全、Prompt调优),但也带来了无与伦比的确定性、可扩展性和与企业现有技术栈融合的能力。

我个人在几个内部数据分析项目中应用了TaskWeaver,最大的体会是:它成功地将“要做什么”的沟通成本降到了最低,但将“如何做好”的责任清晰地留给了开发者。你需要设计好插件接口,编写健壮的插件逻辑,配置安全的环境,并精心设计Prompt来引导LLM。当你把这些基础工作做扎实后,你会发现团队里的产品经理、业务分析师甚至管理者,都能直接通过对话的方式,获取他们以前需要提需求、等排期才能拿到的数据洞察和报告,这种效率的提升是革命性的。

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

Python高阶学习路径指南

Python是一门强大且应用广泛的高级编程语言,其学习路径可以从基础语法一直延伸到数据科学、人工智能、Web开发等多个专业领域。 一个系统、严谨且富有挑战性的学习路径(区别于简单入门教程)应遵循从基础到核心,再到专业应用与深度…

作者头像 李华
网站建设 2026/5/15 10:45:09

CircuitPython与Crickit驱动NeoPixel灯带:动态灯光效果全解析

1. 项目概述:用代码点亮创意,从静态到动态的灯光艺术 在嵌入式开发和创意电子项目中,灯光从来不只是简单的照明。它可以是机器人的“眼睛”,是智能家居的“情绪”,更是交互艺术装置的“灵魂”。如果你玩过Arduino或者…

作者头像 李华
网站建设 2026/5/15 10:44:40

思源宋体CN:7种字重免费商用中文字体完全指南

思源宋体CN:7种字重免费商用中文字体完全指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是否在为商业项目寻找既专业又免费的中文字体而烦恼?是否因为字…

作者头像 李华
网站建设 2026/5/15 10:38:28

Godot 3实战:从GDQuest Demos学习游戏开发最佳实践

1. 项目概述与核心价值最近在社区里看到不少朋友在讨论一个叫“gdquest-demos/godot-3-demos-2022”的GitHub仓库,作为一个在游戏开发领域摸爬滚打多年的老家伙,我第一反应就是:这绝对是个宝藏。这不仅仅是一个简单的代码合集,它更…

作者头像 李华
网站建设 2026/5/15 10:36:07

Windows-build-tools终极指南:5分钟解决Node.js原生模块编译难题

Windows-build-tools终极指南:5分钟解决Node.js原生模块编译难题 【免费下载链接】windows-build-tools :package: Install C Build Tools for Windows using npm 项目地址: https://gitcode.com/gh_mirrors/wi/windows-build-tools 还在为Windows上编译Node…

作者头像 李华
网站建设 2026/5/15 10:36:06

VOC 数据集下载

Pascal VOC Dataset Mirror Pascal VOC挑战是一个非常流行的数据集,用于构建和评估图像分类、对象检测和分割的算法。然而,网站总是宕机。如果你需要文件,下面是它们下载地址: 介绍 这项挑战的主要目标是从许多视觉对象中识别对象 现实场景…

作者头像 李华