Hugging Face x LangChain: 全新 LangChain 合作伙伴包

HuggingFace發表於2024-05-29

我們很高興官宣釋出 langchain_huggingface ,這是一個由 Hugging Face 和 LangChain 共同維護的 LangChain 合作伙伴包。這個新的 Python 包旨在將 Hugging Face 最新功能引入 LangChain 並保持同步。

源自社群,服務社群

目前,LangChain 中所有與 Hugging Face 相關的類都是由社群貢獻的。雖然我們以此為基礎蓬勃發展,但隨著時間的推移,其中一些類在設計時由於缺乏來自 Hugging Face 的內部視角而在後期被廢棄。

透過 Langchain 合作伙伴包這個方式,我們的目標是縮短將 Hugging Face 生態系統中的新功能帶給 LangChain 使用者所需的時間。

langchain-huggingface 與 LangChain 無縫整合,為在 LangChain 生態系統中使用 Hugging Face 模型提供了一種可用且高效的方法。這種夥伴關係不僅僅涉及到技術貢獻,還展示了雙方對維護和不斷改進這一整合的共同承諾。

起步

langchain-huggingface 的起步非常簡單。以下是安裝該 軟體包 的方法:

pip install langchain-huggingface

現在,包已經安裝完畢,我們來看看裡面有什麼吧!

LLM 文字生成

HuggingFacePipeline

transformers 中的 Pipeline 類是 Hugging Face 工具箱中最通用的工具。LangChain 的設計主要是面向 RAG 和 Agent 應用場景,因此,在 Langchain 中流水線被簡化為下面幾個以文字為中心的任務: 文字生成文生文摘要翻譯 等。

使用者可以使用 from_model_id 方法直接載入模型:

from langchain_huggingface import HuggingFacePipeline

llm = HuggingFacePipeline.from_model_id(
    model_id="microsoft/Phi-3-mini-4k-instruct",
    task="text-generation",
    pipeline_kwargs={
        "max_new_tokens": 100,
        "top_k": 50,
        "temperature": 0.1,
    },
)
llm.invoke("Hugging Face is")

也可以自定義流水線,再傳給 HuggingFacePipeline 類:

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")

使用 HuggingFacePipeline 時,模型是載入至本機並在本機執行的,因此你可能會受到本機可用資源的限制。

HuggingFaceEndpoint

該類也有兩種方法。你可以使用 repo_id 引數指定模型。也可以使用 endpoint_url 指定服務終端,這些終端使用 無伺服器 API,這對於有 Hugging Face 專業帳戶企業 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 例項提供面向各種用例的無伺服器 API。

ChatHuggingFace

每個模型都有最適合自己的特殊詞元。如果沒有將這些詞元新增到提示中,將大大降低模型的表現。

為了把使用者的訊息轉成 LLM 所需的提示,大多數 LLM 分詞器中都提供了一個名為 chat_template 的成員屬性。

要了解不同模型的 chat_template 的詳細資訊,可訪問我建立的 space

ChatHuggingFace 類對 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|>""")

嵌入

Hugging Face 裡有很多非常強大的嵌入模型,你可直接把它們用於自己的流水線。

首先,選擇你想要的模型。關於如何選擇嵌入模型,一個很好的參考是 MTEB 排行榜

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)

HuggingFaceEndpointEmbeddings

HuggingFaceEndpointEmbeddingsHuggingFaceEndpoint 對 LLM 所做的非常相似,其在實現上也是使用 InferenceClient 來計算嵌入。它可以與 hub 上的模型以及 TEI 例項一起使用,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)

總結

我們致力於讓 langchain-huggingface 變得越來越好。我們將積極監控反饋和問題,並努力盡快解決它們。我們還將不斷新增新的特性和功能,以擴充該軟體包使其支援更廣泛的社群應用。我們強烈推薦你嘗試 langchain-huggingface 軟體包並提出寶貴意見,有了你的支援,這個軟體包的未來道路才會越走越寬。


英文原文: https://hf.co/blog/langchain

原文作者: Joffrey Thomas,Kirill Kondratenko,Erick Friis

譯者: Matrix Yao (姚偉峰),英特爾深度學習工程師,工作方向為 transformer-family 模型在各模態資料上的應用及大規模模型的訓練推理。

相關文章