AI智能体技能开发:标准化、模块化与开源实践指南

news2026/5/1 8:17:17
1. 项目概述一个为智能体技能而生的开源仓库最近在折腾AI智能体Agent开发的朋友估计都绕不开一个核心问题如何让智能体真正“学会”并“掌握”一项技能无论是让它帮你写一份周报、分析一份数据还是控制一个外部工具本质上都是在为智能体装配“技能”。然而技能的定义、开发、管理和复用在当前的开发实践中往往还处于一种“手工作坊”式的状态——每个项目都有一套自己的实现代码难以共享最佳实践难以沉淀。这正是agent-skills-hub这个开源项目试图解决的问题。简单来说它想成为智能体领域的“技能商店”或“技能库”。你可以把它理解为一个精心设计的、开源的、社区驱动的技能集合与框架。它的核心目标不是提供一个现成的、功能固定的智能体而是提供一个标准化的技能开发、封装、管理和调用体系让开发者可以像搭积木一样快速为自己的智能体装配所需的能力。这个项目特别适合以下几类人AI应用开发者你正在构建一个需要多种能力的智能体应用不想从零开始造轮子。技能贡献者你开发了一个很酷的智能体技能比如调用某个特定API、处理某种格式文件希望分享给社区并标准化。研究者或学习者希望了解当前智能体技能生态的最佳实践学习如何结构化地设计和实现智能体能力。接下来我将深入拆解这个项目的设计思路、核心架构并分享如何基于它进行开发与使用的实战经验。2. 核心架构与设计哲学解析2.1 为什么需要一个“技能中心”在深入代码之前我们先聊聊背后的“为什么”。智能体的能力早期往往通过长篇的提示词Prompt来定义但这存在几个明显瓶颈复杂性管理困难当技能逻辑复杂涉及多步推理、条件判断、外部调用时纯提示词会变得极其臃肿且难以调试。代码与逻辑分离很多技能本质上需要执行一段代码如数据处理、API调用将代码逻辑硬编码在提示词或主程序中破坏了模块化和可维护性。复用性差A项目里写好的“发送邮件”技能很难直接移植到B项目因为接口定义、错误处理、配置方式都可能不同。缺乏发现与共享机制社区中有大量优秀的技能实现但散落在各个GitHub仓库、博客文章中缺乏一个统一的目录和标准来集成它们。agent-skills-hub的设计哲学正是为了应对这些挑战。它倡导将技能视为一等公民进行标准化封装。其核心思想包括声明式接口每个技能通过一个清晰的、结构化的描述文件如skill.yaml来定义其输入、输出、配置参数和功能说明。松耦合执行技能的实现与智能体框架如 LangChain, AutoGen, LlamaIndex解耦。技能本身是一个独立的、可执行的单元。统一注册与发现所有符合规范的技能都可以注册到中心仓库方便其他开发者查找、评估和集成。版本化与依赖管理技能可以有自己的版本号并声明其依赖如特定的Python包、API密钥便于环境管理和兼容性控制。2.2 项目结构深度解读一个典型的agent-skills-hub仓库结构可能如下所示这是基于常见实践和项目目标的合理推断agent-skills-hub/ ├── README.md ├── skills/ # 核心目录所有技能存放于此 │ ├── web_search/ # 技能示例网络搜索 │ │ ├── skill.yaml # 技能元数据声明文件 │ │ ├── __init__.py │ │ ├── executor.py # 技能执行逻辑 │ │ └── requirements.txt # 技能独有依赖 │ ├── data_analysis/ │ │ ├── skill.yaml │ │ └── ... │ └── send_email/ │ ├── skill.yaml │ └── ... ├── hub_core/ # 核心框架代码 │ ├── registry.py # 技能注册与发现 │ ├── validator.py # 技能描述文件校验 │ └── executor.py # 统一的技能执行引擎 ├── examples/ # 使用示例 │ ├── basic_usage.py │ └── integrate_with_llamaindex.py ├── tests/ # 测试 ├── pyproject.toml # 项目依赖 └── CONTRIBUTING.md # 贡献指南关键文件解析skill.yaml这是技能的“身份证”和“说明书”。它可能包含以下字段name: web_search version: 1.0.0 description: 使用搜索引擎进行网络查询并返回摘要结果。 author: your_name inputs: - name: query type: string description: 搜索关键词 required: true outputs: - name: results type: list description: 搜索结果的列表每条包含标题、链接和摘要。 configuration: - name: search_engine type: string default: duckduckgo description: 使用的搜索引擎后端 - name: max_results type: integer default: 5 requirements: - duckduckgo-search这个文件让机器和人都能快速理解这个技能是干什么的、需要什么、能产出什么。executor.py这是技能的“大脑”包含了具体的执行逻辑。它通常会实现一个标准的接口例如一个execute函数from duckduckgo_search import DDGS class WebSearchExecutor: def __init__(self, config): self.search_engine config.get(search_engine, duckduckgo) self.max_results config.get(max_results, 5) def execute(self, inputs): query inputs[query] with DDGS() as ddgs: results [r for r in ddgs.text(query, max_resultsself.max_results)] return {results: results}这种设计将技能逻辑完全封装对外只暴露一个简单的execute方法。hub_core/registry.py这是技能中心的“目录服务”。它负责扫描skills/目录下的所有技能解析它们的skill.yaml文件并在内存中建立一个技能注册表。其他程序可以通过名称和版本来查询和获取技能实例。2.3 设计模式与优势这种架构借鉴了微服务和插件化系统的设计思想带来了几个显著优势可发现性新加入的开发者无需阅读大量代码通过浏览skills/目录或查询注册表就能快速了解现有能力。可组合性智能体可以动态加载和组合多个技能来完成复杂任务。例如一个“市场调研”任务可以依次调用“网络搜索”、“数据提取”、“总结报告”三个技能。可测试性每个技能都是独立的单元可以单独进行单元测试和集成测试极大提升了软件质量。社区驱动标准化的接口降低了贡献门槛。任何开发者都可以按照规范开发一个新技能并通过 Pull Request 贡献到主仓库从而丰富整个生态。注意以上文件结构和代码是基于智能体开发常见模式和项目标题的合理推演。实际agent-skills-hub项目的具体实现可能有所不同但核心思想——标准化、模块化、可复用——是相通的。在参与或使用此类项目时首要任务是仔细阅读其官方文档和代码结构。3. 技能开发全流程实战指南理解了架构我们来看看如何从零开始为agent-skills-hub贡献一个自己的技能。我们以开发一个“天气查询”技能为例。3.1 第一步规划与设计技能契约在写代码之前必须明确技能的“契约”。问自己几个问题输入是什么城市名经纬度是否需要日期输出是什么当前温度体感温度未来预报结构化数据还是自然语言描述需要哪些配置使用哪个天气API是否需要API密钥可能有哪些错误城市不存在、网络超时、API额度不足等。假设我们决定输入一个city字符串必需。输出一个包含temperature温度、condition天气状况、humidity湿度的字典。配置api_provider默认用 OpenWeatherMapapi_key从环境变量读取。错误定义清晰的异常如CityNotFoundError、APIError。3.2 第二步创建技能目录与元数据文件在项目的skills/目录下创建一个新的文件夹例如weather_lookup。首先创建skill.yamlname: weather_lookup version: 0.1.0 description: 查询指定城市的当前天气情况。 author: [Your Name] tags: - weather - api inputs: - name: city type: string description: 要查询天气的城市名称英文或中文如“Beijing”或“北京”。 required: true outputs: - name: weather_data type: dict description: 包含温度、状况、湿度的字典。 schema: temperature: float condition: string humidity: integer configuration: - name: api_provider type: string default: openweathermap description: 使用的天气API提供商。 - name: api_key_env_var type: string default: OPENWEATHER_API_KEY description: 存储API密钥的环境变量名。 requirements: - requests2.28.0这个YAML文件清晰地定义了技能的所有元信息。schema字段用于描述输出字典的结构这对后续智能体理解输出内容非常有帮助。3.3 第三步实现技能执行器接下来在weather_lookup目录下创建executor.pyimport os import requests from typing import Dict, Any class WeatherLookupExecutor: 天气查询技能的执行器。 def __init__(self, config: Dict[str, Any]): self.api_provider config.get(api_provider, openweathermap) self.api_key_env_var config.get(api_key_env_var, OPENWEATHER_API_KEY) self.api_key os.getenv(self.api_key_env_var) if not self.api_key: raise ValueError( f未找到天气API密钥。请设置环境变量{self.api_key_env_var} ) # 可以根据不同的 api_provider 初始化不同的客户端 if self.api_provider openweathermap: self.base_url https://api.openweathermap.org/data/2.5/weather else: # 可以扩展其他提供商如和风天气等 raise ValueError(f不支持的API提供商{self.api_provider}) def execute(self, inputs: Dict[str, Any]) - Dict[str, Any]: 执行天气查询。 city inputs.get(city) if not city: raise ValueError(输入参数 city 是必需的。) # 构建请求参数 params { q: city, appid: self.api_key, units: metric, # 使用摄氏度 lang: zh_cn # 返回中文描述 } try: response requests.get(self.base_url, paramsparams, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError data response.json() # 解析响应数据 if data.get(cod) ! 200: raise Exception(fAPI返回错误{data.get(message, 未知错误)}) main_info data[main] weather_info data[weather][0] result { temperature: main_info[temp], condition: weather_info[description], humidity: main_info[humidity] } return {weather_data: result} except requests.exceptions.ConnectionError: raise Exception(网络连接失败请检查网络设置。) except requests.exceptions.Timeout: raise Exception(请求超时请稍后重试。) except requests.exceptions.HTTPError as e: if response.status_code 404: raise Exception(f未找到城市{city}) else: raise Exception(fHTTP错误 ({response.status_code}): {e}) except KeyError as e: raise Exception(f解析API响应时出错缺少字段{e})关键实现细节与心得配置注入__init__方法接收配置字典。这样技能可以在不同场景下被不同配置初始化例如测试用模拟Key生产用真实Key。环境变量管理强烈建议将API密钥等敏感信息通过环境变量传递而不是硬编码在配置或代码中。这是安全开发的基本要求。健壮的错误处理我们对网络错误、API错误、数据解析错误都做了捕获和转换将底层异常转化为对智能体或用户更友好的业务异常。这是技能可靠性的关键。清晰的返回结构返回值严格遵循skill.yaml中定义的outputs格式即一个字典键为weather_data值为包含具体数据的字典。这保证了调用方总能以预期的方式获取结果。3.4 第四步编写单元测试一个可复用的技能必须是可测试的。创建test_weather_lookup.pyimport pytest import os from unittest.mock import Mock, patch from skills.weather_lookup.executor import WeatherLookupExecutor class TestWeatherLookupExecutor: pytest.fixture def mock_config(self): # 使用模拟的API Key进行测试 os.environ[TEST_WEATHER_API_KEY] mock_key return {api_key_env_var: TEST_WEATHER_API_KEY} def test_init_missing_api_key(self): 测试缺少API密钥时的初始化错误。 if TEST_WEATHER_API_KEY in os.environ: del os.environ[TEST_WEATHER_API_KEY] with pytest.raises(ValueError, match未找到天气API密钥): WeatherLookupExecutor({}) patch(skills.weather_lookup.executor.requests.get) def test_execute_success(self, mock_get, mock_config): 测试成功的天气查询。 # 模拟API成功响应 mock_response Mock() mock_response.status_code 200 mock_response.json.return_value { cod: 200, main: {temp: 22.5, humidity: 65}, weather: [{description: 晴}] } mock_get.return_value mock_response executor WeatherLookupExecutor(mock_config) result executor.execute({city: Beijing}) assert weather_data in result assert result[weather_data][temperature] 22.5 assert result[weather_data][condition] 晴 assert result[weather_data][humidity] 65 mock_get.assert_called_once() patch(skills.weather_lookup.executor.requests.get) def test_execute_city_not_found(self, mock_get, mock_config): 测试城市不存在的错误情况。 mock_response Mock() mock_response.status_code 404 mock_get.return_value mock_response executor WeatherLookupExecutor(mock_config) with pytest.raises(Exception, match未找到城市): executor.execute({city: UnknownCity})编写测试不仅能验证代码逻辑其本身也是技能使用方式的绝佳文档。3.5 第五步本地测试与集成在提交PR之前需要在本地完整测试技能。安装技能依赖在技能目录下运行pip install -r requirements.txt。手动测试执行器写一个简单的脚本初始化WeatherLookupExecutor并调用execute方法检查输出是否符合预期。测试技能发现确保你的技能目录被hub_core/registry.py正确扫描和加载。你可以运行项目提供的示例脚本看是否能通过技能名找到你新开发的技能。运行完整测试套件在项目根目录运行pytest确保你的新技能测试通过且没有破坏现有功能。4. 在智能体项目中集成与使用技能开发好技能后如何在你的AI智能体项目中使用它呢这里提供两种典型场景。4.1 场景一在自定义智能体框架中直接调用假设你有一个自研的智能体循环你可以直接使用agent-skills-hub的核心库来加载和调用技能。# your_agent_project.py import asyncio from hub_core.registry import SkillRegistry from hub_core.executor import SkillExecutor async def main(): # 1. 初始化技能注册表指定技能目录路径 registry SkillRegistry(skills_dir_path./skills) registry.load_skills() # 扫描并加载所有技能 # 2. 获取技能实例 skill_metadata registry.get_skill(weather_lookup, version0.1.0) if not skill_metadata: print(未找到天气查询技能) return # 3. 准备技能配置例如从环境变量或配置文件中读取 skill_config { api_key_env_var: OPENWEATHER_API_KEY } # 4. 初始化技能执行器 executor SkillExecutor(skill_metadata, skill_config) # 5. 在智能体决策循环中调用 # 假设你的LLM决定需要查询天气 agent_decision { skill_to_invoke: weather_lookup, inputs: {city: 上海} } if agent_decision[skill_to_invoke] weather_lookup: try: result await executor.execute_async(agent_decision[inputs]) weather result[weather_data] print(f上海当前天气{weather[condition]}温度{weather[temperature]}°C湿度{weather[humidity]}%) # 将结果反馈给LLM用于生成最终回答 except Exception as e: print(f技能执行失败{e}) # 处理错误例如让LLM告知用户查询失败 if __name__ __main__: asyncio.run(main())4.2 场景二与主流智能体框架如LangChain集成agent-skills-hub的技能可以很方便地包装成 LangChain 的 Tool从而被 LangChain Agent 直接使用。# integrate_with_langchain.py from langchain.agents import Tool from hub_core.registry import SkillRegistry from hub_core.executor import SkillExecutor def create_skill_tool(skill_name, skill_version, config): 将 agent-skills-hub 技能包装成 LangChain Tool。 registry SkillRegistry() registry.load_skills() skill_meta registry.get_skill(skill_name, skill_version) if not skill_meta: raise ValueError(fSkill {skill_name}:{skill_version} not found.) executor SkillExecutor(skill_meta, config) def skill_function(**kwargs): # LangChain Tool 通常以关键字参数传递输入 # 我们需要将其适配到技能执行器期望的 inputs 字典格式 result executor.execute(kwargs) # 将结果转换为字符串供LLM阅读。对于复杂结果可以设计更智能的格式化。 return str(result) # 从 skill.yaml 中提取描述和参数信息用于构建Tool description skill_meta.description # 可以更精细地解析 inputs为LangChain提供更准确的参数模式 return Tool( nameskill_name, funcskill_function, descriptiondescription, ) # 在LangChain Agent中使用 from langchain.agents import initialize_agent, AgentType from langchain.llms import OpenAI llm OpenAI(temperature0) weather_tool create_skill_tool( weather_lookup, 0.1.0, config{api_key_env_var: OPENWEATHER_API_KEY} ) agent initialize_agent( tools[weather_tool], llmllm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue ) # 现在你的Agent就可以理解并使用“查询天气”这个技能了 agent.run(北京现在的天气怎么样)集成心得适配层为不同的智能体框架编写薄薄的适配层如上面的create_skill_tool函数是让技能生态价值最大化的关键。这比将技能逻辑绑定到某个特定框架要灵活得多。错误处理在将技能集成到智能体时要特别注意错误的传递和处理。智能体需要能够理解技能调用失败的原因并决定下一步动作如重试、换一种方式或向用户报错。技能编排对于复杂任务智能体可能需要连续调用多个技能。agent-skills-hub本身不负责编排逻辑但提供了稳定的技能调用基础。编排逻辑可以由上层的智能体框架如LangChain的SequentialChain或自定义的工作流引擎来实现。5. 技能开发与使用中的常见陷阱与最佳实践在实际开发和集成过程中我踩过不少坑也总结出一些让技能更健壮、更易用的经验。5.1 技能设计阶段的“坑”陷阱1输入输出定义过于模糊或复杂。问题skill.yaml中inputs只写一个data类型是any。调用方完全不知道该怎么传参。最佳实践输入输出定义要尽可能具体、原子化。例如与其设计一个“处理用户请求”的万能技能不如拆分成“解析用户意图”、“查询数据库”、“生成回复”等多个小技能。每个技能的接口都应简单明了。陷阱2技能有状态或产生副作用。问题技能内部维护了全局变量或者每次执行会修改外部文件。这会导致在并发调用或多次调用时出现不可预知的行为。最佳实践技能执行器应设计为无状态Stateless。每次execute调用都应是独立的结果只取决于输入和配置。如果必须维护状态如API调用限流计数器应将其封装在技能实例内部并通过配置进行初始化。陷阱3忽略错误处理和超时控制。问题技能内部调用外部API或进行耗时操作但没有设置超时导致智能体线程被永久阻塞。最佳实践# 在executor.py中 import signal from contextlib import contextmanager class TimeoutException(Exception): pass contextmanager def time_limit(seconds): def signal_handler(signum, frame): raise TimeoutException(技能执行超时) signal.signal(signal.SIGALRM, signal_handler) signal.alarm(seconds) try: yield finally: signal.alarm(0) def execute(self, inputs): try: with time_limit(30): # 设置30秒超时 # 核心业务逻辑 return result except TimeoutException: return {error: 技能执行超时请稍后重试} except ExternalAPIError as e: # 将第三方API错误转换为内部标准错误格式 return {error: f服务暂时不可用{e.message}}统一的错误返回格式如包含error字段的字典有助于调用方进行标准化处理。5.2 技能实现阶段的技巧技巧1为技能添加详细的日志。日志是调试分布式、异步智能体系统的生命线。在技能的关键步骤开始、结束、调用外部API前后添加日志并记录请求ID、技能名、输入参数脱敏后等信息。import logging logger logging.getLogger(__name__) def execute(self, inputs, request_idNone): logger.info(f[{request_id}] 开始执行技能 {self.__class__.__name__}, 输入: {inputs}) # ... 业务逻辑 logger.info(f[{request_id}] 技能执行成功输出: {result}) return result技巧2实现技能的健康检查Health Check和版本端点。对于需要依赖外部服务的技能如数据库、API可以实现一个简单的health_check方法用于在技能加载时或定时任务中验证其可用性。同时暴露一个get_version方法也很有用。class WeatherLookupExecutor: # ... __init__ and execute ... def health_check(self): 检查技能依赖的外部服务是否可用。 try: # 发起一个轻量级的测试请求例如查询一个已知城市 test_response requests.get(self.base_url, params{q: London, appid: self.api_key}, timeout5) return test_response.status_code 200 except Exception: return False def get_version(self): return 0.1.05.3 技能使用与集成建议建议1在智能体层面实现技能调用的熔断与降级。当某个技能频繁失败时智能体应能暂时“熔断”对该技能的调用避免持续浪费资源并尝试使用备用技能或降级方案如直接告知用户“该功能暂不可用”。建议2对技能输出进行后处理与验证。不要完全信任技能的原始输出。特别是当技能调用外部不可控的API时其返回的数据格式可能发生变化。在将技能结果交给LLM或呈现给用户之前可以增加一层轻量级的验证或清洗逻辑。def safe_execute_skill(executor, inputs): raw_result executor.execute(inputs) # 验证结果结构是否符合 skill.yaml 中的 output schema if not validate_output_schema(raw_result, executor.metadata): raise ValueError(技能返回结果格式异常) # 对结果进行必要的清洗如去除HTML标签、截断过长文本等 cleaned_result sanitize_output(raw_result) return cleaned_result建议3建立技能的性能监控。记录每个技能调用的耗时、成功率、输入输出样本脱敏。这有助于你发现性能瓶颈优化慢技能。识别出经常被调用的“热门”技能进行重点维护。根据历史数据为技能设置合理的超时时间。6. 总结与展望构建你的智能体技能生态agent-skills-hub这类项目代表了一种趋势将AI智能体的能力建设从“提示词工程”和“硬编码”转向“软件工程”和“模块化开发”。它不仅仅是一个代码仓库更是一种协作规范和架构范式。从我个人的实践来看采用这种模式后团队开发智能体应用的效率得到了显著提升。新成员可以通过浏览技能目录快速了解系统能力复用现有技能避免了重复开发而技能间的标准接口也让复杂的智能体编排成为可能。要真正发挥其价值我建议从一个小技能开始不要想着一口气贡献一个完美的复杂技能。先从实现一个简单的、自己项目需要的技能开始熟悉整个开发、测试、提交流程。注重文档和示例你技能README.md的质量和examples/目录下的示例是否丰富直接决定了其他开发者是否愿意使用你的技能。积极参与社区关注项目的Issue和Pull Request review别人的代码提出建议。一个活跃的社区是开源项目成功的基石。思考技能的组合与编排单个技能的力量有限。如何设计技能使得它们能够像乐高积木一样被轻松组合来解决更宏大的问题这是下一个值得深入探索的方向。或许未来agent-skills-hub会演化出类似“技能工作流编排”或“技能组合模板”的高级特性。最后再分享一个小心得在定义技能的输入输出时多花点时间思考其“语义”而不仅仅是“语法”。一个好的技能接口应该让调用者无论是人还是另一个AI一眼就能明白其意图和边界。这比任何技术实现细节都更能提升整个技能生态的可用性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2571421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…