简介:本文将系统讲解Embedding服务在RAG系统中的部署方法,涵盖架构设计、资源规划、环境配置、服务部署及运维优化全流程。通过学习本文,读者可掌握Embedding服务如何实现文本向量化、向量检索及与RAG系统的集成,并具备独立部署生产级Embedding服务的能力。
Embedding服务是RAG系统的核心组件,负责将用户查询和知识库文档转换为高维向量,支撑语义相似度检索。本文将详细介绍如何部署一个完整的Embedding服务,包括:
主流RAG系统采用Bi-encoder双塔架构,包含:
# 示例Dockerfile依赖FROM python:3.9-slimRUN pip install torch transformers faiss-cpu numpy flask
基础环境搭建:
# 安装Dockercurl -fsSL https://get.docker.com | sh# 安装Docker Composesudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
配置文件准备:
# docker-compose.yml示例version: '3.8'services:embedding-service:image: my-embedding-service:latestports:- "5000:5000"environment:- MODEL_PATH=/models/bert-base-uncasedvolumes:- ./models:/modelsvector-db:image: milvusdb/milvus:latestports:- "19530:19530"
模型服务部署:
# 示例Flask服务from flask import Flask, request, jsonifyfrom transformers import AutoTokenizer, AutoModelimport torchimport numpy as npapp = Flask(__name__)tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")model = AutoModel.from_pretrained("bert-base-uncased")@app.route('/encode', methods=['POST'])def encode():text = request.json['text']inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)with torch.no_grad():outputs = model(**inputs)# 使用CLS token作为文本表示embedding = outputs.last_hidden_state[:, 0, :].numpy()return jsonify({'embedding': embedding.tolist()})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
向量数据库初始化:
# Milvus初始化示例from pymilvus import connections, utility, FieldSchema, CollectionSchema, DataType, Collectionconnections.connect("default", host="vector-db", port="19530")if not utility.has_collection("documents"):fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768)]schema = CollectionSchema(fields, "documents")Collection("documents", schema).init()
文档预处理:
import redef preprocess_text(text):# 去除特殊字符text = re.sub(r'[^\w\s]', '', text)# 转换为小写text = text.lower()return text
批量向量化:
import requestsdef batch_encode_documents(documents):embeddings = []for doc in documents:response = requests.post("http://embedding-service:5000/encode",json={"text": preprocess_text(doc)})embeddings.append(response.json()['embedding'])return embeddings
向量入库:
from pymilvus import Collection, writesdef insert_vectors(collection_name, ids, embeddings):collection = Collection(collection_name)mr = writes.insert(collection_name, data=[ids, embeddings])collection.flush()
API测试:
curl -X POST http://localhost:5000/encode \-H "Content-Type: application/json" \-d '{"text":"hello world"}'
检索测试:
from pymilvus import Collectiondef search_similar(query_embedding, top_k=3):collection = Collection("documents")results = collection.search([query_embedding], "embedding",limit=top_k, output_fields=["id"])return [hit.entity.id for hit in results[0]]
QPS测试:
# 使用ab工具测试API性能ab -n 1000 -c 10 http://localhost:5000/encode \-p test_data.json -T 'application/json'
检索延迟测试:
import timedef benchmark_search(query_count=100):start = time.time()for _ in range(query_count):search_similar([0.1]*768) # 随机向量print(f"Average latency: {(time.time()-start)/query_count*1000:.2f}ms")
模型加载失败:
向量检索无结果:
模型优化:
检索优化:
服务监控:
资源监控:
水平扩展:
垂直扩展:
模型备份:
数据备份:
本文详细介绍了Embedding服务在RAG系统中的部署方法,从架构设计、资源规划到具体部署步骤和运维优化。关键收获包括:
通过遵循本文的部署指南,读者可以构建出稳定、高效的Embedding服务,为RAG系统提供强大的语义检索能力。