通过 ModelScope 下载模型,解决sentence-transformers/all-MiniLM-L6-v2无法下载问题
分步解决方案
步骤 1:通过 ModelScope 下载模型
# 安装 ModelScope CLI
pip install modelscope
# 下载模型到本地目录
modelscope download --model 'sentence-transformers/all-MiniLM-L6-v2' --local_dir './models'
步骤 2:修改代码适配 ModelScope
import os
os.environ['MODELSCOPE_CACHE'] = './models' # 指定模型缓存路径
from modelscope.models import Model
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
class CodeVectorStore:
def __init__(self, persist_directory: str = "vector_store"):
"""初始化向量数据库"""
# 加载本地模型
self.embedding_model = pipeline(
task=Tasks.sentence_embedding,
model='./models/sentence-transformers/all-MiniLM-L6-v2',
model_revision='v1.0.0'
)
# 自定义嵌入函数
self.embeddings = self._modelscope_embedding
# 初始化 Chroma
self.vector_store = Chroma(
persist_directory=persist_directory,
embedding_function=self.embeddings,
collection_name="code_snippets"
)
def _modelscope_embedding(self, texts: List[str]) -> List[List[float]]:
"""生成嵌入向量"""
results = self.embedding_model(inputs={'source_sentence': texts})
return [result['embedding'].tolist() for result in results]
步骤 3:移除 Hugging Face 依赖
# 删除原有导入
- from langchain_huggingface import HuggingFaceEmbeddings
# 添加 ModelScope 依赖
+ from modelscope.pipelines import pipeline
+ from modelscope.utils.constant import Tasks
完整代码实现
import os
os.environ['MODELSCOPE_CACHE'] = './models'
from typing import List, Dict, Any
from langchain_chroma import Chroma
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import logging
import asyncio
import json
logger = logging.getLogger(__name__)
class CodeVectorStore:
def __init__(self, persist_directory: str = "vector_store"):
"""初始化向量数据库"""
# 加载本地模型
self.embedding_model = pipeline(
task=Tasks.sentence_embedding,
model='./models/sentence-transformers/all-MiniLM-L6-v2',
model_revision='v1.0.0'
)
# 初始化 Chroma
self.vector_store = Chroma(
persist_directory=persist_directory,
embedding_function=self._modelscope_embedding,
collection_name="code_snippets"
)
def _modelscope_embedding(self, texts: List[str]) -> List[List[float]]:
"""自定义嵌入函数"""
results = self.embedding_model(inputs={'source_sentence': texts})
return [result['embedding'].tolist() for result in results]
async def add_code_to_store(self, code_snippets: List[Dict[str, Any]]):
"""添加代码到向量数据库"""
try:
texts = [snippet["code"] for snippet in code_snippets]
metadatas = [...] # 元数据处理逻辑保持不变
# 生成嵌入向量
embeddings = self._modelscope_embedding(texts)
# 使用 Chroma 底层 API 添加数据
await asyncio.to_thread(
self.vector_store._collection.add,
embeddings=embeddings,
documents=texts,
metadatas=metadatas
)
except Exception as e:
logger.error(f"添加代码失败: {str(e)}")
raise
# 其他方法保持不变...
关键配置说明
1. 模型目录结构
models/
└── sentence-transformers/
└── all-MiniLM-L6-v2/
├── config.json
├── pytorch_model.bin
└── tokenizer_config.json
2. 环境变量设置
# 设置缓存路径(Linux/macOS)
export MODELSCOPE_CACHE=./models
# 或永久生效(写入 ~/.bashrc)
echo "export MODELSCOPE_CACHE=./models" >> ~/.bashrc
3. 性能优化参数
self.embedding_model = pipeline(
task=Tasks.sentence_embedding,
model='./models/sentence-transformers/all-MiniLM-L6-v2',
model_revision='v1.0.0',
device='cpu', # 指定 CPU 推理
quantization=True, # 8-bit 量化
batch_size=32 # 增大批处理量
)
验证测试
def test_embedding():
store = CodeVectorStore()
texts = ["def test(): pass", "print('hello')"]
embeddings = store._modelscope_embedding(texts)
# 验证输出维度
assert len(embeddings) == 2
assert len(embeddings[0]) == 384 # MiniLM-L6 的向量维度
# 验证相似度计算
similarity = np.dot(embeddings[0], embeddings[1])
print(f"相似度: {similarity:.4f}") # 应大于 0.5
优势对比
功能 | 原 Hugging Face 方案 | 新 ModelScope 方案 |
---|---|---|
国内下载速度 | 慢(依赖国际带宽) | 快(阿里云 CDN 加速) |
模型管理 | 分散式管理 | 统一企业级模型仓库 |
安全合规 | 需自行处理模型合规 | 内置模型使用协议管理 |
离线支持 | 需复杂配置 | 原生支持离线模式 |
服务稳定性 | 受国际网络波动影响 | 国内服务器保障 |
企业级增强
1. 私有镜像搭建
# 使用 Docker 部署 ModelScope 镜像服务
docker run -d -p 8080:8080 \
-v /path/to/models:/models \
registry.cn-hangzhou.aliyuncs.com/modelscope/modelscope-server:latest
2. 访问控制配置
# Nginx 配置示例
server {
listen 80;
server_name models.internal.com;
location / {
auth_basic "Model Server";
auth_basic_user_file /etc/nginx/htpasswd;
proxy_pass http://localhost:8080;
}
}
通过以上方案,您可以在完全脱离 Hugging Face 生态的情况下,使用 ModelScope 的国内服务稳定运行代码审计工具。此方案特别适合以下场景:
- 企业内网环境
- 需要代码审计工具完全自主可控
- 对模型下载速度有较高要求
- 需要符合国内数据合规要求