EvaDB:用SQL直接调用AI模型,实现数据库与AI的无缝集成

news2026/4/29 13:29:29
1. 项目概述当数据库遇上AIEvaDB想解决什么如果你在过去几年里尝试过将AI模型特别是那些大型语言模型或者复杂的计算机视觉模型集成到你的数据应用里那你大概率体会过那种“拧螺丝”的繁琐和“造轮子”的重复劳动。数据在数据库里模型在另一个框架里你需要写一堆胶水代码去连接它们处理格式转换管理推理批次还得操心性能优化。整个过程就像是在两个说着不同语言的国家之间做贸易你得自己当翻译、报关员和物流经理。EvaDB的出现就是为了解决这个核心痛点。简单来说EvaDB是一个AI原生AI-Native的数据库系统。它的目标不是替代你的PostgreSQL、MySQL或者数据仓库而是作为一个智能层Intelligence Layer架设在它们之上。它让你能够像查询普通数据一样用SQL去直接“查询”AI模型。这个“查询”的对象可以是存储在数据库里的一张图片、一段文本甚至是一段视频流。想象一下你有一个存放了百万张产品图片的数据库。传统方式下如果你想找出所有“红色且带有Logo”的图片你需要1把图片数据批量导出2写一个Python脚本调用某个图像识别模型3处理模型输出再把结果写回数据库。而在EvaDB里你只需要写一句类似SELECT id FROM product_images WHERE ColorDetector(data) ‘red’ AND LogoDetector(data) True;的SQL。EvaDB会帮你处理所有底层调用、数据流转和优化。这个项目来自佐治亚理工学院的数据库实验室名字“Eva”寓意着“易于使用的视觉应用Easy Visual Applications”但它的野心早已超越了视觉领域扩展到了多模态AI。它本质上是一个将AI模型函数化、并集成到SQL查询引擎中的执行平台。对于数据分析师、应用开发者甚至是不想深入AI底层的研究者来说EvaDB极大地降低了AI应用的门槛让“用SQL调用AI”从愿景变成了可实操的工程现实。2. 核心架构解析EvaDB如何让SQL“理解”AI要理解EvaDB的魔力我们不能只看表面那几句酷炫的SQL得深入其架构看看它是如何弥合关系型世界与AI模型世界之间的鸿沟的。这背后是一套精心设计的、数据库领域与AI系统领域交叉的工程思想。2.1 核心设计哲学模型即函数Model-as-Function这是EvaDB最根本的抽象。在传统数据库中函数UDF处理的是数值、字符串等标量或聚合数据。EvaDB将这一概念扩展把任何一个AI模型无论是PyTorch、TensorFlow、Hugging Face上的还是自定义的都封装成一个可以在SQL的WHERE、SELECT子句中调用的函数。这个抽象带来了几个关键优势声明式编程开发者只需关心“做什么”用哪个模型处理什么数据得到什么结果而不用操心“怎么做”数据如何加载到模型、批次如何组织、结果如何解析。这极大地提升了开发效率。无缝集成AI查询可以与传统的关系代数操作过滤、连接、分组、排序自由组合。你可以先用人脸检测模型过滤出包含人脸的图片再用情绪识别模型分析这些图片中人的情绪最后按情绪分组计数整个过程在一个SQL语句中完成。优化空间一旦模型被抽象为函数数据库经典的查询优化技术就有了用武之地。EvaDB的优化器可以考虑模型调用的成本、数据的分布来重排谓词先过滤再调用昂贵的模型、决定下推策略等。2.2 系统组件深度拆解EvaDB的架构可以清晰地分为五层从上到下依次为第一层SQL前端与解析器这一层负责接收用户输入的“增强版”SQL。EvaDB扩展了SQL语法主要是引入了CREATE FUNCTION语句来链接AI模型。例如CREATE FUNCTION IF NOT EXISTS SentimentAnalyzer TYPE HuggingFace TASK text-classification MODEL distilbert-base-uncased-finetuned-sst-2-english;这条语句并没有真正“创建”一个函数而是在EvaDB的系统目录中注册了一个模型函数指明了其类型来自HuggingFace、任务文本分类和具体模型路径。解析器会将这些扩展语法转化为内部的抽象语法树AST。注意这里的TYPE非常关键。EvaDB通过不同的TYPE如HuggingFace,TorchScript,TensorFlow,Ludwig,XGBoost等来适配不同的模型框架和部署后端。这要求开发者在注册时明确知晓模型的来源和格式。第二层查询优化器与计划器这是EvaDB的“大脑”也是其技术含量的核心。传统数据库优化器主要针对磁盘I/O和CPU计算进行优化而EvaDB的优化器必须额外考虑一个全新的维度模型推理成本。模型推理通常计算密集且耗时可能比数据扫描本身还要昂贵。优化器会进行一系列改写谓词下推与重排序如果一个查询既有基于传统索引的过滤如timestamp ‘2023-01-01’又有基于模型的过滤如FaceDetector(img) True优化器会评估选择性Selectivity和成本。如果时间过滤能筛掉90%的数据它就会被优先执行避免对大量无关数据调用昂贵的模型。批处理优化这是针对AI推理的关键优化。如果查询需要对多行数据调用同一个模型优化器会尝试将多个调用合并成一个批次Batch一次性送入模型。这能极大利用GPU/加速器的并行计算能力减少模型加载和调用的开销。优化器需要决定最佳的批次大小Batch Size权衡内存占用与吞吐量。函数缓存对于确定性模型相同输入总是产生相同输出优化器可以引入结果缓存。对于被频繁查询的相同或相似数据例如热门商品的图片可以缓存模型输出避免重复计算。第三层执行引擎优化器产生物理执行计划后由执行引擎负责落实。这是EvaDB的“四肢”。它的核心挑战在于异构计算数据可能来自磁盘或网络数据库而模型可能在GPU内存中。执行引擎需要高效地在CPU和GPU或其他AI加速器之间搬运数据并管理计算任务。它包含几个关键模块数据加载器负责从底层数据库通过连接器或本地文件中读取数据并将其转换为模型所需的张量Tensor格式。例如从数据库读出的BLOB图片数据需要被解码为RGB像素数组并归一化到模型要求的尺寸和数值范围。模型运行时这是一个插件化的系统。根据CREATE FUNCTION时指定的TYPEEvaDB会调用相应的后端来加载和运行模型。例如对于HuggingFace模型它会利用transformers库对于ONNX模型它会使用ONNX Runtime。这个设计使得EvaDB能够支持几乎无限的模型生态。批处理调度器接收来自优化器的批次指令将多个数据样本组织成张量调用模型运行时进行批量推理然后再将批量结果拆分为单行输出映射回原始的数据行。第四层存储与模型管理EvaDB本身通常不作为主数据存储而是通过连接器Connectors与现有数据库PostgreSQL, MySQL, SQLite, Snowflake等或数据湖如通过S3、GCS连接协同工作。它维护着自己的系统目录Catalog用于存储注册的模型函数元数据、用户定义的函数UDF以及缓存策略等。模型文件本身可以存储在本地文件系统也可以远程存储如从HuggingFace Hub直接下载。EvaDB的模型管理会处理模型的版本、缓存和预热。例如可以预加载常用模型到GPU内存以减少第一次查询的延迟。第五层底层数据库与AI框架这是EvaDB所构建的基础设施层。它依赖成熟的数据库系统提供可靠的数据存储和事务能力依赖强大的AI框架PyTorch, TensorFlow, Hugging Face Transformers提供模型执行能力。EvaDB的价值在于在二者之上构建了一个统一、高效、易用的交互层而不是重复发明轮子。3. 从零开始一个完整的EvaDB应用实战理论说得再多不如亲手跑一遍。我们以一个贴近实际业务的场景为例构建一个电商评论智能分析系统。假设我们有一个PostgreSQL数据库其中product_reviews表存储了用户评论包含review_id,product_id,review_text,review_date等字段。我们的目标是自动分析每条评论的情感倾向正面/负面并提取评论中提到的产品特征如“电池续航”、“屏幕亮度”、“手感”。3.1 环境搭建与基础配置首先通过pip安装EvaDB。建议使用Python虚拟环境。pip install evadb安装完成后启动EvaDB的客户端。它会自动启动一个后台服务器进程并连接。import evadb # 这会初始化EvaDB的配置和目录 cursor evadb.connect().cursor()接下来我们需要连接到底层的关系型数据库。这里以PostgreSQL为例确保已安装psycopg2驱动。CREATE DATABASE postgres_data WITH ENGINE ‘postgres’, PARAMETERS { “user”: “your_username”, “password”: “your_password”, “host”: “localhost”, “port”: “5432”, “database”: “your_database” };这条命令在EvaDB内创建了一个指向外部PostgreSQL数据库的“数据源”。EvaDB通过这个连接器来读取数据而数据的所有权和事务一致性仍由PostgreSQL保障。实操心得在生产环境中密码等敏感信息建议通过环境变量传入而不是硬编码在SQL中。EvaDB的连接器支持从环境变量读取例如“password”: “${PG_PASSWORD}”。3.2 注册AI模型函数现在我们来注册两个AI模型函数。第一个函数情感分析模型。我们使用Hugging Face上一个轻量级且效果不错的模型distilbert-base-uncased-finetuned-sst-2-english。CREATE FUNCTION IF NOT EXISTS SentimentAnalyzer TYPE HuggingFace TASK ‘text-classification’ MODEL ‘distilbert-base-uncased-finetuned-sst-2-english’;执行此语句后EvaDB会从Hugging Face Hub下载该模型如果本地没有缓存并将其注册为一个名为SentimentAnalyzer的SQL函数。该函数接收一个文本参数返回一个包含标签如POSITIVE,NEGATIVE和置信度的复杂类型。第二个函数特征提取模型。这是一个更定制化的任务。我们可以使用基于Transformer的序列标注模型或者更简单点用一个零样本分类Zero-Shot模型。这里我们使用facebook/bart-large-mnli它可以通过指定候选标签来进行零样本分类。CREATE FUNCTION IF NOT EXISTS FeatureExtractor TYPE HuggingFace TASK ‘zero-shot-classification’ MODEL ‘facebook/bart-large-mnli’;注意事项模型首次加载可能需要较长时间取决于模型大小和网络。EvaDB会缓存加载的模型。对于生产环境可以考虑预先将模型下载到本地路径然后在MODEL参数中指定本地路径以提升冷启动速度并保证稳定性。3.3 编写并执行AI增强的SQL查询数据源和模型都就绪后我们就可以编写真正的“AI-SQL”了。查询1分析所有评论的情感分布。SELECT product_id, SentimentAnalyzer(review_text).label AS sentiment, COUNT(*) AS count FROM postgres_data.product_reviews GROUP BY product_id, sentiment ORDER BY product_id, count DESC;这个查询展示了EvaDB的核心能力。SentimentAnalyzer(review_text)像一个普通SQL函数一样被调用作用于每一行的review_text字段。其返回结果是一个结构体我们用.label提取出情感标签。之后传统的GROUP BY和ORDER BY照常工作。EvaDB会在底层自动进行批处理将成千上万条评论的文本批量送入模型效率远高于逐条调用。查询2找出针对“电池续航”的负面评论。这个查询更复杂需要结合两个模型并进行嵌套调用。SELECT review_id, product_id, review_text, SentimentAnalyzer(review_text).label AS sentiment, FeatureExtractor( review_text, candidate_labels[‘battery life’, ‘screen’, ‘camera’, ‘performance’, ‘price’] ).labels[0] AS top_feature -- 提取最相关的特征 FROM postgres_data.product_reviews WHERE SentimentAnalyzer(review_text).label ‘NEGATIVE’ AND FeatureExtractor( review_text, candidate_labels[‘battery life’, ‘screen’, ‘camera’, ‘performance’, ‘price’] ).labels[0] ‘battery life’ LIMIT 10;这里我们在WHERE子句中直接使用模型函数进行过滤。EvaDB的优化器会识别出SentimentAnalyzer被调用了两次SELECT和WHERE中理论上可以重用中间结果避免重复计算。这是一个重要的优化点。3.4 性能调优与高级用法直接使用上述查询在数据量很大时可能会比较慢。我们可以利用EvaDB的一些高级特性进行优化。1. 创建索引加速过滤虽然不能对模型输出直接创建B-Tree索引但我们可以利用EvaDB的函数结果缓存来加速重复查询。更根本的方法是将模型推理结果物化Materialize到数据库表中然后在该表上创建索引。-- 步骤1创建一个表存储情感分析结果 CREATE TABLE review_sentiments AS SELECT review_id, SentimentAnalyzer(review_text).label AS sentiment, SentimentAnalyzer(review_text).score AS confidence FROM postgres_data.product_reviews; -- 步骤2在物化表上创建索引 CREATE INDEX idx_sentiment ON review_sentiments (sentiment); -- 步骤3后续查询直接连接物化表速度极快 SELECT * FROM postgres_data.product_reviews r JOIN review_sentiments s ON r.review_id s.review_id WHERE s.sentiment ‘NEGATIVE’;这实际上是一种“空间换时间”的策略适用于分析结果相对稳定评论不会频繁变化、且查询模式固定的场景。2. 使用更高效的模型或后端在CREATE FUNCTION时我们可以选择不同的后端。例如如果模型支持ONNX格式使用ONNX Runtime通常能获得比原生PyTorch更优的推理性能尤其是在CPU上。CREATE FUNCTION FastSentimentAnalyzer TYPE ONNX MODEL ‘path/to/sentiment_model.onnx’;此外对于超大规模数据集可以探索将EvaDB与Ray等分布式计算框架结合将模型推理任务分发到集群上执行。4. 深入原理查询优化与执行引擎如何工作要真正用好EvaDB理解其内部优化和执行机制至关重要。这能帮助你在编写查询时做出更优的设计并能在出现性能问题时进行有效排查。4.1 查询优化器的决策过程当我们执行SELECT ... WHERE SentimentAnalyzer(text) ‘NEGATIVE’ AND create_date ‘2023-01-01’;时优化器会构建一个逻辑计划树。初始计划可能是Filter (SentimentAnalyzer(text)‘NEGATIVE’ AND create_date‘2023-01-01’) Scan (product_reviews)一个朴素的执行方式是全表扫描对每一行先计算模型函数再进行日期过滤。这显然效率低下。EvaDB的优化器会尝试应用以下规则谓词下推重排序优化器会从数据库连接器获取create_date列的统计信息最小值、最大值、直方图估算create_date ‘2023-01-01’这个过滤条件的选择性能过滤掉多少数据。同时它也会有一个关于SentimentAnalyzer函数的成本模型。这个成本模型可能基于模型的复杂度、输入数据的平均大小、以及历史执行的 profiling 数据估算出单次模型调用的CPU/GPU时间和内存开销。 比较两个谓词的选择性和成本后优化器可能会将计划重写为Filter (SentimentAnalyzer(text)‘NEGATIVE’) Filter (create_date ‘2023-01-01’) Scan (product_reviews)即先进行快速的、基于索引的日期过滤再对剩下的少量数据调用昂贵的模型。如果日期过滤能去掉95%的数据那么模型调用次数就减少了95%。批处理优化对于Filter (SentimentAnalyzer(text)‘NEGATIVE’)这个操作优化器不会逐行调用模型。它会将其转换为一个“批处理函数调用”算子。这个算子会收集所有需要通过SentimentAnalyzer函数处理的行组成一个批次比如128条一次性调用模型得到一个结果数组再与原始行进行匹配。批次大小的选择是一个权衡太大会导致内存压力和高延迟太小则无法充分利用GPU并行性。EvaDB可能会根据可用内存和模型特性动态调整。4.2 执行引擎的异构计算调度物理计划生成后执行引擎开始工作。假设我们的数据在PostgreSQL中模型在GPU上。数据获取阶段执行引擎通过PostgreSQL连接器执行SELECT review_id, text, create_date FROM product_reviews WHERE create_date ‘2023-01-01’。数据以行的形式从网络流入EvaDB进程的内存。数据转换阶段text列需要被预处理成模型接受的格式如tokenization。这个阶段在CPU上进行。转换后的数据一个字符串列表被放入一个缓冲区。批处理形成阶段当缓冲区中的数据达到预设的批次大小或所有数据都已就绪时执行引擎将这批数据例如128个tokenized的文本组装成一个张量Tensor。设备间传输这个张量从CPU内存被复制到GPU内存如果模型在GPU上。模型推理GPU上的模型运行时如PyTorch执行前向传播产生输出张量包含128个结果的标签和分数。结果回传与处理输出张量从GPU复制回CPU内存被解码成SQL可理解的类型如字符串‘NEGATIVE’和浮点数0.92。执行引擎根据这些结果进行过滤只保留标签为‘NEGATIVE’的行。结果返回最终结果集返回给客户端。整个过程中数据在CPU和GPU之间的搬运步骤4和6往往是隐藏的性能瓶颈特别是当数据量很大时。EvaDB的执行引擎会尝试通过流水线Pipeline来重叠数据传输和计算以掩盖部分延迟。5. 生产环境部署、监控与常见问题排查将EvaDB用于原型验证很简单但要部署到生产环境服务真实流量就需要考虑更多工程因素。5.1 部署架构考量典型的EvaDB生产部署不是单机运行一个Python脚本而是一个客户端-服务器架构。EvaDB服务器作为一个常驻服务运行负责管理模型加载、查询优化和执行。它应该部署在有GPU的机器上如果需要GPU推理。应用服务器你的业务应用如Web后端通过EvaDB的客户端API通常是gRPC或HTTP向EvaDB服务器发送SQL查询。共享存储模型文件应该存放在所有EvaDB服务器实例都能访问的共享存储如NFS、S3或模型仓库中以保证一致性。连接池EvaDB服务器与底层数据库如PostgreSQL之间应使用连接池以管理数据库连接避免频繁建立连接的开销。5.2 关键监控指标为了保障服务稳定你需要监控以下核心指标指标类别具体指标说明与告警阈值资源使用GPU利用率、GPU内存使用率持续高于80%可能需要扩容或优化批次大小。CPU利用率、系统内存使用率监控EvaDB进程本身及数据预处理阶段的资源消耗。查询性能查询延迟P50, P95, P99关注长尾延迟识别慢查询。每秒查询数QPS衡量服务吞吐能力。模型推理批次大小分布观察优化器选择的批次大小是否合理。服务健康EvaDB服务进程存活状态最基本的健康检查。模型加载错误率监控模型下载、反序列化是否失败。底层数据库连接健康度连接池状态、查询超时率。5.3 常见问题与排查手册在实际使用中你可能会遇到以下典型问题问题1查询速度慢GPU利用率却很低。可能原因A数据搬运瓶颈。大量时间花在了从数据库读取数据、CPU预处理、CPU与GPU间拷贝数据上而GPU计算时间很短。排查使用性能分析工具如PyTorch Profiler, NVIDIA Nsight Systems分析查询执行的时间线查看cudaMemcpy数据拷贝操作占比。解决尝试增大批次大小让GPU每次计算更“饱满”考虑使用数据库连接器直接输出预处理后的张量格式如果支持或者使用更快的存储/网络。可能原因B查询优化不佳。昂贵的模型谓词被先执行了。排查使用EXPLAIN命令查看EvaDB生成的执行计划。EXPLAIN ANALYZE可以显示实际执行的成本。解决确保对传统列如时间戳有索引并尝试调整查询条件顺序或使用子查询先进行传统过滤。问题2内存不足OOM错误。可能原因A批次大小过大。一次性加载太多数据到GPU内存。解决在EvaDB配置中调低默认批次大小batch_size。也可以在注册函数时通过参数提示优化器。可能原因B模型本身过大。加载多个大模型同时服务。解决采用模型卸载策略将不常用的模型从GPU内存换出到CPU内存或磁盘。EvaDB的模型管理功能可以辅助这一点。或者垂直扩容GPU内存。问题3模型函数返回结果格式不符合预期。可能原因模型返回的是复杂结构如字典、列表而SQL期望标量值。排查先单独测试模型函数SELECT SentimentAnalyzer(‘sample text’);查看其完整返回结构。解决在SQL中使用点号.或数组下标[ ]来提取所需字段。例如SentimentAnalyzer(text).label或FeatureExtractor(text).labels[0]。确保你了解所使用模型在指定任务下的输出规范。问题4连接到远程数据库超时。可能原因网络延迟或底层数据库负载过高。解决增加EvaDB连接器的超时设置优化底层数据库的查询性能为目标表添加索引考虑在EvaDB和业务数据库之间增加一层缓存如Redis缓存频繁查询的中间结果。EvaDB作为一个活跃的学术开源项目其强大之处在于它提供了一个极具前瞻性的抽象将AI能力无缝地编织进数据处理的流程中。它可能不是所有AI集成问题的银弹比如对于需要极低延迟、超高吞吐的在线推理场景专门的模型服务框架可能更合适。但对于那些需要将AI分析与复杂数据查询紧密结合的场景——例如交互式数据分析、批量数据标注、实时内容审核流水线——EvaDB无疑能显著减少工程复杂度让团队更专注于业务逻辑本身而不是底层集成细节。它的出现标志着“AI赋能数据”正在从一种理念走向工程化的标准实践。

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