AI 代理工具响应 (观察) 即使工具执行成功,也会间歇性返回空值 — toolWorkflow / toolCode + Agent (LangChain)
QQ 错误描述
n8n版本: 2.3.1.4(平稳) 节点: @n8n/n8n-nodes-LangChain代理 (v3 1),工具Workflow (v2.2),工具Code (v1.3),lmChatOpenAi (v1.3),内存PostgresChat (v1.4) 型号:GPT-4,温度为0.2
□ 总结
一个有4个连接工具的AI Agent节点(3x工具Workflow calling sup-workflows, 1x工具Code with inline JS)断断续续地从一个工具呼叫中接收了EMPTY的观察,尽管该工具自己的执行成功并返回了正确的数据. 这导致毒剂要么产生假想但假象值的幻觉,要么(在正确的系统及时)诚实地报告"这个工具没有归还任何东西"——这对生产毒剂来说都是不好的结果.
□ 证据
Agent node上的 " Return Intermediate Steps: true " 显示,在 " intermediate Steps " 中,一个失败的工具呼叫看起来是这样:
"动作":{"工具":"得到 定价 info","工具输入":{...}} "观察":"".
从字面上来说,2-字符串'''——不是一个错误,不是无效的,只是一个空的JSON字符串——而SAME子工作流自己的执行记录(可单独从 n8n 的执行日志中看到该嵌入的工作流程)显示它通过它的终端节点计算并返回正确的对象,例如:
{"输出":""precio a mostrar usd":100,.}}}
因此工具本身从未失败. 腐败严格发生在工具节点输出和LangChain代理工具调用回路读作观察的桥上.
□我们排除的东西(控制复制,~25跑出两个几乎相同的工作流程)
我们搭建了一个最小的复制工作流程(相同的4个工具,相同的子工作流程,相同的LLM/证书),与真实工作流程并列,一次一个孤立的变量. 尽管在真实工作流程中, SAME精确的有效载荷可靠地复制了:
- 工具类型(工具Code vs. 简单工具Workflow vs. 复杂工具Workflow with a 25-node 子工作流程)
- 将1个工具对4个工具按顺序逐一呼叫
- 聊天内存:新鲜/清洁会话对复用会话,前转弯
- 系统即时长度/内容(简短的通用即时与完整的~4000字符制作即时)
- 会话密钥策略:Postgres聊天节点上的静态对动态(每个用户)会话密钥
- 工具`说明'字段长度/细节(短位数相对于附有示例的完整生产说明)
- 一个额外的`来自AI ' 的独立输入字段,在其中一个工具Workflow节点上“未定义”
□ 一个可能的线索:耐久改变复制率
作为工作,我们在每个工具的返回语句之前添加了“等待这个. helpers.httprequest(.)”的调用(将真实结果输入外部终点)——在返回之前,每个工具的调用都增加了大约100ms-1s的额外延迟。
此更改前: 7个测试运行中 ~1 中复制的bug 。 在添加了这个延迟后:在5跑中被复制的bug.
这不是证据,但这是一个强烈的暗示 这可能是一个种族条件 . . . . . . .
内容来源: n8n-io/n8n