Coltt向量数据库:轻量级架构设计与边缘计算实战

news2026/5/3 8:39:03
1. 从零到生产Coltt向量数据库的设计哲学与实战解析最近在折腾一个向量数据库项目叫Coltt。这名字你可能没听过它之前叫NNV今年2月才改的名。我之所以花时间研究它是因为市面上那些大名鼎鼎的向量数据库像Milvus、Weaviate、Qdrant功能确实强大但有时候感觉有点“杀鸡用牛刀”。特别是当你只是想在一个边缘设备上跑个语义搜索或者快速验证一个想法时启动一套完整的分布式系统配置各种依赖光是资源占用和部署复杂度就够喝一壶了。Coltt的定位很明确一个可以从零开始实现并直接用于生产的数据库。它瞄准了边缘计算和小规模生产场景但野心不止于此。通过一套在我看来相当有意思的架构设计它试图证明自己也能在大型生产环境中可靠运行。这听起来有点矛盾一个轻量级的玩意儿还想扛大旗但仔细拆解它的设计思路后我发现这种“矛盾”恰恰是它最有价值的地方。它没有盲目追随RAFT共识算法的潮流而是在数据特性和实际需求之间找到了一条更务实的路径。接下来我就结合自己的实践经验带你深入Coltt的内核看看它是怎么思考又是怎么落地的。2. 架构抉择为什么Coltt没有选择RAFT2.1 共识算法的两难困境在分布式数据库领域RAFT算法几乎是“标配”。我以前做项目也这么选原因很简单经过大量生产验证可靠。RAFT通过选举Leader和日志复制保证了强一致性读可用性高。但它的代价是写可用性降低因为所有写请求都必须经过Leader一旦Leader网络分区或宕机整个集群的写入就会卡住。对于向量数据库我开始重新思考这个问题。向量数据库的典型使用场景是什么大量的批量写入比如离线构建索引和高频读取线上查询。实时写入的压力通常没那么大。那么为了应对未来可能出现的多写需求就一定要上RAFT这种“重武器”吗Coltt的开发者显然也纠结过。他们画了一张图直指RAFT在向量数据库场景下的核心矛盾复杂度高且与向量数据“重读轻写”的特性不完全匹配。构建一个基于RAFT的多主Multi-Leader架构再叠加Gossip协议去做数据同步复杂度会呈指数级上升运维和调试将成为噩梦。注意这里并不是说RAFT不好而是强调技术选型要匹配场景。对于金融交易这类要求强一致、实时写的系统RAFT是基石。但对于向量搜索我们或许可以接受一种更“最终一致”的、写入性能更高的模型。2.2 Coltt的两种核心架构模式Coltt提出了两种架构思路都不是传统的RAFT集群但各有其巧妙之处。2.2.1 负载均衡器与数据库集成模式这是第一种也是我个人认为最直观、最容易上手的一种。它的核心思想是把分片和复制的逻辑从数据库内部抽离出来放到前端的负载均衡器LB里。数据库本身保持“纯净”只负责最核心的向量存储和检索。这种模式又细分为两种子类型副本负载均衡器Replica LB原理LB后面挂载多个完全相同的数据库副本。写入时LB会等待所有副本都成功写入后才向客户端返回成功读取时可以从任意副本读取。优点读性能极佳因为请求可以被分摊到所有副本上。数据一致性高写入成功意味着所有副本都有数据。缺点写延迟高因为要等最慢的那个副本。存储成本也高数据完全冗余。分片负载均衡器Shard LB原理LB后面挂载多个数据库每个数据库只存储整体数据的一部分一个分片。写入时LB根据分片键例如向量ID的哈希值将数据路由到特定的一个分片进行写入。读取时如果是点查通过ID查可以直接路由如果是范围查询或全量扫描如FLAT搜索则需要向所有分片发起查询并聚合结果。优点写性能高因为每次写入只涉及一个节点。横向扩展性好数据量增大时通过增加分片即可。缺点读操作特别是需要聚合的查询延迟会更高因为涉及网络通信和结果合并。实操心得选择哪种LB模式取决于你的业务画像。如果你的业务是写入一次反复查询如构建一次知识库然后每天接受大量问答那么副本模式可能更合适它能最大化查询吞吐量。如果你的业务是持续流入数据且查询通常能命中单一分片例如按用户ID分片查询某个用户的向量那么分片模式能带来更好的写入性能和更经济的存储。这种架构最大的魅力在于简单。部署和管理一组无状态的、同构的数据库节点再配上一个智能的LB可以用Nginx、HAProxy甚至自己写一个简单的Go服务其复杂度远低于维护一个RAFT集群。数据库节点故障了换一个新的从其他副本同步数据副本模式或者由LB将流量切走分片模式即可。2.2.2 基于JetStream的多主模式第二种架构用到了NATS的JetStream功能。NATS是一个高性能的消息系统JetStream是其提供的持久化流式消息功能。这个架构是这样的每个数据库实例都内置一个JetStream客户端它们都连接到同一个NATS集群并订阅相同的主题Topic。当任何一个数据库实例需要写入数据时它并不直接写本地而是将写操作一条消息发布到JetStream的特定主题。所有订阅了该主题的数据库实例都会收到这条消息并各自在本地执行写入。这就实现了一个多主Multi-Leader架构多个节点都可以接受写入请求。那么经典的写冲突问题怎么解决Coltt采用了一种称为“最后写入者获胜”Last Writer Wins, LWW的策略。冲突场景两个客户端几乎同时向两个不同的数据库节点写入同一个向量ID的数据。解决过程两个节点都会生成一条写消息发布到JetStream。由于消息队列的全局有序性在同一个流内这两条消息会有一个先后顺序被所有节点消费。所有节点都会按顺序执行这两条写操作。后执行的那条操作会覆盖前一条的结果。为什么可行开发者认为对于向量数据库这种策略是可行的。原因有二第一向量数据模型相对简单通常没有传统关系型数据库那种跨多表的复杂事务不需要严格的序列化隔离级别。第二性能优先。为了避免全局锁带来的性能瓶颈接受在极端并发下极低概率的数据覆盖对于向量更新场景有时新向量覆盖旧向量也是可接受的业务逻辑是一种权衡。注意LWW策略需要谨慎评估。如果你的业务逻辑严格要求每次更新都必须基于前一个正确状态例如向量的元数据是累加计数器那么这种模式就不适用。它更适合“设置”型操作而非“更新”型操作。我的体会JetStream模式在架构上看起来比LB模式更“分布式”一些因为它依赖了一个外部的消息系统NATS。这带来了去中心化的写入能力但也引入了新的依赖和运维点。你需要确保NATS集群本身的高可用。不过对于已经使用NATS作为微服务通信骨干的团队来说这种集成会非常自然。3. 内部引擎数据分片、索引与混合搜索的实战细节聊完了宏观架构我们钻到数据库内部看看。Coltt在存储和检索引擎层面也做了不少针对性的设计。3.1 内存数据分片设计化解锁竞争向量搜索尤其是精确搜索如FLAT本质上是线性扫描时间复杂度O(n)。当数据量很大时即使使用索引如HNSW构建和搜索过程也涉及大量内存访问。一个很现实的问题是锁竞争。传统的做法是一个大的向量集合放在一块内存区域用一个读写锁保护。当多个线程goroutine并发读时没问题但当有线程要写入插入或删除时就会阻塞所有的读和其他写。在高并发插入或边写边查的场景下这里很容易成为瓶颈。Coltt的解决方案是内存数据分片。它把整个向量数据集在逻辑上划分成多个独立的“分片”Shard每个分片有自己的锁。写入数据时系统根据向量ID等规则决定放入哪个分片只需要锁住那个分片即可其他分片依然可以自由地提供读取服务。这样做的好处非常直接锁粒度变细从全局一把大锁变成了多个小锁锁竞争的概率大大降低。写入并行化不同的写入操作如果落在不同的分片上可以完全并行执行。读性能影响最小化一个分片被锁住写入只影响访问该分片的查询其他分片的查询完全不受影响。在代码实现上这通常意味着一个ShardManager管理着一个[]*Shard数组每个Shard包含自己的向量数据切片和一把sync.RWMutex。// 概念性代码非Coltt源码 type Shard struct { data []Vector mutex sync.RWMutex } type ShardManager struct { shards []*Shard shardFunc func(vectorID uint64) int // 分片函数 } func (m *ShardManager) Insert(vec Vector) { shardIndex : m.shardFunc(vec.ID) shard : m.shards[shardIndex] shard.mutex.Lock() defer shard.mutex.Unlock() shard.data append(shard.data, vec) // ... 更新该分片内的索引如HNSW图 } func (m *ShardManager) Search(query Vector, k int) []SearchResult { results : make(chan []SearchResult, len(m.shards)) var wg sync.WaitGroup for _, shard : range m.shards { wg.Add(1) go func(s *Shard) { defer wg.Done() s.mutex.RLock() // 读锁允许并发读 defer s.mutex.RUnlock() // 在该分片内执行搜索 partialResults : searchInShard(s.data, query, k) results - partialResults }(shard) } wg.Wait() close(results) // 聚合所有分片的结果 return mergeResults(results, k) }3.2 索引策略HNSW与FLAT/CFLAT的权衡Coltt支持主流的HNSW图索引也支持基础的FLAT暴力扫描和其增强版CFLAT。它们在存储和处理上有所不同。HNSW为了效率构建好的HNSW图结构会以二进制格式持久化到磁盘。同时原始的向量数据也会在内部的键值KV存储中存一份冗余。这是因为HNSW图本身不存储原始向量只存储邻居关系。重启时需要从KV存储加载向量数据来重建图或者直接加载序列化的图文件更快。这会占用较多磁盘空间但换来了极快的搜索速度O(log n)和重启速度。FLAT/CFLAT这两种是精确搜索算法不需要预先构建复杂的图结构。数据直接从KV存储加载到内存中进行线性扫描。因此没有额外的索引存储开销磁盘占用小。但搜索速度慢O(n)适合数据量小开发者提到边缘场景支持百万级或对精度要求100%的场景。数据流向可以概括为写入的向量同时进入KV存储用于持久化和FLAT搜索和内存中的索引结构如HNSW图。查询时根据指定的索引类型从相应的结构中检索。3.3 CFLAT面向多向量混合搜索的解决方案这是Coltt的一个亮点功能。传统的向量搜索用一个向量Embedding表示一个实体的全部信息。但现实中一个实体可能有多个维度。例如一个用户画像可能包含“兴趣向量”、“行为向量”、“人口属性向量”。单向量搜索的局限如果把所有信息拼接成一个长文本再生成一个向量信息会混杂可能导致搜索失真。比如你想找“性格果断”且“理想型是高大消瘦”的人。如果“果断”和“高大消瘦”在语义空间里不接近单向量搜索可能无法准确匹配。CFLAT的解决思路多向量存储为同一个数据项存储多个向量例如vector_personality,vector_ideal_type。复合评分查询时用户提供多个查询向量并为每个向量指定一个权重重要性。CFLAT会分别计算查询向量与目标数据各个对应向量的相似度如余弦相似度然后根据权重进行加权求和得到一个最终的复合分数。基于FLAT实现为什么选择在FLAT上实现而不是HNSW因为给HNSW这种图索引做“复合”查询非常麻烦。你需要为每种向量类型维护一个独立的HNSW图搜索时需要在多个图间跳转和合并结果算法复杂且内存消耗大空间复杂度差。而FLAT的线性扫描虽然慢但实现复合评分非常简单直接扫描一遍数据对每条数据计算多个相似度并加权即可。空间复杂度和单向量FLAT一样。适用场景CFLAT非常适合那些需要从多个维度进行综合评估的推荐、匹配系统。例如招聘平台匹配“技能向量”和“公司文化向量”。电商推荐匹配“商品特征向量”和“用户实时意图向量”。社交匹配正如其文档中的例子匹配“性格向量”和“外貌偏好向量”。实操要点使用CFLAT时权重的设置至关重要需要业务调优。同时由于是线性扫描务必严格控制单个分片内的数据量或者通过预过滤例如先按性别、地区过滤大幅减少候选集以保证查询延迟在可接受范围内。4. Coltt-Edge为边缘计算而生的轻量级引擎“Edge”这个概念在Coltt里被具体化为Coltt-Edge。它不是指一定要在路由器、摄像头上跑而是指一种轻量级的、资源消耗少的、可以快速部署在非数据中心环境的版本。为什么要用Edge想象一下这些场景你在开发一个智能硬件需要在设备本地进行离线语音指令识别语义匹配。你有一个移动应用希望在不联网的情况下也能根据用户历史行为进行内容推荐。你需要在客户现场的服务器上部署一个检索系统但客户环境资源有限且不允许连接外网。在这些场景下部署一个完整的Milvus或Weaviate集群显得过于笨重。Coltt-Edge的目标就是用最小的资源占用内存、CPU提供针对中小规模数据集官方提及百万向量级别的高效向量检索能力。它的“轻”体现在哪单一可执行文件Go语言编译生成依赖极少部署就是复制一个文件。可选的索引你可以根据数据量选择使用HNSW速度优先或FLAT/CFLAT精度和内存优先。对于边缘场景数据量通常可控FLAT往往是更简单可靠的选择。简化的架构Edge模式通常以单节点运行或者配合上述的LB架构组成小集群。它剥离了分布式协调中最复杂的部分只保留核心的存储和检索功能。一个强大的组合模式你可以将多个Coltt-Edge实例部署在不同的边缘节点上然后在前端通过一个分片负载均衡器来统一管理。这样每个Edge节点只负责一部分数据共同组成一个逻辑上的大规模向量数据库。这种模式非常适合数据生产源头分散的场景如多个地点的物联网设备可以实现数据的本地化处理和低延迟查询同时通过中心LB提供统一的查询入口。5. 实战部署与常见问题排查5.1 从源码运行一步步搭建环境Coltt是Go语言项目从源码运行是最直接的体验方式。这里以Linux/Windows为例# 1. 克隆代码库 git clone https://github.com/sjy-dv/coltt cd coltt # 2. 运行Edge节点 # Edge模式是轻量级单机模式适合快速启动和测试。 go run cmd/root/main.go -modeedge # 3. 运行Core节点 # Core模式可以理解为更完整的节点可能包含更多协调功能具体取决于版本。 go run cmd/root/main.go -moderoot重要提示Mac用户项目文档明确指出由于使用了CPU加速指令集SSE, AVX2等的代码在Mac平台上可能会出错且暂时不是修复的优先项。这意味着在Mac上从源码编译运行可能无法成功或者性能不佳。建议Mac用户使用Docker方式或者直接在Linux虚拟机/服务器上进行开发测试。Docker部署推荐 项目提供了Makefile来简化Docker操作。# 加载环境变量如果需要 source .env # 使用make命令构建并运行Edge的Docker容器 make edge-dockerDocker方式能很好地解决环境依赖问题特别是跨平台时。5.2 常见问题与排查技巧在测试和使用Coltt的过程中我遇到并总结了一些典型问题问题1创建集合Collection时如果名称已存在旧集合会被删除现象在2025年3月23日之前的版本中调用CreateCollectionAPI时如果传入一个已存在的集合名不仅会报错反而会删除已存在的那个集合。原因这显然是一个逻辑Bug。在创建集合的流程中检查到已存在后没有正确回滚或返回错误可能错误地执行了清理或覆盖操作。解决根据更新日志该问题已在2025.03.23版本中修复。务必确认你使用的版本是否包含此修复。升级到最新版本是首选。如果暂时无法升级应在业务代码层做防护在调用CreateCollection前先调用ListCollections检查是否存在。问题2写入性能随着数据量增长而下降现象初期写入很快当数据量达到几十万后写入速度明显变慢。排查思路检查索引类型如果你使用的是HNSW索引随着图的增长插入新节点时需要连接更多的边计算量会增大。这是HNSW的特性。对于批量导入可以考虑先关闭索引用FLAT模式导入导入完成后再一次性构建HNSW索引。检查分片情况如果你使用的是分片模式确认数据是否均匀分布。如果某个分片的数据量远大于其他分片它就会成为写入热点。检查你的分片键Shard Key选择是否合理。检查持久化配置如果每次写入都同步刷盘Sync to Disk性能会很差。查看配置中是否有控制WALWrite-Ahead Log刷盘策略的选项调整为异步或批量刷盘可以极大提升写入吞吐但需要承担断电丢失少量数据的风险取决于刷盘间隔。监控系统资源使用top,htop,iostat等工具看瓶颈是在CPU向量计算、内存频繁GC还是在磁盘I/O。问题3查询结果不准确或召回率低现象用HNSW索引搜索感觉找到的相似向量不是最相关的。排查思路确认EFSearch参数HNSW搜索时有一个efSearch参数它控制搜索时考察的候选节点数量。efSearch值越大搜索越精确但速度越慢。默认值可能为了速度而设得较小。尝试逐步调大efSearch比如从10调到50、100观察召回率变化。检查向量归一化余弦相似度计算要求向量是归一化的模长为1。确保你存入的向量和查询的向量都经过了归一化处理。未归一化的向量计算余弦相似度会产生偏差。审视CFLAT权重如果使用CFLAT查询结果的质量高度依赖权重设置。尝试调整不同向量的权重观察结果是否符合业务预期。这可能是一个需要多次实验的调优过程。用FLAT验证在测试阶段可以用FLAT索引暴力搜索的结果作为“标准答案”来对比HNSW或CFLAT的结果计算召回率从而量化索引的效果。问题4内存占用过高现象进程占用内存远超预期。排查思路向量维度这是内存占用的大头。内存占用 ≈ 向量条数 × 维度 × 4字节float32。算一下你的数据量是否在预期内。100万条768维的向量就需要约1000000 * 768 * 4 / 1024 / 1024 ≈2.93 GB内存。HNSW图结构HNSW除了存储向量还要存储多层图的邻居列表。这通常会使内存占用增加50%甚至更多。如果内存紧张可以考虑使用参数更小的HNSW如M和efConstruction调小或者直接使用FLAT索引。Go GCGo语言的垃圾回收器在内存压力大时表现可能不稳定。可以尝试设置环境变量GOGC来调整GC触发阈值例如GOGC50或者升级到使用更新版本Go编译的Coltt。问题5在分布式模式下查询延迟不稳定现象使用分片LB架构时有些查询快有些查询慢。排查思路慢查询分析记录每次查询的耗时并区分出是LB路由时间、网络传输时间还是单个分片内部的搜索时间。如果是分片内部慢参考问题3。分片负载不均检查是否所有分片的查询请求量均衡。可能由于分片键设计问题导致大部分查询都落到了某一个分片上。考虑增加分片数量或优化分片键。网络问题跨节点查询时网络延迟和带宽可能成为瓶颈。确保节点间网络通畅。对于需要聚合所有分片结果的查询可以尝试让LB并行发送请求并设置合理的超时时间。6. 未来展望与开发计划根据项目文档Coltt团队目前看来主要是个人开发者利用业余时间有一些有趣的规划LLM微调数据集自动构建管道这个想法很有前瞻性。向量数据库存储了文本和其向量每次相似性搜索本质上是在找“语义相近”的文本对。这些查询召回结果对天然可以作为指令微调Instruction Tuning或对比学习的数据集。如果能自动化地收集、清洗、格式化这些交互数据对于想要基于自身业务数据微调LLM的团队来说会是一个强大的工具。不过文档也提到直接这样得到的数据还不能用于训练需要进一步处理如去重、质量过滤、指令重构等。增强CFLAT功能计划为CFLAT引入更复杂的操作符比如OR逻辑。目前的CFLAT是加权求和可看作AND逻辑。加入OR后可以支持“查找在性格上相似或者在外貌偏好上相似”的用户这能覆盖更广泛的搜索需求使混合搜索的表达能力更强。性能优化文档中提到了因开发导致的性能暂时下降。这是开源项目的常态。可以关注其UPDATE-LOG.md等待核心算法如HNSW构建、CFLAT计算的优化以及可能的内存管理和并发控制的改进。给开发者和用户的建议对开发者Coltt的架构设计清晰代码是学习分布式系统和向量数据库实现的良好材料。特别是其“轻量级分布式”的思路很有启发性。如果你有兴趣可以关注其CFLAT和多向量搜索的实现这是一个小而精的研究方向。对潜在用户如果你需要一个易于部署、易于理解、控制感强的向量数据库特别是用于边缘环境、原型验证或中小规模生产场景Coltt值得一试。它的优势在于“简单透明”没有太多黑盒魔法。但对于超大规模十亿级以上、要求极高可用性和强一致性的核心生产场景建议还是先进行严格的压力测试和故障演练或者考虑更成熟的解决方案。开源项目的稳定性和周边生态如监控、管理工具是需要时间积累的。最后一点个人体会使用像Coltt这样的新兴项目最大的收获不仅仅是解决手头的问题更是能深入参与到一种技术范式的演进中。你会更关注架构背后的权衡理解每一个参数的意义并在遇到问题时有能力去追踪和定位。这种掌控感是在使用高度封装的黑盒云服务时难以获得的。当然这也意味着你需要投入更多的时间去运维和排错。如何选择取决于你的团队阶段和技术追求。

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