如何基于FastAPI构建嵌入编码器?采用SentenceTransformer预训练模型
文本嵌入服务实现:FastAPI + SentenceTransformer + Swagger GUI
以下是满足需求的修正版代码,解决了原代码中的类型错误和依赖问题,同时保留Swagger GUI的交互能力:
from fastapi import FastAPI from pydantic import BaseModel from sentence_transformers import SentenceTransformer from typing import List # 全局加载预训练模型,仅初始化一次,节省资源 embedding_model = SentenceTransformer("./assets/BAAI/bge-small-en") app = FastAPI(title="文本嵌入服务", description="输入任意文本,获取SentenceTransformer生成的嵌入向量") class EmbeddingRequest(BaseModel): text: str # 接收用户输入的纯文本 class EmbeddingResponse(BaseModel): embeddings: List[float] # 修正类型:嵌入向量是浮点数组,而非单个浮点数 @app.post("/embeddings", response_model=EmbeddingResponse, summary="生成文本嵌入向量") def get_embeddings(request: EmbeddingRequest): # 调用模型编码文本,转换为Python列表以便JSON序列化 embeddings_result = embedding_model.encode(request.text).tolist() return EmbeddingResponse(embeddings=embeddings_result)
关键修改说明
- 修复响应类型错误:原代码将
embeddings定义为float,但模型返回的是一维浮点数组,改为List[float]才能正确返回符合格式的结果。 - 简化模型调用逻辑:模型全局加载后可直接使用,无需通过
Depends注入,避免重复加载模型导致的性能损耗。 - 适配同步方法:
model.encode是同步阻塞方法,使用同步路由(去掉async)更适配,FastAPI会自动在后台线程池处理请求,不影响并发。 - 序列化兼容处理:将模型返回的numpy数组转为Python列表,确保能被JSON序列化后返回给前端。
使用步骤
- 安装依赖:
pip install fastapi uvicorn sentence-transformers pydantic
- 启动服务:
uvicorn main:app --reload
- 访问Swagger GUI:
打开浏览器访问http://localhost:8000/docs,找到/embeddings接口,输入文本后点击「Execute」即可获取对应的嵌入向量。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

