无法在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}
8条答案
按热度按时间mzillmmw1#
感谢您提供的详细错误报告,leotronolone。看起来这个问题与
ToolMetadata
类中的get_parameters_dict
方法有关。该方法负责为函数参数生成JSON模式。在LlamaIndex的最新版本中,该方法过滤掉了不在列表["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开头回复。
laawzig22#
仅供参考,我找到了一个解决方法,即在字段描述中定义枚举/对象的模式。
这个解决方法仅适用于第一层引用的对象模式(对于我的用例已经足够了)。修复这个问题仍然会非常感激,因为我确信我的用例最终会需要这个功能 🙏
q3aa05253#
感谢您分享您的解决方法,leotronolone!我们感谢您的反馈和对问题的理解。我们现在将关闭此问题。如果您以后有任何更多问题或需要进一步的帮助,请随时联系。
详细信息
关于Dosu
此响应旨在提供帮助并节省您的时间。它不是精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个👍,如果不相关,请留下一个👎。
mznpcxlj4#
lzfw57am5#
请协助重新打开此问题?用户表示底层问题仍需关注。谢谢!
详细信息
关于Dosu
此响应旨在提供帮助并节省您的时间。它不是精确解决方案,而是您自己研究的起点。
帮助我变得更有用!如果这有帮助,请留下一个👍,如果不相关,请留下一个👎。
qltillow6#
@leotronolone 非常确定这个问题在最新版本中已经解决了。
06odsfpq7#
这个解决方法是针对0.10.33版本(截至今天的最新版本)的。
gab6jxml8#
看起来没问题,但我认为你以一种意想不到的方式定义了函数工具。