Wren Engine:为AI智能体注入业务语义的上下文引擎

news2026/4/30 3:56:07
1. 项目概述为AI智能体注入“业务大脑”的Wren Engine如果你正在构建或使用AI智能体比如Claude Code、Cursor里的AI助手来处理业务数据大概率遇到过这样的场景你问它“本季度华东区的净收入是多少”它吭哧吭哧写出一段SQL结果要么查错了表要么用错了“净收入”的计算公式最后给出的数字和财报对不上。问题出在哪不是智能体不够聪明而是它缺少一样关键的东西——业务上下文。这就是Wren Engine要解决的核心痛点。你可以把它理解为一个专为AI智能体设计的“业务语义翻译官”和“数据导航仪”。它不是一个简单的数据连接器也不是一个传统的BI语义层。它的核心价值在于在原始的数据表Raw Tables和上层的AI应用之间构建了一个富含业务逻辑、关系和治理规则的上下文层。想象一下你的公司数据仓库里有几十张表orders,customers,refunds,products... 对一个AI智能体来说这就是一堆冷冰冰的、名字各异的表格和字段。它不知道“活跃客户”是定义为“过去30天内有下单的客户”还是“过去90天内有登录的客户”它也不知道计算“毛利率”时应该用orders.amount减去products.cost还是需要关联另一张discounts表。Wren Engine所做的就是通过一种叫做建模定义语言的东西把这些散落在DBA、分析师和业务人员脑子里的业务知识系统地、结构化地“教”给AI智能体。我花了些时间深入研究这个由Canner开源的Rust项目它给我的第一印象是“野心不小”。它没有停留在“让AI能写SQL”的层面而是直指下一代AI应用的核心需求让AI能理解业务并基于理解做出可靠的数据访问决策。这对于开发面向企业内部的数据问答机器人、智能分析副驾、甚至是能自动生成报告和看板的自动化工作流意义重大。接下来我会结合官方资料和我对这类系统的理解拆解Wren Engine的设计思路、核心机制以及如何上手使用希望能给正在探索AI与数据结合点的开发者一些实在的参考。2. 核心设计思路为什么是“上下文引擎”而非“SQL生成器”在深入技术细节前我们必须先厘清一个关键概念Wren Engine定位为“上下文引擎”这与市面上众多的“Text-to-SQL”工具有着本质区别。理解这一点是评估它是否适合你场景的前提。2.1 从“连接与生成”到“理解与规划”传统的Text-to-SQL工具或简单的数据库MCP服务器其工作流可以概括为自然语言问题 - 理解表结构 - 生成SQL - 执行并返回结果。这个链条存在几个脆弱环节语义歧义“收入”可能指gross_revenue毛收入、net_revenue净收入或recognized_revenue确认收入。没有业务定义AI只能猜测。关联复杂性回答“每个销售人员的成交金额”需要关联employees、orders、customers表。AI可能漏掉关键的连接条件如dept_id或使用错误的关联类型INNER JOIN vs LEFT JOIN。口径不一致财务部的“客户数”可能去重了市场部的可能没去重。AI在不同对话中可能给出矛盾的结果。安全与治理缺失AI生成的SQL可能无意中访问了敏感数据列或绕过了行级安全策略。Wren Engine引入的“上下文层”正是在生成SQL之前增加了一个业务语义解析与查询规划的阶段。它的工作流变成了自然语言问题 - 匹配业务模型中的概念如“净收入”指标 - 根据预定义的模型、关联和规则生成逻辑计划 - 优化并转换为针对底层数据源的可执行SQL。注意这不仅仅是“更好的提示词工程”。它将业务逻辑从易变、冗长的提示词中抽离出来固化到一个可版本化、可测试、可协作的工程化资产即MDL模型中。这意味着当业务逻辑变更时例如“活跃用户”的定义从30天改为7天你只需要更新MDL模型所有接入的AI智能体会自动遵循新逻辑无需逐个修改提示词或重训模型。2.2 核心组件MDL、引擎与MCP服务器Wren Engine的架构清晰地反映了这一设计思路。从官方架构图和高层模块划分我们可以梳理出三个核心部分建模定义语言这是业务知识的载体。它不仅仅定义表Models更重要的是定义业务概念之间的关系Relationships、计算指标Metrics和访问控制Access Rules。例如你可以定义一个Customer模型它源自raw_customers表然后定义一个Order模型并声明它与Customer模型之间存在“一个客户可以有多个订单”的关系。你还可以定义一个名为LTV的指标其表达式为SUM(Order.amount)并限定只有role: finance的用户可以访问。Rust上下文引擎这是大脑。wren-core模块基于Apache DataFusion构建负责加载和解析MDL理解其中的业务语义。当收到一个查询意图例如“查询高价值客户的LTV”引擎会进行语义解析识别出“高价值客户”可能对应Customer模型上某个标签“LTV”是一个已定义的指标。然后它会根据MDL中定义的模型、关系和指标逻辑生成一个优化的、跨数据源的逻辑执行计划。这个计划是“业务逻辑层面”的不绑定具体数据库方言。服务层与连接器这是手脚。ibis-server基于FastAPI和mcp-server提供了与外界交互的接口。ibis-server负责连接具体的数据源通过Ibis框架支持多达十几种数据源将上下文引擎生成的逻辑计划“翻译”成可在目标数据源上执行的SQL如PostgreSQL的SQL、Snowflake的SQL并执行它。mcp-server则专门为AI智能体环境如Claude Desktop提供标准化的MCP协议接口让智能体可以像调用工具一样自然地“询问”Wren Engine业务问题。这种解耦设计带来了灵活性你可以单独使用wren-core作为库嵌入自己的应用也可以通过ibis-server构建一个集中的语义查询服务或者通过mcp-server让你日常使用的代码助手瞬间获得业务数据查询能力。3. 核心细节解析MDL建模与查询规划实战理解了宏观设计我们深入到实操层面。Wren Engine的威力能否发挥很大程度上取决于你如何运用MDL来为你的业务数据建模。这部分我会结合常见业务场景拆解MDL的核心概念和建模要点。3.1 解剖一个MDL模型文件MDL文件通常以.yml或.yaml格式定义。我们以一个简化的电商业务为例创建一个jaffle_shop的模型。# wrenai.yml - 项目配置文件 version: 1 name: jaffle_shop models: - path: models/customers.yml - path: models/orders.yml - path: models/relationships.yml# models/customers.yml model: customers table: raw_customers description: 所有注册客户的主表 columns: - name: customer_id type: varchar description: 客户唯一标识符 primary_key: true - name: first_name type: varchar - name: last_name type: varchar - name: signup_date type: date description: 客户注册日期 - name: customer_tier type: varchar description: 客户等级 (standard, premium, vip)# models/orders.yml model: orders table: raw_orders description: 所有订单记录 columns: - name: order_id type: varchar primary_key: true - name: customer_id type: varchar description: 关联到customers.customer_id - name: order_date type: date - name: status type: varchar description: 订单状态 (placed, shipped, completed, returned) - name: amount type: decimal(10,2) description: 订单金额美元 metrics: - name: total_sales description: 所有已完成订单的总销售额 expression: SUM(amount) filter: status completed - name: average_order_value description: 平均订单价值 expression: total_sales / COUNT(DISTINCT order_id) filter: status completed# models/relationships.yml relationships: - name: customer_orders description: 一个客户可以有多个订单 from: customers to: orders join_type: one_to_many condition: customers.customer_id orders.customer_id要点解析与实操心得modelvstable这是MDL的精髓。model是业务概念如“客户”table是物理存储如raw_customers。这种分离允许你未来更换底层数据表而无需修改业务查询逻辑。description字段不要小看它。清晰的描述不仅有助于人工阅读未来也可能被AI用于理解字段含义。务必用业务语言填写。metrics定义指标是重头戏。注意total_sales的定义它包含了filter: status completed。这意味着任何通过Wren Engine查询“总销售额”的AI都会自动过滤掉已退货或未完成的订单确保口径统一。这是避免AI“瞎猜”的关键。relationships定义明确定义关联关系是解决“连接猜测”问题的法宝。join_type: one_to_many告诉引擎从customers到orders是一对多关系。当AI查询“客户及其订单”时引擎会自动使用正确的LEFT JOIN或INNER JOIN逻辑。踩坑提醒在定义关系时确保condition中的字段名完全正确包括大小写。初期最容易出现的错误就是关系定义无效导致查询时无法自动关联。建议先在数据库客户端手动验证一下关联条件是否能查出正确数据。3.2 查询如何被“理解”与“重写”假设一个AI智能体通过MCP服务器向Wren Engine提问“VIP客户的平均订单价值是多少”意图解析Wren Engine首先会解析这个问题。它会识别出两个关键业务概念“VIP客户”可能对应customers.customer_tier vip和“平均订单价值”对应orders模型上定义的average_order_value指标。模型匹配与关联引擎知道average_order_value指标属于orders模型。要计算某个客户群体的该指标需要先筛选客户再关联其订单。根据relationships.yml中定义的customer_orders关系引擎知道如何将customers和orders关联起来。生成逻辑计划引擎会生成一个逻辑计划大致等价于以下业务逻辑“从customers模型中筛选出customer_tier为‘vip’的记录通过customer_id关联到orders模型然后计算关联后订单集的average_order_value指标。”SQL生成与优化ibis-server拿到这个逻辑计划结合连接的是PostgreSQL这一信息将其翻译成优化的SQL。这个SQL会直接包含WHERE customers.customer_tier vip以及正确的JOIN语句和指标计算表达式SUM(amount) / COUNT(DISTINCT order_id)并自动加上status completed的过滤条件。整个过程AI智能体无需知道底层有哪些表、如何关联、指标如何计算。它只需要提出业务问题Wren Engine负责将问题“落地”成准确、高效、安全的查询。这极大地降低了智能体出错的概率也减少了对提示词中详细灌输业务知识的依赖。4. 实操过程从零搭建一个可用的Wren Engine服务理论说得再多不如动手跑一遍。这里我将带你完成一个最小化的本地部署用示例数据jaffle_shop来体验Wren Engine与Claude Code的集成。4.1 环境准备与依赖安装Wren Engine的组件主要用Rust和Python编写。你需要准备以下环境Rust工具链用于编译核心引擎。# 安装Rust (如果尚未安装) curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env rustc --version # 确认安装成功Python 3.9和uvuv是一个快速的Python包管理器和安装器Wren项目推荐使用它。# 安装uv (以macOS/Linux为例) curl -LsSf https://astral.sh/uv/install.sh | sh source $HOME/.local/bin/uv uv --versionDocker (可选但推荐)为了快速启动一个PostgreSQL数据库来承载jaffle_shop示例数据。docker --version4.2 启动Wren Engine服务栈官方提供了docker-compose方式来一键启动所有服务这对于初次体验非常友好。克隆仓库并进入目录git clone https://github.com/Canner/wren-engine.git cd wren-engine使用Docker Compose启动docker-compose up -d这个命令会启动几个容器postgres包含jaffle_shop示例数据的数据库。wren-ui一个本地Web界面用于连接数据源和配置MDL。ibis-server查询执行服务器。mcp-serverMCP协议服务器供AI客户端连接。验证服务打开浏览器访问http://localhost:3000你应该能看到Wren Engine的UI。在UI中你应该能看到一个预配置好的jaffle_shop项目其数据源已经指向了本地启动的PostgreSQL容器。实操心得第一次启动时由于需要构建Rust部分和下载Python依赖可能会花费几分钟。如果docker-compose up过程中出现网络问题导致依赖下载失败可以尝试先单独拉取镜像docker pull ghcr.io/canner/wren-ai:latest。另外确保你的本地端口3000、8080等没有被其他应用占用。4.3 在Claude Code中配置MCP服务器这是让AI智能体获得“超能力”的关键一步。我们以Claude Code或Cursor为例这些IDE通常支持MCP协议。获取MCP服务器配置Wren Engine的mcp-server启动后会暴露一个SSEServer-Sent Events端点。在Docker Compose部署下其地址通常是http://localhost:8080/mcp/sse。配置Claude Code在Claude Code中打开设置Settings。找到“MCP Servers”或“AI工具配置”相关部分。添加一个新的MCP服务器配置类型选择SSEURL填入http://localhost:8080/mcp/sse。给它起个名字比如Wren Engine (Local)。保存并重启Claude Code的AI功能或相关插件。验证连接重启后在Claude Code的聊天框或AI指令界面你应该能看到新增加的工具Tools。通常会被命名为类似“query_wren”或“ask_data”的工具。你可以尝试问一个简单的问题比如“我们有多少客户” 如果配置成功AI会调用Wren Engine的工具并返回类似“根据客户模型当前共有XX位客户”的结果而不是自己去瞎编一个SQL。至此你已经拥有了一个具备业务数据查询能力的AI编程助手。你可以尝试更复杂的问题如“上个月销售额最高的产品是什么”或“计算一下各客户等级的复购率”。观察AI是如何利用Wren Engine提供的上下文来回答的并与直接让AI写SQL进行对比体会其中的差异。5. 深入引擎内部架构设计与扩展实践对于想要二次开发或深度集成的开发者理解Wren Engine的内部架构和扩展点至关重要。这部分我们深入代码层面看看它的核心模块是如何协作的以及如何为它添加新的数据源。5.1 核心模块协作流程回顾一下官方仓库的模块结构结合代码我们可以梳理出一次查询请求的完整旅程请求入口AI智能体通过MCP协议向mcp-server发送一个自然语言请求例如“query: 显示VIP客户的姓名和总消费金额”。意图转换mcp-server接收请求将其转换为Wren Engine内部可理解的查询格式。它可能会调用底层的wren-core-pyPython绑定来与Rust引擎交互。语义解析与计划生成wren-coreRust加载当前项目的MDL文件。它解析查询请求识别出“VIP客户”对应customers模型的过滤条件“总消费金额”可能是一个需要实时计算的表达式SUM(orders.amount)。引擎利用MDL中定义的模型、列、关系和指标构建一个初始的逻辑查询计划。优化基于Apache DataFusion引擎对逻辑计划进行优化包括谓词下推、常量折叠、公共子表达式消除等。例如它将“VIP客户”的过滤条件尽可能下推到数据源层面去执行。计划分发优化后的逻辑计划被传递给ibis-server。SQL生成与执行ibis-server根据配置的数据源类型如PostgreSQL利用Ibis框架将逻辑计划编译成该数据源方言的SQL语句。然后它通过对应的连接器执行这个SQL。结果返回查询结果被ibis-server获取经由mcp-server封装后按照MCP协议的格式返回给AI智能体。关键设计洞察wren-coreRust专注于业务语义和逻辑计划与具体的数据源解耦。ibis-serverPython Ibis专注于物理执行和方言适配。这种分离使得增加对新数据源的支持变得相对清晰主要工作在ibis-server的连接器部分。5.2 如何添加一个新的数据源连接器假设公司使用了一个Wren Engine尚未官方支持的数据源例如TiDB我们需要为其添加支持。主要工作集中在ibis-server模块。检查Ibis支持首先确认Ibis框架是否已经支持该数据源。Ibis支持的后端列表可以在其文档找到。如果已支持那么工作会简单很多。在ibis-server中创建连接配置在ibis-server的代码中找到处理数据源连接配置的部分。你需要添加对新数据源类型的识别逻辑并编写一个函数来根据配置参数如host, port, username, password, database创建Ibis后端连接。# 伪代码示例在某个config或client模块中 if datasource_type “tidb”: import ibis # 假设Ibis通过ibis.connect支持TiDB且使用mysql协议 backend ibis.mysql.connect( hostconfig.host, portconfig.port, userconfig.username, passwordconfig.password, databaseconfig.database, ) return backend注册方言与SQL编译规则Ibis通常已经为各种后端内置了SQL编译能力。你需要确保在生成SQL时选择了正确的“方言”。这可能需要在查询编译环节传入特定的dialect参数。测试编写集成测试使用一个测试用的TiDB实例验证从MDL建模到查询执行的完整链路是否畅通。重点测试数据类型映射、函数兼容性以及特定SQL语法的生成是否正确。扩展性思考Wren Engine通过Ibis抽象了物理执行这是一个明智的选择。Ibis本身就像一个“数据帧的SQL编译器”支持众多后端。这意味着Wren Engine的跨数据源能力很大程度上继承了Ibis的广度。对于社区开发者而言为Wren Engine添加一个新数据源主要任务就是“桥接”该数据源与Ibis如果Ibis已支持则工作量较小。5.3 性能考量与调优思路当业务模型变得复杂或者数据量巨大时性能会成为关注点。Wren Engine的性能瓶颈可能出现在几个地方MDL加载与解析对于超大型的MDL成千上万个模型、关系每次启动或重载时解析YAML文件可能耗时。优化思路考虑将编译后的MDL缓存为某种二进制格式如protobuf或实现增量更新机制。查询规划时间非常复杂的嵌套查询、多层关联和指标计算可能会使逻辑计划生成和优化阶段变慢。优化思路wren-core基于DataFusion其优化器已经相当强大。可以关注DataFusion的版本更新并审视MDL设计避免过度复杂的环形依赖或递归关系。SQL生成与执行这是最常见的瓶颈点取决于底层数据源的性能和生成的SQL质量。优化思路利用物化视图对于计算成本很高、被频繁使用的关键指标如月销售总额可以在数据源层预先定义为物化视图然后在MDL中将模型指向这个视图而不是原始大表。索引优化确保MDL中定义的主键、外键关系在底层数据库表上有对应的索引。Wren Engine生成的JOIN条件会利用这些键。查询下推观察Wren Engine生成的最终SQL确保过滤条件WHERE和聚合GROUP BY被正确地“下推”到了数据源执行而不是在内存中处理。这取决于Ibis后端编译器的能力通常都做得很好。监控建议在生产环境部署时务必为ibis-server和底层数据库添加详细的查询日志和性能监控。记录每个查询的生成时间、执行时间、返回行数这有助于定位是引擎规划慢还是数据源执行慢。6. 常见问题与排查技巧实录在实际部署和集成Wren Engine的过程中你肯定会遇到各种问题。下面我整理了一些典型问题及其排查思路希望能帮你节省时间。6.1 连接与配置问题问题1Docker Compose启动后UI无法访问或提示后端连接失败。排查步骤检查容器状态运行docker-compose ps确认所有容器postgres,wren-ui,ibis-server,mcp-server的状态都是“Up”。查看日志运行docker-compose logs ibis-server和docker-compose logs mcp-server查看是否有明显的错误信息如数据库连接失败、端口冲突等。检查网络确保容器在同一个Docker网络中。默认的docker-compose.yml会创建一个共享网络。验证API端点尝试直接调用ibis-server的APIcurl http://localhost:8080/health。应该返回一个健康状态。如果失败可能是ibis-server启动异常。常见原因端口占用本地3000、8080、5432等端口已被其他应用占用。修改docker-compose.yml中的端口映射。镜像拉取失败网络问题导致镜像拉取不完整。尝试docker-compose down -v然后docker-compose pull再重新up。环境变量配置错误检查docker-compose.yml或.env文件中关于数据库连接字符串的配置是否正确。问题2在Claude Code中配置了MCP服务器但AI不调用或提示工具不可用。排查步骤确认MCP服务器运行curl http://localhost:8080/mcp/sse。你应该看到持续的SSE流数据头信息。如果连接被立即关闭或有错误说明mcp-server未正常运行。检查Claude Code配置确保MCP服务器URL完全正确特别是/mcp/sse路径。某些客户端可能需要配置http://host:port/mcp/sse。查看客户端日志Claude Code或Cursor通常有开发者工具或日志窗口查看其中是否有关于MCP连接的错误信息。重启AI会话在IDE中有时需要重启AI聊天会话或重新加载插件新的MCP工具才会出现。6.2 建模与查询问题问题3定义了模型和关系但AI查询时提示“找不到模型‘XXX’”或关联失败。排查步骤检查MDL语法YAML文件对缩进非常敏感。使用在线YAML校验器或yamllint检查你的MDL文件。验证模型加载通过Wren UI或ibis-server的元数据接口如GET /v1/mdl查看当前加载的模型列表确认你的模型是否在其中。检查关系定义仔细核对relationships中的from、to模型名称是否与model定义完全一致包括大小写。检查condition中的字段名是否存在于对应模型的columns中。重新部署MDL修改MDL后可能需要重启服务或通过API触发重新加载。在Wren UI中通常有“部署”或“刷新”按钮。问题4查询结果不正确比如指标计算错误或关联出了多余/丢失的数据。排查步骤“透视”生成的SQL这是最有效的调试手段。在ibis-server的日志中设置日志级别为DEBUG或INFO找到针对该查询生成的最终SQL语句。将其复制到你的数据库客户端中直接执行验证结果。分解问题指标错误检查指标expression和filter。手动用SQL实现这个表达式看结果是否匹配。关联错误检查关系定义中的join_type和condition。生成的SQL是LEFT JOIN还是INNER JOIN条件是否准确尝试在数据库客户端手动执行这个JOIN。检查数据源权限确认Wren Engine连接数据库的用户有权限访问相关的表和视图。6.3 性能问题问题5简单的查询响应也很慢。排查步骤区分阶段耗时通过日志或添加监控确定时间是花在“引擎规划”还是“SQL执行”上。如果是规划慢可能是MDL过于复杂。尝试简化模型或检查是否有循环依赖。如果是执行慢分析生成的SQL。使用数据库的EXPLAIN或EXPLAIN ANALYZE命令查看执行计划检查是否缺少索引、是否进行了全表扫描。优化底层数据库表结构或索引。问题6并发查询时服务不稳定或内存溢出。排查思路资源限制检查Docker容器的内存和CPU限制。wren-core是Rust编译的通常内存效率很高但ibis-serverPython在处理大量并发或大数据集结果时可能占用较多内存。考虑调整容器资源限制。连接池确保ibis-server到数据库的连接使用了连接池并且池大小配置合理。查询超时与取消实现查询超时机制避免一个慢查询拖垮整个服务。Wren Engine的API或部署网关应支持设置超时。将Wren Engine集成到生产环境远不止是技术部署。它涉及到如何与现有的数据治理流程、CI/CD管道以及团队协作方式相结合。你需要考虑MDL模型的版本管理、不同环境开发、测试、生产的配置管理、以及如何让数据分析师和业务人员参与到模型的定义和维护中来。这更像是一个“数据即产品”的团队实践而Wren Engine提供了一个强有力的技术基座。从我实际测试和研究的感受来看它的理念非常前沿直击了当前AI应用在数据领域的痛点。虽然作为一个开源项目它在企业级特性如高可用、多租户、审计日志上还有待完善但其清晰的架构和活跃的社区使其成为构建下一代智能数据应用时一个非常值得关注和投入的技术选项。

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