Hugging Face
这篇笔记展示了如何开始使用 Hugging Face
的 LLM 作为聊天模型。
具体来说,我们将:
- 利用 HuggingFaceEndpoint 集成来实例化一个
LLM
。 - 利用
ChatHuggingFace
类来使这些 LLM 中的任何一个与 LangChain 的 Chat Messages 抽象进行交互。 - 探索使用
ChatHuggingFace
进行工具调用。 - 演示如何使用开源的 LLM 来驱动一个
ChatAgent
流水线。注意:要开始使用,您需要将 Hugging Face Access Token 保存为环境变量:
HUGGINGFACEHUB_API_TOKEN
。
%pip install --upgrade --quiet langchain-huggingface text-generation transformers google-search-results numexpr langchainhub sentencepiece jinja2
1. 实例化一个 LLM
HuggingFaceEndpoint
from langchain_huggingface import HuggingFaceEndpoint
llm = HuggingFaceEndpoint(
repo_id="meta-llama/Meta-Llama-3-70B-Instruct",
task="text-generation",
max_new_tokens=512,
do_sample=False,
repetition_penalty=1.03,
)
2. 实例化 ChatHuggingFace
以应用聊天模板
实例化聊天模型并传递一些消息。
注意:如果使用自托管的 text-generation-inference
,则需要显式传递 model_id
。
from langchain_core.messages import (
HumanMessage,
SystemMessage,
)
from langchain_huggingface import ChatHuggingFace
messages = [
SystemMessage(content="You're a helpful assistant"),
HumanMessage(
content="What happens when an unstoppable force meets an immovable object?"
),
]
chat_model = ChatHuggingFace(llm=llm)
在词汇表中添加了特殊标记,请确保相关的词嵌入已经进行了微调或训练。
检查 model_id
chat_model.model_id
'meta-llama/Meta-Llama-3-70B-Instruct'
检查聊天消息格式化为 LLM 调用的方式
chat_model._to_chat_prompt(messages)
"<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\nYou're a helpful assistant<|eot_id|><|start_header_id|>user<|end_header_id|>\n\nWhat happens when an unstoppable force meets an immovable object?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n"
调用模型
res = chat_model.invoke(messages)
print(res.content)
在物理学中的一个经典思想实验!
不可阻挡的力量遇到不可移动的物体的概念是一个悖论,几个世纪以来一直困扰着哲学家和物理学家。这是一个扭曲思维的场景,挑战着我们对基本物理定律的理解。
实质上,不可阻挡的力量是无法停止或减速的东西,而不可移动的物体是无法移动或位移的东西。如果我们假设这两个实体存在于同一个宇宙中,我们就会遇到一个逻辑矛盾。
3. 使用 ChatHuggingFace
探索工具调用
text-generation-inference
支持从 v2.0.1 开始使用开源 LLM 进行工具调用。
创建一个基本工具(Calculator
):
from langchain_core.pydantic_v1 import BaseModel, Field
class Calculator(BaseModel):
"""将两个整数相乘。"""
a: int = Field(..., description="第一个整数")
b: int = Field(..., description="第二个整数")
将工具绑定到 chat_model
并尝试一下:
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
llm_with_multiply = chat_model.bind_tools([Calculator], tool_choice="auto")
parser = PydanticToolsParser(tools=[Calculator])
tool_chain = llm_with_multiply | parser
tool_chain.invoke("How much is 3 multiplied by 12?")
[Calculator(a=3, b=12)]
4. 作为代理进行测试!
在这里,我们将测试 Zephyr-7B-beta
作为一个零-shot ReAct
代理。下面的示例摘自这里。
注意:要运行这一部分,您需要将 SerpAPI Token 保存为环境变量:
SERPAPI_API_KEY
。from langchain import hub
from langchain.agents import AgentExecutor, load_tools
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import (
ReActJsonSingleInputOutputParser,
)
from langchain.tools.render import render_text_description
from langchain_community.utilities import SerpAPIWrapper配置代理,使用
react-json
样式提示和访问搜索引擎和计算器。# 设置工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# 设置 ReAct 样式提示
prompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(
tools=render_text_description(tools),
tool_names=", ".join([t.name for t in tools]),
)
# 定义代理
chat_model_with_stop = chat_model.bind(stop=["\nObservation"])
agent = (
{
"input": lambda x: x["input"],
"agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
}
| prompt
| chat_model_with_stop
| ReActJsonSingleInputOutputParser()
)
# 实例化 AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)agent_executor.invoke(
{
"input": "莱昂纳多·迪卡普里奥的女朋友是谁?她的当前年龄提高到0.43次方是多少?"
}
)进入新的 AgentExecutor 链...
问题:莱昂纳多·迪卡普里奥的女朋友是谁?她的当前年龄提高到0.43次方是多少?
思考:我需要使用搜索工具找出莱昂纳多·迪卡普里奥目前的女朋友是谁。然后,我可以使用计算器工具将她的当前年龄提高到0.43次方。
行动:{ "action": "Search", "action_input": "leo dicaprio girlfriend" }
莱昂纳多·迪卡普里奥可能已经在维多利亚·塞雷蒂(Vittoria Ceretti)身上找到了真爱。一位消息人士在《美国周刊》最新一期中独家透露:“他们相爱了。莱昂纳多显然非常自豪地展示维多利亚,并让每个人都看到他们在一起是多么幸福。”现在我们知道莱昂纳多·迪卡普里奥目前的女朋友是维多利亚·塞雷蒂,让我们来了解一下她的当前年龄。
行动:{ "action": "Search", "action_input": "vittoria ceretti age" }
25岁现在我们知道维多利亚·塞雷蒂的当前年龄是25岁,让我们使用计算器工具将其提高到0.43次方。
行动:{ "action": "Calculator", "action_input": "25^0.43" }
答案:3.991298452658078最终答案:维多利亚·塞雷蒂,莱昂纳多·迪卡普里奥的当前女朋友,当提高到0.43次方时,约为4.0,保留两位小数。她的当前年龄为25岁。
链结束。{'input': "莱昂纳多·迪卡普里奥的女朋友是谁?她的当前年龄提高到0.43次方是多少?",
'output': "维多利亚·塞雷蒂,莱昂纳多·迪卡普里奥的当前女朋友,当提高到0.43次方时,约为4.0,保留两位小数。她的当前年龄为25岁。"}哇喔!我们的开源7b参数 Zephyr 模型能够:
- 规划一系列行动:“我需要使用搜索工具找出莱昂纳多·迪卡普里奥目前的女朋友是谁。然后,我可以使用计算器工具将她的当前年龄提高到0.43次方。”
- 然后使用 SerpAPI 工具执行搜索,找出莱昂纳多·迪卡普里奥目前的女朋友是谁
- 执行另一个搜索,找出她的年龄
- 最后使用计算器工具计算她的年龄提高到0.43次方 看到开源 LLM 作为通用推理代理的潜力是令人兴奋的。你也来试试吧!