HyperAgent开源框架:构建AI智能体的状态管理与工具集成实践

news2026/4/27 21:40:30
1. 项目概述一个面向AI智能体的开源框架最近在折腾AI智能体Agent相关的项目发现了一个挺有意思的开源框架——HyperAgent。这名字听起来就挺“超”的HyperBrowserAI团队出品。简单来说它不是一个具体的应用而是一个帮你快速构建、测试和部署AI智能体的底层框架。你可以把它想象成一个专门为智能体打造的“乐高积木”工具箱提供了各种标准化的连接器、状态管理、记忆模块和决策引擎让你不用从零开始造轮子就能组装出功能复杂的AI助手。我为什么会关注它因为在尝试让AI去自动化执行一些任务比如自动分析数据、处理工作流或者模拟用户进行一些操作时经常会遇到几个头疼的问题不同AI模型比如GPT、Claude、本地模型的接口调用方式五花八门智能体的状态它现在在干什么、记住了什么很难持久化和回溯多步骤任务的逻辑编排写起来很乱。HyperAgent声称就是为了解决这些痛点而生的它试图提供一个统一的抽象层让开发者能更专注于智能体的业务逻辑本身而不是底层的通信和状态管理。这个框架适合谁呢如果你是一个对AI应用开发感兴趣的开发者尤其是想深入智能体领域构建能够自主执行多步骤任务的AI程序那么HyperAgent值得你花时间研究。它降低了构建复杂智能体的门槛但同时也要求你对编程和AI的基本原理有一定了解。接下来我会结合自己的探索和测试拆解一下它的核心设计、怎么用以及实际踩过的一些坑。2. 核心设计理念与架构拆解2.1 为什么需要“智能体框架”在深入HyperAgent之前我们先聊聊为什么单纯的API调用不够用。当你直接调用一个大语言模型的API来完成一个任务时比如“帮我总结这篇长文章”这是一个单次交互。但现实中的复杂任务往往是多轮次的。例如“请监控A网站的某个数据指标如果连续三天超过阈值X就发邮件给B并在我另一个系统C里创建一条待办事项。” 这个任务涉及1周期性执行2条件判断3跨系统操作网站、邮箱、内部系统4状态记忆过去三天的数据。如果全靠自己写代码你需要处理定时任务调度、不同API的认证和调用、历史数据的存储与查询、执行逻辑的流程控制如果发邮件失败了怎么办。代码会迅速变得臃肿且难以维护。智能体框架的核心价值就是将这类状态管理、工具调用、记忆持久化、决策循环等通用能力模块化、标准化。HyperAgent的设计哲学在我看来是“以状态为中心”。它把智能体每一次与环境的交互包括接收输入、调用工具、得到输出都看作一个可记录、可回放的事件。整个框架围绕着如何定义、存储、更新和利用“智能体状态”来展开。2.2 HyperAgent 的核心组件与工作流根据官方文档和源码分析HyperAgent的架构可以概括为以下几个核心部分它们共同协作驱动智能体完成任务1. 环境Environment与 状态State这是HyperAgent的基石。Environment定义了智能体所处的“世界”它提供了智能体可以执行的动作Actions并接收动作返回的观察Observations。State则是对当前环境以及智能体自身信息的一个快照。例如一个网页浏览智能体的状态可能包含当前打开的URL、页面DOM内容、登录状态等。HyperAgent强制要求状态必须是可序列化的这使得状态的持久化和回滚成为可能。2. 智能体AgentAgent是核心决策单元。它接收当前的State然后决定下一步要采取哪个Action。这个决策过程通常由一个LLM驱动。HyperAgent的Agent模块通常包含策略Policy 决定动作选择的逻辑。最简单的是基于LLM的零样本zero-shot或思维链Chain-of-Thought策略。记忆Memory 让智能体记住过去的交互。HyperAgent可能提供了短期记忆如对话历史和长期记忆如向量数据库存储的关键信息的接口。工具Tools Agent可以调用的函数。比如“搜索网络”、“执行Python代码”、“发送HTTP请求”。框架需要管理工具的注册、描述和调用。3. 工具Tools与 执行器ExecutorTools是智能体延伸的手脚。HyperAgent的一个优点是它可能内置或易于集成大量常见工具计算器、搜索引擎、文件读写等。Executor则负责安全、可靠地运行这些工具并处理可能出现的异常比如工具调用超时、返回错误。4. 轨迹Trajectory与 记忆存储智能体从初始状态到最终状态所经历的一系列State, Action, Observation三元组构成了一个Trajectory轨迹。HyperAgent会完整记录这些轨迹。这不仅是用于调试和复盘更是实现复杂能力的关键学习与微调 轨迹可以作为高质量的训练数据用来微调底层的小模型让它更好地模仿成功路径。反思与改进 智能体可以回顾失败的轨迹分析哪里出了问题并自我修正策略。持续任务 当智能体被中断后重启它可以读取保存的轨迹快速恢复到之前的状态继续执行任务。5. 控制器Controller与 生命周期管理这是智能体运行的“发动机”。它管理着智能体运行的主循环获取状态 - Agent决策 - 执行动作 - 更新状态 - 存储轨迹 - 判断终止条件任务完成或失败。它还负责处理并发、资源清理等。用一个简单的流程图来概括其工作流[启动] | v [初始化 Environment Agent] | v [进入主循环] -- [获取当前 State] | | v v [Agent 根据 State 和 Memory 选择 Action] | v [Executor 安全执行 Action 得到 Observation] | v [Environment 更新 State (State Action Observation)] | v [存储本次交互到 Trajectory Memory] | v [判断任务是否完成] --否-- [继续循环] | 是 v [保存完整 Trajectory 结束运行]这个架构的优势在于清晰的分层和解耦。如果你想换一个LLM只需要修改Agent里的策略部分如果想增加一个新工具只需注册即可不影响其他模块。3. 从零开始搭建你的第一个HyperAgent智能体理论说了不少现在我们来动手实操。假设我们要构建一个简单的“信息搜集智能体”它的任务是根据用户提出的一个话题自动搜索网络获取最新信息并整理成一份摘要报告。3.1 环境准备与安装首先确保你的开发环境有Python 3.8。然后通过pip安装HyperAgent。由于它是一个较新的项目建议直接从GitHub仓库安装最新版本以获得最全的功能和修复。# 推荐从源码安装 git clone https://github.com/hyperbrowserai/HyperAgent.git cd HyperAgent pip install -e . # 或者通过pip安装可能不是最新版 # pip install hyperagent安装完成后你还需要准备一个LLM的API密钥。HyperAgent通常支持OpenAI API兼容的多种模型。这里以OpenAI为例export OPENAI_API_KEYyour-api-key-here注意如果你使用Azure OpenAI或其他本地模型如通过Ollama部署的Llama需要查看HyperAgent的文档配置对应的Base URL和模型名称。框架的灵活性往往体现在对这些后端的支持上。3.2 定义任务与环境在我们的例子中环境就是“互联网信息世界”。我们不需要模拟一个复杂的图形环境只需要定义智能体能做什么动作搜索、浏览即可。HyperAgent可能已经提供了基础的WebEnvironment或类似的组件。如果没有我们可以定义一个简单的环境。from hyperagent import Environment, State, Action, Observation from typing import Optional, Dict, Any import requests from bs4 import BeautifulSoup class SimpleWebEnv(Environment): 一个极度简化的网页环境仅用于演示 def __init__(self): super().__init__() self.current_url None self.page_content def reset(self) - State: 重置环境状态 self.current_url None self.page_content # State通常是一个字典包含所有必要信息 return State(data{url: self.current_url, content: self.page_content}) def step(self, action: Action) - Observation: 执行一个动作返回观察结果 action_type action.data.get(type) if action_type search: query action.data.get(query) # 模拟搜索这里简化成直接访问一个固定的搜索URL或调用搜索API # 实际上你应该集成Serper API、Google Search API等 print(f[Env] 执行搜索: {query}) # 假设我们调用一个模拟搜索函数 result self._mock_search(query) self.page_content result obs_data {result: result, status: search_completed} elif action_type summarize: # 智能体请求对当前内容进行总结这个动作可能由另一个工具执行这里仅为演示环境步骤 print(f[Env] 收到总结指令) obs_data {status: ready_for_summarization, content: self.page_content} else: obs_data {error: f未知动作类型: {action_type}} return Observation(dataobs_data) def _mock_search(self, query: str) - str: 模拟搜索返回一段固定文本。真实场景请替换为真正的搜索工具调用。 return f这是关于{query}的模拟搜索结果。最近的研究表明...此处是模拟的文本内容。这个环境很简单它只响应两种动作搜索和准备总结。State和Observation都是包装数据的容器。在实际使用中HyperAgent很可能已经内置了更强大、更真实的环境例如与真实浏览器交互的环境。3.3 配置智能体与工具接下来是核心部分创建智能体。我们需要给智能体配备“大脑”LLM和“手脚”工具。from hyperagent import Agent from hyperagent.agent.policy import ZeroShotPolicy # 假设存在零样本策略 from hyperagent.tools import Tool, tool from hyperagent.memory import ShortTermMemory import openai # 首先定义智能体可以使用的工具 tool def search_web(query: str) - str: 在互联网上搜索指定查询词返回相关的文本信息。 Args: query: 要搜索的关键词或问题。 Returns: 搜索结果的文本摘要。 # 这里应该集成正式的搜索API如SerperDev、DuckDuckGo等。 # 为演示我们直接调用上面环境里的模拟函数或一个独立的搜索函数。 print(f[Tool] 正在搜索: {query}) # 模拟网络请求和结果解析 # result requests.get(fhttps://api.serper.dev/search?q{query})... return f关于{query}的真实或模拟搜索结果文本。 tool def write_summary(text: str, length: str medium) - str: 将一段长文本总结成指定长度的摘要。 Args: text: 需要总结的原始文本。 length: 摘要长度可选 short, medium, long。 Returns: 生成的摘要。 print(f[Tool] 正在生成{length}长度的摘要...) # 这里可以调用LLM进行总结或者使用简单的文本摘要库。 # 为演示我们模拟一个总结过程。 simulated_summary f【摘要】这是对提供文本的{length}总结。核心观点是... return simulated_summary # 创建智能体 def create_my_agent(): # 1. 准备工具列表 tools [search_web, write_summary] # 2. 配置LLM这里以OpenAI为例 # HyperAgent的Policy可能需要一个LLM客户端 llm_client openai.Client() # 使用环境变量中的API_KEY # 3. 创建策略决策逻辑 # ZeroShotPolicy 是一种简单策略它每次都将当前状态和任务描述发给LLM让LLM选择工具和输入。 policy ZeroShotPolicy( llmllm_client, toolstools, modelgpt-4o-mini, # 指定模型 ) # 4. 创建记忆 memory ShortTermMemory(capacity10) # 记住最近10轮对话 # 5. 组装智能体 agent Agent( policypolicy, memorymemory, nameInfoScoutBot ) return agent, tools关键点在于ZeroShotPolicy它利用LLM的理解能力根据当前状态比如用户的问题、之前的对话历史和可用工具的描述来决定下一步该调用哪个工具以及传入什么参数。HyperAgent框架会自动将工具的函数签名和文档字符串转换成LLM能理解的提示词。3.4 运行与监控最后我们将环境、智能体和控制器串联起来运行整个系统。from hyperagent import Controller def main(): # 1. 初始化环境 env SimpleWebEnv() initial_state env.reset() # 2. 创建智能体和工具 agent, tools create_my_agent() # 3. 创建控制器并注册工具执行器 controller Controller( agentagent, environmentenv, ) # 控制器内部会处理工具的执行 # 4. 定义任务 user_query 量子计算在2024年的最新进展是什么 print(f任务开始: {user_query}) # 5. 运行智能体简化流程实际控制器run方法可能更复杂 # 这里演示一个手动的循环实际使用框架提供的run方法 max_steps 5 current_state initial_state # 将用户查询作为初始观察或状态的一部分注入 current_state.data[user_query] user_query for step in range(max_steps): print(f\n--- 步骤 {step1} ---) # 智能体决策 action agent.decide(current_state) print(f智能体选择动作: {action}) # 环境执行动作得到观察 observation env.step(action) print(f环境观察: {observation.data.get(status, N/A)}) # 更新状态 (在真实控制器中这一步是自动的) # 新的状态 旧状态 动作 观察 new_state_data {**current_state.data, last_action: action.data, last_obs: observation.data} current_state State(datanew_state_data) # 更新智能体记忆 agent.memory.add(current_state) # 检查任务是否完成例如观察中包含了摘要结果 if summary in str(observation.data).lower(): print(任务完成) break print(\n 运行结束 ) if __name__ __main__: main()在实际的HyperAgent框架中Controller类会封装这个循环你只需要提供任务目标它就会自动运行直到完成或达到步数限制。运行后你可以在日志中看到智能体的思考过程它先决定调用search_web工具拿到结果后再决定调用write_summary工具最终生成答案。4. 深入核心状态管理、记忆与工具生态4.1 状态State的持久化与回滚HyperAgent强调的“状态”是其强大功能的来源。状态不仅仅是当前的数据快照它包含了整个交互历史。框架通常会将状态或轨迹自动保存到文件或数据库中。# 假设框架提供了轨迹保存功能 from hyperagent.trajectory import TrajectoryRecorder recorder TrajectoryRecorder(storage_path./trajectories) controller Controller(agentagent, environmentenv, recorderrecorder) # 运行后会在 ./trajectories 下生成文件记录每一步的 State, Action, Observation。 # 这带来了两个巨大好处 # 1. 调试当智能体行为异常时你可以像看录像一样回放整个过程精准定位问题出在哪一步。 # 2. 继续执行如果程序崩溃你可以从保存的最后一个状态重新加载让智能体继续任务而不是从头开始。实操心得一定要为你的项目设计一个清晰、可序列化的状态结构。避免在状态中存储无法pickle的复杂对象如打开的数据库连接、网络会话。状态应该只包含必要的数据和指向外部资源的引用如文件路径、ID。4.2 短期记忆与长期记忆的实现记忆是智能体表现“智能”的关键。HyperAgent的Memory模块可能提供了多种实现。短期记忆通常是维护一个固定长度的列表保存最近的(state, action, observation)元组。这直接作为上下文提供给LLM让它知道刚才发生了什么。上面的ShortTermMemory就是一个例子。长期记忆对于需要跨越很长时间或大量信息的知识需要使用向量数据库如Chroma, Pinecone, Weaviate。智能体可以将重要的观察结果例如“用户张三喜欢蓝色”转换成向量并存储。当遇到相关场景时例如“为张三推荐产品”通过向量检索召回这些记忆注入上下文。# 伪代码展示长期记忆的可能用法 from hyperagent.memory import VectorMemory from hyperagent.embedder import OpenAIEmbedder # 假设的嵌入器 embedder OpenAIEmbedder(modeltext-embedding-3-small) vector_memory VectorMemory(embedderembedder, vector_store_path./memory_db) # 智能体完成一个重要任务后存储关键信息 key_info 项目Alpha的API密钥是XYZ服务器地址是192.168.1.100。 vector_memory.add(key_info, metadata{category: credentials, project: Alpha}) # 当新任务涉及相关项目时检索记忆 related_memories vector_memory.search(Alpha项目的服务器地址是什么, k1) if related_memories: context f根据过往记录{related_memories[0].content} # 将context加入给LLM的提示词中注意事项长期记忆的检索不是免费的。每次交互都检索大量记忆会拖慢速度、增加token消耗。需要设计策略决定何时存储、何时检索。例如只在检测到话题涉及特定领域如“项目Alpha”时才触发检索。4.3 扩展工具库与安全考量工具是智能体能力的边界。HyperAgent的魅力在于其工具生态的易扩展性。如何自定义一个工具就像我们之前用tool装饰器定义的search_web一样简单。关键是写好文档字符串DocstringLLM靠它来理解工具的用途和参数。tool def query_database(sql: str) - str: 在预定义的项目数据库上执行安全的SQL查询只读。用于获取用户数据、项目状态等信息。 Args: sql: 要执行的SELECT查询语句。禁止包含DROP, DELETE, INSERT, UPDATE等关键字。 Returns: 查询结果以表格的文本形式返回。如果出错返回错误信息。 # 1. 安全检查 forbidden_keywords [drop, delete, insert, update, ;, --] for kw in forbidden_keywords: if kw in sql.lower(): return f错误查询包含禁止的关键字 {kw}。 # 2. 连接数据库并执行此处省略具体代码 # conn get_db_connection() # results conn.execute(sql).fetchall() # return str(results) return 模拟的数据库查询结果。工具执行的安全沙箱这是生产环境中至关重要的一环。你不能让LLM生成的代码直接在你的服务器上运行。HyperAgent的Executor应该提供或允许你配置安全措施。代码执行对于python工具必须在隔离的Docker容器或安全沙箱如piston中运行限制CPU、内存、网络和文件访问。网络请求限制可访问的域名白名单防止智能体访问内网或恶意网站。权限控制不同工具应有不同权限等级。例如“发送邮件”工具需要更高权限不能由处理普通查询的智能体随意调用。提示在开发初期可以放宽限制以便快速原型验证。但在部署前必须仔细审查每一个工具的安全边界这是防止智能体“闯祸”的底线。5. 实战进阶构建一个自动化数据分析智能体让我们构想一个更复杂的场景来展示HyperAgent在整合多步骤工作流上的威力。假设我们要构建一个“周报数据智能体”它的任务是每周一自动从公司数据库拉取上周销售数据调用Python进行清洗和分析生成图表并将分析摘要和图表通过邮件发送给团队。5.1 设计工作流与状态机这个任务无法一步完成它是一个典型的工作流Workflow。我们可以用状态机来定义它状态_初始等待触发如每周一上午9点。状态_获取数据连接数据库执行SQL查询将原始数据存入状态。状态_分析数据调用pandas工具进行数据清洗、计算关键指标如周环比、Top 5产品。状态_生成可视化调用matplotlib或plotly工具生成销售趋势图、饼图等将图片文件保存到本地路径并将路径存入状态。状态_撰写报告将指标和图表路径汇总调用LLM如GPT生成一段文字分析报告。状态_发送邮件将报告正文和图表附件通过邮件工具发送。状态_完成记录日志清理临时文件。在HyperAgent中我们可以通过设计一个State的phase字段来标识当前阶段智能体根据不同的phase选择不同的工具组合。5.2 实现与编排我们需要为上述每个阶段创建对应的工具。然后关键点在于智能体的Policy策略需要被设计成能理解这个工作流。有几种方法方法A让LLM自己规划Zero-Shot我们给LLM一个高级指令“你是一个周报自动化助手请按步骤完成1.获取数据2.分析数据3.生成图表4.写报告5.发邮件。你当前处于{current_phase}阶段。” 依靠LLM强大的推理能力它可能会自己一步步推进。但缺点是不稳定容易在步骤间混乱。方法B使用智能体框架的工作流/编排引擎更可靠的方式是利用HyperAgent可能提供的更高级抽象比如Workflow或Orchestrator。你可以显式地定义这个顺序逻辑。# 伪代码展示一种可能的编排方式 from hyperagent.workflow import SequentialWorkflow weekly_report_workflow SequentialWorkflow( nameWeekly Sales Report, steps[ {tool: fetch_sales_data, args_provider: lambda state: {week: state[target_week]}}, {tool: analyze_with_pandas}, {tool: generate_plots}, {tool: write_summary_with_llm}, {tool: send_email, args_provider: lambda state: { to: state[recipients], subject: f销售周报 {state[target_week]}, body: state[report_text], attachments: state[plot_paths] }}, ] ) # 在控制器中运行工作流 controller.run_workflow(weekly_report_workflow, initial_state)在这种模式下智能体或工作流引擎严格按预定步骤执行每个步骤的输入参数可以由上一步的输出动态决定通过args_provider。这结合了自动化的可靠性和LLM的灵活性例如write_summary_with_llm步骤仍然由LLM自由发挥。5.3 错误处理与自我修复复杂流程中出错是常态。网络超时、数据库连接失败、生成的图表格式不对……一个健壮的智能体必须具备错误处理能力。HyperAgent的架构有利于实现这一点。因为每一步的State、Action、Observation都被记录当Observation包含错误信息时我们可以设计一个“错误处理子策略”。# 在智能体决策逻辑中加入错误处理 def advanced_policy(state): # 检查上一步观察是否包含错误 last_obs state.data.get(last_observation, {}) if error in last_obs: error_msg last_obs[error] # 根据错误类型决定修复动作 if connection timeout in error_msg: # 重试逻辑 return Action(data{type: retry, tool: state.data[last_tool], args: state.data[last_args]}) elif data format invalid in error_msg: # 尝试数据清洗工具 return Action(data{type: call_tool, tool: clean_data, args: state.data[raw_data]}) else: # 未知错误请求人工帮助或记录日志后终止 return Action(data{type: alert_human, message: f遇到无法处理的错误: {error_msg}}) else: # 正常情况继续执行工作流中的下一步 return decide_next_normal_step(state)此外可以利用轨迹记录进行事后分析。收集失败任务的轨迹人工或通过另一个“分析智能体”来诊断根本原因然后更新工具的实现或智能体的提示词实现系统的持续改进。6. 常见问题、排查与性能优化在实际使用HyperAgent或类似框架时你肯定会遇到各种问题。以下是我总结的一些常见坑点和解决思路。6.1 智能体陷入循环或行为异常症状智能体反复执行同一个或一组无意义的动作无法推进任务。原因排查工具描述不清LLM不理解某个工具的用途。检查工具的docstring是否清晰、准确地描述了功能和参数。使用更具体、无歧义的语言。状态信息不足LLM做决策依赖当前状态。检查传递给LLM的State是否包含了完成任务所需的全部关键信息如任务目标、上一步结果、可用工具列表。提示词Prompt设计问题给智能体的系统指令System Prompt可能不够明确。尝试在指令中强调“避免重复动作”、“如果卡住了尝试另一种方法”。LLM本身的不确定性即使是同一个提示LLM也可能产生随机输出。可以尝试降低temperature参数如设为0增加max_tokens以避免回答被截断。解决步骤打开框架的详细日志查看每一步智能体收到的提示词和它的完整回复。模拟LLM的视角阅读这个提示词看自己是否能做出正确的决策。迭代修改工具描述、状态结构或系统提示词。6.2 工具调用失败或超时症状智能体发出了正确的工具调用指令但工具执行报错或长时间无响应。原因与解决参数格式错误LLM生成的参数类型与工具函数声明不匹配如字符串传成了数字。在工具函数内部增加严格的类型检查和转换并返回清晰的错误信息给智能体。网络或外部依赖问题工具依赖的API或服务不可用。在工具函数中添加重试机制和超时设置。from tenacity import retry, stop_after_attempt, wait_exponential import requests retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min2, max10)) def call_external_api(url): response requests.get(url, timeout10) response.raise_for_status() return response.json()资源限制如文件句柄未关闭、内存泄漏。确保工具代码是资源友好的使用with语句管理资源。6.3 性能瓶颈与成本控制问题智能体运行速度慢或者LLM API调用费用高昂。优化策略缓存对频繁且结果不变的查询如“今天的日期”进行缓存。可以为工具添加装饰器来实现。精简上下文每次调用LLM时传递给它的对话历史记忆是消耗token的主要部分。定期清理无关紧要的旧记忆或者使用“摘要记忆”的方式将很长的历史压缩成一段摘要。使用小模型在不需要复杂推理的步骤如简单的数据提取、格式转换可以配置策略使用更便宜、更快的模型如gpt-3.5-turbo只在关键决策点使用大模型如GPT-4。异步执行如果多个工具调用之间没有依赖关系可以考虑让控制器异步执行它们缩短整体运行时间。设置预算和监控在控制器层面设置最大步数max_steps和最大token消耗预警防止智能体陷入无限循环或执行成本过高的任务。6.4 部署与监控当你的智能体开发完毕准备投入生产环境时容器化使用Docker将你的智能体应用、其Python环境、依赖包一起打包。这保证了环境的一致性。配置管理将所有配置API密钥、数据库连接串、模型名称通过环境变量或配置文件管理切勿硬编码在代码中。日志与监控集成像structlog或loguru这样的日志库输出结构化的日志JSON格式便于被ELKElasticsearch, Logstash, Kibana或Datadog等监控系统收集。关键要记录每个轨迹的ID、每一步的动作和观察、工具调用耗时、LLM调用耗时和token使用量。版本控制对你的智能体配置提示词、工具集、工作流定义进行版本控制如Git。这样你可以轻松回滚到之前的稳定版本并对比不同版本的表现。HyperAgent作为一个框架为你处理了智能体系统中许多复杂且重复的部分。但它不是一个“魔法黑箱”。要构建出真正强大、可靠的AI智能体依然需要你深入理解其原理精心设计状态、工具和策略并投入大量的测试和迭代。它提供的是一套强大的脚手架而建筑本身的质量取决于开发者你。

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