Files
rag/scripts/download_models.py

83 lines
2.7 KiB
Python

"""
下载 BGE embedding 和 reranker 模型到本地 models/ 目录
首次配置时运行:
python scripts/download_models.py
"""
import os
import sys
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MODELS_DIR = os.path.join(PROJECT_ROOT, "models")
EMBEDDING_MODEL_PATH = os.path.join(MODELS_DIR, "bge-base-zh-v1.5")
RERANK_MODEL_PATH = os.path.join(MODELS_DIR, "bge-reranker-base")
os.makedirs(MODELS_DIR, exist_ok=True)
def download_embedding_model():
"""下载 BGE 中文向量模型"""
if os.path.exists(os.path.join(EMBEDDING_MODEL_PATH, "config.json")):
print(f"[跳过] Embedding 模型已存在: {EMBEDDING_MODEL_PATH}")
return True
print(f"[下载] BGE 中文向量模型 (bge-base-zh-v1.5)...")
print(f" 目标路径: {EMBEDDING_MODEL_PATH}")
try:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-base-zh-v1.5")
model.save(EMBEDDING_MODEL_PATH)
print(f"[完成] Embedding 模型下载成功!")
return True
except Exception as e:
print(f"[失败] Embedding 模型下载失败: {e}")
return False
def download_reranker_model():
"""下载 BGE reranker 模型"""
if os.path.exists(os.path.join(RERANK_MODEL_PATH, "config.json")):
print(f"[跳过] Reranker 模型已存在: {RERANK_MODEL_PATH}")
return True
print(f"[下载] BGE Reranker 模型 (bge-reranker-base)...")
print(f" 目标路径: {RERANK_MODEL_PATH}")
try:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
os.makedirs(RERANK_MODEL_PATH, exist_ok=True)
model = AutoModelForSequenceClassification.from_pretrained("BAAI/bge-reranker-base")
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-reranker-base")
model.save_pretrained(RERANK_MODEL_PATH)
tokenizer.save_pretrained(RERANK_MODEL_PATH)
print(f"[完成] Reranker 模型下载成功!")
return True
except Exception as e:
print(f"[失败] Reranker 模型下载失败: {e}")
print(f" (项目启动时会自动尝试下载,或可稍后手动重试)")
return False
if __name__ == "__main__":
print("=" * 60)
print("RAG 项目模型下载脚本")
print("=" * 60)
ok1 = download_embedding_model()
print()
ok2 = download_reranker_model()
print()
print("=" * 60)
if ok1:
print("Embedding 模型: OK (项目可以启动)")
else:
print("Embedding 模型: FAILED (项目无法启动,请检查网络)")
if ok2:
print("Reranker 模型: OK")
else:
print("Reranker 模型: FAILED (不影响启动,首次使用 rerank 时自动下载)")
print("=" * 60)