Langchain-Chatchat
Langchain-Chatchat copied to clipboard
关于agent调用tool的返回问题
使用agent调用tool的流程是怎么样的,列出所有调用流程,并解释agent工作的逻辑。现在我调用了自定义tool,有返回内容但是前端显示的是:调用agent工具失败,该回答为大模型自身能力的回答: ` 和返回内容。
嗨,@saltedfish2!很高兴再次见到你。希望你一切都好!
在Langchain-Chatchat中,agent调用tool的流程主要通过异步回调来管理,这些回调处理了tool生命周期的不同阶段,如启动、运行、完成和错误处理。这个逻辑被封装在CustomAsyncIteratorCallbackHandler
类中,该类继承自AsyncIteratorCallbackHandler
。这个类通过一系列事件驱动的方法来管理agent调用的tool的状态和输出。以下是关键组件及其在过程中的角色的概述:
-
初始化:
__init__
方法设置了一个用于通信的asyncio队列和一个用于信号完成的事件。它还初始化了一个字典来跟踪当前tool的状态。 -
Tool启动(
on_tool_start
):当一个tool开始时,此方法会被触发。它通过在预定义的停止词处截断输入字符串来预处理输入,以管理无法有效处理长输入的大型模型。然后,它更新cur_tool
字典,将tool的名称、输入字符串和初始状态(Status.agent_action
)放入队列。 -
Tool结束(
on_tool_end
):当一个tool完成其执行时,此方法会更新cur_tool
字典,将tool的输出(同时从输出中删除预定义的前缀"Answer:")和其状态(Status.tool_finish
)放入队列。 -
Tool错误(
on_tool_error
):此方法处理在tool执行过程中发生的错误。它更新cur_tool
字典,将错误状态和错误消息放入队列。 -
LLM Token更新(
on_llm_new_token
):此方法在从语言模型获取新的token时被调用。它通过更新cur_tool
字典,将截断的token和更改的状态设置为运行状态来处理特殊的token。对于其他token,如果允许输出(self.out
为True),则更新字典中的token。 -
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
- 从前端agent问答debug后工具无法正确调用到
- [BUG] 调用agents成功得到结果但是返回到web失败
- server/agent/callbacks.py
- server/chat/agent_chat.py
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.
后来跑通了没?
后来跑通了没?
还没有,应该是模型输出的格式与输出解析器能处理的不同。要对输出解析器做更新。
这个问题已经被标记为 stale
,因为它已经超过 30 天没有任何活动。