适用于个人开发、中小型项目的Embedding方案(配合ChromaDB)
本地模型,可离线部署(免费)
类名 | 模型示例 | 模型来源 | 是否开源 | 说明 |
---|---|---|---|---|
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 npclass 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 | 高质量检索、结构化问题任务 |
自定义类 | 灵活,可对接各种本地模型或量化模型 | 中文、多语言、自定义逻辑 |