Intelli开源智能代理框架:从核心概念到生产部署全解析

news2026/5/12 7:22:25
1. 项目概述Intelli 是什么以及它为何值得关注最近在开源社区里一个名为intelligentnode/Intelli的项目开始引起不少开发者的注意。乍一看这个标题你可能会有点困惑Intelli是某种新的智能代理框架还是一个集成开发环境的插件实际上这个项目是一个围绕“智能节点”或“智能代理”概念构建的开源工具库或框架。它的核心目标是帮助开发者更高效地构建、管理和编排具备一定自主决策与执行能力的软件代理。简单来说它试图为那些想让程序变得更“聪明”、能自动处理复杂任务的开发者提供一套趁手的工具箱。我自己在尝试构建自动化工作流和智能助手类应用时常常遇到一个痛点市面上要么是过于庞大、学习曲线陡峭的企业级平台要么就是功能单一、需要自己从头造轮子的零散库。Intelli 的出现似乎瞄准了这个中间地带。它不试图做一个包罗万象的“大脑”而是专注于提供构建智能行为单元所需的核心模块比如任务解析、工具调用、状态管理以及简单的记忆能力。这对于想要快速验证一个智能体想法或者为现有应用添加一些自动化智能特性的开发者来说吸引力是巨大的。这个项目适合谁呢如果你是一名全栈开发者、DevOps工程师或者对自动化、RPA、智能助手感兴趣的技术爱好者Intelli 都值得你花时间了解一下。它尤其适合那些希望用代码而非拖拽界面来定义复杂业务逻辑同时又不想陷入底层通信和调度细节的团队。接下来我将带你深入拆解这个项目的设计思路、核心组件并分享如何从零开始上手以及在实际使用中可能遇到的“坑”和应对技巧。2. 核心架构与设计哲学解析2.1 从“智能节点”到“智能体”核心概念界定要理解 Intelli首先得厘清它的核心概念——“智能节点”在这里究竟指什么。在分布式系统和AI领域“节点”通常指一个可以独立运行、具有特定功能的计算单元。Intelli 中的“节点”我理解为一个封装了特定能力如调用一个API、执行一段逻辑、进行条件判断并具备一定自主性的执行单元。多个这样的节点通过预定义的规则或动态的决策逻辑连接起来就形成了一个可以完成复杂任务的“智能体”。这种设计哲学与传统的面向过程编程或简单的函数调用有本质区别。传统编程中执行流程是线性和确定的而在 Intelli 的模型里每个节点更像一个黑盒它接收输入基于内部逻辑可能包含简单的规则也可能集成大语言模型的推理能力进行处理然后产生输出并决定下一个要激活的节点。这引入了不确定性和动态性使得整个系统能够应对更复杂的、非结构化的任务场景。项目选择这样的架构显然是预见到了未来软件需要处理更多模糊、多步骤且需要上下文理解的任务比如自动化的客户支持、动态的数据处理流水线或是游戏中的NPC行为树。2.2 模块化与可插拔为什么这是关键优势Intelli 在代码组织上强调高度的模块化。从我的分析来看它通常会将核心功能分解为几个清晰的层次核心运行时负责节点的生命周期管理、消息路由和任务调度。这是引擎保证一切能跑起来。节点库一系列预构建的、开箱即用的标准节点。比如可能有“HTTP请求节点”、“条件判断节点”、“数据转换节点”、“日志记录节点”等。这是它的武器库。工具集成层专门用于对接外部能力和数据源。这是项目的扩展性所在允许你轻松地将新的API、数据库甚至本地命令行工具封装成一个节点。编排与定义层提供一种方式来描述节点之间的连接关系和执行流程。这可能通过YAML/JSON配置文件、领域特定语言或者直接使用Python代码来实现。这种可插拔的设计带来了巨大优势。首先技术栈无关性你可以用Python写核心逻辑用Go写高性能计算节点用JavaScript写Web交互节点只要它们遵循相同的通信契约比如通过gRPC或HTTP就能被统一编排。其次易于测试和调试每个节点可以独立进行单元测试而整个流程的调试可以聚焦于节点间的数据流和状态转换。最后社区驱动进化一个健康的节点生态可以快速形成开发者可以共享自己编写的专用节点如“发送企业微信消息节点”、“查询特定数据库节点”加速所有人的开发进程。2.3 与现有方案的对比Airflow、LangChain 与 Camunda看到 Intelli很多人会自然联想到其他几个流行项目Apache Airflow、LangChain 和 Camunda。它们之间有重叠但侧重点不同。Apache Airflow核心是工作流调度。它擅长管理具有明确依赖关系和定时触发的批处理任务比如每天凌晨的数据ETL作业。Airflow的DAG有向无环图定义了固定的执行路径节点Operator通常是确定性的任务。Intelli 更偏向于动态的、基于内容的决策流。它的节点可能根据上一个节点的输出内容动态选择下一个节点更适合交互式和决策型场景。LangChain核心是大语言模型应用开发框架。它提供了将LLM与各种工具、记忆系统连接起来的链Chain。Intelli 可以看作是一个更通用化的“智能体运行时”。LangChain的链是专门为LLM设计的而Intelli的节点可以包含LLM推理也可以完全不涉及AI只是纯逻辑处理。你可以把LangChain构建的链作为一个特殊的“LLM推理节点”集成到Intelli的流程中。Camunda核心是业务流程管理。它专注于企业级的人机协同业务流程有强大的表单、用户任务和BPMN标准支持。Intelli 更轻量更偏向纯自动化的技术流程适合那些不需要人工审批环节、完全由代码驱动的智能场景。简单来说如果你需要一个高度灵活、以代码为中心、专注于构建自主智能代理的框架Intelli 的定位显得更加精准。它试图在强大的功能性和开发的轻便性之间找到一个平衡点。3. 核心组件深度拆解与实操要点3.1 节点能力封装的基本单元节点是Intelli的基石。一个设计良好的节点应该遵循“单一职责原则”。在实操中创建一个节点通常需要定义以下几部分# 假设性代码展示节点结构 from intelli_sdk.core.node import BaseNode class DataEnrichmentNode(BaseNode): node_type processor.enrich description 通过调用外部API丰富输入数据 def __init__(self, config): super().__init__(config) # 初始化必要的客户端如数据库连接、API密钥等 self.api_client SomeAPIClient(config.get(api_key)) self.cache {} async def execute(self, context): 核心执行方法。 context: 包含输入数据、全局状态等信息的上下文对象。 返回更新后的上下文或抛出异常。 input_data context.get(data) # 1. 参数校验与预处理 if not input_data.get(user_id): raise ValueError(缺少必要的 user_id 字段) # 2. 核心业务逻辑例如调用外部API # 注意这里应添加重试、超时、熔断等健壮性处理 try: enriched_info await self.api_client.fetch_user_profile(input_data[user_id]) except APITimeoutError: # 优雅降级如果API失败使用缓存或返回默认值 enriched_info self.cache.get(input_data[user_id], {level: default}) self.logger.warning(fAPI调用超时使用缓存数据 for user {input_data[user_id]}) # 3. 结果处理与上下文更新 context[data][enriched_info] enriched_info # 可以决定下一个节点或由编排层决定 context[_next_node] decision_node if enriched_info[level] vip else normal_process_node return context def get_schema(self): 定义节点的输入/输出数据格式用于可视化编辑器和类型检查 return { input: {type: object, properties: {user_id: {type: string}}}, output: {type: object, properties: {enriched_info: {type: object}}} }实操要点与避坑指南幂等性设计确保节点执行多次与执行一次的效果相同。这对于错误重试和流程恢复至关重要。例如你的“发送通知节点”应该先检查是否已发送过避免重复骚扰用户。资源管理在__init__中初始化的连接数据库、HTTP会话池一定要在节点销毁时正确关闭。Intelli 运行时应该提供生命周期钩子如shutdown方法让你清理资源。上下文污染修改context时要小心。最佳实践是只更新自己负责的数据字段避免覆盖其他节点写入的信息。可以使用嵌套字典或命名空间来隔离。日志与可观测性在每个关键步骤开始、结束、错误记录结构化的日志。不仅记录“发生了什么”还要记录“为什么”如决策依据的某个关键变量值。这将是后期调试的救命稻草。3.2 连接器与工具集成打通外部世界的桥梁Intelli 的价值很大程度上取决于它能连接多少外部服务。其连接器模块通常采用适配器模式为不同的第三方服务提供统一的调用接口。一个典型的连接器配置可能如下所示以YAML为例connectors: openai: type: llm.openai config: api_key: ${env:OPENAI_API_KEY} base_url: https://api.openai.com/v1 default_model: gpt-4-turbo-preview postgres: type: database.postgres config: host: localhost port: 5432 database: myapp username: ${env:PG_USER} password: ${env:PG_PASSWORD} connection_pool: min_size: 2 max_size: 10核心实现技巧配置外部化与安全永远不要将API密钥、数据库密码等硬编码在节点代码或流程定义中。必须通过环境变量或安全的配置管理服务如HashiCorp Vault注入。上述${env:XXX}是常见的变量替换语法。连接池管理对于数据库、HTTP客户端等务必使用连接池。避免在每个节点的每次执行中都创建新连接这会导致性能急剧下降和端口耗尽。连接器层应该负责维护和复用这些池化资源。错误处理标准化定义一套统一的异常类型如ConnectorTimeoutError,ConnectorAuthError并在节点代码中根据异常类型做出不同的恢复策略重试、降级、直接失败。模拟与测试为你的连接器编写模拟器。在开发和单元测试阶段使用模拟的连接器可以避免调用真实API产生费用和依赖让测试更快、更稳定。3.3 编排引擎智能工作流的核心大脑编排引擎是Intelli最复杂也最核心的部分。它负责解析流程定义实例化节点在正确的时机调用节点的execute方法并传递上下文。它的设计直接决定了系统的性能和可靠性。常见的编排模式顺序流最基本的模式节点A执行完后自动执行节点B。适用于有严格先后顺序的步骤。条件分支基于上下文中的某个值决定下一步执行哪个节点。这通常由一个专门的“条件判断节点”或引擎内置的网关来实现。并行分支同时触发多个独立节点执行然后等待所有节点完成后再汇聚。用于提升处理吞吐量但要注意资源竞争和错误处理。事件驱动节点不是由上一个节点直接触发而是监听特定的事件如消息队列中的新消息、文件系统的变化。这使系统能异步响应外部刺激。引擎的健壮性考量状态持久化引擎必须定期将流程实例的当前状态执行到了哪个节点、上下文数据是什么持久化到数据库。这样在系统崩溃重启后可以从断点恢复避免任务丢失。这是生产级系统和非生产级玩具项目的分水岭。超时与看门狗为每个节点的执行设置超时。如果一个节点卡住引擎应该能中断它并按照预定义的策略重试、标记失败、执行补偿节点进行处理。分布式执行当流程负载很高时引擎应该支持将不同的节点分发到不同的工作进程甚至不同的机器上执行。这通常通过消息队列如Redis、RabbitMQ、Kafka来实现引擎作为调度器节点作为工作者。4. 从零开始构建你的第一个智能流程4.1 环境准备与项目初始化假设我们使用Python版本的Intelli。首先通过pip安装假设包已发布# 安装核心库 pip install intelli-core # 安装一些常用的官方节点插件 pip install intelli-nodes-http intelli-nodes-llm intelli-nodes-logic接下来创建一个项目目录并初始化配置。项目结构可能如下my_intelli_agent/ ├── config/ │ ├── connectors.yaml # 连接器配置 │ └── logging.yaml # 日志配置 ├── nodes/ # 自定义节点目录 │ └── my_custom_node.py ├── workflows/ # 工作流定义目录 │ └── customer_onboarding.yaml ├── .env # 环境变量切勿提交到Git └── main.py # 应用入口在.env文件中设置你的密钥OPENAI_API_KEYsk-... DATABASE_URLpostgresql://user:passlocalhost/dbname4.2 定义一个具体的业务流程用户入职自动化让我们用一个具体的场景来串联所有概念自动化处理新用户注册后的入职流程。流程需要接收新用户事件包含用户ID。查询用户详细信息。根据用户来源如“推荐”、“广告”执行不同的欢迎任务。并行执行a) 发送欢迎邮件 b) 在内部系统创建工单。汇总结果并记录日志。对应的流程定义workflows/customer_onboarding.yamlname: customer_onboarding version: 1.0 description: 新用户注册后的自动化入职流程 variables: default_email_template: “welcome_generic” nodes: - id: receive_event type: webhook config: path: /webhook/onboarding - id: fetch_user_profile type: database.query config: connector: postgres query: “SELECT * FROM users WHERE id :user_id” params: - name: user_id from: context.event.data.user_id - id: determine_welcome_path type: switch config: expression: context.nodes.fetch_user_profile.result.source cases: - value: “referral” next: send_vip_email - value: “ad_campaign” next: send_promo_email default: send_generic_email - id: send_vip_email type: email.send config: connector: sendgrid template_id: “vip_welcome” to: context.nodes.fetch_user_profile.result.email - id: send_promo_email type: email.send config: connector: sendgrid template_id: “promo_welcome” to: context.nodes.fetch_user_profile.result.email - id: send_generic_email type: email.send config: connector: sendgrid template_id: ${variables.default_email_template} to: context.nodes.fetch_user_profile.result.email - id: create_internal_ticket type: http.request config: connector: http_default method: POST url: “https://internal-crm.com/api/tickets” body: title: “新用户入职: {{user_id}}” user_id: context.event.data.user_id - id: parallel_gateway type: parallel config: branches: - [send_vip_email, send_promo_email, send_generic_email] # 根据条件实际只执行其中一个 - [create_internal_ticket] - id: log_completion type: log config: level: INFO message: “用户 {{context.event.data.user_id}} 入职流程完成。邮件发送状态: {{context.nodes.send_*_email.status}}, 工单ID: {{context.nodes.create_internal_ticket.response.body.id}}”4.3 编写自定义节点与集成测试假设我们需要一个官方库中没有的节点calculate_user_lifetime_value。我们在nodes/目录下创建它。# nodes/custom_ltv_node.py import statistics from intelli_core.node import BaseNode from some_ml_library import predict_future_value # 假设的ML库 class CalculateUserLTVNode(BaseNode): node_type “business.ltv_calculator” description “基于用户历史订单预测其生命周期价值” def __init__(self, config): super().__init__(config) # 从配置中读取模型路径或参数 self.model_version config.get(‘model_version’, ‘v1’) self.threshold_high config.get(‘threshold_high’, 1000) async def execute(self, context): user_data context.get(‘user_profile’) order_history user_data.get(‘orders’, []) if not order_history: # 新用户无历史数据使用默认值 predicted_ltv 500 confidence 0.5 else: # 简单特征工程平均订单额、订单频率、最近购买时间 avg_order_value statistics.mean([o[‘amount’] for o in order_history]) # 调用预测模型这里用模拟函数 predicted_ltv, confidence predict_future_value(avg_order_value, len(order_history), self.model_version) # 根据LTV打标签 user_segment “high_value” if predicted_ltv self.threshold_high else “standard” # 更新上下文 context[‘analysis’] { ‘predicted_ltv’: round(predicted_ltv, 2), ‘confidence’: round(confidence, 2), ‘segment’: user_segment } # 可以基于分段决定后续流程 if user_segment “high_value”: context[‘_next_node’] ‘assign_vip_agent’ else: context[‘_next_node’] ‘continue_standard_flow’ self.logger.info(f”LTV预测完成: {context[‘analysis’]}”) return context如何测试这个节点不要等待整个流程部署后再测试。为节点编写单元测试# test_nodes/test_custom_ltv_node.py import pytest from nodes.custom_ltv_node import CalculateUserLTVNode pytest.mark.asyncio async def test_ltv_node_new_user(): “””测试无历史订单的新用户场景””” node CalculateUserLTVNode({‘model_version’: ‘v1’}) context {‘user_profile’: {‘name’: ‘John’, ‘orders’: []}} updated_context await node.execute(context) assert updated_context[‘analysis’][‘predicted_ltv’] 500 assert updated_context[‘analysis’][‘segment’] ‘standard’ pytest.mark.asyncio async def test_ltv_node_high_value(): “””测试高价值用户场景””” node CalculateUserLTVNode({‘threshold_high’: 800}) context { ‘user_profile’: { ‘orders’: [{‘amount’: 600}, {‘amount’: 900}, {‘amount’: 750}] } } # 这里需要 mock predict_future_value 函数让它返回一个大于800的值 with patch(‘nodes.custom_ltv_node.predict_future_value’, return_value(1200, 0.8)): updated_context await node.execute(context) assert updated_context[‘analysis’][‘segment’] ‘high_value’ assert updated_context[‘_next_node’] ‘assign_vip_agent’4.4 部署与运行让流程活起来最后我们需要一个主程序来加载配置、注册节点并启动引擎。在main.py中import asyncio import os from intelli_core import Engine from intelli_core.config import load_config_from_path from nodes.custom_ltv_node import CalculateUserLTVNode async def main(): # 1. 加载配置 config load_config_from_path(‘./config’) # 2. 初始化引擎 engine Engine(config) # 3. 注册自定义节点官方节点通常自动注册 engine.register_node(CalculateUserLTVNode) # 4. 加载工作流定义 workflow_def engine.load_workflow(‘./workflows/customer_onboarding.yaml’) # 5. 启动引擎例如启动一个接收Webhook的HTTP服务器 # 或者手动触发一个流程实例 if __name__ ‘__main__’: # 模拟一个事件触发 initial_context { ‘event’: { ‘type’: ‘user_registered’, ‘data’: {‘user_id’: ‘12345’} } } result await engine.run_workflow(workflow_def, initial_context) print(f“流程执行结果: {result.status}”) print(f“最终上下文: {result.context}”) # 6. 生产环境通常是长期运行等待事件 # await engine.start_server() if __name__ ‘__main__’: asyncio.run(main())运行你的第一个智能流程# 设置环境变量 export OPENAI_API_KEYyour_key_here export PG_USERyour_db_user # 运行主程序 python main.py5. 生产环境进阶性能、监控与故障排查5.1 性能优化策略当你的智能流程从demo走向生产处理成千上万的并发请求时性能问题会凸显出来。节点异步化确保所有节点的execute方法都是async的并在内部使用异步IO库如aiohttp,asyncpg。这能极大提高I/O密集型节点的吞吐量避免阻塞事件循环。批量处理如果某个节点需要频繁调用外部API如发送短信、更新数据库考虑实现批量处理。例如收集一段时间内或一定数量的请求一次性发送可以显著减少网络往返和连接开销。缓存策略对于计算昂贵或数据变化不频繁的节点引入缓存。可以使用内存缓存如lru_cache或分布式缓存如Redis。在节点的execute方法开始处检查缓存命中则直接返回。流程设计优化审视你的工作流。不必要的串行节点能否改为并行某个复杂节点能否拆分成多个更小、更可缓存的节点流程中是否存在“扇出”过大的节点一个节点触发几十个后续节点这可能成为瓶颈。5.2 可观测性日志、指标与追踪“黑盒”系统是运维的噩梦。你必须为你的Intelli应用装上眼睛和耳朵。结构化日志不要只打印“Process started”。记录带有丰富上下文的日志如流程ID、节点ID、用户ID、关键决策参数、执行耗时等。这便于使用ELK或Loki等工具进行聚合查询和告警。# 好的日志 self.logger.info(“node_executed”, extra{ “node_id”: self.node_id, “workflow_instance_id”: context[‘_workflow_instance_id’], “user_id”: context.get(‘user_id’), “duration_ms”: (end_time - start_time) * 1000, “decision”: “high_value” })关键指标暴露使用Prometheus客户端库暴露指标。核心指标包括各类型节点的执行次数、成功/失败计数。节点执行耗时P50, P95, P99。流程实例的完成数、失败数、平均完成时间。队列长度如果使用了消息队列。分布式追踪为每个流程实例生成一个唯一的Trace ID并贯穿所有节点的执行。当节点调用外部HTTP服务或数据库时将这个Trace ID注入到请求头中。这样你可以在Jaeger或Zipkin中看到一个请求完整的、端到端的执行路径快速定位延迟或错误的根源。5.3 常见问题排查实录以下是我在实际使用和类似系统运维中遇到的一些典型问题及解决方法。问题现象可能原因排查步骤与解决方案流程卡在某个节点不动无错误日志1. 节点执行陷入死循环或长时间等待。2. 消息丢失分布式环境下。3. 引擎调度器挂了。1.检查节点逻辑查看该节点代码是否有while True或等待外部永不发生的事件。2.查看节点日志检查该节点最后输出的日志看是否在调用某个外部服务。3.检查系统资源CPU/内存是否耗尽4.检查消息队列如果用了队列查看队列中是否有积压消费者是否在线。5.启用超时和看门狗为节点设置执行超时并在引擎层面实现心跳检测。上下文数据在流程中神秘丢失或篡改1. 多个节点并发修改同一上下文字段导致竞态条件。2. 节点错误地覆盖了其他节点的数据。3. 状态持久化/反序列化出错。1.审查流程设计并行执行的节点是否访问了相同的上下文字段如果是考虑引入锁或将该字段的更新合并到一个专用节点。2.实施上下文隔离鼓励节点使用context.set(‘namespace.key’, value)而非直接操作顶级字段。3.增加审计日志在引擎层面记录每次上下文被修改前后的快照可采样避免数据量过大。4.检查序列化确保所有存入上下文的Python对象都是可JSON序列化的。外部API调用间歇性失败导致整个流程失败1. 网络波动或第三方服务不稳定。2. 未实施重试机制。3. 未处理限流或认证失败。1.实现指数退避重试对于网络错误、5xx状态码进行重试如最多3次间隔 1s, 2s, 4s。2.添加熔断器如果某个外部服务连续失败多次暂时熔断对该服务的所有调用直接快速失败或走降级逻辑过一段时间再尝试恢复。3.细化错误处理区分“可重试错误”如超时和“不可重试错误”如认证失败、参数错误。后者应立即失败并通知人工处理。流程执行速度慢吞吐量上不去1. 存在性能瓶颈节点慢查询、同步IO。2. 流程中串行步骤过多。3. 引擎或数据库配置不当。1.性能剖析使用追踪工具或在每个节点记录耗时找出最慢的节点。2.优化瓶颈节点为慢查询添加索引、将同步调用改为异步、引入缓存。3.流程重构将无依赖关系的串行节点改为并行执行。4.调整资源配置增加工作进程/线程数调整数据库连接池大小。5.考虑异步化引擎确保引擎本身不会成为瓶颈。5.4 版本管理与流程演进随着业务变化你的智能流程也需要迭代。直接修改线上运行的流程定义是危险的。流程版本化每个工作流定义都应带有版本号。当部署新版本时旧版本的运行中实例应继续使用旧定义执行完毕新触发的实例使用新定义。这需要引擎支持多版本并存。蓝绿部署可以部署两套完全相同的Intelli环境。先将新流程部署到“绿”环境并进行充分测试然后通过切换流量入口如负载均衡器配置将请求从“蓝”环境切到“绿”环境。数据迁移与兼容性如果新版本的节点输出数据结构发生了变化要考虑对下游节点或依赖此数据的其他系统的影响。可能需要编写数据转换节点或进行双写确保平滑过渡。回滚计划每次部署前必须明确如何快速回滚到上一个稳定版本。这通常意味着备份旧的配置和代码并确保回滚操作简单、快速。

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