aquila
基于Faiss的多服务向量搜索引擎,支持语义k-NN搜索与JSON元数据联合索引
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于Faiss的多服务向量搜索引擎,支持语义k-NN搜索与JSON元数据联合索引
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2021年,一个小型内容创作团队的工程师遇到了这样的困境:他们搭建了一个图片素材库,用户可以通过文字描述搜索相似图片。最初用传统关键词匹配,效果勉强能接受——但当素材量涨到10万张时,搜索延迟从毫秒级飙升到数秒,用户流失率陡然上升。他们尝试引入 Elasticsearch,却发现配置一个兼顾"语义相似度"和"元数据过滤"的检索系统,需要写几千行代码,还要维护复杂的分布式集群。团队规模不过3人,根本没有精力做运维。
这个场景并非孤例。事实上,所有需要语义级相似性检索的开发者,都面临同样的两难:要么用简单但不准的关键词匹配,要么用精准但复杂的专用向量数据库——中间几乎没有折中方案。Aquila Network(更准确地说,其核心组件 AquilaDB)正是为填补这个空白而生:它把向量检索的复杂度封装成一个"开箱即用"的数据库,让普通开发者无需理解 Faiss 或 HNSW 的底层原理,也能用上高效的语义搜索。
传统数据库的检索逻辑是精确匹配——你搜"猫的照片",数据库只返回标题或标签里精确包含"猫的照片"的记录。如果你有一张猫的实拍图,但标题写的是"IMG_2021.jpg",传统搜索根本找不到它。这就是语义鸿沟(semantic gap):人类理解的"相似性"远比关键词匹配复杂得多。
神经信息检索(Neural Information Retrieval,N-IR)解决了这个问题。它的核心思路是:用深度学习模型把图片、文本等原始数据编码成高维向量 embedding(通常128维到1536维),向量之间的距离反映了语义相似度。这样,"猫的照片"经过模型编码后,会生成一个与真实猫图片向量非常接近的向量,搜索时只需找向量空间中最近的 k 个邻居——这就是 k-NN(k-Nearest Neighbors)检索。
然而,从模型编码到向量检索之间,还隔着数据存储、索引优化、并发控制、元数据关联等一系列工程问题。Microsoft Research 的综述论文 Neural Information Retrieval: A Literature Analysis 指出,这是 N-IR 从研究走向生产的主要障碍。AquilaDB 正是瞄准了这个 gap——它是一个面向 N-IR 的专用数据库,把端到端流程压缩到最小依赖集。
Aquila Network 的代码仓库采用多服务 Monorepo 结构,根目录下包含6个相对独立的子模块,每个服务各司其职,通过 HTTP 或内部机制通信:
技术栈:Python 3.8 + Faiss + leveldb
这是整个系统的心脏,负责向量索引和 k-NN 搜索。底层使用 Meta(原 Facebook)开源的 Faiss(Facebook AI Similarity Search)库实现高效近似最近邻检索,支持 HNSW 和 IVF 等多种索引策略。代码中 vec_index/hfaiss.py 和 vec_index/hannoy.py 分别对应两种索引实现,前者是 Faiss 的 Python 绑定,后者是 Rust 实现的 HNSW 变体。
数据持久化使用 leveldb(通过 GoLevelDB 封装),一个键值存储引擎,用于存储向量及其关联的 JSON 元数据。它还实现了 WAL(Write-Ahead Log)机制(wal/walman.py)来保证写入的持久性——即使服务崩溃,已写入的数据也不会丢失。
MetricStore 通过 authentication.py 实现基于椭圆曲线加密的身份验证(ECDSA),使用了 cryptops.py 中的加密工具函数。CID(Content Identifier)模块借鉴了 IPFS 的内容寻址方案,为每个向量数据块生成唯一哈希。
技术栈:Python 3.8 + Transformers + Sentence-Transformers
Encoder 负责把原始数据(图片、文本)转换为向量 embedding。它依赖 Hugging Face Transformers 生态,requirements.txt 中包含了完整的训练推理栈:PyTorch 1.10.1、Transformers 4.15.0、Sentence-Transformers 2.1.0,以及 NLTK、FastText 等 NLP 工具。
从 encoder.py 和 manager.py 的结构来看,Encoder 服务支持从 Aquila Hub(远程模型市场)按需下载预训练模型。这意味着开发者无需在本地预装所有模型,按需拉取即可——降低了存储成本,也便于模型迭代更新。
技术栈:Go 1.15 + gorilla/mux + MongoDB
Network 是 Aquila Network 名字的由来——它是去中心化 P2P 网络的入口节点,使用 Go 语言实现。依赖 goleveldb 做本地持久化,mongo-driver 用于与 MongoDB 通信。虽然代码还处于早期阶段(2021年的 go.mod 版本),但从架构设计来看,目标是让多个 Aquila 节点组成去中心化网络,共享向量索引。
技术栈:TypeScript + Express + TypeORM + PostgreSQL + Redis + BullMQ
Search 是面向客户端的 RESTful API 层,使用 routing-controllers 框架(类似 Java 的 Spring Boot 注解风格)组织代码。它通过 TypeORM 连接 PostgreSQL,存储用户、收藏夹、书签等关系数据;通过 ioredis 连接 Redis 做缓存和会话管理;通过 BullMQ(基于 Redis 的任务队列)处理网页爬取等耗时任务。
控制器层(controller/)实现了完整的 CRUD 操作:认证(JWT)、收藏夹管理、书签增删改查、订阅关系等。这是一个典型的 BaaS(Backend as a Service)后端,数据模型与前端 Web UI 紧密配合。
技术栈:Next.js 12 + React 18 + Redux Toolkit + Sass + NextAuth
View 是面向终端用户的 Web UI,基于 Next.js 的 SSR 架构构建,使用 Redux Toolkit 做状态管理,Sass 做样式预处理。页面路由覆盖了探索(Explore)、首页搜索、收藏夹浏览、用户账号管理等完整流程。
前端通过 aquila-js SDK(npm 包)与后端 Search 服务通信,实现了注册/登录、收藏夹订阅、语义书签搜索等交互功能。NextAuth 负责 OAuth 认证集成。
技术栈:Python Flask + BeautifulSoup
Txt_Transform 是一个轻量级的文本抽取和预处理服务,用于将网页内容结构化后交给 Encoder 生成向量。它依赖 Flask 做 HTTP 服务,BeautifulSoup 做 HTML 解析,Sumy 做自动文摘。
当用户在 Aquila Network 网站输入"可爱的猫在草地上玩耍"并点击搜索时,背后经历了以下步骤:
整个流程的端到端延迟,取决于模型推理时间和 Faiss 检索时间。对于百万级向量,HNSW 索引的单次查询通常在 10-50ms 量级,对用户几乎无感知。
AquilaDB 的核心组件(MetricStore 和 Encoder)都提供了 Dockerfile,支持容器化部署。项目 README 中给出了具体的 Docker 构建和运行命令:
# 部署 MetricStore(Lite版)
docker build https://raw.githubusercontent.com/Aquila-Network/AquilaDB/master/Dockerfile -t aquiladb:local
docker run -p 5001:5001 -d aquiladb:local
# 部署 MetricStore(大数据版,使用 Faiss 的完整索引)
docker build https://raw.githubusercontent.com/Aquila-Network/AquilaDB/master/DockerfileBig -t aquiladb:localbg
docker run -p 5001:5001 -d aquiladb:localbg
Dockerfile 采用多阶段构建(Multi-stage Build):第一阶段克隆仓库并安装依赖,第二阶段只复制运行时产物,生成精简镜像。
然而,这套部署方案存在明显的工程缺陷:
docker-compose up 就能启动完整系统的方案。metricstore 有自己的 Dockerfile,search 是 Node.js 应用,network 是 Go 二进制,txt_transform 又是另一个镜像——把它们组装起来需要相当的 DevOps 经验。整体来看,AquilaDB 的部署难度被评定为困难——它适合有 Docker 经验的开发者做原型验证,但不建议直接用于生产级别的弹性部署。
AquilaDB 所在的赛道是向量数据库(Vector Database),这是一个在 2023-2024 年呈爆发式增长的领域。Pinecone、Weaviate、Milvus、Qdrant 等专用向量数据库先后获得大额融资,而传统的 Elasticsearch 和 PostgreSQL(通过 pgvector 扩展)也在快速追赶。
相比这些竞品,AquilaDB 的差异化在于:
但劣势同样明显:
Aquila Network 代表了一种"让 ML 工具民主化"的思路:不是把向量检索做成只有大厂才能运维的复杂系统,而是让它像 SQLite 一样简单插入现有应用。从代码结构来看,团队有扎实的多语言全栈能力(Python/Go/TypeScript),架构设计也有一定前瞻性。
但一个开源项目最怕的不是技术不够好,而是断更。AquilaDB/Aquila 的主仓库在2021年后活跃度明显下降,而向量数据库领域在这几年间已经涌现了大量成熟竞品。如果你正在评估向量搜索方案,Pinecone、Qdrant 或 Weaviate 可能是更稳妥的选择;如果你对神经检索的原理感兴趣,想找一个易读的参考实现来学习 Faiss + 元数据存储的集成方式,AquilaDB 的代码值得一读。
图1:Aquila Network 品牌标识
图2:AquilaDB 在 Aquila Network 生态系统中的位置
图3:Aquila Network Web 前端界面(Home 页面)