AgentNova R05.0:零依赖、本地优先的自主AI智能体框架深度解析

news2026/5/1 10:47:43
1. 项目概述一个为本地运行而生的可扩展智能体框架如果你和我一样对市面上那些动辄需要联网、依赖复杂云服务、或者封装得像个黑盒子的AI智能体框架感到头疼那么AgentNova R05.0的出现可能会让你眼前一亮。这是一个处于Alpha阶段但设计理念非常清晰的自主AI智能体框架。它的核心吸引力在于“最小化”和“可破解性”——整个框架基于Python标准库构建没有外部依赖这意味着你可以像阅读自己写的代码一样完全理解并掌控它的每一个运行细节。AgentNova的定位很明确为开发者提供一个能在本地环境通过Ollama或云端通过ZAI等插件高效运行且高度可扩展的智能体基础架构。它从OpenClaw的架构中汲取灵感但为了“本地优先”的操作模式进行了彻底的重构。简单来说它试图解决一个核心矛盾我们既希望智能体足够强大和灵活能调用工具、有记忆、可多智能体协作又希望它足够轻量和透明能够完全运行在自己的机器上避免数据隐私和网络延迟的困扰。AgentNova通过其基于清单manifest的插件系统、内置的安全机制和多模式工具调用支持正在这条路上进行着扎实的探索。2. 核心架构与设计哲学拆解2.1 为何选择“零依赖”与“本地优先”在AI开发领域“依赖”是一个甜蜜的负担。丰富的第三方库能快速实现功能但也带来了环境冲突、版本锁定和安全风险。AgentNova选择了一条更艰难但更纯粹的路仅使用Python标准库。这意味着它的核心通信依赖于urllib数据存储使用sqlite3配置管理可能用json或configparser。这样做的好处是极致的可移植性和可控性。你从GitHub拉取代码后几乎可以在任何有Python环境的地方直接运行无需担心pip install时出现的各种兼容性问题。这对于构建需要长期稳定运行、或部署在受限环境如某些服务器或边缘设备的智能体应用至关重要。“本地优先”则是另一个关键设计决策。框架默认后端是Ollama一个优秀的本地大模型运行工具。这确保了核心的推理能力可以完全离线进行数据不出本地响应延迟极低。同时框架并没有封闭自己它通过插件系统优雅地支持了云端后端如ZAI将选择权交给了开发者。这种设计哲学体现了一种务实的态度优先保障基础能力的自主可控再通过标准化的接口扩展外部能力。2.2 插件系统可扩展性的基石R05.0版本引入的基于清单的插件系统是AgentNova实现“可破解”与“可扩展”的核心。与许多框架要求你将代码直接写入核心库不同AgentNova的插件更像是一个个独立的、声明式的功能包。一个插件通常包含一个manifest.json文件其中定义了插件的元数据名称、版本、作者、它所提供或依赖的后端、新增的工具、以及初始化逻辑。框架在启动时会扫描特定的插件目录读取这些清单并实现“懒加载”——即只有在真正需要使用某个插件功能时才会加载其代码。这避免了不必要的内存开销和启动延迟。例如BitNet、ZAI、ACP、TurboQuant这些后端都是以插件形式存在的。如果你想添加一个支持新的AI API服务比如另一个云服务商理论上你只需要按照PLUGIN_SPEC.md规范编写一个插件清单和对应的适配器类而无需修改AgentNova的一行核心代码。这种设计极大地降低了社区的贡献门槛也使得框架本身能够保持核心的简洁和稳定。2.3 三层工具支持与模型适配策略智能体框架的核心能力之一是工具调用。AgentNova在这里做得非常细致它根据模型的原生能力将工具支持分为三个层级并实现了自动检测原生支持适用于像qwen2.5、llama3.1、mistral这类内置了函数调用function calling能力的模型。框架会直接使用模型API提供的标准工具调用格式效率最高。ReAct模式适用于不支持原生函数调用但具有较强推理能力的模型如qwen2.5-coder,qwen3。框架会通过特定的提示词Prompt引导模型以“思考-行动-观察”Reasoning-Acting-Observation的文本格式来使用工具。这虽然比原生方式慢但极大地扩展了兼容模型的范围。无工具模式纯推理不调用任何工具。框架在首次使用某个模型时会通过一个内置的诊断程序agentnova models --tool-support来测试并缓存该模型的工具支持级别。这个设计非常贴心它避免了每次运行时都进行探测的开销。当然你也可以通过--force-react参数强制所有模型使用ReAct模式这在调试或对比不同提示策略时很有用。实操心得在实际使用中我发现对于较小的模型如0.5B参数级别即使它声称支持原生工具调用有时效果也不如ReAct模式稳定。这是因为小模型的输出格式可能不够规范。我的建议是对于关键任务先用--force-react测试一下如果效果更好就将其作为该模型的默认模式记录在配置中。3. 从零开始环境搭建与核心功能实操3.1 安装与基础配置安装AgentNova非常简单你有两种选择# 方案一安装最新的开发版功能最新但可能不稳定 pip install githttps://github.com/VTSTech/AgentNova.git --force-reinstall # 方案二安装PyPI上的稳定版相对稳定更新稍慢 pip install agentnova安装完成后第一件事是配置后端。假设我们主要使用本地Ollama确保Ollama已安装并运行前往 Ollama官网 下载安装然后在终端运行ollama serve启动服务。默认情况下它会在http://localhost:11434提供服务。拉取一个模型例如拉取一个轻量级但能力不错的模型qwen2.5:0.5bollama pull qwen2.5:0.5b。验证AgentNova连接运行agentnova models。如果一切正常你会看到已拉取的模型列表以及它们的工具支持状态可能需要先运行agentnova models --tool-support进行检测。3.2 CLI快速上手三种核心模式解析AgentNova的CLI提供了三种核心交互模式对应不同的使用场景run模式执行单次提示任务并退出。适合自动化脚本或快速测试。# 计算一个数学题 agentnova run What is 15 * 8? --tools calculator # 输出: 120chat模式进入交互式对话。适合探索性任务或需要多轮交互的场景。# 启动一个交互式会话使用qwen2.5:0.5b模型并允许使用计算器和shell工具 agentnova chat -m qwen2.5:0.5b --tools calculator,shellagent模式启动自主智能体。它会尝试自主规划并调用工具来完成更复杂的开放式指令。# 让智能体自主决定如何完成一个任务例如“获取当前时间并写入文件” agentnova agent -m qwen2.5:7b --tools shell,write_file,datetime注意事项在agent模式下尤其是启用了shell、write_file这类具有“写”能力的工具时强烈建议加上--confirm标志。这会在执行危险操作前要求你手动确认输入y/N为你的系统增加一道安全锁。3.3 Python API深度集成示例对于开发者而言CLI方便测试但Python API才是将AgentNova集成到自己项目中的正确方式。下面是一个比官方示例更详细的集成案例展示了会话记忆、错误处理和流式输出的结合使用。import asyncio from agentnova import Agent from agentnova.tools import make_builtin_registry async def main(): # 1. 创建工具集。这里我们选择计算器、读取文件和Shell工具。 # make_builtin_registry() 返回所有内置工具的注册表.subset() 可以方便地筛选。 tool_registry make_builtin_registry() selected_tools tool_registry.subset([calculator, read_file, shell]) # 2. 创建智能体实例并启用会话持久化。 # session_id 是持久化的关键。相同ID的会话会共享历史记录存储在SQLite中。 agent Agent( modelqwen2.5:0.5b, # 指定模型 toolsselected_tools, # 传入工具 backendollama, # 指定后端 session_idmath_assistant, # 会话ID用于持久化记忆 confirm_dangerousTrue, # 对危险工具要求确认等效于CLI的--confirm ) # 3. 执行一个多步骤任务计算一个复杂公式并读取一个配置文件来验证结果。 try: # 任务一计算 print(任务一计算 (12 34) * 56 / 7) result1 await agent.arun(Calculate (12 34) * 56 / 7) print(f智能体回答: {result1.final_answer}) print(f耗时: {result1.total_ms:.0f}ms, 步骤数: {result1.steps}\n) # 任务二基于历史让它读取一个文件假设当前目录有个config.txt # 因为启用了session_id智能体知道刚才的计算历史。 print(任务二请读取当前目录下的 config.txt 文件并告诉我第一行内容。) result2 await agent.arun(Read the file config.txt and tell me its first line.) print(f智能体回答: {result2.final_answer}\n) # 任务三流式输出示例如果后端支持 print(任务三用流式方式生成一段关于AI的简短描述。) async for chunk in agent.astream(Write a short paragraph about artificial intelligence.): print(chunk, end, flushTrue) # 逐块打印模拟打字机效果 print(\n) except Exception as e: print(f任务执行出错: {e}) finally: # 4. 关闭持久化连接重要 agent.memory.close() if __name__ __main__: asyncio.run(main())这段代码演示了几个关键点工具的动态选择通过subset方法灵活组合工具而不是硬编码。会话持久化session_id使得智能体在多次运行中能记住上下文这对于构建有状态的助手应用至关重要。错误处理用try...except包裹执行过程确保资源如内存连接能在finally块中被正确清理。异步支持使用arun和astream等异步方法可以更好地集成到现代异步Web框架或GUI应用中。4. 高级特性与实战技巧4.1 持久化记忆构建有状态的智能体无状态的对话机器人每次都是“全新”的这限制了它的实用性。AgentNova通过SQLite实现的持久化记忆让智能体能够跨越多次调用记住对话历史、工具调用结果甚至用户偏好。核心机制 当你创建一个带有session_id的Agent实例时框架会在~/.agentnova/sessions.db中创建或连接一个SQLite数据库。每次对话和工具调用的元数据角色、内容、时间戳、工具调用ID等都会被序列化存储。实战技巧会话管理使用agentnova sessionsCLI命令可以列出所有存在的会话。对于长期运行的服务你需要设计会话的清理策略例如基于最后访问时间的LRU策略避免数据库无限膨胀。记忆窗口默认情况下智能体可能会记住所有历史。对于超长对话这可能导致上下文令牌数超限。一个高级技巧是在创建Agent时可以传入一个自定义的memory对象实现基于摘要或关键信息提取的记忆压缩策略但这需要你自行扩展Memory基类。信息隔离session_id是唯一的隔离键。你可以为每个用户、每个线程或每个任务创建不同的ID确保信息不会串通。4.2 安全机制放心地赋予智能体“手脚”让AI直接操作你的系统执行Shell命令、读写文件听起来很危险。AgentNova内置了一套多层次的安全防护这是它能被称为“可黑客”但“安全”框架的底气。路径验证任何文件操作工具read_file,write_file,edit_file都会对传入的路径进行规范化检查防止目录遍历攻击如../../../etc/passwd。默认会限制在用户目录或当前工作目录下。命令阻止列表shell工具内部维护了一个危险命令列表如rm -rf /,sudo,format等。尝试执行这些命令会被直接拒绝。SSRF保护http_request工具会检查目标URL阻止向本地回环地址如127.0.0.1,localhost或内部网络地址发起的请求防止服务器端请求伪造攻击。注入检测对传递给Shell命令的参数进行简单的模式匹配尝试检测常见的命令注入字符如;,|,,等。交互式确认--confirm这是最后一道也是最有效的人工防线。当启用后在执行任何shell、write_file、edit_file操作前都会在终端弹出确认提示。审计日志所有通过shell、write_file、edit_file执行的操作无论成功与否都会以JSON Lines格式记录在~/.agentnova/audit.log中。这为事后审查和责任追溯提供了依据。避坑指南即使有这些保护也永远不要在生产环境中以高权限如root运行AgentNova智能体。最佳实践是创建一个专用的、权限受限的系统用户来运行它并将其工作目录限制在一个安全的沙箱内。4.3 多智能体编排从单兵到团队作战单个智能体的能力总有边界。AgentNova的Orchestrator模块允许你将多个各有所长的智能体组织起来协同完成复杂任务。目前支持三种模式router路由、pipeline流水线、parallel并行。下面是一个router模式的典型应用场景一个简单的客服系统根据用户问题类型路由给不同的专家智能体。from agentnova import Agent, Orchestrator, AgentCard import asyncio async def customer_service_demo(): # 1. 初始化一个路由模式的编排器 orchestrator Orchestrator(moderouter) # 2. 注册三个专家智能体这里用卡片定义实际可加载真实Agent实例 # 技术客服 orchestrator.register(AgentCard( nametech_support, descriptionHandles technical issues, software errors, and API problems., capabilities[error, bug, crash, install, update, api], modelqwen2.5-coder:7b, # 使用擅长代码的模型 tools[shell, read_file, http_request] # 工具集偏向诊断 )) # 账单客服 orchestrator.register(AgentCard( namebilling_support, descriptionHandles billing inquiries, subscription, and payment issues., capabilities[invoice, payment, refund, subscription, charge], modelqwen2.5:0.5b, # 通用模型即可 tools[read_file] # 可能需要读取账单文件 )) # 普通咨询客服 orchestrator.register(AgentCard( namegeneral_inquiry, descriptionHandles general questions, product features, and onboarding., capabilities[how to, what is, feature, guide, tutorial], modelqwen2.5:0.5b, tools[] # 纯问答无需工具 )) # 3. 模拟用户问题测试路由 test_queries [ 我的软件打开就崩溃错误代码是0x80070005怎么办, 我上个月的账单好像多扣了钱能查一下吗, 请问你们产品的高级版有哪些新功能, 我想了解一下如何通过API上传文件。 ] for query in test_queries: print(f\n用户问题: {query}) # 编排器会根据问题内容匹配capabilities选择最合适的智能体卡片 agent_card, score orchestrator.select_agent(query) print(f 路由结果: {agent_card.name} (匹配度: {score:.2f})) # 在实际应用中这里会实例化对应的Agent并运行任务 # result await Agent.from_card(agent_card).arun(query) if __name__ __main__: asyncio.run(customer_service_demo())这个例子展示了如何通过定义不同的capabilities能力关键词来实现智能路由。编排器内部会计算用户问题与每个智能体能力描述之间的语义相似度得分最高者胜出。在实际部署中AgentCard可以关联到预配置好的、拥有不同工具和模型参数的Agent实例实现真正的任务分发。5. 插件开发与生态扩展实战AgentNova的威力很大程度上来自于其插件系统。虽然项目本身提供了一些官方插件如ZAI、BitNet但真正的潜力在于社区能够根据自己的需求开发定制插件。这里我将以一个虚构的“天气查询插件”为例拆解插件开发的核心步骤。5.1 插件结构剖析一个标准的AgentNova插件至少包含以下结构my_weather_plugin/ ├── manifest.json # 插件清单核心文件 ├── __init__.py # 可选Python包标识 ├── backend.py # 后端实现如果需要新后端 ├── tools.py # 新工具实现如果需要新工具 └── README.md # 插件说明文档5.2 编写插件清单 (manifest.json)清单文件是插件与框架之间的契约。它必须是有效的JSON。{ name: weather-provider, version: 0.1.0, author: Your Name, description: A plugin to fetch weather information from a public API., license: MIT, provides: { backends: [weather], tools: [get_weather] }, requires: { agentnova: 0.5.0, python: 3.8 }, config: { WEATHER_API_KEY: { type: string, description: API key for the weather service (optional for free tier), default: }, WEATHER_BASE_URL: { type: string, description: Base URL of the weather API, default: https://api.weatherapi.com/v1 } }, entry_points: { agentnova.backend: [weather my_weather_plugin.backend:WeatherBackend], agentnova.tool: [get_weather my_weather_plugin.tools:get_weather_tool] } }关键字段解释provides: 声明本插件提供哪些类型的扩展后端、工具。requires: 声明依赖确保框架版本兼容。config: 定义插件需要的配置项这些可以通过环境变量或框架配置来设置。entry_points: 这是Python的入口点机制。它告诉AgentNova当需要加载名为“weather”的后端时去my_weather_plugin.backend模块找WeatherBackend类当需要加载“get_weather”工具时去找get_weather_tool函数。5.3 实现后端类 (backend.py)如果你只是添加工具而不需要新的模型后端这一步可以省略。但这里我们假设天气API本身需要一些特殊的调用逻辑。# my_weather_plugin/backend.py import os import json from typing import Dict, Any, Optional, AsyncIterator from urllib.request import Request, urlopen from urllib.parse import urlencode from agentnova.core.backend import BaseBackend from agentnova.core.types import ApiMode, BackendResponse class WeatherBackend(BaseBackend): A dummy backend that simulates weather data fetching. name weather supported_api_modes [ApiMode.OPENRE] # 只支持OpenResponses模式 def __init__(self, base_url: Optional[str] None, api_key: Optional[str] None): self.base_url base_url or os.getenv(WEATHER_BASE_URL, https://api.weatherapi.com/v1) self.api_key api_key or os.getenv(WEATHER_API_KEY, ) async def generate_completion(self, model: str, messages: list, **kwargs) - BackendResponse: # 这个后端并不真正用于LLM推理而是用于封装对天气API的调用。 # 在实际插件中这里可能用于格式化请求或处理认证。 # 对于简单的工具插件可能不需要实现完整的后端工具可以直接调用API。 # 这里为了示例我们返回一个固定响应。 # 更复杂的插件可能会在这里实现一个轻量级的“模型”用于理解自然语言查询并转换为API参数。 return BackendResponse( content[WeatherBackend] This backend is for API integration, not LLM generation., modelmodel, total_tokens0 ) # 通常工具函数会直接调用API而不是通过后端。但后端可以作为配置和客户端的管理中心。 def fetch_weather(self, city: str) - Dict[str, Any]: 调用真实天气API的示例方法同步版本。 params {q: city, key: self.api_key} url f{self.base_url}/current.json?{urlencode(params)} req Request(url, headers{User-Agent: AgentNova-WeatherPlugin/0.1.0}) try: with urlopen(req, timeout10) as resp: data json.load(resp) return { city: data[location][name], temp_c: data[current][temp_c], condition: data[current][condition][text], humidity: data[current][humidity] } except Exception as e: return {error: fFailed to fetch weather: {e}}5.4 实现工具函数 (tools.py)工具是插件与智能体交互的主要方式。工具函数必须遵循特定的签名接收参数并返回一个字符串结果。# my_weather_plugin/tools.py import os from typing import Dict, Any from agentnova.core.tools import Tool # 从环境变量或框架配置获取后端实例简化示例实际可能通过依赖注入 _weather_backend None def get_weather_backend(): 懒加载获取天气后端实例。 global _weather_backend if _weather_backend is None: from .backend import WeatherBackend _weather_backend WeatherBackend() return _weather_backend def get_weather_tool(city: str) - str: Get the current weather for a given city. Args: city: The name of the city (e.g., Beijing, New York). Returns: A string describing the current weather conditions. # 输入验证 if not city or not isinstance(city, str): return Error: City name must be a non-empty string. backend get_weather_backend() weather_data backend.fetch_weather(city) if error in weather_data: return fCould not retrieve weather for {city}. Error: {weather_data[error]} # 格式化一个友好的响应 return ( fThe current weather in {weather_data[city]} is {weather_data[condition].lower()}. fTemperature is {weather_data[temp_c]}°C with humidity at {weather_data[humidity]}%. ) # 将函数包装成AgentNova可识别的Tool对象 get_weather Tool( nameget_weather, descriptionFetches the current weather for a specified city., funcget_weather_tool, argument_names[city], # 显式声明参数名便于模型理解 )5.5 使用与测试插件放置插件将整个my_weather_plugin目录放到AgentNova的插件搜索路径下。默认路径可能是~/.agentnova/plugins/或项目内的plugins/目录。具体路径需要查看框架文档或源码。发现插件运行agentnova plugins你应该能在列表中看到weather-provider。使用插件# 设置API密钥如果用的是收费API export WEATHER_API_KEYyour_api_key_here # 运行智能体并使用新的天气工具 agentnova run Whats the weather like in London? --tools get_weather --backend ollama智能体会尝试理解问题然后调用get_weather工具并传入cityLondon参数。开发注意事项错误处理工具函数必须健壮。任何异常都应被捕获并返回一个清晰的错误信息字符串而不是抛出异常导致智能体循环崩溃。依赖管理如果你的插件需要第三方库如requests必须在manifest.json的requires字段中声明并在安装说明中告知用户。由于AgentNova核心零依赖插件需要自行处理依赖安装。配置化所有可配置项如API端点、密钥都应通过manifest.json的config字段暴露并使用环境变量读取提高插件的灵活性。6. 性能调优、问题排查与社区资源6.1 模型选择与性能基准AgentNova的测试套件agentnova.examples提供了丰富的基准测试。对于生产应用选择模型时需要在速度、准确性和成本间权衡。轻量级/边缘场景qwen2.5:0.5b或functiongemma:270m是绝佳选择。它们在Quick Diagnostic测试中能达到100%准确率响应速度极快几十毫秒到几秒资源占用小。平衡型/通用任务qwen2.5:7b或llama3.2:7b提供了更强的推理和编码能力速度尚可是大多数复杂任务的起点。复杂推理/代码生成考虑qwen2.5-coder:7b或deepseek-coder:7b。注意deepseek-r1系列是“思考模型”AgentNova能自动处理其think标签但推理速度会显著变慢测试中deepseek-r1:1.5b需要~305秒适合对准确性要求极高、对延迟不敏感的任务。性能调优技巧上下文长度通过--num-ctx参数调整。对于简单对话2048可能就够了涉及长文档处理可能需要8192或更多。更长的上下文会消耗更多内存和计算时间。批处理如果你有大量独立任务可以考虑用Python脚本并发调用多个Agent实例注意Ollama服务器的并发承受能力。缓存充分利用agentnova models --tool-support的缓存结果避免每次启动都进行模型能力探测。6.2 常见问题与解决方案速查表问题现象可能原因排查步骤与解决方案运行agentnova命令提示“命令未找到”1. Pip安装路径未加入PATH。2. 虚拟环境中未安装。1. 尝试python -m agentnova代替。2. 确认在正确的Python环境which python中执行了pip install。agentnova models列表为空或连接失败1. Ollama服务未运行。2. 网络或防火墙问题。3. 环境变量OLLAMA_BASE_URL设置错误。1. 运行ollama serve并确保其运行在11434端口。2. 运行curl http://localhost:11434/api/tags测试Ollama API。3. 检查agentnova config --urls确认后端URL。工具调用失败提示“Model does not support native tool calls”1. 模型确实不支持原生工具调用。2. 工具支持检测缓存过期或错误。1. 运行agentnova models --tool-support --no-cache重新检测。2. 尝试添加--force-react参数强制使用ReAct模式。智能体陷入循环或输出无关内容1. 提示词冲突或模型“幻觉”。2.--max-steps设置过高。3. 工具返回结果格式异常。1. 使用-v查看详细推理步骤检查工具调用和观察。2. 降低--max-steps如设为5限制循环次数。3. 检查工具函数是否总是返回字符串且没有抛出未处理异常。插件未加载1. 插件目录不正确。2.manifest.json格式错误。3. 插件依赖未满足。1. 确认插件目录在AGENTNOVA_PLUGIN_PATH或默认路径下。2. 使用python -m json.tool manifest.json验证JSON格式。3. 查看agentnova plugins输出是否有错误信息检查插件requires字段。使用--session时报数据库错误1. 会话数据库文件损坏。2. 多个进程同时写入同一会话。1. 尝试删除~/.agentnova/sessions.db文件会丢失所有会话。2. 确保会话访问是串行的或为不同进程使用不同的session_id。执行Shell命令被阻止1. 命令在阻止列表中。2. 路径试图访问敏感目录。1. 检查命令是否包含rm,sudo等关键词。2. 使用--confirm进行交互式确认或审查审计日志~/.agentnova/audit.log。6.3 参与社区与贡献AgentNova是一个开源项目其活力来自于社区。作为用户和开发者你可以通过多种方式参与报告问题在GitHub仓库的Issues页面清晰描述你遇到的问题、复现步骤、环境信息AgentNova版本、Python版本、模型名称、后端以及相关的日志或错误信息。贡献代码从修复文档错别字、增加测试用例到实现新功能或开发新插件所有贡献都受欢迎。请先阅读项目的CONTRIBUTING.md如果存在和代码风格指南。分享插件如果你开发了一个有用的插件考虑将其开源并通过Pull Request或 Discussions 板块分享给社区。一个繁荣的插件生态是框架成功的关键。分享用例在项目的Discussions或社交媒体上分享你是如何使用AgentNova解决实际问题的。真实的用例故事最能吸引新的开发者并启发框架的演进方向。这个框架目前处于Alpha阶段意味着核心API和功能可能还会发生较大变化。但正是这种早期阶段为开发者提供了绝佳的机会去深入了解智能体系统的内部机制并按照自己的需求去塑造它。从简单的本地自动化脚本到复杂的多智能体协作系统AgentNova提供的这套最小化、可扩展的积木值得每一个对AI智能体感兴趣的开发者花时间探索和搭建。

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