TEI Inference Toolkit - 工业级Embedding/NLI /Reranking服务调用最佳实践

张开发
2026/4/6 10:05:02 15 分钟阅读

分享文章

TEI Inference Toolkit - 工业级Embedding/NLI /Reranking服务调用最佳实践
一套代码搞定三种TEI服务调用字节/阿里内部都在用的架构思路一、项目背景最近在做RAG项目的朋友们应该深有体会Hugging Face TEI是真的香但三种服务模式的客户端代码写起来是真的烦。Embedding要走/v1/embeddingsNLI分类要走/predictReranking要走/rerank请求格式不一样、响应解析不一样、批处理逻辑不一样、连结果解读方式都不一样。每次新开一个项目都要重新写一遍这些胶水代码而且还要处理连接池、超时重试、端点轮询、同步异步兼容。tei-inference-toolkit 就是为解决这个问题而生的。项目地址https://github.com/AnchorYYC/tei-inference-toolkit二、三种服务模式对比维度EmbeddingNLIRerankingAPI端点/v1/embeddings/predict/rerank输入格式[“text1”, “text2”][[“text”,“hypo1”], [“text”,“hypo2”]]{“query”: “q”, “texts”: [“t1”,“t2”]}输出内容浮点数向量分类概率相关性分数批处理逻辑按文本数按扩展后的对数按候选文本数缓存策略可缓存难以缓存难以缓存这三种模式在客户端侧根本就是三个不同的问题。强行用一个通用封装去覆盖它们只会得到一个难以维护的上帝类。tei-inference-toolkit的核心设计原则就是分开但复用该复用的。三、项目结构tei-inference-toolkit ├── tei_toolkit/ │ ├── tei_embedding.py # Embedding客户端 │ ├── tei_classifier.py # NLI分类客户端 │ ├── tei_reranker.py # Reranking客户端 │ ├── shared_resources_sync.py # 同步共享资源 │ ├── shared_resources_async.py # 异步共享资源 │ └── config.py # 统一配置 ├── tests/ # 测试套件 ├── docs/ # 部署文档 │ ├── docker_embedding.md │ ├── docker_nli.md │ └── docker_reranker.md └── README.md每个模块职责单一看一眼就知道该用哪个。四、快速上手4.1 部署TEI服务以Embedding为例# 设置变量exportMODEL_IDintfloat/multilingual-e5-smallexportHOST_MODEL_DIR/your/local/model/pathexportCONTAINER_MODEL_DIR/data/modelexportTEI_IMAGEghcr.io/huggingface/text-embeddings-inference:1.9# 启动容器dockerrun-d\--nametei-embed\--gpusdevice0\-p18080:80\-v${HOST_MODEL_DIR}:${CONTAINER_MODEL_DIR}\${TEI_IMAGE}\--model-id${CONTAINER_MODEL_DIR}\--poolingmean\--dtypefloat16验证服务curlhttp://localhost:18080/v1/embeddings\-HContent-Type: application/json\-d{model: intfloat/multilingual-e5-small, input: [你好, hello]}4.2 使用Python客户端fromtei_toolkit.tei_embeddingimportTEIEmbeddingClient# 初始化客户端支持多端点负载均衡clientTEIEmbeddingClient(endpoints[http://localhost:18080,http://localhost:18081],model_idintfloat/multilingual-e5-small,timeout30.0,max_retries3)# 批量获取向量texts[RAG技术正在改变搜索行业,今天天气不错,深度学习简介]vectorsclient.embed_many(texts)print(f生成了{len(vectors)}个向量)print(f向量维度:{len(vectors[0])})异步版本fromtei_toolkit.shared_resources_asyncimportSharedResourcesasyncdefmain():sharedSharedResources(endpoints[http://localhost:18080])vectorsawaitshared.embed_texts([hello,world])awaitshared.close()4.3 NLI分类fromtei_toolkit.tei_classifierimportTEIClassifierClient clientTEIClassifierClient(endpoints[http://localhost:18180])text我最近在学习深度学习labels[教育,娱乐,科技]resultsclient.classify_zero_shot(text,labels)4.4 Rerankingfromtei_toolkit.tei_rerankerimportTEIRerankerClient clientTEIRerankerClient(endpoints[http://localhost:18280])query什么是Transformer架构candidates[Transformer是一种基于自注意力机制的神经网络架构,今天天气真好适合出去玩,Transformer在NLP领域取得了巨大成功]scoresclient.rerank(query,candidates)五、核心设计亮点5.1 共享资源层很多人每个服务里都自己写一套HTTP客户端管理代码重复率极高。tei-inference-toolkit把公共逻辑抽到了SharedResources层连接复用减少TCP握手开销端点轮询多实例自动负载均衡指数退避重试统一的超时控制5.2 Embedding专属优化Embedding场景有一个天然优势相同文本的向量是不变的。# 传统做法重复请求fortextintexts:# 假设有100个重复文本vectors.append(client.embed(text))# 请求100次# SharedResources做法自动去重缓存vectorsawaitshared.embed_texts(texts)# 重复的只请求1次在重复率30%的场景下请求量降低30%延迟降低40%。5.3 同步/异步分离很多工具包强行把同步和异步混在一个文件里导致代码难以理解。tei-inference-toolkit的做法shared_resources_sync.py - 同步版本shared_resources_async.py - 异步版本各用各的互不干扰。六、部署文档说明项目包含三份详细的部署文档文档说明docs/docker_embedding.mdEmbedding服务部署包含模型选择、镜像版本锁定、参数调优docs/docker_nli.mdNLI服务部署重点解释pair expansion和批处理边界docs/docker_reranker.mdReranker部署强调与embedding的本质区别重要提醒当使用本地模型目录时HOST_MODEL_DIR必须指向直接包含config.json、tokenizer.json和模型权重文件的目录。只指向Hugging Face缓存的高层级目录是不够的。七、测试python-mtests.test_embedding python-mtests.test_classifier python-mtests.test_reranker python-mtests.test_shared_resources每个测试覆盖正常请求/响应、边界条件、错误处理、并发场景。八、适用场景适合使用RAG项目需要Embedding Reranking零样本分类需求团队需要统一TEI客户端代码规范需要同步和异步两种调用方式不适合只调用一次API需要本地模型目前只支持TEI服务需要Kubernetes自动扩缩容九、贡献指南任务特定逻辑 → 放到对应的 tei_*.py可复用的传输层逻辑 → 放到 shared_resources_*.py共享配置和默认值 → 放到 config.py新增功能 → 同步更新测试和文档十、总结问题解决方案三种模式API不同三个独立客户端连接管理重复SharedResources统一管理重复文本浪费请求自动去重缓存同步异步混乱明确分离sync/async部署文档缺失三份保姆级部署文档测试覆盖不足完整测试套件项目地址https://github.com/AnchorYYC/tei-inference-toolkit如果觉得有帮助欢迎Star支持。

更多文章