LoginSignup
7
5

Hugging Faceからダウンロードしたembedding modelをローカルで利用する

Last updated at Posted at 2023-12-21

概要

  • LangChainでの利用やChromaでダウンロード済みのモデルを利用したいくていろいろ試したので記録用に抜粋してまとめた次第

なぜやろうと思のか

  • OpenAIのAPIでEmbeddingするのは費用が掛かる
  • ↑のモデルより性能の良いモデルがある
  • 利用するたびに毎回HuggingFaceから落としてくるの時間かるしめんどい…
  • ダウンロード済みの使えばええやん!って思ったけど公式ドキュメントに詳しく書いてない…

中身の補足

  • 本来はmultilingual-e5-largeを利用する予定だが、容量がでかいのでbaseを利用して試した(model_nameを変更すればいける)

モデルのダウンロード

公式ページの該当部分: Download a snapshot of the repo

pip install sentence_transformers

from huggingface_hub import snapshot_download

model_name = "intfloat/multilingual-e5-base"
download_path = snapshot_download(
    repo_id=model_name,
    local_dir = f"path_to_model/{model_name}",
    local_dir_use_symlinks=False # ※1
    )

download_pathが実際にダウンロードされたモデルのパスになるので以降の~pathにはこれを使えばOK

※1: デフォルトはauto。サイズの大きいファイルはダウンロード時のキャッシュへシンボリックリンクが張られるこれによりファイルサイズの最適化ができる。今回Falseにしているのは、シンボリックを作成せず、完全なダウンロードを実行するため(Jupyterのカーネルや、コンテナを再起動する場合困るので)

SentenceTransformerで利用

from sentence_transformers import SentenceTransformer

model_name = "intfloat/multilingual-e5-base"
model_path = f"path_to_model/{model_name}"
model = SentenceTransformer(model_path)

# 例えば
# テキストをembedding
embedding = model.encode('ベクトル化したい文字列')

# dfの列すべてembedding
df["vector"] = df["text"].apply(model.encode)

LangChainで利用

from langchain.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name=model_path)
embedded_texts = embeddings.embed_documents(
    [
        "Hi there!",
        "Oh, hello!",
        "What's your name?",
        "My friends call me World",
        "Hello World!"
    ]
)
len(embedded_texts), len(embedded_texts[0])
# →(5, 1536)
text = "This is a test document."
query_result = embeddings.embed_query(text)
doc_result = embeddings.embed_documents([text])

ChromaDBでの利用

純正Chromaの場合

import chromadb
from chromadb.utils import embedding_functions

client = chromadb.PersistentClient(path="/path/to/save/to")

ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=model_path)

collection = client.create_collection(name="my_collection", embedding_function=ef)

LangChain利用の場合(LangChainで利用と一緒ではある)

from langchain.vectorstores import Chroma
from langchain.embeddings import SentenceTransformerEmbeddings
ef = SentenceTransformerEmbeddings(model_name=model_path) # HuggingFaceEmbeddingsでもOK
db = Chroma.from_documents(documents, embeddings)
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5