打通智能体孤岛:用 AgentRun 构建生产级 A2A 多 Agent 管理协作系统

news2026/3/17 17:10:32
作者丛霄当我们把一个复杂业务拆解成多个专职 Agent 时随之而来的问题是这些 Agent 怎么知道彼此的存在怎么找到对方、理解对方的能力、发起调用A2AAgent-to-Agent协议给出了标准答案。它由 Google 主导提出通过AgentCard让每个智能体对外自描述能力与接入方式通过服务发现让调用方动态感知可用 Agent 的全貌。然而协议只定义了规范生产落地还需要一套完整的管理体系——注册、隔离、权限控制、多环境管理缺一不可。AgentRun 在 A2A 协议之上构建了这套体系。本文从原理出发以「希希咖啡厅」多 Agent 系统为例完整演示如何在 AgentRun 中完成从工作空间搭建、发现端点配置到用 Go SDK 拉取 AgentCard、与 Agent 完成一轮对话的全链路流程。A2A 协议原理AgentCard智能体的自我介绍A2A 协议中每个智能体都通过一份AgentCard对外声明自己的身份和能力。AgentCard 是一份标准 JSON 文档描述了是谁Agent 的名称、描述、版本、提供方能做什么技能列表Skills每个技能有 ID、名称、描述和示例问法怎么访问服务地址URL、支持的传输协议JSON-RPC / gRPC有什么限制认证方式OAuth2、API Key 等、是否支持流式响应。按照 A2A 标准AgentCard 默认托管在/.well-known/agent-card.json路径下客户端只需知道 Agent 的 Base URL就能拿到这份自描述文档进而决定如何与它通信。一个典型的 AgentCard 结构如下{ name: coffee_agent, description: 希希咖啡店智能服务可以帮助点咖啡和查询订单, url: https://agent.example.com/agent, version: 0.0.1, capabilities: { streaming: true, pushNotifications: true, stateTransitions: [submitted, working, completed, failed] }, skills: [ { id: coffee_agent-get_products, name: 获取商品列表, description: 获取当前可点的咖啡饮品列表, examples: [有什么咖啡推荐, 看看菜单] }, { id: coffee_agent-create_order, name: 创建订单, description: 帮用户下单点咖啡, examples: [我要一杯拿铁, 下单两杯美式] } ] }服务发现谁在这个网络里有了 AgentCard 规范还缺一个关键问题的答案我怎么知道有哪些 Agent 可以调用A2A 协议本身没有定义中心化的注册表实际项目中通常需要一个「发现层」来管理 Agent 的注册和查询。发现层的职责是接受一个查询如「给我这个环境里所有可用的 Agent」返回每个 Agent 的 AgentCard URL调用方再逐一拉取 AgentCard 完成能力感知。通信机制JSON-RPC 2.0 Task 模型A2A 协议的核心是JSON-RPC 2.0消息格式配合Task任务模型来实现 Agent 间的通信。消息格式A2A 采用标准的 JSON-RPC 2.0 请求/响应模式// 请求 { jsonrpc: 2.0, id: 1, method: tasks/sendMessage, params: { message: { role: user, parts: [{ type: text, text: 我要一杯拿铁 }] }, taskId: null } } // 响应 { jsonrpc: 2.0, id: 1, result: { id: task-123, status: { state: completed }, messages: [...], artifacts: [...] } }核心方法包括tasks/sendMessage发送消息创建新 Task 或继续已有 Tasktasks/get查询 Task 状态tasks/cancel取消执行中的 Task。Task 生命周期每个与 Agent 的交互都建模为一个TaskTask 有明确的状态流转submitted → working → completed ↓ ↓ failed canceledsubmitted任务已提交等待处理workingAgent 正在处理可能通过messageDelta事件推送中间结果completed任务完成返回最终结果failed执行失败canceled任务被取消。流式响应Server-Sent EventsA2A 支持通过 Server-Sent EventsSSE实现流式输出。当 AgentCard 中capabilities.streaming: true时客户端可以订阅任务的事件流// SSE 事件流 event: messageDelta data: {messageId: msg-1, parts: [{type: text, text: 正在为您}]} event: messageDelta data: {messageId: msg-1, parts: [{type: text, text: 下单...}]} event: taskStatusUpdate data: {taskId: task-123, status: {state: completed}}这种模式特别适合长文本生成、多步骤推理等耗时操作用户无需等待完整响应即可看到中间进展。推拉模式主动通知除了客户端主动拉取pollingA2A 还支持服务端主动推送。当capabilities.pushNotifications: true时Agent 可以在任务状态变化时主动通知客户端// 客户端在初始请求中携带 pushNotification URL { params: { message: {...}, pushNotification: { url: https://client.example.com/callback, token: optional-auth-token } } }这样Agent 处理完任务后可以直接回调客户端无需客户端轮询。技能调用Skills 机制AgentCard 中的skills数组定义了 Agent 可以执行的原子能力。每个 Skill 包含id唯一标识符name人类可读名称description功能描述examples示例问法帮助 LLM 理解何时应该调用这个 Skill。调用方在拿到 AgentCard 后可以将 Skills 告诉主控 AgentOrchestrator让它根据用户意图选择合适的 Skill在tasks/sendMessage时通过skillId参数直接指定调用某个 Skill简单场景下让 Agent 自行判断使用哪个 Skill依赖 LLM 的推理能力。AgentRun 的多 Agent 管理注册、发现与隔离AgentRun 在 A2A 协议基础上提供了一套生产级的多 Agent 管理体系核心围绕三个概念工作空间Workspace逻辑隔离的 Agent 集合工作空间是 AgentRun 中组织 Agent 的基本单位类似于一个「项目空间」或「命名空间」。不同业务域、不同团队的 Agent 可以分属不同工作空间互相隔离权限独立管理。一个 Agent Runtime 归属于一个工作空间后工作空间就成为它对外可被发现的范围边界。发现端点Discovery Endpoint按环境隔离的发现入口一个工作空间内可以配置多个发现端点典型用法是按部署环境区分每个发现端点维护了一张映射表记录「哪个 Agent」对应「哪个访问地址」。同一个 Agent 在不同端点中可以配置不同的地址例如开发地址 vs 自定义域名。平台托管 vs 外部 Agent统一的发现体验AgentRun 支持两类 Agent 共存于同一工作空间类型部署方式注册方式状态流转平台托管 AgentAgentRun 负责部署到运行时通过创建注册CREATING → READY外部 Agent自行部署在任意位置手动注册到指定空间直接 READY两类 Agent 在发现端点中的表现完全一致——调用方拿到的都是标准a2aAgentCardUrl无需关心 Agent 实际部署在哪里。凭证安全保护谁可以发现这些 Agent服务发现本身就是敏感信息——暴露工作空间内有哪些 Agent、它们在哪里可能为攻击者提供侦察入口。AgentRun 在发现端点上内置了完整的凭证验证体系支持多种行业标准的认证方式可按场景灵活选择。支持的凭证类型API Key最轻量的接入方式适合服务端对服务端的调用场景。平台颁发一个 Key调用方在请求头中携带即可。# 使用自定义 Header推荐更语义化 curl -H X-API-Key: your-api-key \ https://.../workspaces/workspace-name/discovery/agents?discoveryEndpointNamedefault # 或使用标准 Authorization Bearer 方式 curl -H Authorization: Bearer your-api-key \ https://.../workspaces/workspace-name/discovery/agents?discoveryEndpointNamedefaultHeader 名称如X-API-Key和 prefix如Bearer均可在凭证配置中自定义。此外Key 也可以通过 URL 查询参数?Authorizationkey传递方便在不便设置请求头的环境中使用。HTTP Basic Auth兼容标准 HTTP Basic 认证适合对接遗留系统或工具链中不便使用 Token 的场景。curl -u username:password \ https://.../workspaces/my-workspace/discovery/agents?discoveryEndpointNamedefault凭证与工作空间的绑定关系凭证配置与工作空间解耦——你可以在平台统一管理凭证然后将某个凭证绑定到指定工作空间的服务发现配置上。绑定之后未携带有效凭证的请求会被拒绝401 / 403更换凭证时只需在平台重新绑定无需修改任何 Agent 的代码不同工作空间可以绑定不同凭证实现精细化的访问控制。实战体验准备工作创建工作空间并注册 Agent第一步部署模版多 Agent 系统本文以「希希咖啡厅」多 Agent 系统作为演示对象。在 AgentRun 控制台的Agent 模版页面找到该模版点击一键部署平台会自动创建并启动以下两个 Agentcoffee_agent希希咖啡店智能服务负责点单、查看菜单、查询订单delivery_agent送了么配送助手负责安排配送和查询配送状态。等待两个 Agent 状态变为Ready后进行下一步。第二步创建工作空间在 AgentRun 控制台新建一个工作空间Workspace。工作空间是组织和隔离 Agent 的基本单元后续的服务发现都以工作空间为范围。第三步将 Agent 注册到工作空间有两种方式将 Agent 纳入工作空间方式一创建新 Agent 时指定工作空间在创建 Agent Runtime 时填写workspaceId字段Agent 会直接归属到该工作空间。方式二将已有 Agent 移入工作空间在 Agent 详情页或工作空间管理页面将已有的 Agent Runtime 迁移到目标工作空间。外部 Agent 也可接入如果你有运行在 AgentRun 平台外部的 A2A 兼容服务自建服务、第三方 Agent同样可以注册进来。注册时勾选「外部 Agent」选项并填写对外服务地址即可平台不会尝试部署状态立即变为 Ready后续发现和调用方式与平台托管 Agent 完全一致。配置发现端点Agent 注册好之后还需要在工作空间中配置「发现端点」才能让外部调用方通过统一入口发现这些 Agent。在工作空间管理页面进入「服务发现」或「Discovery」配置添加一个发现端点例如命名为default然后将工作空间内的 Agent 逐一配置进来填写每个 Agent 的访问地址。配置访问凭证为了防止发现端点被未授权访问可以为工作空间绑定一个 API Key 凭证。配置后所有对该工作空间发现端点的请求都需要在请求头中携带 X-API-Key。在工作空间设置中选择或创建一个凭证将其关联到该工作空间的服务发现配置上。调用发现端点配置完成后可以用下面的方式验证发现端点是否正常工作curl -s \ -H X-API-Key: your-api-key \ https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/workspaces/workspace-name/discovery/agents?discoveryEndpointNamedefault响应示例{ code: SUCCESS, data: { items: [ { agentRuntimeName: coffee-agent, protocolConfiguration: { protocolSettings: [ { name: A2A, a2aAgentCardUrl: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/coffee-agent/endpoints/Default/invocations/.well-known/agent-card.json } ] } } ], pageNumber: 1, pageSize: 1, total: 1 } }每个 Agent 的a2aAgentCardUrl就是接下来用 A2A SDK 发起连接的入口。基于 a2a-go SDK 的发现 Demo以下是一个完整的 Go Demo展示如何从发现端点解析出 AgentCard URL再使用 a2a-go SDK https://github.com/a2aproject/a2a-go 获取 AgentCard 并与 Agent 通信。完整代码位于examples/a2a-discovery-demo/。package main import ( context encoding/json flag fmt io log net/http os github.com/a2aproject/a2a-go/a2a github.com/a2aproject/a2a-go/a2aclient github.com/a2aproject/a2a-go/a2aclient/agentcard ) // DiscoveryResponse 是 AgentRun 发现端点的响应结构 // 实际响应格式{code:SUCCESS,data:{items:[...]}} type DiscoveryResponse struct { Code string json:code Data *DiscoveryData json:data,omitempty AgentRuntimes []AgentRuntime json:agentRuntimes,omitempty // 兼容旧版格式 } type DiscoveryData struct { Items []AgentRuntime json:items PageNumber int json:pageNumber PageSize int json:pageSize Total int json:total } type AgentRuntime struct { AgentRuntimeName string json:agentRuntimeName ProtocolConfiguration *ProtocolConfiguration json:protocolConfiguration,omitempty } type ProtocolConfiguration struct { ProtocolSettings []ProtocolSetting json:protocolSettings } type ProtocolSetting struct { Name string json:name A2AAgentCardURL string json:a2aAgentCardUrl,omitempty } // Config 保存运行时的所有端点配置 type Config struct { DiscoveryBaseURL string // AgentRun 平台基础地址格式https://uid.agentrun-data.cn-hangzhou.aliyuncs.com WorkspaceID string // 工作空间名称 DiscoveryEndpointName string // 发现端点名称通常为 default APIKey string // API Key 凭证 } func (c *Config) discoveryURL() string { return fmt.Sprintf( %s/workspaces/%s/discovery/agents?discoveryEndpointName%s, c.DiscoveryBaseURL, c.WorkspaceID, c.DiscoveryEndpointName, ) } func main() { var cfg Config flag.StringVar(cfg.DiscoveryBaseURL, base-url, envOrDefault(AGENTRUN_BASE_URL, ), AgentRun 平台基础地址) flag.StringVar(cfg.WorkspaceID, workspace-id, envOrDefault(AGENTRUN_WORKSPACE_ID, ), 工作空间名称) flag.StringVar(cfg.DiscoveryEndpointName, endpoint-name, envOrDefault(AGENTRUN_ENDPOINT_NAME, default), 发现端点名称) flag.StringVar(cfg.APIKey, api-key, envOrDefault(AGENTRUN_API_KEY, ), API Key 凭证) flag.Parse() ctx : context.Background() // ── 第一步请求发现端点获取 Agent 列表 ───────────────────────────── req, _ : http.NewRequestWithContext(ctx, http.MethodGet, cfg.discoveryURL(), nil) req.Header.Set(X-API-Key, cfg.APIKey) resp, err : http.DefaultClient.Do(req) if err ! nil { log.Fatalf(请求发现端点失败: %v, err) } defer resp.Body.Close() body, _ : io.ReadAll(resp.Body) var discovery DiscoveryResponse if err : json.Unmarshal(body, discovery); err ! nil { log.Fatalf(解析发现响应失败: %v, err) } // ── 第二步从响应中提取 A2AAgentCardURL ───────────────────────────── // 响应嵌套在 data.items 中旧版在顶层 agentRuntimes runtimes : discovery.AgentRuntimes if discovery.Data ! nil len(discovery.Data.Items) 0 { runtimes discovery.Data.Items } var firstCardURL string for _, runtime : range runtimes { if runtime.ProtocolConfiguration nil { continue } for _, ps : range runtime.ProtocolConfiguration.ProtocolSettings { if ps.Name A2A ps.A2AAgentCardURL ! { fmt.Printf(发现 Agent: %s\n AgentCard URL: %s\n\n, runtime.AgentRuntimeName, ps.A2AAgentCardURL) if firstCardURL { firstCardURL ps.A2AAgentCardURL } } } } if firstCardURL { log.Fatal(未发现任何 A2A Agent) } // ── 第三步用 agentcard.Resolver 拉取 AgentCard ────────────────────── // A2AAgentCardURL 已是完整 URLWithPath() 跳过默认路径拼接 card, err : agentcard.DefaultResolver.Resolve(ctx, firstCardURL, agentcard.WithPath()) if err ! nil { log.Fatalf(获取 AgentCard 失败: %v, err) } fmt.Printf(AgentCard 信息:\n) fmt.Printf( 名称: %s\n, card.Name) fmt.Printf( 描述: %s\n, card.Description) fmt.Printf( 版本: %s\n, card.Version) fmt.Printf( 服务地址: %s\n, card.URL) fmt.Printf( 支持流式: %v\n, card.Capabilities.Streaming) for _, skill : range card.Skills { fmt.Printf( - [%s] %s: %s\n, skill.ID, skill.Name, skill.Description) } // ── 第四步建立 A2A 客户端向 Agent 发送消息 ─────────────────────── // NewFromCard 根据 AgentCard 声明的 preferredTransport 自动选择传输协议 client, err : a2aclient.NewFromCard(ctx, card) if err ! nil { log.Fatalf(创建 A2A 客户端失败: %v, err) } defer client.Destroy() msg : a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: 你好请介绍一下你能做什么}) result, err : client.SendMessage(ctx, a2a.MessageSendParams{Message: msg}) if err ! nil { log.Fatalf(发送消息失败: %v, err) } // SendMessageResult 是 interface实际类型为 *a2a.Task 或 *a2a.Message switch r : result.(type) { case *a2a.Task: fmt.Printf(\nAgent 回复 (Task, 状态: %s):\n, r.Status.State) for _, artifact : range r.Artifacts { for _, part : range artifact.Parts { if tp, ok : part.(a2a.TextPart); ok { fmt.Printf( %s\n, tp.Text) } } } case *a2a.Message: fmt.Printf(\nAgent 回复 (Message):\n) for _, part : range r.Parts { if tp, ok : part.(a2a.TextPart); ok { fmt.Printf( %s\n, tp.Text) } } } } func envOrDefault(key, defaultVal string) string { if v : os.Getenv(key); v ! { return v } return defaultVal }运行方式通过 run_demo.sh 脚本运行所有端点参数通过环境变量传入# run_demo.sh #!/usr/bin/env bash set -euo pipefail SCRIPT_DIR$(cd $(dirname ${BASH_SOURCE[0]}) pwd) # ── 端点配置可通过环境变量覆盖 ───────────────────────────────────────── BASE_URL${AGENTRUN_BASE_URL:?请设置 AGENTRUN_BASE_URL例如 https://uid.agentrun-data.cn-hangzhou.aliyuncs.com} WORKSPACE_ID${AGENTRUN_WORKSPACE_ID:?请设置 AGENTRUN_WORKSPACE_ID即工作空间名称} ENDPOINT_NAME${AGENTRUN_ENDPOINT_NAME:-default} API_KEY${AGENTRUN_API_KEY:?请设置 AGENTRUN_API_KEY} cd $SCRIPT_DIR echo ▶ 运行 A2A Discovery Demo echo base-url: $BASE_URL echo workspace-id: $WORKSPACE_ID echo endpoint-name: $ENDPOINT_NAME echo go run main.go \ --base-url $BASE_URL \ --workspace-id $WORKSPACE_ID \ --endpoint-name $ENDPOINT_NAME \ --api-key $API_KEY执行命令exportAGENTRUN_BASE_URLhttps://uid.agentrun-data.cn-hangzhou.aliyuncs.com exportAGENTRUN_WORKSPACE_IDworkspace-name exportAGENTRUN_API_KEYyour-api-key ./examples/a2a-discovery-demo/run_demo.sh执行结果▶ 运行 A2A Discovery Demo base-url: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com workspace-id: workspace-name endpoint-name: default A2A Discovery Demo 发现端点: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/workspaces/workspace-name/discovery/agents?discoveryEndpointNamedefault 发现 2 个 A2A Agent: - buy-me-a-coffeev-workspace-name_coffee_agent AgentCard URL: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/buy-me-a-coffeev-workspace-name_coffee_agent/endpoints/Default/invocations/.well-known/agent-card.json - buy-me-a-coffeev-workspace-name_delivery_agent AgentCard URL: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/buy-me-a-coffeev-workspace-name_delivery_agent/endpoints/Default/invocations/.well-known/agent-card.json 正在获取 AgentCard: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/buy-me-a-coffeev-workspace-name_coffee_agent/endpoints/Default/invocations/.well-known/agent-card.json AgentCard 信息: 名称: coffee_agent 描述: 希希咖啡店智能服务可以帮助点咖啡和查询订单 版本: 0.0.1 服务地址: https://uid.agentrun-data.cn-hangzhou.aliyuncs.com/agent-runtimes/buy-me-a-coffeev-workspace-name_coffee_agent/endpoints/Default/invocations 支持流式: false 技能列表: - [coffee_agent] model: 希希咖啡店智能服务可以帮助点咖啡和查询订单 - [coffee_agent-get_products_api_coffee_products_get] get_products_api_coffee_products_get: 获取商品列表 - [coffee_agent-create_order_api_coffee_orders_post] create_order_api_coffee_orders_post: 创建订单 - [coffee_agent-get_order_api_coffee_orders__order_id__get] get_order_api_coffee_orders__order_id__get: 获取订单详情 ...共 9 个技能 发送消息: 你好请介绍一下你能做什么 Agent 回复 (Task, 状态: completed): 你好我是希希咖啡的智能服务助手可以帮你做以下几件事情哦 - 点咖啡为你推荐饮品、帮助下单。 - 查询订单查看你的订单状态或获取最近的订单信息。 - 提供门店基础信息比如地址、营业时间等。 有什么我可以帮到你的吗☕️总结本文完整走通了 AgentRun A2A 通信链路的多个环节。A2A 的价值不止于此次演示的单轮对话。一旦你的 Agent 网络通过服务发现互相可见Orchestrator Agent 就可以在运行时动态拼装调用链将复杂任务分发给最合适的专职 Agent——这正是多智能体协作的核心模式。AgentRun 的工作空间与发现端点机制让这套模式在生产环境中真正可管理、可扩展、可审计。本功能目前邀测阶段欢迎加入“函数计算 AgentRun 客户群”钉群号134570017218联系试用。立即体验函数计算 AgentRun函数计算 AgentRun 的无代码到高代码演进能力现已开放体验查看更多产品详情https://www.aliyun.com/product/fc/agentrun快速创建访问控制台https://functionai.console.aliyun.com/cn-hangzhou/agent/explore60 秒创建你的第一个 Agent深度定制当需要更复杂功能时一键转换为高代码持续演进利用函数计算 AgentRun 的基础设施能力持续优化你的 Agent快速了解函数计算 AgentRun一句话介绍函数计算 AgentRun 是一个以高代码为核心的一站式 Agentic AI 基础设施平台。秉持生态开放和灵活组装的理念为企业级 Agent 应用提供从开发、部署到运维的全生命周期管理。函数计算 AgentRun 架构图AgentRun 运行时基于阿里云函数计算 FC 构建继承了 Serverless 计算极致弹性、按量付费、零运维的核心优势。通过深度集成 AgentScope、LangChain、RAGFlow、Mem0 等主流开源生态。函数计算 AgentRun 将 Serverless 的极致弹性、零运维和按量付费的特性与 AI 原生应用场景深度融合助力企业实现成本与效率的极致优化平均 TCO 降低 60%。让开发者只需专注于 Agent 的业务逻辑创新无需关心底层基础设施让 Agentic AI 真正进入企业生产环境。参考链接[1] A2A Protocol Specificationhttps://browser.alibaba-inc.com/?Urlhttps%3A%2F%2Fa2a-protocol.org%2Flatest%2Fspecification%2F[2] a2a-go SDKhttps://github.com/a2aproject/a2a-go

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