Epsilla向量数据库实战:10倍性能提升的RAG系统核心架构解析

news2026/5/15 17:33:38
1. 项目概述为什么我们需要另一个向量数据库如果你最近在折腾大语言模型应用尤其是RAG检索增强生成系统那你肯定对向量数据库这个概念不陌生。从Pinecone、Weaviate到Milvus、Qdrant市面上选择不少。但当我第一次看到Epsilla的标语——“一个快10倍、更便宜、更好的向量数据库”时我的第一反应是又来一个这牛皮是不是吹得有点大但作为一个常年在一线部署AI应用、被向量检索的延迟和成本问题折磨得够呛的工程师我还是决定花点时间深挖一下。毕竟在真实的业务场景里向量搜索的性能和成本直接决定了你的应用能不能上线、用户体验好不好、老板的账单会不会爆炸。经过一段时间的测试和源码研究我发现Epsilla确实有些不一样的东西。它不是一个简单的“又一个HNSW实现”而是在架构设计和核心算法上做了不少激进的取舍目标直指生产环境中最痛的那些点极致的查询速度、可控的硬件成本以及作为一个“真正的数据库”所应有的管理能力。简单来说Epsilla是一个开源向量数据库其核心是用C编写的并声称通过一种先进的并行图遍历技术在保持99.9%以上精度的前提下实现了比主流HNSW算法快10倍的向量搜索速度。这听起来很技术但落到我们开发者手里意味着更快的响应时间、更低的服务器开销以及处理更大规模数据量的可能性。它提供了完整的数据库抽象库、表、字段向量只是其中一种字段类型同时支持元数据过滤、混合搜索稠密稀疏向量、内置embedding模型并且与LangChain、LlamaIndex等生态无缝集成。注意向量数据库不是万能的。如果你的数据量很小比如几万条或者查询QPS极低直接用PostgreSQL的pgvector扩展或者甚至把向量缓存在内存里计算相似度可能是更简单经济的选择。Epsilla这类专用数据库的价值在于应对百万、千万乃至亿级数据量的实时检索场景。2. 核心架构与设计哲学拆解Epsilla的官方介绍提到它使用了“先进的学术并行图遍历技术”。这说法有点笼统我结合其开源代码和一些论文线索来拆解一下它到底“快”在哪里以及这种设计带来了哪些优势和需要留意的地方。2.1 与HNSW的对比为什么快10倍不是梦目前业界向量索引的“事实标准”是HNSWHierarchical Navigable Small World。它非常优秀平衡了构建速度、查询速度和精度。但HNSW有一个特点它的查询过程是近似最近邻搜索ANNS并且是顺序遍历的。虽然跳表结构加速了搜索但在每一步它都需要计算当前节点与查询向量的距离然后选择下一个要遍历的邻居。这个过程在CPU上难以充分并行化。Epsilla的核心创新点据我分析在于它采用了一种基于图的并行遍历算法。我猜测其灵感来源于一些学术界对大规模图计算的研究。它的思路可能是将向量空间构建成一个图之后在查询时不再是像HNSW那样一个节点接一个节点地“走”而是同时从多个入口点出发并行地探索图的不同区域并利用一种高效的剪枝和合并策略快速收敛到最近邻。这种并行性可以从两个层面理解硬件层面更好地利用现代多核CPU的并行计算能力把一次查询分解成多个可以同时执行的任务。算法层面减少不必要的距离计算。传统的贪心算法可能会因为初始点不好而陷入局部最优需要多轮“回溯”。并行探索相当于同时尝试多条路径更容易快速找到全局较优解。带来的直接好处就是延迟Latency大幅降低。对于在线服务尤其是对话式AI应用用户等待检索结果的时间从几十毫秒降到几毫秒体验提升是质的飞跃。其次由于单位时间能处理更多查询吞吐量Throughput也上去了这意味着单台服务器能支撑更高的QPS间接降低了成本。2.2 计算与存储分离的云原生架构这是Epsilla另一个值得称道的设计。很多开源向量数据库在部署时计算节点和存储是紧耦合的。数据存在本地磁盘扩容时往往需要迁移数据非常麻烦。Epsilla明确提出了云原生架构支持计算存储分离。这意味着什么弹性伸缩计算层负责执行查询的节点可以根据查询压力独立扩缩容无需关心数据存在哪里。存储层如对象存储S3、云硬盘也可以独立扩展。这在应对流量高峰时非常有用。成本优化计算资源很贵但存储相对便宜。分离后你可以为计算层配置高性能但昂贵的CPU和内存而为存储层配置大容量、低成本的硬盘。不用为了存数据而养着一堆高配CPU。简化运维节点故障恢复更快。计算节点可以做成无状态的挂了直接重启一个新的从共享存储加载数据即可。数据持久化的责任交给了更可靠的存储服务。在epsilla-cloud的托管服务中这个特性被直接产品化了。而在自建的开源版本中通过-v /data:/data挂载卷你也可以轻松地将数据目录指向一个网络存储如NFS、Ceph初步实现分离。2.3 “向量即字段”的数据库理念很多向量数据库更像是一个“向量检索引擎”首要API是index和search。Epsilla则从一开始就强调自己是一个“数据库管理系统”。这体现在它的数据模型上数据库(Database) - 表(Table) - 字段(Field)。向量在这里只是字段的一种数据类型VECTOR_FLOAT和其他整型、字符串型字段完全平等。这种设计带来了巨大的灵活性丰富的元数据过滤你可以像写SQL的WHERE子句一样结合向量相似度和结构化条件进行查询。例如“查找与这个query最相似的、且发布时间在最近一周、状态为‘已发布’的文章”。这比先做向量搜索再在内存里过滤要高效和精确得多。统一的管理接口创建表、插入数据、查询、删除都沿用熟悉的数据库操作范式学习成本低。对于已经熟悉传统数据库的团队来说上手更快。更好的数据完整性支持主键、数据类型约束等减少了脏数据产生的可能性。3. 从零开始实战部署与核心操作光说不练假把式我们直接上手通过Docker快速拉起一个Epsilla服务并用Python客户端完成从建表、灌数据到查询的全流程。我会在每一步穿插我踩过的坑和最佳实践。3.1 环境准备与Docker部署部署Epsilla最简单的方式就是使用Docker。官方镜像已经包含了所有依赖。# 1. 拉取最新镜像 docker pull epsilla/vectordb # 2. 运行容器 docker run --pullalways -d -p 8888:8888 -v /path/to/your/data:/data --name epsilla_db epsilla/vectordb这里有几个关键参数和注意事项-p 8888:8888: 将容器内的8888端口映射到主机。Epsilla的服务端API就在这个端口上。你可以根据需要修改主机端口比如-p 8080:8888。-v /path/to/your/data:/data:这是最重要的部分。它把主机上的一个目录挂载到容器的/data路径。Epsilla所有的数据库数据都会写在这里。务必将其挂载到一个持久化的存储位置比如云硬盘或者NAS目录。如果没挂载容器删除后数据就没了。--name epsilla_db: 给容器起个名字方便管理。--pullalways: 确保每次运行都拉取最新镜像。对于生产环境建议指定一个稳定版本标签如epsilla/vectordb:v1.0.0。部署完成后可以用curl简单测试一下服务是否健康curl http://localhost:8888/status如果返回{status:OK}之类的信息说明服务已经跑起来了。实操心得在生产环境我强烈建议使用Docker Compose或Kubernetes来管理。可以方便地配置资源限制CPU、内存、重启策略以及将数据卷指向更可靠的云存储。单机Docker run只适合开发和测试。3.2 Python客户端基础操作详解Epsilla提供了pyepsilla这个官方Python客户端。我们先安装它然后一步步操作。pip install pyepsilla3.2.1 连接与数据库管理from pyepsilla import vectordb # 1. 连接到服务器 client vectordb.Client(hostlocalhost, port8888) # 如果是远程服务器将localhost替换为服务器IP # 2. 加载或创建一个数据库 # 注意load_db这个API名字有点误导它实际上是“连接并准备使用”一个数据库。 # 如果指定路径下的数据库不存在则会创建。 db_name MyBlogDB db_path /data/epsilla # 这个路径对应容器内的/data/epsilla我们挂载的卷会映射到这里 client.load_db(db_namedb_name, db_pathdb_path) # 3. 切换到要使用的数据库 client.use_db(db_namedb_name)关键点解析db_path是服务器端的路径也就是我们Docker容器内的/data/epsilla。所有数据库都会以子目录的形式创建在这个路径下。例如MyBlogDB数据库的实际数据会存储在/data/epsilla/MyBlogDB里。load_db和use_db的区别load_db是告诉后端引擎准备某个数据库的数据use_db是设置客户端的当前会话使用哪个数据库。通常你按顺序执行这两个操作即可。3.2.2 表设计与创建定义你的数据模型这是体现Epsilla“数据库”特性的核心。假设我们要构建一个博客文章的检索系统。# 定义表结构 table_fields [ {name: id, dataType: INT, primaryKey: True}, # 主键必须唯一 {name: title, dataType: STRING}, {name: content, dataType: STRING}, # 原始文本内容 {name: author, dataType: STRING}, {name: publish_date, dataType: STRING}, # 日期可以用STRING或INT存储时间戳 {name: category, dataType: STRING}, {name: view_count, dataType: INT}, # 核心向量字段。我们将为content生成嵌入向量。 { name: content_vector, dataType: VECTOR_FLOAT, dimensions: 768, # 必须与你使用的embedding模型维度一致例如BERT-base是768 metricType: COSINE # 相似度度量方式。可选COSINE余弦相似度 EUCLIDEAN欧氏距离 IP内积 } ] # 创建表 response client.create_table( table_nameblog_articles, table_fieldstable_fields ) print(response) # 成功会返回 {message: Create table successfully., statusCode: 200}字段定义深度解析主键primaryKey必须指定一个整数INT字段为主键。Epsilla用它来唯一标识记录。插入数据时主键不能重复否则会失败。向量字段VECTOR_FLOATdimensions这是最容易出错的地方。你必须明确知道你的embedding模型输出向量的维度是多少。OpenAI的text-embedding-3-small是1536text-embedding-ada-002是1536BERT-base是768。建表时指定的维度必须与后续插入的向量维度严格匹配。metricType决定了如何计算“相似度”。COSINE最常用的衡量向量方向的相似性范围[-1,1]值越大越相似。适合文本语义相似度。EUCLIDEAN欧氏距离值越小越相似。IP内积值越大越相似。当向量经过标准化模长为1后内积等于余弦相似度。如何选择绝大多数文本embedding模型如OpenAI, Sentence-BERT在训练时优化的是余弦相似度所以首选COSINE。如果你的向量不是标准化的或者有特殊需求再考虑其他两种。3.2.3 插入数据文本与向量的准备Epsilla本身不负责生成向量你需要先用外部embedding模型将文本转换成向量然后再插入。# 假设我们有一个embedding函数这里用伪代码实际需调用OpenAI、HuggingFace等API def get_embedding(text: str) - list: # 调用你的embedding服务返回一个浮点数列表例如768维 # 例如: return openai.Embedding.create(input[text], modeltext-embedding-3-small).data[0].embedding pass # 准备要插入的数据 articles [ { id: 1, title: 机器学习入门指南, content: 机器学习是人工智能的核心主要包括监督学习、无监督学习和强化学习..., author: 张三, publish_date: 2023-10-01, category: 技术, view_count: 1500, content_vector: get_embedding(机器学习是人工智能的核心主要包括监督学习、无监督学习和强化学习...) }, { id: 2, title: Python异步编程详解, content: asyncio是Python用于编写并发代码的库使用async/await语法..., author: 李四, publish_date: 2023-10-15, category: 编程, view_count: 3200, content_vector: get_embedding(asyncio是Python用于编写并发代码的库使用async/await语法...) }, # ... 更多文章 ] # 批量插入 response client.insert( table_nameblog_articles, recordsarticles ) print(response) # 成功返回 {message: Insert successfully., statusCode: 200, result: {successCount: 2}}批量插入的性能技巧批量大小不要一条一条地插入那样网络开销极大。建议批量插入每次100-1000条记录为宜。但也要注意单次插入的数据量太大会导致请求超时或内存压力。需要根据你的向量维度和网络条件做权衡。错误处理插入时可能会因为主键冲突、向量维度不匹配、字段类型错误等原因失败。response里会包含成功和失败的数量。在生产系统中务必对插入操作进行健壮的错误处理比如记录失败的数据并重试。向量生成生成向量可能是整个流水线中最耗时的部分。考虑使用异步请求、批处理API如果embedding服务支持来并行生成以提高数据灌入效率。3.2.4 执行查询语义搜索与混合过滤最激动人心的部分来了。我们将进行语义搜索并展示如何结合元数据过滤。# 场景1纯语义搜索 - “我想了解Python并发相关的文章” query_text Python并发编程 # 注意query接口需要传入原始文本Epsilla会调用其内置或你配置的embedding模型将其转为向量。 # 但根据文档此功能可能需要特定配置。更通用的方式是先本地生成查询向量。 query_vector get_embedding(query_text) response client.query( table_nameblog_articles, query_fieldcontent_vector, # 指定在哪个向量字段上搜索 response_fields[id, title, author, category], # 指定返回哪些字段 query_vectorquery_vector, # 查询向量 limit5 # 返回最相似的5条结果 ) print(纯语义搜索结果) for item in response[result]: print(fID: {item[id]}, 标题: {item[title]}, 作者: {item[author]}) # 场景2混合搜索 - “我想看技术类里关于机器学习的最新文章” query_vector_ml get_embedding(机器学习最新进展) response client.query( table_nameblog_articles, query_fieldcontent_vector, response_fields[id, title, publish_date, view_count], query_vectorquery_vector_ml, filtercategory 技术, # 元数据过滤像SQL的WHERE子句 limit3 ) print(\n混合搜索技术类结果) for item in response[result]: print(fID: {item[id]}, 标题: {item[title]}, 发布日期: {item[publish_date]}) # 场景3更复杂的过滤 - “查看编程类中浏览量超过1000的Python文章” # 这需要结合向量相似度和复杂的元数据条件 query_vector_py get_embedding(Python asyncio) response client.query( table_nameblog_articles, query_fieldcontent_vector, response_fields[id, title, view_count], query_vectorquery_vector_py, filtercategory 编程 AND view_count 1000, # 支持AND, OR, , , , !等操作 limit5 ) print(\n复杂过滤搜索结果) for item in response[result]: print(fID: {item[id]}, 标题: {item[title]}, 浏览量: {item[view_count]})查询API的精髓filter参数是Epsilla的杀手锏之一。它允许你在向量相似度搜索之前或之后取决于内部优化进行高效的过滤避免了“先搜索全部再在内存里过滤”的低效操作。语法接近SQL非常直观。limit控制返回数量。注意这个数量是经过过滤后的相似度排序结果。设置一个合理的值平衡结果质量和性能。with_distance你可以在query参数中加入with_distanceTrue返回结果会包含与查询向量的距离或相似度分数方便你设置阈值来过滤掉低质量匹配。4. 高级特性与生产级考量基础操作跑通后我们需要关注那些能让项目真正稳定上线的特性。4.1 内置Embedding与“开箱即用”的搜索Epsilla宣传的“Natural Language In, Natural Language Out”体验指的是它内置了embedding模型或支持轻松配置。这样你无需在应用代码中先调用外部API生成向量可以直接传入文本进行查询。根据文档这可能需要通过配置启用特定的embedding服务。在云托管版中可能直接可用。在自建版中你可能需要参考其高级配置将内置的embedding模块指向一个本地运行的模型如通过Ollama部署的某个开源模型或一个远程API端点。这样做的好处简化架构少维护一个外部服务调用。降低延迟如果模型内置或部署在同内网文本转向量的延迟会更低。保证一致性查询时用的embedding模型必须和建索引时的模型一致否则语义搜索会失效。内置管理可以减少这种不一致的风险。需要注意内置模型的性能、效果和更新可能受Epsilla版本限制。对于效果有极致要求的企业可能仍倾向于使用自己精调或特定的商用embedding API如OpenAI、Cohere这时就需要使用我们上面演示的“先本地生成向量再查询”的模式。4.2 索引管理让搜索更快更准在create_table时我们跳过了indices参数。索引是加速查询的关键。Epsilla会自动为向量字段创建索引但你也可以自定义。client.create_table( table_nameblog_articles_adv, table_fieldstable_fields, # 沿用之前的字段定义 indices[ { name: vec_index, # 索引名称 field: content_vector, # 为哪个字段建索引 # 通常不需要额外参数引擎会自动使用其核心算法 }, { name: title_author_idx, field: [title, author], # 也可以为标量字段建索引加速filter indexType: SCALAR # 指定为标量索引 } ] )对于向量索引Epsilla使用其专利算法通常无需手动调整参数。对于经常用于filter的标量字段如category,author,publish_date创建标量索引可以大幅提升过滤速度尤其是在数据量大的情况下。4.3 与LangChain/LlamaIndex集成如果你在用LangChain或LlamaIndex这类AI应用框架Epsilla提供了官方集成可以将其作为一个VectorStore来使用。以LangChain为例from langchain.embeddings import OpenAIEmbeddings # 或其他Embedding类 from langchain.vectorstores import Epsilla # 需要确认LangChain是否已内置支持或需要安装特定包 from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 加载文档并分割 loader TextLoader(some_document.txt) documents loader.load() text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) docs text_splitter.split_documents(documents) # 2. 创建Epsilla向量存储 embeddings OpenAIEmbeddings() vector_store Epsilla.from_documents( docs, embeddings, db_path/data/epsilla, db_nameMyLangChainDB, table_namedocs, clientvectordb.Client(hostlocalhost, port8888) ) # 3. 作为检索器使用 retriever vector_store.as_retriever(search_kwargs{k: 4}) relevant_docs retriever.get_relevant_documents(你的问题是什么)这种集成将数据灌入、索引创建和检索查询都封装成了高级API让你能更专注于构建应用逻辑而不是底层数据库操作。4.4 性能调优与监控对于生产系统性能和数据监控必不可少。资源监控CPU向量搜索是CPU密集型操作。使用htop或云监控工具观察查询时的CPU使用率。如果持续高位考虑升级CPU或增加计算节点如果架构支持。内存索引和数据会加载到内存中。确保服务器有足够RAM。可以通过Docker参数-m 4g来限制容器内存防止OOM。磁盘I/O主要发生在初始加载数据和持久化时。使用SSD能获得更好的体验。查询调优limit参数不要一次性请求过多结果比如limit1000这会给引擎带来不必要的排序和传输开销。前端分页通常每次10-20条足矣。filter复杂度过于复杂的filter表达式多个OR条件、模糊匹配可能会影响性能。尽量使用等值过滤和范围过滤并为常用过滤字段建立标量索引。批量查询如果业务需要同时用多个query进行搜索查看客户端是否支持批量查询接口比循环发起单个请求更高效。数据预热在服务启动或加载大型数据库后最初的几次查询可能会较慢因为数据需要从磁盘加载到内存缓存。对于关键服务可以考虑在启动后发送一些“预热”查询。5. 常见问题与故障排查实录在实际使用中你肯定会遇到各种问题。下面是我和社区里遇到的一些典型情况及其解决方法。5.1 部署与连接问题问题1Docker容器启动后立刻退出。排查运行docker logs epsilla_db查看日志。最常见的原因是端口冲突或挂载卷的权限问题。解决端口冲突更改主机端口如-p 8889:8888。卷权限确保主机上/path/to/your/data目录对Docker进程是可读写的。可以尝试chmod 777 /path/to/your/data测试环境或调整目录属主。问题2Python客户端连接超时Connection refused/timeout。排查确认Epsilla服务是否真的在运行docker ps查看容器状态。确认端口映射是否正确docker port epsilla_db。如果客户端和服务器不在同一机器检查防火墙/安全组是否放行了8888端口。解决根据排查结果重启容器、修正端口映射或配置防火墙规则。5.2 数据操作问题问题3插入数据失败报错“Primary key duplicate”或“Field type mismatch”。原因插入的数据与表结构定义不符。解决检查records列表中的每条记录是否都包含所有定义的字段且类型匹配整数不能是字符串。确保主键字段的值在所有记录中是唯一的。对于向量字段检查其维度是否与建表时定义的dimensions完全一致。一个768维的向量必须是长度为768的list。问题4查询结果不相关或质量差。原因这通常是embedding模型的问题而非数据库问题。排查步骤检查维度与度量确认查询时使用的向量其维度和度量类型COSINE/EUCLIDEAN与建表时完全一致。验证embedding模型用同一个模型分别对一段文本和其同义反复句生成向量计算它们的余弦相似度。如果相似度不高说明模型不适合你的领域或任务。检查数据质量灌入数据库的文本是否干净是否包含了太多无关噪声如HTML标签、特殊字符尝试简单查询用一个非常简单的句子查询看是否能返回包含相同关键词的文档。如果不能可能是数据灌入或索引构建出了问题。5.3 性能问题问题5查询速度随着数据量增长而明显变慢。可能原因未使用索引但向量字段Epsilla会自动索引。过滤条件filter中的字段没有标量索引导致全表扫描。服务器资源CPU、内存不足。解决为频繁用于过滤的标量字段创建索引如indexType: SCALAR。监控服务器资源考虑升级硬件或横向扩展如果支持集群模式。检查是否每次查询都生成了新的embedding向量。如果是考虑缓存查询向量。问题6内存使用率过高。原因向量索引和原始数据都会驻留内存以追求极速查询。解决这是特性不是bug。确保你的服务器内存足够容纳整个数据集和索引。内存需求大致为数据量 * (向量维度 * 4字节 元数据开销)。100万条768维向量大概需要3GB左右内存仅向量部分。如果数据量极大需要研究Epsilla是否支持磁盘辅助索引或分片集群方案。5.4 与生态集成问题问题7在LangChain中使用时报错找不到Epsilla模块。原因LangChain的集成可能还在发展中或者需要安装额外的包。解决查看Epsilla官方文档的“Integrations”部分确认正确的安装命令可能是pip install langchain-epsilla或类似。查看LangChain官方文档确认Epsilla这个类是否已被合并到主库或者是否需要从langchain.vectorstores导入。作为备选方案可以暂时使用LangChain的generic VectorStore接口或者直接使用pyepsilla客户端自己实现检索逻辑这并不复杂。经过这一番从理论到实战的折腾Epsilla给我的整体印象是它在追求极致性能的路上走得非常坚决并且没有牺牲作为一个数据库应有的数据管理能力。对于需要处理海量向量数据、对查询延迟和成本敏感的中大型项目来说它确实是一个值得认真评估的选项。当然开源版本在集群管理、高可用、可视化工具等方面可能不如成熟的商业产品这就需要你的团队具备更强的运维能力或者考虑他们的云托管服务。我的建议是先用一个中等规模的数据集比如几十万条做个完整的POC把数据灌入、查询、过滤、集成到你的应用链路里全跑一遍亲身感受一下它的“快”和“好”到底能不能兑现以及你的团队能否驾驭它。

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