llama_index [Bug]: FunctionTool在json schema中未传递引用的对象/枚举

vsikbqxv  于 5个月前  发布在  其他
关注(0)|答案(8)|浏览(47)

无法在llamaindex(0.9.40)的最新版本中在函数调用输入中使用引用的对象/枚举。这是由于在定义函数调用时,不再将引用的对象添加到发送给LLM的json模式中。这些json模式以前是从FunctionTool.fromDefaults()中的fn_schema输入(它扩展了BaseModel)生成的。

示例代码:

from enum import Enum
from llama_index.llms.openai import OpenAI
from llama_index.tools import FunctionTool
from llama_index.agent import OpenAIAgent

from pydantic import BaseModel

class MATH_OPERATOR(str, Enum):
ADD = "add"
SUBTRACT = "subtract"

def calculate(math_operator: MATH_OPERATOR, valueA: int, valueB: int):
return "answer"

class CalculateFunctionModel(BaseModel):
math_operator: MATH_OPERATOR
valueA: int
valueB: int

def run():
llm = OpenAI(model="gpt-4-1106-preview", temperature=0)
calculator_tool = FunctionTool.from_defaults(
fn=calculate,
fn_schema=CalculateFunctionModel
)
agent = OpenAIAgent.from_tools(llm=llm, tools=[calculator_tool], verbose=True)
return agent.chat("what is 2 * 2, make sure to use a tool")

相关日志/回溯:

Added user message to memory: what is 212 * 2909, make sure to use a tool
** Messages: **
user: what is 212 * 2909, make sure to use a tool


** Response: **
assistant: None


=== Calling Function ===
Calling function: calculate with args: {"math_operator":"MULTIPLY","valueA":212,"valueB":2909}

mzillmmw

mzillmmw1#

  • 🤖*

感谢您提供的详细错误报告,leotronolone。看起来这个问题与ToolMetadata类中的get_parameters_dict方法有关。该方法负责为函数参数生成JSON模式。在LlamaIndex的最新版本中,该方法过滤掉了不在列表["type", "properties", "required", "definitions"]中的键。
以下是相关的代码片段:

parameters = self.fn_schema.schema()
parameters = {
    k: v
    for k, v in parameters.items()
    if k in ["type", "properties", "required", "definitions"]
}

这意味着模式中的任何其他键,如表示引用对象和枚举的那些键,都被移除了。这很可能是LLM返回的函数调用输入不遵守期望的JSON模式的原因。
要解决此问题,您可以修改get_parameters_dict方法,将这些额外的键包含在模式中。然而,由于不知道您的模式的具体结构以及它们是如何使用的,很难提供具体的解决方案。
不幸的是,我无法在LlamaIndex 0.9.14和0.9.40版本之间找到get_parameters_dict方法所做的确切更改。如果您能提供关于这两个版本之间此方法行为变化方面的更多信息,那将很有帮助。
您可以在llama_index/tools/types.py文件中找到ToolMetadata类的源代码。
希望这对您有所帮助!如果您有任何其他问题或需要进一步澄清,请随时提问。

来源

此回复旨在节省您的时间并提供帮助。它不是精确的解决方案,而是您自己研究的一个起点。
帮助我变得更有用!如果这有帮助,请留下一个👍;如果无关紧要,请留下一个👎。
如果您想继续对话,请以@dosu-bot开头回复。

laawzig2

laawzig22#

仅供参考,我找到了一个解决方法,即在字段描述中定义枚举/对象的模式。

class CalculateFunctionModel(BaseModel):
  math_operator: MATH_OPERATOR = Field(description=f"Possible MATH_OPERATOR vales: {[a.value for a in MATH_OPERATOR]}")
  valueA: int
  valueB: int

这个解决方法仅适用于第一层引用的对象模式(对于我的用例已经足够了)。修复这个问题仍然会非常感激,因为我确信我的用例最终会需要这个功能 🙏

q3aa0525

q3aa05253#

感谢您分享您的解决方法,leotronolone!我们感谢您的反馈和对问题的理解。我们现在将关闭此问题。如果您以后有任何更多问题或需要进一步的帮助,请随时联系。

详细信息

关于Dosu

此响应旨在提供帮助并节省您的时间。它不是精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个👍,如果不相关,请留下一个👎。

  • 要继续对话,请提及@dosu。*
mznpcxlj

mznpcxlj4#

@dosu 我们能重新打开这个吗?底层问题仍未解决。
lzfw57am

lzfw57am5#

请协助重新打开此问题?用户表示底层问题仍需关注。谢谢!

详细信息

关于Dosu

此响应旨在提供帮助并节省您的时间。它不是精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个👍,如果不相关,请留下一个👎。

  • 要继续对话,请提及@dosu。*
qltillow

qltillow6#

@leotronolone 非常确定这个问题在最新版本中已经解决了。

06odsfpq

06odsfpq7#

这个解决方法是针对0.10.33版本(截至今天的最新版本)的。

gab6jxml

gab6jxml8#

看起来没问题,但我认为你以一种意想不到的方式定义了函数工具。

相关问题