AI智能体安全沙箱AgentKernel:构建生产级防火墙与权限控制

news2026/4/30 3:48:53
1. 项目概述为AI智能体构建一道坚不可摧的防火墙如果你正在或计划在生产环境中部署AI智能体Agent无论是基于LangChain、OpenClaw还是AutoGPT那么有一个问题你迟早会面对安全。这些智能体本质上是一段能够自主调用工具如读写文件、执行命令、访问网络的代码它们拥有与你运行它们的进程相同的权限。想象一下一个被恶意提示词诱导或者代码本身存在漏洞的智能体可以悄无声息地读取你的~/.ssh/id_rsa私钥、将敏感数据发送到外部服务器或者在你的服务器上执行rm -rf /。这绝非危言耸听现实中的安全事件如OpenClaw的ClawHavoc恶意技能集已经敲响了警钟。AgentKernel正是为了解决这个核心痛点而生。它不是一个全新的智能体框架而是一个安全沙箱或者说一个专为AI智能体设计的防火墙。它的定位非常清晰框架无关、自托管、开源。这意味着无论你使用哪种智能体框架都可以将AgentKernel作为一层透明的安全代理插入进去拦截、审查并控制智能体发出的每一个操作请求。它的口号“Run any AI agent safely. See everything. Block what‘s dangerous.”精准地概括了其价值。对于开发者、运维工程师和安全负责人而言AgentKernel提供了从策略定义、实时拦截到完整审计的一站式解决方案。它让你在享受AI智能体自动化能力的同时无需在安全问题上提心吊胆。接下来我将从一个实践者的角度深入拆解AgentKernel的设计哲学、核心机制以及如何将其集成到你的工作流中。2. 核心架构与安全设计哲学AgentKernel的架构设计体现了现代安全领域的“纵深防御”思想。它不是依靠单一机制而是通过多层、互补的安全控制来确保即使某一层被突破整体系统依然安全。理解这个架构是有效使用它的前提。2.1 整体工作流透明的请求拦截AgentKernel的核心工作模式是“代理”或“边车”。你的智能体例如一个LangChain应用不再直接操作系统资源而是将所有工具调用请求发送给AgentKernel。AgentKernel作为中间人对这些请求进行安全评估后再决定是放行、阻断还是需要人工审批。[你的智能体应用] -- (工具调用请求) -- [AgentKernel安全沙箱] -- (策略检查) -- [放行/阻断] -- [实际系统资源] ↑ |--- [策略引擎] |--- [能力令牌系统] |--- [审计日志器] |--- [进程沙箱]这种设计的最大好处是对业务代码侵入性极低。你通常只需要修改智能体框架的工具调用端点或者使用AgentKernel提供的适配器如LangChain Adapter包装现有工具即可接入安全层。2.2 四大核心安全组件深度解析2.2.1 策略引擎定义安全的边界策略引擎是安全规则的大脑。它采用“默认拒绝显式允许”的白名单思维这是安全领域的黄金准则。所有操作默认都是被禁止的你必须通过策略文件明确声明哪些操作是允许的。策略使用YAML格式定义结构清晰。一个关键的设计亮点是跨域安全检查。传统的安全工具可能会孤立地检查“文件访问”和“Shell命令”。但攻击者完全可以通过一个被允许的Shell命令如cat去读取一个被禁止访问的文件如~/.ssh/id_rsa。AgentKernel的策略引擎能智能地识别这种关联例如当它看到bash工具的参数中包含文件路径时会自动将该路径提交给文件策略模块进行二次校验从而封堵了这个常见的安全盲区。实操心得在定义策略时切忌一开始就设置过于宽松的规则。建议从default: block开始然后通过智能体的实际运行日志审计日志观察它尝试访问哪些资源再逐步、精确地添加allow规则。这个过程类似于配置防火墙规则最小化权限是核心。2.2.2 能力令牌系统动态、细粒度的权限授予静态的策略文件有时不够灵活。例如一个智能体可能只在执行特定任务时需要临时访问某个数据库密钥。能力令牌系统为此而生。它通过HMAC哈希消息认证码生成具有密码学签名的令牌每个令牌都精确描述了“谁”agentId在“什么时间范围内”durationMs可以“对什么资源”resource进行“何种操作”actions。这种“即时权限”模式极大地缩小了攻击面。即使攻击者窃取了一个令牌其有效期和权限范围也受到严格限制无法滥用。令牌的验证使用常数时间比较算法可以有效防止通过测量响应时间来猜测签名信息的时序攻击。2.2.3 审计日志器一切操作皆有迹可循“看见”是安全的基础。审计日志器将每一次策略决策无论允许还是阻止的完整上下文记录到PostgreSQL中包括时间戳、智能体ID、操作类型、资源标识、请求参数、决策结果和原因。这不仅是为了事后追责更是进行安全分析和策略调优的宝贵数据源。例如你可以通过SQL查询快速发现异常模式“过去一小时内哪个智能体被阻止访问敏感文件的次数异常增多” 这可能是攻击尝试的早期信号。AgentKernel的日志格式设计考虑了合规性如HIPAA, SOC2便于企业集成到现有的安全信息与事件管理系统中。2.2.4 进程沙箱最后的隔离防线这是最后一道也是最严格的防线。当AgentKernel需要执行一些不可信的用户代码例如处理动态生成的脚本时它会将其放入一个V8隔离沙箱中。这个沙箱设置了严格的内存上限、执行超时并移除了所有危险的全局对象如require(‘child_process’),fs,net。即使恶意代码突破了前面的逻辑策略也会被物理限制在这个“牢笼”里无法对主机造成实际损害。3. 从零开始部署与集成实战了解了核心原理后我们进入实战环节。我将带你完成一个典型的部署和集成流程涵盖本地开发和生产环境的关键配置。3.1 环境准备与快速启动AgentKernel基于Node.js生态因此首先需要确保你的环境符合要求。# 1. 确认Node.js版本 20 node --version # 2. 全局安装AgentKernel CLI工具 # 推荐使用pnpm它在处理Monorepo依赖时更高效。npm同样可用。 npm install -g agentkernel/agent-kernel # 或 pnpm add -g agentkernel/agent-kernel # 3. 初始化项目配置 # 这个命令会启动一个交互式向导引导你创建初始策略文件和.env环境变量。 agentkernel init向导会询问你一些基本问题例如工作目录、默认策略模板strict,balanced,permissive。对于初次使用选择balanced平衡模式是个不错的起点。完成后你会在当前目录下看到生成的policy.yaml和.env文件。# 4. 启动AgentKernel安全代理独立模式 # 此模式会启动一个HTTP/WebSocket服务器你的智能体将连接至此。 agentkernel start启动后控制台会显示代理监听的地址默认http://localhost:18788和运行状态。你可以立即用curl进行测试验证策略是否生效。3.2 策略配置详解与最佳实践自动生成的policy.yaml是一个很好的模板但真实环境需要更精细的调整。我们来逐部分拆解。template: balanced # 继承balanced模板的基线规则 file: default: block # 默认阻止所有文件访问 rules: # 阻止对敏感配置和密钥的访问 - pattern: **/.ssh/** decision: block reason: SSH private keys and configuration - pattern: **/.aws/** decision: block reason: AWS credentials and configuration - pattern: **/.kube/** decision: block reason: Kubernetes cluster access # 明确允许项目工作区 - pattern: ~/projects/my-ai-agent/** # 使用绝对路径或~别名更安全 decision: allow reason: Project workspace # 允许读取系统通用文件如 /etc/hosts, /usr/share/dict/words - pattern: /etc/hosts decision: allow reason: System hosts file for network diagnostics - pattern: /usr/share/dict/** decision: allow reason: Word list for text processing network: default: block # 默认阻止所有网络请求 rules: # 允许访问AI服务API但需谨慎 - host: api.openai.com decision: allow reason: OpenAI API for LLM calls - host: api.anthropic.com decision: allow reason: Claude API # 允许访问内部服务 - host: internal-api.company.com decision: allow reason: Internal business API # 阻止已知的数据外泄通道和恶意域名 - host: api.telegram.org decision: block reason: Potential data exfiltration channel - host: *.pastebin.com decision: block reason: Common paste site for exfiltrating data shell: default: block # 默认阻止所有Shell命令 rules: # 阻止高危破坏性命令 - command: rm *-rf* # 匹配 rm -rf, rm -rf /, sudo rm -rf 等变体 decision: block reason: Recursive force delete - extremely dangerous - command: mkfs* decision: block reason: Filesystem formatting - command: dd *if*of* decision: block reason: Raw disk manipulation # 允许安全的开发和管理命令 - command: git * decision: allow reason: Version control operations - command: npm * decision: allow reason: Node package management - command: ls * decision: allow reason: Directory listing - command: find * -name *.py decision: allow reason: Find Python files in project # 允许特定脚本但限制参数 - command: /opt/scripts/deploy.sh --env staging decision: allow reason: Approved deployment script for staging注意事项模式匹配的优先级规则是按顺序评估的第一条匹配的规则生效。通常把最具体的block规则放在前面然后是具体的allow规则最后是通用规则。谨慎使用通配符**和*非常强大但也危险。**/.ssh/**是好的但**/config*可能过于宽泛意外允许访问/etc/config。定期审查审计日志策略不是一劳永逸的。每周查看审计日志特别是被block的操作能帮你发现智能体未被满足的合理需求或者潜在的恶意行为模式。3.3 与LangChain智能体集成这是最常见的集成场景。假设你有一个现有的LangChain智能体它使用SerpAPI工具进行搜索并使用PythonREPL工具运行代码。集成前不安全from langchain.agents import initialize_agent, AgentType from langchain.tools import SerpAPIWrapper, PythonREPLTool search SerpAPIWrapper() python_repl PythonREPLTool() tools [search, python_repl] # 智能体可以直接、不受限制地使用这些工具 agent initialize_agent(tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION)集成后通过AgentKernel加固首先确保AgentKernel代理正在运行。然后使用AgentKernel提供的LangChain适配器来包装你的工具。import requests from langchain.tools import BaseTool, Tool from typing import Any, Optional class AgentKernelTool(BaseTool): 一个通过AgentKernel代理执行操作的通用工具包装器 name: str agentkernel_proxy description: str Executes an action through the AgentKernel security proxy. Specify tool and args. agent_id: str my-langchain-agent kernel_endpoint: str http://localhost:18788/evaluate def _run(self, tool: str, **kwargs: Any) - str: 向AgentKernel发送评估请求 payload { tool: tool, args: kwargs, agentId: self.agent_id } try: response requests.post( self.kernel_endpoint, jsonpayload, headers{Content-Type: application/json}, timeout30 ) result response.json() if result.get(decision) allowed: # 这里需要根据工具类型实际执行操作并返回结果。 # 为了简化示例我们假设代理也负责执行实际架构中代理可能只做决策执行由另一服务完成。 return fAction {tool} allowed and executed. Result: {result.get(output, N/A)} else: return fAction BLOCKED by policy: {result.get(reason, No reason provided)} except requests.exceptions.RequestException as e: return fError communicating with AgentKernel: {str(e)} async def _arun(self, *args: Any, **kwargs: Any) - str: 异步版本 raise NotImplementedError(Async not implemented for this example) # 创建安全的工具实例 safe_search_tool AgentKernelTool( namesafe_web_search, descriptionSearches the web via SerpAPI, but through security proxy., # 你可以通过重写_run方法或配置将工具类型映射到具体的SerpAPI调用 ) safe_python_tool AgentKernelTool( namesafe_python_repl, descriptionRuns Python code in a REPL, but through security proxy., ) # 现在你的智能体只能通过安全代理来执行操作 safe_tools [safe_search_tool, safe_python_tool] secure_agent initialize_agent(safe_tools, llm, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION)更优雅的方式使用官方适配器如果使用TypeScript/JavaScript版本的LangChain可以直接使用agentkernel/langchain-adapter包提供的wrapToolWithPolicy函数它能更无缝地集成策略引擎。import { wrapToolWithPolicy } from agentkernel/langchain-adapter; import { SerpAPI } from langchain/tools; import { PolicyEngine } from agentkernel/runtime; // 初始化策略引擎 const policyEngine new PolicyEngine(/* config */); const serpApiTool new SerpAPI(process.env.SERPAPI_API_KEY); // 包装工具 const safeSerpTool wrapToolWithPolicy(serpApiTool, policyEngine, { agentId: my-langchain-agent, toolName: web_search // 在策略中标识此工具 }); // 现在 safeSerpTool 在每次调用前都会自动咨询policyEngine3.4 生产环境部署与加固将AgentKernel用于生产环境需要关注高可用、性能和安全性配置。1. 使用Docker Compose部署项目提供了docker-compose.test.yml作为参考可以很容易地改造成生产版本。# docker-compose.prod.yml version: 3.8 services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: agentkernel POSTGRES_USER: agentkernel_prod POSTGRES_PASSWORD: ${DATABASE_PASSWORD} # 从.env文件注入强密码 volumes: - postgres_data:/var/lib/postgresql/data command: postgres -c sslon -c ssl_cert_file/var/lib/postgresql/server.crt -c ssl_key_file/var/lib/postgresql/server.key # 生产环境务必启用SSL并挂载证书 healthcheck: test: [CMD-SHELL, pg_isready -U agentkernel_prod] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes volumes: - redis_data:/data healthcheck: test: [CMD, redis-cli, --raw, incr, ping] interval: 10s agentkernel: build: . # 或使用官方镜像如果发布image: agentkernel/agent-kernel:latest depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: - NODE_ENVproduction - AGENTKERNEL_PRODUCTION_HARDENINGtrue - DATABASE_HOSTpostgres - DATABASE_SSLtrue - REDIS_PASSWORD${REDIS_PASSWORD} - PERMISSION_SECRET${PERMISSION_SECRET} # 必须设置且长度32 - LOG_LEVELinfo # 生产环境避免使用debug/trace ports: - 18788:18788 volumes: - ./policy.yaml:/app/policy.yaml:ro # 将宿主机策略文件挂载为只读 - ./audit_logs:/app/logs # 如果需要文件日志备份 restart: unless-stopped command: [node, dist/index.js, start, --port, 18788, --host, 0.0.0.0] volumes: postgres_data: redis_data:2. 关键生产环境配置.env# 必须使用强随机字符串例如openssl rand -base64 32 PERMISSION_SECRET你的32位以上强密钥 # 数据库 DATABASE_HOSTpostgres DATABASE_PORT5432 DATABASE_NAMEagentkernel DATABASE_USERagentkernel_prod DATABASE_PASSWORD你的强数据库密码 DATABASE_SSLtrue # Redis REDIS_PASSWORD你的强Redis密码 # 应用 NODE_ENVproduction AGENTKERNEL_PRODUCTION_HARDENINGtrue LOG_LEVELinfo PORT18788 HOST0.0.0.0设置AGENTKERNEL_PRODUCTION_HARDENINGtrue至关重要它会强制启用一系列安全检查比如拒绝弱密码、强制SSL连接等。3. 高可用与监控反向代理在AgentKernel前面放置Nginx或HAProxy实现负载均衡、SSL终结和DDoS防护。健康检查利用/health端点配置健康检查。curl http://localhost:18788/health应返回{status:ok}。监控指标/stats端点提供实时统计信息请求数、阻止数、平均延迟可集成到Prometheus/Grafana中。日志聚合将AgentKernel的日志特别是审计日志导出到ELK Stack或Datadog等集中式日志系统便于全局分析。4. 高级特性与定制化开发当你熟悉了基础用法后AgentKernel的一些高级特性可以帮助你构建更复杂、更安全的工作流。4.1 能力令牌的编程式使用能力令牌系统不仅用于内部你也可以在你的智能体编排逻辑中使用它实现动态的、上下文相关的权限管理。import { createCapabilityManager } from agentkernel/permissions; // 初始化管理器与AgentKernel共享同一个SECRET const manager createCapabilityManager({ secret: process.env.PERMISSION_SECRET!, issuer: my-orchestrator-service }); // 场景用户触发一个“文件分析”任务 async function handleFileAnalysisTask(userId: string, filePath: string) { // 1. 为该任务生成一个仅限1小时、只读访问特定文件的令牌 const token manager.grant({ agentId: analysis-bot-${taskId}, permissions: [{ category: filesystem, actions: [read], resource: filePath // 精确到具体文件 }], purpose: Analyze file for user ${userId}, durationMs: 60 * 60 * 1000, // 1小时 }); // 2. 将令牌传递给执行该任务的AI智能体 const agentResponse await executeAgent({ task: Analyze the content of ${filePath}, capabilityToken: token // 智能体需要在请求中携带此令牌 }); // 3. 令牌过期后自动失效无需手动撤销 } // 在AgentKernel的策略引擎或自定义拦截器中可以验证此令牌 function validateRequest(request, token) { const verification manager.verify(token); if (!verification.valid) { throw new Error(Invalid or expired token: ${verification.reason}); } // 检查请求的操作是否在令牌授权范围内 const check manager.check(verification.agentId, request.category, request.action, request.resource); return check; }4.2 自定义策略检查器如果内置的文件、网络、Shell策略不能满足你的需求你可以实现自定义的策略检查器。例如你想检查SQL查询是否包含DROP TABLE语句。import { PolicyEngine, PolicyCheckResult, PolicyCategory } from agentkernel/runtime; class SqlPolicyChecker { category: PolicyCategory custom; async check(request: any, context: any): PromisePolicyCheckResult { if (request.tool ! execute_sql) { return { decision: no_decision }; // 不处理其他工具 } const sql request.args?.query?.toUpperCase() || ; const dangerousPatterns [DROP TABLE, DELETE FROM, TRUNCATE TABLE]; for (const pattern of dangerousPatterns) { if (sql.includes(pattern)) { return { decision: blocked, reason: SQL query contains dangerous operation: ${pattern}, details: { matchedPattern: pattern, sqlSnippet: sql.substring(0, 100) } }; } } // 也可以结合能力令牌进行更细粒度的检查 if (context.capabilityToken) { // ... 验证令牌是否有权执行此查询 } return { decision: allowed }; } } // 将自定义检查器注册到策略引擎 const policyEngine new PolicyEngine(config); policyEngine.registerChecker(new SqlPolicyChecker());4.3 审计日志的分析与告警审计日志是金矿。你可以定期运行分析脚本生成安全报告或触发告警。# audit_analyzer.py import psycopg2 import pandas as pd from datetime import datetime, timedelta def analyze_blocked_actions(hours24): conn psycopg2.connect(dsnos.environ[DATABASE_URL]) query SELECT agent_id, resource_type, COUNT(*) as block_count, ARRAY_AGG(DISTINCT reason) as reasons FROM audit_log WHERE outcome blocked AND created_at NOW() - INTERVAL %s hours GROUP BY agent_id, resource_type HAVING COUNT(*) 5 -- 阈值24小时内被阻止超过5次 ORDER BY block_count DESC; df pd.read_sql_query(query, conn, params(hours,)) conn.close() if not df.empty: print(f⚠️ High frequency of blocked actions in last {hours}h:) print(df.to_string()) # 此处可以集成邮件、Slack、PagerDuty等告警 # send_alert_to_slack(df) return df def detect_anomalous_agent(): 检测行为异常的智能体例如突然大量访问之前从未访问过的文件 conn psycopg2.connect(dsnos.environ[DATABASE_URL]) query WITH agent_patterns AS ( SELECT agent_id, resource_type, COUNT(*) as total_requests, COUNT(DISTINCT DATE(created_at)) as active_days FROM audit_log WHERE created_at NOW() - INTERVAL 7 days GROUP BY agent_id, resource_type ) SELECT * FROM agent_patterns WHERE total_requests 100 AND active_days 2; -- 过去7天内总请求超100次但活跃天数少于2天可能是突发恶意行为 df pd.read_sql_query(query, conn) conn.close() return df5. 常见问题排查与性能调优在实际使用中你可能会遇到一些问题。以下是一些常见场景及其解决方法。5.1 连接与配置问题问题AgentKernel代理启动失败报数据库连接错误。检查确认PostgreSQL/Redis容器是否已启动且健康。运行docker compose ps查看状态。解决检查.env文件中的数据库连接字符串是否正确特别是主机名、端口和密码。对于生产环境确保DATABASE_SSL设置正确。日志使用agentkernel start --log-level debug获取更详细的启动日志。问题智能体工具调用返回Connection refused或超时。检查确认AgentKernel代理正在运行且监听在正确的端口默认18788。使用curl http://localhost:18788/health测试。解决检查智能体应用中的AgentKernel端点配置是否正确。如果AgentKernel运行在Docker容器内确保端口映射正确并且智能体应用能访问到该容器的网络。防火墙检查主机或容器网络的防火墙设置是否阻止了相关端口的通信。5.2 策略规则不生效问题我添加了一条allow规则但操作仍然被阻止。检查规则顺序策略引擎按顺序匹配。如果一条block规则在前面匹配了后面的allow规则就不会生效。使用agentkernel policy test --tool bash --command “ls ~/.ssh”进行干跑测试查看匹配过程。检查模式匹配YAML中的路径模式是全局模式。~/projects/**和/home/user/projects/**可能不同。确保模式与智能体请求的实际路径完全匹配。查看审计日志中记录的resource_id字段。缓存问题策略引擎可能会缓存规则以提高性能。修改policy.yaml后重启AgentKernel服务或通过CLI发送agentkernel policy reload命令如果支持来重新加载策略。问题Shell命令被允许了但它访问的文件却被阻止了跨域检查。这是正常的安全行为这正是AgentKernel的核心安全特性之一。例如你允许了cat命令但策略禁止访问~/.ssh/id_rsa。当智能体执行cat ~/.ssh/id_rsa时Shell策略模块会放行cat但文件策略模块会阻止对~/.ssh/id_rsa的访问最终决策是blocked。解决如果你确实需要允许该操作你需要在file.rules中添加一条对应的allow规则或者调整你的任务设计避免智能体需要访问敏感路径。5.3 性能瓶颈与调优AgentKernel作为每个工具调用的中间层会引入额外的延迟。在高并发场景下需要关注性能。审计日志写入大量日志写入可能成为瓶颈。调优考虑将审计日志先写入一个高性能的消息队列如Redis Streams然后由后台worker异步批量写入PostgreSQL。AgentKernel的架构可能支持配置不同的日志输出器。采样对于极高吞吐量的场景可以对allowed决策进行采样记录而对所有blocked决策进行全量记录。策略匹配速度规则数量非常多时成千上万条线性匹配可能变慢。调优规则应尽可能精简。将最常匹配的规则放在前面。考虑使用更高效的数据结构如Trie树用于路径匹配如果AgentKernel未来支持或你可以定制策略检查器的话。数据库连接池确保PostgreSQL连接池配置合理在AgentKernel的数据库配置中。连接数过少会导致等待过多会拖累数据库。监控指标密切关注/stats端点提供的averageLatencyMs平均延迟和requestsPerSecondRPS指标。如果延迟持续增长需要结合上述点进行排查。5.4 与其他系统的集成挑战问题我的智能体框架不在官方支持列表LangChain, OpenClaw中。解决方案AgentKernel是框架无关的其核心是一个HTTP/WebSocket服务。你需要为你的框架实现一个简单的“工具包装器”或“中间件”。这个中间件的职责是拦截框架发起的工具调用 - 将其格式化为AgentKernel的API请求{“tool”: “…”, “args”: {…}, “agentId”: “…”} - 发送给AgentKernel - 根据返回的决策决定是继续执行还是抛出错误。参考agentkernel/langchain-adapter的实现方式。问题我需要更复杂的审批工作流而不仅仅是自动允许/阻止。解决方案AgentKernel的决策结果除了allowed和blocked理论上还可以有requires_approval。你可以扩展策略引擎或自定义检查器对特定高风险操作返回此决策。然后在你的编排层调用AgentKernel的代码中捕获这个结果触发一个人工审批流程例如发送通知到Slack等待审批按钮点击审批通过后再让智能体继续执行。这需要在你自己的应用逻辑中实现。将AgentKernel集成到你的AI智能体工作流中就像为你的自动化系统安装了一套高级的监控和制动系统。它不会改变你车辆的引擎智能体框架但能确保你在任何路况下都不会失控。从制定严谨的默认阻止策略开始逐步根据审计日志开放必要权限结合能力令牌实现动态权限控制你就能在充分利用AI能力的同时牢牢守住安全的底线。随着智能体应用的日益复杂这类安全基础设施的价值只会越来越凸显。

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