本機架設自己的 embedding 服務
目錄
HuggingFace 上有很多 Transformer / Encoder 類的 embedding model, 至少有三種方法可以下載到本機做運算
- SentenceTransformer
- Ollama
- llama.cpp
假設模型有在 HuggingFace 上,而且有 gguf 格式,這邊以 https://huggingface.co/mixedbread-ai/mxbai-embed-large-v1 為例
SentenceTransformer #
SentenceTransformer 是一個 python 函式庫,嚴格來說要搭配像 fastapi + uvicorn 才是真正的服務。
SentenceTransformer 安裝跟使用很簡單
# 安裝
$ pip install sentence-transformers
在 python 裡使用
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("mixedbread-ai/mxbai-embed-large-v1")
# sentences 可以是字串的 list 或單一個字串
sentences = [
"Represent this sentence for searching relevant passages: What is AI?",
"Apples and cookies are my favorite."
]
return model.encode(sentences).tolist()
Ollama #
我之前介紹過 用 Ollama 跑 LLM 語言模型,包括怎麼安裝等等
Ollama 也可以跑 embedding model – 可利用 https://ollama.com/search?c=embedding 看官方或是開發者有沒有放上去
如果有的話,以 mxbai-embed-large
為例,架設 API 服務只要
$ ollama pull mxbai-embed-large
# 不需要加模型名字
$ ollama serve
在 python 裡使用(要先 pip install ollama
)
import ollama
model_name = "mxbai-embed-large"
sentence = "AI is artificial intelligence"
# 只能一個字串
return ollama.embeddings(model=model_name, prompt=sentence)["embedding"]
也可以直接用 HTTP API,不需用 python 函式庫
預測的 throughput, 在我的 Mac 上 Ollama 比 SentenceTransformer 快
llama.cpp #
llama.cpp 是用 C/C++ 寫的 transformer 模型的預測函式庫
而 Ollama 其實是把 llama.cpp 包一層起來,速度上在某些情況下差不多,不過如果想要直接用 llama.cpp 的話:
安裝 - 直接從 github clone 原始碼下來,然後在本機編譯 https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md
模型下載 - 可以去 HuggingFace 把模型的 gguf 下載下來,例如這裡
編譯完後,原目錄會有很多可執行檔,用來架設服務:
$ ./llama-server -m /path/to/gguf/mxbai-embed-large-v1-f16.gguf --embedding
就可以用 HTTP API 獲得 embedding,例如在 python 用 requests
函式庫
import requests
sentence = "AI is artificial intelligence"
# 也是只能一個字串
r = requests.post("http://localhost:8080/embedding",
json={"content": sentence})
try:
return r.json()["embedding"]