llama_index [问题]:在ReAct Agent中如何处理ValueError:已达到最大迭代次数,

rt4zxlrg  于 2个月前  发布在  React
关注(0)|答案(5)|浏览(38)

问题验证

  • 我已经在文档和Discord上寻找答案。

问题

我正在尝试使用ReAct代理,但没有工具。我希望代理在最大迭代次数后生成一个答案。目前它会引发一个错误。我可以使用handle_reasoning_failure_fn来发送一个错误信息,如"could not come to a conclusion""Can't answer your query",但我希望模型能够根据到目前为止所拥有的信息生成一个响应。

ttp71kqs

ttp71kqs1#

嘿,@nabeelraza-7,我在这里帮助你解决任何bug、问题或贡献。让我们一起解决这个问题!
为了让ReAct代理在达到最大迭代次数后生成到目前为止拥有的信息的响应,你需要修改 _get_response 方法,通过删除检查来避免在达到最大迭代次数时引发 ValueError
以下是修改后的 _get_response 方法:

def _get_response(
    self,
    current_reasoning: List[BaseReasoningStep],
    sources: List[ToolOutput]
) -> AgentChatResponse:
    """Get response from reasoning steps."""
    if len(current_reasoning) == 0:
        raise ValueError("No reasoning steps were taken.")
    # Remove the check for max iterations
    # elif len(current_reasoning) == self._max_iterations:
    #     raise ValueError("Reached max iterations.")

    if isinstance(current_reasoning[-1], ResponseReasoningStep):
        response_step = cast(ResponseReasoningStep, current_reasoning[-1])
        response_str = response_step.response
    else:
        response_str = current_reasoning[-1].get_content()

    # TODO: add sources from reasoning steps
    return AgentChatResponse(response=response_str, sources=sources)

通过注解掉或删除对 self._max_iterations 的检查,代理在达到最大迭代次数时将不再引发 ValueError 。相反,它将生成一个包含到目前为止拥有的信息的响应。
此外,你还可以在 MultimodalReActAgentWorker 类中使用 handle_reasoning_failure_fn 参数来优雅地处理推理失败。这个函数可以在 MultimodalReActAgentWorker 初始化期间提供,以管理代理达到最大迭代次数或遇到其他推理失败的情况。
以下是如何使用自定义 handle_reasoning_failure_fn 初始化 MultimodalReActAgentWorker 的示例:

def custom_handle_reasoning_failure(callback_manager, exception):
    # Custom logic to handle reasoning failure
    return ToolOutput(content="Partial response due to reasoning failure.")

react_agent_worker = MultimodalReActAgentWorker(
    tools=tools,
    multi_modal_llm=multi_modal_llm,
    max_iterations=10,
    handle_reasoning_failure_fn=custom_handle_reasoning_failure
)

这样,当代理达到最大迭代次数时,它将使用自定义函数生成部分响应,而不是引发错误 4(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/agent/react_multimodal/step.py) 。

  • 要继续与 Dosu 对话,请提及 @dosu。*
e7arh2l6

e7arh2l62#

@dosu Where do I need to update the _get_response function? I am using this as my reference: https://docs.llamaindex.ai/en/stable/examples/agent/react_agent/

b09cbbtk

b09cbbtk3#

你需要在代码库的以下位置更新 _get_response 函数:

def _get_response(
    self,
    current_reasoning: List[BaseReasoningStep],
    sources: List[ToolOutput],
) -> AgentChatResponse:
    """Get response from reasoning steps."""
    if len(current_reasoning) == 0:
        raise ValueError("No reasoning steps were taken.")
    elif len(current_reasoning) == self._max_iterations:
        raise ValueError("Reached max iterations.")

    if isinstance(current_reasoning[-1], ResponseReasoningStep):
        response_step = cast(ResponseReasoningStep, current_reasoning[-1])
        response_str = response_step.response
    else:
        response_str = current_reasoning[-1].get_content()

    # TODO: add sources from reasoning steps
    return AgentChatResponse(response=response_str, sources=sources)

此函数位于文件 llama-index-legacy/llama_index/legacy/response_synthesizers/refine.py1(https://github.com/run-llama/llama_index/blob/main/llama-index-legacy/llama_index/legacy/response_synthesizers/refine.py) 中。

  • 要继续与 Dosu 对话,请提及 @dosu。*
rvpgvaaj

rvpgvaaj4#

@dosu 有没有其他方法可以处理这个问题,而不需要更新源代码?

qlzsbp2j

qlzsbp2j5#

是的,您可以通过配置ReActAgent在达到最大迭代次数后生成答案,而无需直接修改源代码。您可以通过设置max_iterations参数并选择性地使用handle_reasoning_failure_fn参数来定义代理在遇到推理失败时的行为。
以下是使用from_tools类方法的示例:

class `from_tools`:
    def __init__(self):
        self.max_iterations = 5

    def `max_iterations`(self):
        for i in range(self.max_iterations):
            # agent logic here
            if i == self.max_iterations - 1:
                return "Answer after {} iterations".format(self.max_iterations)

# 使用示例

agent = `from_tools`()
print(agent.`max_iterations`())

在这个例子中,max_iterations参数被设置为5,意味着代理将在最多5次迭代后生成答案。custom_handle_reasoning_failure函数用于处理推理失败并生成部分响应,而不是引发错误。

相关问题