embedding-as-service
统一封装14+种文本向量化模型,一行代码将任意文本转为固定长度向量,支持BERT/Word2Vec/RoBERTa等主流嵌入技术
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
统一封装14+种文本向量化模型,一行代码将任意文本转为固定长度向量,支持BERT/Word2Vec/RoBERTa等主流嵌入技术
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你正在构建一个文本相似度搜索系统,市面上有 word2vec、GloVe、FastText、BERT、RoBERTa、XLNet、ALBERT 等十余种词向量模型,每个模型的调用方式、数据格式、预处理逻辑都各不相同。如果每个模型都要单独写一套接口,光是适配工作就够喝一壶的——更何况你可能还需要在同一个系统里对比不同模型的效果。
embedding-as-service 就是来解决这个问题的。它将十几种主流文本向量化技术统一封装成同一个调用接口,无论是 BERT 的上下文感知嵌入,还是 Word2Vec 的词级别嵌入,只需一行代码即可完成编码,输出统一维度的固定长度向量。
本项目灵感来源于知名项目 hanxiao/bert-as-service,由印度 AI 开发者 Aman Srivastava 创建并维护。与原项目专注于 BERT 不同,embedding-as-service 野心更大——它将覆盖范围扩展到了几乎所有主流文本嵌入技术,构建一个"一站式向量化服务平台"。
项目采用 Server-Client 架构:服务端承载模型推理,通过 ZeroMQ 通信协议与客户端交互;客户端可以是 Python 模块直接调用(适合本地推理),也可以通过 HTTP/ZeroMQ 协议远程调用(适合分布式部署)。服务端后端基于 Flask + UWSGI 生产级部署,前端 CLI 提供 embedding-as-service-start 命令行工具,一键启动不同模型的服务。
| 模型类别 | 具体模型 | 技术特点 |
|---|---|---|
| 上下文感知型 | BERT、RoBERTa、ALBERT、XLNet、DistilBERT | 基于 Transformer,捕获上下文语义,768维输出 |
| 词级静态型 | Word2Vec、GloVe、FastText | 词级别嵌入,无需微调,适合词义相似度任务 |
| 预训练Sentence型 | USE (Universal Sentence Encoder) | Google 出品,适合句子级别语义相似度 |
| 自定义 | 支持加载任意自定义嵌入 | 灵活扩展 |
from embedding_as_service.text.encode import Encoder
# 初始化编码器
en = Encoder(embedding='bert', model='bert_base_cased', max_seq_length=256)
# 编码文本
vecs = en.encode(texts=['hello world', '你好世界'])
返回的向量可以直接用于:
项目支持 7 种池化策略,决定如何将 Token 级别向量压缩为句子级向量:
| 策略 | 输出维度 | 适用场景 |
|---|---|---|
reduce_mean | 768 | 通用场景,最常用 |
reduce_max | 768 | 捕获最显著特征 |
reduce_mean_max | 1536 | concat 策略,信息最全 |
first_token | 768 | 取 [CLS] token,等同 BERT 原版 |
last_token | 768 | 取最后一个 hidden state |
None | 128×768 | 保留完整 token 序列,不池化 |
# 克隆仓库
git clone https://github.com/amansrivastava17/embedding-as-service.git
cd embedding-as-service/docker
# 一键启动(自动构建镜像 + 启动服务)
docker-compose up --build
# 启动后,通过客户端调用
pip install embedding-as-service-client
Dockerfile 基于 python:3.7-slim,包含完整依赖安装(TensorFlow 1.15.2、Keras 2.2.4 等),但构建阶段较慢,因为需要从 PyPI 拉取多个大型依赖包。
# 启动 BERT 模型服务
embedding-as-service-start --embedding bert --model bert_base_cased --port 8080 --max_seq_length 256
# 同时支持多 worker 并发处理
embedding-as-service-start --embedding bert --model bert_base_cased --port 8080 --num_workers 4
embedding-as-service/
├── server/
│ ├── embedding_as_service/
│ │ ├── text/ # 文本编码核心实现
│ │ └── utils.py # 工具函数(池化策略等)
│ ├── requirements.txt # 服务端依赖(含 TensorFlow 1.15.2)
│ ├── setup.py
│ └── tests/
├── client/
│ ├── embedding_as_service_client/
│ │ └── __init__.py # 客户端实现(HTTP/ZMQ 通信)
│ ├── requirements.txt # 客户端依赖(轻量,无需 GPU)
│ ├── setup.py
│ └── tests/
└── docker/
├── Dockerfile # 单阶段构建
└── docker-compose.yml # 一键编排
服务端核心依赖:tensorflow==1.15.2、keras==2.2.4、bert-tensorflow==1.0.1、tensorflow_hub==0.4.0。这里存在一个技术债——TensorFlow 1.15.2 已于 2020 年停止维护,建议迁移到 TF2,但需注意 API 兼容性问题。
优势方面:
tests/ 目录)需要正视的问题:
随着 Pinecone、Milvus、Chroma 等向量数据库的兴起,文本向量化的需求急剧增长。embedding-as-service 作为中间预处理层,解决了"多模型对比实验"和"统一接口调用"两个核心痛点。它的增长曲线(210 stars)与向量数据库热潮高度相关——不是偶然,而是市场需求催化的结果。
目前该项目已有 9 位贡献者参与维护,在 GitHub 上持续活跃,对于需要快速验证不同向量化方案效果的研究者和开发者来说,是一个值得关注的工具。