Langchain-Chatchat icon indicating copy to clipboard operation
Langchain-Chatchat copied to clipboard

关于agent调用tool的返回问题

Open saltedfish2 opened this issue 11 months ago • 3 comments

使用agent调用tool的流程是怎么样的,列出所有调用流程,并解释agent工作的逻辑。现在我调用了自定义tool,有返回内容但是前端显示的是:调用agent工具失败,该回答为大模型自身能力的回答: ` 和返回内容。

saltedfish2 avatar Mar 10 '24 17:03 saltedfish2

嗨,@saltedfish2!很高兴再次见到你。希望你一切都好!

在Langchain-Chatchat中,agent调用tool的流程主要通过异步回调来管理,这些回调处理了tool生命周期的不同阶段,如启动、运行、完成和错误处理。这个逻辑被封装在CustomAsyncIteratorCallbackHandler类中,该类继承自AsyncIteratorCallbackHandler。这个类通过一系列事件驱动的方法来管理agent调用的tool的状态和输出。以下是关键组件及其在过程中的角色的概述:

  1. 初始化__init__方法设置了一个用于通信的asyncio队列和一个用于信号完成的事件。它还初始化了一个字典来跟踪当前tool的状态。

  2. Tool启动(on_tool_start:当一个tool开始时,此方法会被触发。它通过在预定义的停止词处截断输入字符串来预处理输入,以管理无法有效处理长输入的大型模型。然后,它更新cur_tool字典,将tool的名称、输入字符串和初始状态(Status.agent_action)放入队列。

  3. Tool结束(on_tool_end:当一个tool完成其执行时,此方法会更新cur_tool字典,将tool的输出(同时从输出中删除预定义的前缀"Answer:")和其状态(Status.tool_finish)放入队列。

  4. Tool错误(on_tool_error:此方法处理在tool执行过程中发生的错误。它更新cur_tool字典,将错误状态和错误消息放入队列。

  5. LLM Token更新(on_llm_new_token:此方法在从语言模型获取新的token时被调用。它通过更新cur_tool字典,将截断的token和更改的状态设置为运行状态来处理特殊的token。对于其他token,如果允许输出(self.out为True),则更新字典中的token。

  6. Agent完成(on_agent_finish:当agent完成其任务时,此方法被调用。它更新cur_tool字典,将最终答案和状态(Status.agent_finish)放入队列。然后,它重置cur_tool字典以供下一个tool使用。

关于前端显示"调用agent工具失败"的问题,尽管自定义tool有返回内容,这表明前端可能在解释或处理后端响应时存在问题。根据提供的后端逻辑,错误可能源于:

  • 前后端通信:前端可能没有正确处理或解释后端发送的状态码和消息。确保前端正确解析并对响应中的状态和错误消息进行操作。

  • 错误处理:后端报告或处理错误的方式和前端期望的方式可能存在差异。例如,后端通过队列发送错误信息,但前端可能没有正确处理这些信息。

  • 异步处理:由于后端使用异步处理,可能存在时间问题或竞态条件,即前端在后端完全处理或更新结果之前尝试访问结果。

要解决这个问题,需要检查前端代码,确保它正确处理后端的各种状态和输出,特别是如何处理和显示错误与成功的输出。此外,验证前端和后端是否正确同步,特别是在处理异步事件和数据传输方面。

关于"调用agent工具失败"错误在前端出现时返回的具体错误消息或代码,其格式如下:

工具名称: <tool_name>
工具状态: 调用失败
错误信息: <error>

这个消息是在处理流式响应(if stream:)和非流式响应(else:)时遇到Status.error时构造的。错误消息包括工具名称(工具名称),状态指示调用失败(工具状态: 调用失败),以及遇到错误的工具提供的错误消息(错误信息)。

相关文档:

Sources

About Dosu

This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

dosubot[bot] avatar Mar 10 '24 17:03 dosubot[bot]

后来跑通了没?

dalunzi-dreamers avatar Mar 11 '24 15:03 dalunzi-dreamers

后来跑通了没?

还没有,应该是模型输出的格式与输出解析器能处理的不同。要对输出解析器做更新。

saltedfish2 avatar Mar 12 '24 07:03 saltedfish2

这个问题已经被标记为 stale ,因为它已经超过 30 天没有任何活动。

github-actions[bot] avatar Apr 11 '24 21:04 github-actions[bot]