本地模型,可离线部署(免费)
类名 | 模型示例 | 模型来源 | 是否开源 | 说明 |
---|---|---|---|---|
SentenceTransformerEmbeddingFunction |
all-MiniLM-L6-v2 bge-small-en gte-base-zh |
Hugging Face(sentence-transformers) | 是 | 主流免费模型,支持本地运行,无需联网。体积小,速度快,适合入门和中小型项目。 |
InstructorEmbeddingFunction |
hkunlp/instructor-xl intfloat/e5-base |
Hugging Face | 是 | 可带指令说明,如 "query:..." ,提升 query 对 passage 的匹配精度,RAG 中表现优异。 |
自定义类(需手写 wrapper) | 任意 HuggingFace 模型(如 moka-ai/m3e-base 、intfloat/multilingual-e5-base )本地量化模型 |
Hugging Face / 本地下载 | 是 | 可使用自定义代码加载模型并生成向量,适合高级用户或特殊需求,如中文多语种、跨域场景。 |
付费方案:
类名 | 服务商 | 模型名示例 | 是否联网 | 定价情况 |
---|---|---|---|---|
OpenAIEmbeddingFunction |
OpenAI | text-embedding-3-small text-embedding-ada-002 |
是 | 按 token 计费,约 $0.0001/1K tokens(Ada) |
CohereEmbeddingFunction |
Cohere | embed-english-light-v3.0 embed-multilingual-v3.0 |
是 | 按请求计费,具体看订阅计划,起步免费额度后按量计费 |
使用
SentenceTransformerEmbeddingFunction
from chromadb.utils.embedding_functions import SentenceTransformerEmbeddingFunction
# 创建一个嵌入函数实例
embedding_fn = SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")
# 对文本进行向量化
texts = ["China is a country", "Beijing is the capital"]
vectors = embedding_fn(texts)
print(vectors) # 输出为二维数组,每行为一个向量
- 使用
InstructorEmbeddingFunction
(支持指令式格式)
from chromadb.utils.embedding_functions import InstructorEmbeddingFunction
# e5/instructor 模型要求输入带前缀,例如 query: or passage:
embedding_fn = InstructorEmbeddingFunction(model_name="hkunlp/instructor-xl")
# 示例(用于检索任务)
texts = ["query: What is the capital of China?"]
vectors = embedding_fn(texts)
- 使用“自定义类”
适用于需要特殊处理逻辑的情况
from transformers import AutoTokenizer, AutoModel
import torch
import numpy as np
class MyEmbeddingFunction:
def __init__(self, model_name="intfloat/multilingual-e5-base"):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModel.from_pretrained(model_name)
def __call__(self, texts):
# 前缀很重要
inputs = self.tokenizer(["query: " + t for t in texts], return_tensors="pt", padding=True, truncation=True)
with torch.no_grad():
outputs = self.model(**inputs)
embeddings = outputs.last_hidden_state[:, 0, :] # [CLS] 向量
return embeddings.cpu().numpy()
# 使用方法
embedding_fn = MyEmbeddingFunction()
vectors = embedding_fn(["你好,世界", "中国的首都是哪里?"])
可以把这个类传给 Chroma 的
embedding_function=...
参数来完成定制化集成。
省流选择总结
方案 | 特点 | 推荐场景 |
---|---|---|
SentenceTransformerEmbeddingFunction |
小巧,速度快,部署简单 | 快速开发、中小项目、嵌入不复杂 |
InstructorEmbeddingFunction |
检索效果佳,适合加 prefix | 高质量检索、结构化问题任务 |
自定义类 | 灵活,可对接各种本地模型或量化模型 | 中文、多语言、自定义逻辑 |