Hugging Face x LangChain:LangChain 中的一个新合作伙伴包

发布于 2024 年 5 月 14 日
在 GitHub 上更新

我们激动地宣布推出 langchain_huggingface,这是 LangChain 中一个由 Hugging Face 和 LangChain 共同维护的合作伙伴包。这个新的 Python 包旨在将 Hugging Face 的最新发展成果带入 LangChain,并保持其持续更新。

来自社区,为了社区

LangChain 中所有与 Hugging Face 相关的类都是由社区编写的,虽然我们因此蓬勃发展,但随着时间的推移,由于缺乏内部人士的视角,其中一些类已经变得过时了。

通过成为合作伙伴包,我们的目标是缩短将 Hugging Face 生态系统中的新功能带给 LangChain 用户所需的时间。

langchain-huggingface 与 LangChain 无缝集成,提供了一种在 LangChain 生态系统内高效利用 Hugging Face 模型的有效方法。这种合作关系不仅是技术共享,更体现了维护和持续改进这一集成的共同承诺。

快速入门

开始使用 langchain-huggingface 非常简单。以下是如何安装和开始使用该的方法

pip install langchain-huggingface

既然包已经安装好了,让我们来看看里面有什么内容吧!

大语言模型(LLM)

HuggingFacePipeline

transformers 中,Pipeline 是 Hugging Face 工具箱中最通用的工具。由于 LangChain 主要设计用于解决 RAG 和 Agent 用例,因此这里的 pipeline 范围被限制在以下以文本为中心的任务:“text-generation”(文本生成)、“text2text-generation”(文本到文本生成)、“summarization”(摘要)、“translation”(翻译)。

模型可以通过 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")

或者你也可以在将其传递给类之前自己定义 pipeline

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

使用此类时,模型将被加载到缓存中并使用你的计算机硬件;因此,你可能会受到计算机可用资源的限制。

HuggingFaceEndpoint

使用这个类也有两种方式。你可以通过 repo_id 参数指定模型。这些端点使用无服务器 API,这对使用专业账户企业中心的人尤其有利。不过,普通用户通过在执行代码的环境中使用他们的 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,以便能够服务于从无服务器 API 到已部署的 TGI 实例等多种用例。

ChatHuggingFace

每个模型都有其自己效果最佳的特殊 token。如果不在提示中添加这些 token,你的模型性能将大大降低。

当从消息列表转换为补全提示时,大多数 LLM 的分词器(tokenizer)中存在一个名为 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|>""")

嵌入模型(Embeddings)

Hugging Face 上有许多非常强大的嵌入模型,你可以直接在你的 pipeline 中使用。

首先选择你的模型。选择嵌入模型的一个好资源是 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 实例一起使用。

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 一天比一天更好。我们将积极监控反馈和问题,并努力尽快解决它们。我们还将增加新特性和功能,并扩展该包以支持更广泛的社区用例。我们强烈鼓励你尝试这个包并给出你的意见,因为它将为该包的未来铺平道路。

社区

如何使用 huggingface 模型通过 langchain 进行文本生成

注册登录 以发表评论