做RAG也好,做语义搜索也好,第一步都是把文本转换成向量。这一步的质量直接决定了后续所有环节的效果。

Embedding模型在做什么

Embedding模型把一段文本映射成一个固定维度的浮点数向量。语义相近的文本,它们的向量在空间中的距离也近。“如何退款"和"退款流程是什么"会被映射到相近的位置,而"如何退款"和"今天天气不错"则距离很远。

中文场景主流选择

BAAI的BGE系列是中文场景的首选。bge-small-zh-v1.5只有120MB,384维,速度快效果够用。bge-large-zh-v1.5有1.3GB,1024维,效果明显更好。bge-m3支持多语言和多粒度,适合中英混合的场景。

MokaAI的M3E系列也是不错的选择,中文效果好。OpenAI的text-embedding-3-large虽然英文优先,但中文效果也不错,适合不想自己部署模型的团队。

评估方法

构造100-200组文本对,标注语义相似度,计算模型输出向量的余弦相似度和人工标注的Spearman相关系数。Benchmark仅供参考,自己的数据集才是最终裁判。

实战建议

先用bge-small-zh快速验证流程,效果不够再升级到bge-large。把精力放在数据清洗和分块策略上,回报比换模型大得多。

环境准备

部署前先确认环境。Python版本建议3.10+,依赖管理用venv或conda隔离。GPU环境需要CUDA 12.x和对应版本的cuDNN。网络方面,确保目标机器能访问模型仓库(HuggingFace或其镜像)。

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Linux/macOS
# .venv\Scripts\activate   # Windows

# 安装依赖
pip install -r requirements.txt

性能优化

生产环境不能只"跑起来"就行。几个关键的优化方向:

  • 批处理:合并多个请求一起推理,GPU利用率从30%提升到80%+;
  • 量化推理:INT8量化能把显存占用减半,精度损失通常在1%以内;
  • 缓存策略:对相同输入缓存结果,避免重复计算;
  • 异步处理:用消息队列(Redis/RabbitMQ)解耦请求和推理,削峰填谷。

监控和告警

上线后必须监控。关键指标包括请求QPS、P95延迟、错误率、GPU利用率和显存占用。推荐用Prometheus采集指标,Grafana做可视化面板。

告警规则建议:

  • P95延迟超过5秒 → Warning;
  • 错误率超过1% → Critical;
  • GPU显存超过90% → Warning,避免OOM。

踩坑记录

依赖冲突是最常见的部署问题。不同包的版本要求互相矛盾,pip install直接报错。解决办法是用pipdeptree查看依赖树,找到冲突的具体包,然后用--no-deps单独安装;

权限问题在Docker部署时容易踩。容器内用户和宿主机用户UID不一致,导致模型文件读取权限不足。Dockerfile里用--chown设置正确的文件权限;

网络超时在国内环境下尤其明显。模型下载、API调用都可能因为网络不稳定而失败。在代码里加重试逻辑,超时时间设置合理(模型加载给60s以上);