构建AI智能体调度平台:从微服务架构到工程实践

news2026/5/16 4:52:41
1. 项目概述一个面向智能体的“Airbnb”式调度平台最近在折腾AI智能体Agent相关的项目发现一个挺有意思的现象大家把模型、工具链、工作流都搭好了但真要让多个智能体协同工作或者把智能体能力开放出去给别人调用管理起来就特别麻烦。这感觉就像你家里装修水电工、木工、油漆工都找齐了但缺一个靠谱的“工长”来协调排期、分配任务、监督进度。Xiaoher-C/agentbnb这个项目在我看来就是试图扮演这个“智能体工长”的角色。简单来说agentbnb是一个为AI智能体提供调度、管理和服务化能力的平台。它的名字灵感来源于“Airbnb”寓意着让智能体像房源一样可以被轻松“发布”、“发现”和“租用”。你不再需要关心智能体具体跑在哪台服务器、用什么环境只需要通过平台的标准接口去调用它完成你需要的任务。这对于想构建复杂多智能体应用或者希望将自己训练的智能体能力产品化的开发者来说是一个非常有价值的中间件。我自己在尝试构建客服、内容生成、数据分析等涉及多个AI模块的场景时就深受智能体间通信混乱、状态管理困难、资源分配不均之苦。agentbnb这类平台的出现正是为了解决这些工程化痛点。它适合以下几类人一是AI应用开发者希望快速集成多种智能体能力而无需重复造轮子二是智能体模型的提供方希望有一个标准化的渠道来部署和运营自己的AI服务三是技术团队负责人需要一套可观测、可管理、可扩展的智能体协作框架来支撑业务。2. 核心设计思路解耦、调度与服务化2.1 为什么需要智能体调度平台在深入agentbnb的具体实现前我们先聊聊为什么单纯的智能体框架比如LangChain、AutoGen还不够。这些框架提供了构建单个或简单协作智能体的工具包但当智能体数量增多、交互逻辑变复杂、并且需要7x24小时稳定对外提供服务时就会暴露出几个关键问题资源隔离与弹性伸缩不同的智能体可能对计算资源GPU/CPU、内存、依赖库有不同要求。把所有智能体塞进同一个环境容易引发依赖冲突并且无法根据单个智能体的负载进行独立扩缩容。一个翻译智能体请求量暴增不应该影响旁边一个负责图表生成的智能体。生命周期与状态管理智能体往往是有状态的一次对话的上下文、执行到哪一步了、临时存储的数据等。在分布式环境下如何保证智能体实例崩溃后能恢复状态如何管理智能体的创建、销毁、休眠和唤醒这些都是框架层通常不直接解决的。统一的通信与发现机制智能体A如何知道智能体B提供了什么能力调用地址是什么协议是什么如果B的地址变了怎么办需要一个类似“服务注册与发现中心”的组件让智能体之间能透明地互相调用。可观测性与治理平台运营者需要知道每个智能体的调用量、响应时间、成功率、资源消耗甚至能对敏感操作进行审计和流控。这在多个团队共享智能体池的场景下尤为重要。agentbnb的设计目标正是将智能体的业务逻辑与基础设施管理解耦。开发者专注于实现智能体本身的能力即“房源”的装修和配置而平台负责解决“房源”的挂牌、预订、入住安排、保洁维护等一系列运营问题。2.2 架构概览与核心组件虽然我没有看到agentbnb的全部源码但根据其项目名、描述以及同类平台如微软的AutoGen Studio、一些开源的Agent Server的常见模式可以推断其核心架构通常包含以下几层1. 智能体抽象层定义什么是“智能体”。一个智能体通常包含几个基本要素唯一的ID、一段描述其能力的元数据名称、功能描述、输入输出格式、具体的执行入口比如一个HTTP端点、一个函数、或一个Grpc服务。平台会提供一个SDK或基类让开发者按照规范来封装自己的智能体逻辑。2. 注册与发现中心这是平台的“目录服务”。智能体启动后会向这个中心注册自己的信息。其他服务或智能体可以通过查询这个中心找到所需能力的智能体及其访问地址。这通常通过一个“智能体注册表”数据库和相应的查询API来实现。3. 调度与路由引擎这是平台的大脑。当收到一个任务请求时调度器需要决定由哪个或哪几个智能体来执行。决策可能基于智能体的能力匹配度、当前负载、优先级、甚至成本。在复杂工作流中它还要负责智能体间的调用顺序和数据传递。4. 执行环境与运行时为智能体提供安全的沙箱环境。这可能包括容器化Docker隔离、虚拟环境Conda/Venv管理确保智能体之间的依赖互不干扰。运行时还负责监控智能体的资源使用情况并在异常时进行重启或迁移。5. 通信总线智能体之间、客户端与智能体之间通信的管道。常见的方式包括基于HTTP REST API、消息队列如RabbitMQ, Kafka、或发布订阅系统。平台需要定义一套标准的通信协议例如任务请求格式、结果返回格式、错误处理规范。6. 管理与监控台提供给管理员和开发者的Web界面或CLI工具用于查看智能体状态、部署新智能体、查看日志、监控指标、设置调度策略等。提示在设计自己的智能体平台时切忌一开始就追求大而全。可以从最核心的“注册发现”和“HTTP代理路由”功能做起先解决智能体互相找不到的问题再逐步叠加调度、监控等高级功能。3. 关键实现细节与实操要点3.1 如何定义与封装一个智能体这是接入平台的第一步也是最关键的一步。一个好的智能体抽象应该足够简单让开发者能快速上手又足够灵活能覆盖各种类型的AI能力。一个典型的智能体接口定义可能如下以Python伪代码为例class Agent: def __init__(self, agent_id: str, name: str, description: str, version: str): self.agent_id agent_id self.metadata { name: name, description: description, version: version, input_schema: {...}, # 定义输入参数的JSON Schema output_schema: {...}, # 定义输出结果的JSON Schema } async def execute(self, task_input: dict, context: dict) - dict: 核心执行方法。 task_input: 客户端传入的任务参数。 context: 平台提供的上下文如会话ID、用户信息、上游智能体结果等。 返回一个字典格式的结果。 # 开发者在这里实现智能体的核心逻辑 # 可以是调用本地模型、调用API、执行代码等 result await self._do_actual_work(task_input, context) return {status: success, data: result} async def health_check(self) - bool: 健康检查平台会定期调用。 return True封装要点声明式元数据input_schema和output_schema至关重要。它们不仅用于生成API文档更是调度器进行能力匹配和输入验证的依据。使用JSON Schema可以清晰地定义参数类型、是否必填、枚举值等。异步优先智能体的执行往往涉及网络IO调用模型API、访问数据库使用异步async/await可以极大提高平台的并发处理能力。上下文注入context参数是平台为智能体提供的“全局变量”可以包含本次任务链的ID、用户身份、以及其他共享数据。这避免了智能体之间通过复杂参数传递上下文。标准化响应执行方法的返回格式应该统一至少包含status如 “success”, “error”和data字段。错误信息可以放在error字段中便于平台统一处理。实操心得在早期可以不用强制所有智能体都继承某个基类而是采用“适配器”模式。对于已有的、不符合接口的代码写一个简单的Wrapper类将其包裹成标准接口即可。这降低了接入门槛。3.2 实现高效的注册与发现机制注册中心可以简单理解为一个数据库表但为了高性能和高可用需要考虑更多。表结构设计示例CREATE TABLE agents ( id VARCHAR(64) PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, endpoint VARCHAR(512) NOT NULL, -- 智能体的实际调用地址如 http://192.168.1.10:8080/run health_endpoint VARCHAR(512), -- 健康检查地址 status ENUM(UP, DOWN, OUT_OF_SERVICE) DEFAULT UP, capabilities JSON, -- 存储智能体的能力标签如 [translation, zh-en, text] load_factor INT DEFAULT 0, -- 当前负载用于调度 last_heartbeat TIMESTAMP, -- 最后心跳时间 metadata JSON, -- 扩展元数据如版本、作者、输入输出schema created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );发现机制拉取模式客户端定期从注册中心拉取全量或增量的智能体列表。实现简单但实时性有延迟。推送模式注册中心在智能体状态变化时主动通知订阅的客户端如通过WebSocket或消息队列。实时性好但系统更复杂。混合模式对于服务发现如另一个智能体寻找伙伴可以采用客户端内嵌轻量级发现库类似微服务中的客户端发现直接查询注册中心API。对于管理台等实时性要求高的场景采用WebSocket推送。健康检查与保活 智能体需要定期如每30秒向注册中心发送心跳。注册中心如果一段时间如90秒没收到心跳则将智能体状态标记为DOWN或OUT_OF_SERVICE调度器将不再向其分发任务。一个健壮的设计是智能体在启动时注册在关闭前主动注销。同时平台侧也要有定时任务清理长时间无心跳的“僵尸”注册记录。注意注册中心的地址IP和端口对于所有智能体和客户端必须是可访问的。在生产环境中通常使用域名和负载均衡器来指向注册中心集群避免单点故障。3.3 设计调度与路由策略调度器是平台智能化的体现。最简单的调度是随机或轮询但一个实用的调度器需要考虑更多因素。调度决策流程请求解析客户端请求包含任务类型和参数。调度器首先解析请求确定需要哪些“能力”。能力匹配根据“能力”标签从注册中心查询所有状态为UP且具备该能力的智能体列表。筛选与排序负载均衡选择当前load_factor最低的智能体。负载因子可以根据并发请求数、CPU使用率等计算。地理位置如果智能体部署在全球多个区域优先选择离请求来源近的以降低延迟。版本偏好客户端可以指定需要的智能体版本调度器进行匹配。成本优化不同智能体可能运行在不同规格的机器上调用成本不同。调度器可以在满足SLA的前提下选择成本更低的。执行与容错将请求转发给选中的智能体。如果调用失败超时或返回错误调度器应能根据策略进行重试可能选择另一个智能体或快速失败。路由策略示例 假设我们有三个提供“文本摘要”能力的智能体summarizer-v1,summarizer-v2-fast,summarizer-v2-accurate。默认路由客户端不指定版本时路由到默认的summarizer-v2-fast。版本路由客户端请求头带X-Agent-Version: v1则路由到summarizer-v1。能力标签路由客户端可以指定更细的标签如{capability: summarization, mode: accurate}则路由到summarizer-v2-accurate。实操心得调度策略可以做成可插拔的模块。初期实现一个简单的“加权轮询”或“最少连接数”策略就够用。后期再逐步增加基于预测的智能调度。策略配置最好能热更新无需重启调度器。4. 平台搭建与核心环节实现4.1 技术栈选型与考量构建一个像agentbnb这样的平台技术选型决定了开发效率和后期维护成本。以下是一个基于云原生理念的参考技术栈组件候选技术选型考量后端框架FastAPI, Spring Boot (Java), Go (Gin/Echo)FastAPI是Python生态的绝佳选择。它异步性能好自动生成OpenAPI文档与Python AI生态PyTorch, Transformers无缝集成。如果团队以Java为主Spring Boot是稳健之选。Go则在性能和并发上有优势。服务注册与发现etcd, Consul, ZooKeeper, Redis, 自研数据库etcd/Consul是专为服务发现设计的分布式键值存储提供强一致性和Watch机制但引入额外组件。对于中小规模用Redis配合Pub/Sub或关系型数据库如PostgreSQL实现简化版可以降低复杂度。消息通信HTTP REST, gRPC, Message Queue (RabbitMQ, Kafka)HTTP REST最简单通用智能体实现门槛最低。gRPC性能更好适合内部高频调用。消息队列解耦更彻底支持异步任务和广播但复杂度高。建议初期用HTTP关键路径考虑gRPC。执行隔离Docker容器, Kubernetes Pod, 进程隔离Docker提供完整的环境隔离是最安全的方式适合运行任意代码的智能体。管理成本较高。进程隔离用虚拟环境更轻量适合信任的、纯Python的智能体。K8s则提供了强大的编排能力适合生产级部署。数据存储PostgreSQL, MySQL, MongoDB智能体元数据、任务日志、审计信息等结构化数据用PostgreSQL很合适。如果需要存储非结构化的会话历史或大块数据可以搭配MongoDB或MinIO对象存储。监控与日志Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana)Prometheus收集平台和智能体的指标QPS、延迟、错误率。Grafana用于可视化仪表盘。日志集中收集到ELK或Loki中便于排查问题。选型建议不要盲目追求新技术。如果你的团队精通Python那么 FastAPI PostgreSQL Docker 的组合能让你快速搭建出原型。稳定性压倒一切优先选择团队熟悉的技术。4.2 核心API设计与实现平台需要对外暴露一套清晰的API供客户端调用和智能体注册。1. 智能体注册API (POST /api/v1/agents)from pydantic import BaseModel from typing import List, Optional import uuid class AgentRegisterRequest(BaseModel): name: str description: str endpoint: str # 智能体自身的执行端点 health_check_endpoint: Optional[str] None capabilities: List[str] [] metadata: dict {} # 包含input_schema, output_schema等 app.post(/api/v1/agents) async def register_agent(request: AgentRegisterRequest): # 1. 验证endpoint是否可达可选可做简单健康检查 # 2. 生成唯一agent_id agent_id fagent_{uuid.uuid4().hex[:8]} # 3. 将信息存入数据库 db_agent { agent_id: agent_id, status: UP, **request.dict(), last_heartbeat: datetime.utcnow() } await db.agents.insert_one(db_agent) # 4. 可能触发事件通知调度器有新的智能体上线 await message_queue.publish(agent.registered, {agent_id: agent_id}) return {agent_id: agent_id, status: registered}2. 任务执行API (POST /api/v1/execute)这是客户端最常调用的接口。class TaskRequest(BaseModel): capability: str # 所需能力如 image_generation parameters: dict # 任务参数 agent_id: Optional[str] None # 可选指定某个智能体 # 其他元数据优先级、超时时间、回调地址等 app.post(/api/v1/execute) async def execute_task(request: TaskRequest): # 1. 根据capability或指定的agent_id通过调度器选择一个智能体 selected_agent await scheduler.select_agent(request.capability, request.agent_id) if not selected_agent: raise HTTPException(status_code404, detailNo available agent found) # 2. 可选根据智能体的input_schema验证parameters # 3. 构造转发请求添加平台上下文如request_id, user_id context { platform_request_id: str(uuid.uuid4()), timestamp: datetime.utcnow().isoformat() } payload { task_input: request.parameters, context: context } # 4. 异步调用选中的智能体 try: async with httpx.AsyncClient(timeout30.0) as client: response await client.post( selected_agent.endpoint /run, jsonpayload, headers{Content-Type: application/json} ) response.raise_for_status() result response.json() except (httpx.TimeoutException, httpx.RequestError) as exc: # 调用失败更新智能体状态可能触发重试逻辑 await update_agent_status(selected_agent.id, DOWN) # 这里可以嵌入重试逻辑选择另一个智能体重试 raise HTTPException(status_code503, detailfAgent unavailable: {exc}) # 5. 记录任务日志异步进行避免阻塞主流程 asyncio.create_task(log_task_execution(request, selected_agent, result)) # 6. 返回结果给客户端 return result3. 智能体发现与查询API (GET /api/v1/agents)app.get(/api/v1/agents) async def list_agents(capability: Optional[str] None, status: Optional[str] None): query {} if capability: query[capabilities] capability if status: query[status] status agents await db.agents.find(query).to_list(100) # 过滤掉敏感信息只返回公开元数据 return [{agent_id: a[agent_id], name: a[name], description: a[description], status: a[status], capabilities: a[capabilities]} for a in agents]实操心得API设计要遵循RESTful风格并做好版本管理/api/v1/。所有对智能体的调用都要设置合理的超时时间如30秒并使用异步客户端防止一个慢速智能体拖垮整个平台。返回给客户端的错误信息要友好但日志里要记录详细的内部错误方便排查。4.3 智能体生命周期管理平台不能只负责“派活”还得负责“后勤保障”即智能体的全生命周期管理。部署与启动镜像打包为每个智能体创建Docker镜像包含代码、依赖和环境。使用多阶段构建减小镜像体积。配置注入智能体启动时需要知道注册中心的地址、自己的身份令牌等。这些配置通过环境变量或配置文件注入不要硬编码在镜像里。健康检查集成在智能体镜像中除了业务服务还要提供一个/health端点用于平台探活。这个端点应该检查关键依赖如模型、数据库是否就绪。伸缩与负载均衡水平伸缩当某个智能体的请求队列持续过长平台应能自动触发扩容。这需要与K8s或云服务商的API集成创建新的智能体实例并注册。负载均衡器对于同一智能体的多个实例平台内部或通过外部负载均衡器如Nginx需要将请求均匀分发。可以使用轮询、最少连接等算法。版本升级与回滚蓝绿部署部署新版本智能体v2时先注册新实例但不将流量切过去。通过管理台手动将一部分流量导入v2进行测试。测试无误后逐步将流量从v1切换到v2。出现问题则快速切回v1。平台支持平台API应支持按版本路由。这样即使v2已经上线部分重要客户端仍可指定使用稳定的v1版本实现平滑过渡。监控与告警关键指标每个智能体的QPS、平均响应时间、错误率、资源使用率CPU/内存。业务指标根据智能体类型定义如图文生成智能体的“图片生成耗时”、“审美评分”代码生成智能体的“代码通过率”。告警规则当错误率超过5%持续5分钟或响应时间P99大于10秒时触发告警邮件、钉钉、Slack。注意智能体的生命周期管理是平台最复杂的部分之一。建议初期以手动管理为主自动化脚本为辅。待核心流程跑通后再逐步实现自动化伸缩和部署。切忌一开始就追求全自动化容易陷入基础设施的泥潭。5. 常见问题与排查技巧实录在实际搭建和运营agentbnb这类平台的过程中你会遇到各种各样的问题。下面是我总结的一些典型坑点和解决思路。5.1 智能体失联与“僵尸”服务问题现象调度器将任务路由到一个智能体但调用超时失败。查看注册中心该智能体状态仍是UP。排查思路检查网络连通性从平台服务器ping/telnet智能体所在机器的IP和端口。可能是防火墙规则、安全组配置错误或者智能体容器/进程崩溃但端口未释放。检查智能体健康检查直接调用智能体的/health端点看是否正常响应。可能是智能体内部依赖如数据库、模型文件出现问题导致服务假死。检查心跳机制确认智能体的心跳任务是否在正常运行。如果是定时任务是否因为线程阻塞、异常退出而停止。检查注册中心查看该智能体的last_heartbeat时间。如果远远超过心跳间隔如设定30秒心跳但记录显示5分钟前说明心跳没有成功更新到数据库。可能是网络问题也可能是数据库压力大导致更新慢。解决方案与预防加强健康检查智能体的健康检查不应只是“进程存活”而应检查核心功能。例如一个翻译智能体可以在/health里尝试翻译一个简单句子验证模型是否加载成功。设置合理的超时和重试平台调用智能体时设置连接超时如5秒和读取超时如25秒。第一次调用失败后立即将智能体标记为“可疑”并选择另一个实例重试。实现主动摘除注册中心应有后台线程定期扫描last_heartbeat过期的记录自动将其状态改为DOWN。这可以作为心跳失败的最后保障。完善日志在智能体启动、心跳发送、注册中心更新状态等关键环节打上详细的日志并带上唯一请求ID方便串联整个生命周期。5.2 任务执行超时与雪崩问题现象某个智能体处理某个特定任务特别慢例如处理一个超长文本导致任务队列堆积。后续请求持续等待最终大量超时平台整体响应变慢甚至瘫痪。排查思路定位慢速智能体查看监控仪表盘找到响应时间P99或P999异常高的智能体。分析任务特征查看该智能体的慢速请求日志分析输入参数是否有共性如文本长度、图片分辨率特别大。检查资源瓶颈登录智能体所在服务器查看CPU、内存、GPU、磁盘IO是否达到瓶颈。可能是单个任务消耗资源过大也可能是并发太多导致资源争抢。解决方案与预防任务超时控制在平台层面和智能体层面设置双重超时。平台调用智能体超时如30秒则直接返回失败避免阻塞。智能体内部处理也应设置超时防止某个子操作卡死。实现熔断机制当某个智能体的错误率或慢速比例超过阈值如50%请求超过10秒调度器暂时熔断对该智能体的调用直接返回失败或降级到备用方案。一段时间后如1分钟进入半开状态尝试放少量流量探测是否恢复。任务队列与限流为每个智能体设置一个任务队列和并发数限制。例如限制某个GPU密集型智能体最多同时处理3个任务后续请求在队列中等待或立即返回“服务繁忙”。这保护了智能体不被压垮。输入验证与裁剪在平台转发请求前根据智能体声明的input_schema进行验证。对于文本长度、文件大小等可以设置硬性限制超过则直接拒绝并提示用户“输入过长”。异步任务模式对于预计执行时间很长的任务超过1分钟不应采用同步HTTP调用。可以改为异步模式客户端提交任务后立即返回一个task_id客户端随后轮询或通过WebSocket回调来获取结果。平台将任务放入消息队列由智能体异步消费。5.3 智能体版本冲突与依赖地狱问题现象智能体A升级后依赖了新的库版本导致与智能体B所需的旧版本冲突。或者平台升级了基础环境导致部分智能体无法运行。排查思路检查错误日志智能体启动失败或执行时报错通常会有明确的导入错误ImportError或运行时错误。对比环境对比能正常运行的旧环境与当前环境的pip list或conda list找出有版本差异的包。审查Dockerfile检查智能体的Dockerfile中是否固定了关键依赖的版本。解决方案与预防严格的容器隔离这是最根本的解决方案。每个智能体必须运行在自己独立的Docker容器中拥有完全隔离的Python环境。这样智能体A用TensorFlow 2.10智能体B用TensorFlow 2.15互不影响。使用轻量级基础镜像推荐使用python:3.11-slim这类小型镜像作为基础在镜像内用虚拟环境或直接pip install安装依赖。避免使用臃肿的、包含大量预装库的AI基础镜像以减少冲突风险和镜像体积。依赖清单锁定在智能体项目中提供requirements.txt或pyproject.toml文件并使用pip-tools或poetry锁定所有依赖的确切版本。在Docker构建时依据锁定的版本文件安装。提供基础工具镜像对于团队内部可以维护一个包含常用AI框架如PyTorch、Transformers和平台SDK的基础镜像。智能体基于此镜像构建只需安装自己独有的少量包。这能加快构建速度并确保基础依赖一致。5.4 安全与权限控制缺失问题现象任何知道平台地址的人都可以调用智能体智能体可以未经授权访问平台内部数据库或其他服务。排查思路这是一个设计阶段就该考虑的问题。如果上线后发现需要紧急评估风险。解决方案与预防API认证与授权平台的所有API除健康检查都应要求身份验证。可以使用API Key、JWT令牌或OAuth 2.0。在调度器转发请求给智能体时也应携带一个内部服务令牌智能体端验证此令牌后才执行。智能体间调用的安全智能体A调用智能体B时不应直接使用B的内部地址而应通过平台网关。平台网关负责鉴权、限流和审计。这样即使B的地址暴露外部也无法直接调用。网络隔离将智能体运行在独立的网络命名空间或子网中通过平台网关与之通信。智能体不应有直接访问互联网或内部核心数据库的权限。如果智能体需要访问外部资源应通过平台提供的安全代理或预先配置好的白名单。输入输出过滤与审计对用户输入进行严格的过滤和转义防止注入攻击。对智能体的输出内容特别是文本生成类进行必要的审核防止产生有害内容。所有任务执行记录都应审计日志便于追溯。实操心得安全是一个持续的过程。建议在项目初期就引入最少权限原则。可以先用一个简单的API Key认证然后逐步完善角色权限控制RBAC区分普通用户、智能体开发者、管理员等不同角色。定期进行安全扫描和渗透测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2617149.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…