AI 大模型开发

搭建tei-embedding 与配置bge-m3 文本模型

JACIN··11 分钟阅读

下载模型#

text
pip install -U huggingface_hub

以这个 bge-m3 为例: save_dir 就是保存的绝对路径,根据需要修改

text
from huggingface_hub import snapshot_download
import os

# 1. 设置下载目录 (和你 docker-compose 里的挂载一致)
save_dir = "/root/tei/data/bge-m3"

# 2. 确保目录存在
os.makedirs(save_dir, exist_ok=True)

print(f"🚀 开始下载 BAAI/bge-m3 到 {save_dir} ...")

# 3. 开始下载 (相当于命令行的 download)
snapshot_download(
    repo_id="BAAI/bge-m3",
    local_dir=save_dir,
    local_dir_use_symlinks=False,  # 关键:下载真实文件,不要软链接
    resume_download=True           # 支持断点续传
)

print("✅ 下载完成!")

tei 部署#

text
version: "3.8"

services:
  tei:
    container_name: tei-embedding
    image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.5
    restart: always
    ports:
      - "8080:80"
    volumes:
      # 👇 【修改1】把宿主机下载好的具体模型目录,挂载到容器的 /data/bge-m3
      - ./data/bge-m3:/data/bge-m3
    shm_size: 1g
    environment:
      # 保持这些清空操作,防止网络环境干扰
      - http_proxy=
      - https_proxy=
      - HTTP_PROXY=
      - HTTPS_PROXY=
      - no_proxy=*
    command: 
      # 👇 【修改2】这里改成容器内的路径,TEI 看到路径就会启动“离线模式”
      - --model-id
      - /data/bge-m3
      - --pooling
      - cls
      - --max-client-batch-size
      - "32"
      - --dtype
      - float32

测试#

部署测试#

text
curl 127.0.0.1:8080/embed \
    -X POST \
    -d '{"inputs": "机器真不错"}' \
    -H 'Content-Type: application/json'

你会看到屏幕上瞬间刷出一屏密密麻麻的浮点数:[[0.0123, -0.0456, ...]]

  • 只要看到这一屏数字,说明 TEI 活了,模型加载成功,推理功能正常。
  • 如果报错 Connection refused,说明容器没起来或者端口没对上。

相似度测试#

text
pip install numpy
text
import requests
import numpy as np

# TEI 地址
API_URL = "http://127.0.0.1:8080/embed"

def get_embeddings(texts):
    """从 TEI 获取向量"""
    response = requests.post(API_URL, json={"inputs": texts})
    return np.array(response.json())

def cosine_similarity(v1, v2):
    """计算两个向量的余弦相似度"""
    # 公式:(A . B) / (|A| * |B|)
    dot_product = np.dot(v1, v2)
    norm_v1 = np.linalg.norm(v1)
    norm_v2 = np.linalg.norm(v2)
    return dot_product / (norm_v1 * norm_v2)

def run_test():
    # 准备测试数据:两句意思相近,一句完全无关
    sentences = [
        "那个男人正在吃苹果",   # 句子 A
        "有个男的在吃水果",     # 句子 B (应该和 A 很像)
        "今天天气真不错",       # 句子 C (完全不搭边)
    ]
    
    print("🤖 正在让模型理解句意...")
    vectors = get_embeddings(sentences)
    
    vec_a = vectors[0]
    vec_b = vectors[1]
    vec_c = vectors[2]
    
    # 计算相似度
    score_ab = cosine_similarity(vec_a, vec_b)
    score_ac = cosine_similarity(vec_a, vec_c)
    
    print("\n--------- 测试结果 ---------")
    print(f"句子 A: {sentences[0]}")
    print(f"句子 B: {sentences[1]}")
    print(f"句子 C: {sentences[2]}")
    print("---------------------------")
    print(f"✅ A 和 B 的相似度 (男人吃苹果 vs 吃水果): {score_ab:.4f}")
    print(f"❌ A 和 C 的相似度 (男人吃苹果 vs 天气):   {score_ac:.4f}")
    
    if score_ab > score_ac:
        print("\n🎉 成功!模型通过了语义测试!")
    else:
        print("\n⚠️ 失败!模型好像分不清语义。")

if __name__ == "__main__":
    run_test()

运行结果:

text
🤖 正在让模型理解句意...

--------- 测试结果 ---------
句子 A: 那个男人正在吃苹果
句子 B: 有个男的在吃水果
句子 C: 今天天气真不错
---------------------------
✅ A 和 B 的相似度 (男人吃苹果 vs 吃水果): 0.8675
❌ A 和 C 的相似度 (男人吃苹果 vs 天气):   0.4570

🎉 成功!模型通过了语义测试!

评论

还没有评论,来发第一个吧