langchain 工具与HuggingFace不兼容 - 无论是教程还是库都存在问题

h6my8fg2  于 4个月前  发布在  其他
关注(0)|答案(9)|浏览(86)

检查其他资源

  • 我为这个问题添加了一个非常描述性的标题。
  • 我使用集成搜索在LangChain文档中进行了搜索。
  • 我使用GitHub搜索查找了一个类似的问题,但没有找到。
  • 我确信这是LangChain中的一个bug,而不是我的代码。
  • 通过更新到LangChain的最新稳定版本(或特定集成包)无法解决此bug。

示例代码

我按照以下步骤操作:https://python.langchain.com/v0.2/docs/integrations/chat/huggingface/
然而,它不起作用。当我尝试将bind_tools与我的模型绑定时,代码会抛出错误。

from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_huggingface import HuggingFaceEndpoint, ChatHuggingFace

class Calculator(BaseModel):
        """Multiply two integers together."""

        a: int = Field(..., description="First integer")
        b: int = Field(..., description="Second integer")

llm = HuggingFaceEndpoint(
          repo_id="HuggingFaceH4/zephyr-7b-beta",
          task="text-generation",
          max_new_tokens=100,
          do_sample=False,
          seed=42
      )
 
chat_model = ChatHuggingFace(llm=llm)
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?")

错误信息和堆栈跟踪(如果适用)

warnings.warn(
Traceback (most recent call last):
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/llm_application_with_calc.py", line 69, in <module>
    tool_chain.invoke("How much is 3 multiplied by 12?")
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 2399, in invoke
    input = step.invoke(
            ^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 4433, in invoke
    return self.bound.invoke(
           ^^^^^^^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/language_models/chat_models.py", line 170, in invoke
    self.generate_prompt(
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/language_models/chat_models.py", line 599, in generate_prompt
    return self.generate(prompt_messages, stop=stop, callbacks=callbacks, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/language_models/chat_models.py", line 456, in generate
    raise e
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/language_models/chat_models.py", line 446, in generate
    self._generate_with_cache(
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_core/language_models/chat_models.py", line 671, in _generate_with_cache
    result = self._generate(
             ^^^^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_huggingface/chat_models/huggingface.py", line 212, in _generate
    return self._create_chat_result(answer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_huggingface/chat_models/huggingface.py", line 189, in _create_chat_result
    message=_convert_TGI_message_to_LC_message(response.choices[0].message),
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/langchain_huggingface/chat_models/huggingface.py", line 102, in _convert_TGI_message_to_LC_message
    if "arguments" in tool_calls[0]["function"]:
                      ~~~~~~~~~~^^^
  File "/Users/ssengupta/Desktop/LangchainTests/Langchain_Trials/.venv/lib/python3.12/site-packages/huggingface_hub/inference/_generated/types/base.py", line 144, in __getitem__
    return super().__getitem__(__key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 0

描述

我正在按照教程进行操作。然而,我仍然遇到上述问题。我甚至降级到了0.2.2,但它仍然无法正常工作。

系统信息

System Information
------------------
> OS:  Darwin
> OS Version:  Darwin Kernel Version 23.5.0: Wed May  1 20:09:52 PDT 2024; root:xnu-10063.121.3~5/RELEASE_X86_64
> Python Version:  3.12.3 (v3.12.3:f6650f9ad7, Apr  9 2024, 08:18:48) [Clang 13.0.0 (clang-1300.0.29.30)]

Package Information
-------------------
> langchain_core: 0.2.3
> langchain: 0.2.1
> langchain_community: 0.2.1
> langsmith: 0.1.67
> langchain_huggingface: 0.0.1
> langchain_text_splitters: 0.2.0
> langchainhub: 0.1.17
> langgraph: 0.0.60

Packages not installed (Not Necessarily a Problem)
--------------------------------------------------
The following packages were not found:

> langserve
bbuxkriu

bbuxkriu1#

from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_huggingface import HuggingFaceEndpoint, ChatHuggingFace

class Calculator(BaseModel):
    """Multiply two integers together."""
    x: int
    y: int

llm = HuggingFaceEndpoint(
    repo_id="HuggingFaceH4/zephyr-7b-beta",
    task="text-generation",
    max_new_tokens=100,
    do_sample=False,
    seed=42
)
chat_model = ChatHuggingFace(llm=llm)
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?")

这段代码没有报错,但是没有输出。

aelbi1ox

aelbi1ox2#

我遇到了相同的问题,有人找到解决方案了吗?

abithluo

abithluo3#

从您提供的代码和描述来看,您在使用HuggingFace的ChatHuggingFace模型时遇到了一些问题。根据您的描述,当您尝试使用自定义函数时,模型返回了一个空字符串。同时,当您尝试使用内置工具(如Tavily)时,模型似乎无法识别这些工具。

首先,确保您已经正确安装了所有必要的库和依赖项。对于这个问题,您需要确保已经安装了tavily库。您可以使用以下命令安装:

pip install tavily

接下来,您需要检查您的代码以确保您正确地使用了TavilySearchResults类。在您的示例中,您已经正确地设置了环境变量TAVILY_API_KEY,但是在创建TavilySearchResults示例时,您需要传递一个包含API密钥的字典,而不是直接将其设置为环境变量。请尝试将以下代码:

os.environ["TAVILY_API_KEY"] = '...'
search = TavilySearchResults(max_results=2)
tools = [search]
model_with_tools = chat_model.bind_tools(tools)
response = model_with_tools.invoke([HumanMessage(content="What's the weather in SF?")])

替换为:

api_key = 'your_tavily_api_key'
search = TavilySearchResults(max_results=2, api_key=api_key)
tools = [search]
model_with_tools = chat_model.bind_tools(tools)
response = model_with_tools.invoke([HumanMessage(content="What's the weather in SF?")])

请注意,您需要将your_tavily_api_key替换为您的实际Tavily API密钥。

如果问题仍然存在,请检查您的模型是否支持使用自定义函数。您可以通过查看模型的文档或与模型提供者联系来获取更多信息。

4ktjp1zp

4ktjp1zp4#

我在一个colab笔记本中复制了这个错误(不得不使用gemma 2B,因为其他所有的东西在colab中都崩溃了):'(
https://colab.research.google.com/drive/1rYF_f4Tx6Dx2zRrEWWvWkRqXgW_LSnsM?usp=sharing

vulvrdjw

vulvrdjw5#

我也无法复制教程。
根据史密斯上的执行跟踪,工具被调用,聊天模型接收到一个ToolMessage。然而,聊天模型忽略了ToolMessage并生成另一个工具调用。

uelo1irk

uelo1irk6#

大家好,我确认目前还不支持工具——只有聊天功能起作用。在我们实现它的过程中,应该添加一个警告/错误提示。

vyswwuz2

vyswwuz27#

你的意思是,工具目前还不支持开源模型或像GPT-4这样的闭源模型吗?

v1l68za4

v1l68za48#

就我所见,在这个背景下,闭源模型根本不相关,因为我们正在谈论HuggingFace包,对吗?
HuggingFace的问题在于它们并不真正支持transformers库中的工具(某些特定模型和分词器的支持逐渐开始出现)。据我所知,它之所以通过API端点得到支持,是因为在text-generation-inference包中以更通用的方式处理工具(或者实际上是HuggingFace内部使用的其他方式提供API)。
我认为我们应该做的是确定text-generation-inference如何处理这个问题(代码不是超级容易阅读,所以除非我们能从作者那里得到信息,最直接的方法可能是编译一个版本,将生成的输入输出到LLM的标准输出或文件中,以便我们可以检查它们),并复制它。当然,问题在于每个模型的结构化输入提示都不同(例如,有些有特殊的系统提示标记、消息标记,有些甚至有明确的支持函数调用等)。我可以想到将可用工具等描述插入提示的不同方法,但最好遵循HuggingFace已经为他们的API所做的任何事情。
或者,我们可以等待HuggingFace改进其对工具的支持,然后尝试在其上构建接口——但在我看来,这似乎是一个不太理想的选择。

5sxhfpxr

5sxhfpxr9#

啊,是的,我的错误,闭源模型与此上下文无关,因为我们正在处理HF开源模型。
但是,我明白你的意思。我想前进的方式类似于你所指示的,即查看开源LLM是否理解我们提供的工具的作用,然后它们是否能够为我们提供正确的工具参数来调用它。
但是,与此同时,在教程中添加警告或建议会让人们知道它可能或可能不起作用。

相关问题