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