見出し画像

LangChainのパートナーパッケージ langchain-huggingface の概要

以下の記事が面白かったので、簡単にまとめました。

Hugging Face x LangChain : A new partner package in LangChain


1. langchain-huggingface

「LangChain」のHuggingFace関連のクラスはすべてコミュニティによってコーディングされており、これで成功しましたが、時間の経過とともに、内部関係者の視点が欠如しているため、一部のクラスは非推奨になりました。

パートナーパッケージになることで、HuggingFace エコシステムで利用可能な新機能を「LangChain」のユーザーに提供するのにかかる時間を短縮することを目指しています。

langchain-huggingface」は「LangChain」とシームレスに統合され、LangChain エコシステム内でHuggingFaceモデルを利用する効率的かつ効果的な方法を提供します。このパートナーシップは、テクノロジーを共有するだけでなく、この統合を維持し、継続的に改善するという共同の取り組みでもあります。

2. インストール

パッケージをインストールする手順は、次のとおりです。

$ pip install langchain-huggingface

3. LLM

3-1. HuggingFacePipeline

Pipeline」は「transformers」の中で最も多用途なツールです。 「LangChain」は主に RAG およびエージェントのユースケースに対応するように設計されており、ここでのPipelineの範囲は、次のテキスト中心のタスクに限定されます。

・text-generation
・text2text-generation
・summarization
・translation

モデルは from_model_id() で直接ロードできます。

from transformers import AutoModelForCausalLM, AutoTokenizer,pipeline

model_id = "microsoft/Phi-3-mini-4k-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    load_in_4bit=True,
    #attn_implementation="flash_attention_2", # if you have an ampere GPU
)
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=100, top_k=50, temperature=0.1)
llm = HuggingFacePipeline(pipeline=pipe)
llm.invoke("Hugging Face is")

このクラスを使用する場合、モデルはキャッシュにロードされ、コンピューターのハードウェアを使用します。したがって、コンピュータ上の利用可能なリソースによって制限される可能性があります。

3-2. HuggingFaceEndpoint

このクラスを使用する方法も2つあります。 repo_id パラメータでモデルを指定できます。これらのエンドポイントは「serverless API」を使用します。これは、「pro accounts」や「enterprise hub」を使用しているユーザーにとって特に有益です。それでも、通常のユーザーは、コードを実行している環境でHF トークンを使用して接続することで、すでにかなりの量のリクエストにアクセスできます。

from langchain_huggingface import HuggingFaceEndpoint

llm = HuggingFaceEndpoint(
    repo_id="meta-llama/Meta-Llama-3-8B-Instruct",
    task="text-generation",
    max_new_tokens=100,
    do_sample=False,
)
llm.invoke("Hugging Face is")
llm = HuggingFaceEndpoint(
    endpoint_url="<endpoint_url>",
    task="text-generation",
    max_new_tokens=1024,
    do_sample=False,
)
llm.invoke("Hugging Face is")

内部では、このクラスは「InferenceClient」を使用して、デプロイされたTGIインスタンスにさまざまなユースケースの「serverless API」を提供できるようにします。

3-3. ChatHuggingFace

すべてのモデルには、最適に機能する独自のスペシャルトークンがあります。これらのトークンをプロンプトに追加しないと、モデルの性能が大幅に低下します。

メッセージリストから完了プロンプトに進むとき、ほとんどのLLMトークナイザーには「chat_template」呼ばれる属性が存在します。

さまざまなモデルの「chat_template」について詳しく知りたい場合は、このspaceにアクセスしてください。

このクラスは他のLLMのラッパーです。 メッセージリストを入力として受け取り、tokenizer.apply_chat_template() を使用して正しい完了プロンプトを作成します。

from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint

llm = HuggingFaceEndpoint(
    endpoint_url="<endpoint_url>",
    task="text-generation",
    max_new_tokens=1024,
    do_sample=False,
)
llm_engine_hf = ChatHuggingFace(llm=llm)
llm_engine_hf.invoke("Hugging Face is")

上記のコードは次と同等です。

# with mistralai/Mistral-7B-Instruct-v0.2
llm.invoke("<s>[INST] Hugging Face is [/INST]")

# with meta-llama/Meta-Llama-3-8B-Instruct
llm.invoke("""<|begin_of_text|><|start_header_id|>user<|end_header_id|>Hugging Face is<|eot_id|><|start_header_id|>assistant<|end_header_id|>""")

4. 埋め込み

HuggingFaceには、Pipelineで直接利用できるものよりも非常に強力な埋め込みモデルが満載です。

まずモデルを選択してください。 埋め込みモデルを選択するための優れたリソースの1つは、「MTEB leaderboard」です。

4-1. HuggingFaceEmbeddings

このクラスは「sentence-transformers」の埋め込みを使用します。埋め込みをローカルで計算するため、コンピューターのリソースが使用されます。

from langchain_huggingface.embeddings import HuggingFaceEmbeddings

model_name = "mixedbread-ai/mxbai-embed-large-v1"
hf_embeddings = HuggingFaceEmbeddings(
    model_name=model_name,
)
texts = ["Hello, world!", "How are you?"]
hf_embeddings.embed_documents(texts)

4-2. HuggingFaceEndpointEmbeddings

「HuggingFaceEndpointEmbeddings」は、埋め込みを計算するために内部で「InferenceClient」も使用するという意味で、「HuggingFaceEndpoint」がLLMに対して行うことと非常によく似ています。これは、ローカルまたはオンラインにデプロイされているかどうかに関係なく、ハブ上のモデルおよびTEIインスタンスで使用できます。

from langchain_huggingface.embeddings import HuggingFaceEndpointEmbeddings

hf_embeddings = HuggingFaceEndpointEmbeddings(
    model= "mixedbread-ai/mxbai-embed-large-v1",
    task="feature-extraction",
    huggingfacehub_api_token="<HF_TOKEN>",
)
texts = ["Hello, world!", "How are you?"]
hf_embeddings.embed_documents(texts)



この記事が気に入ったらサポートをしてみませんか?