3.6 KiB
3.6 KiB
工作流数据流转测试方案
问题描述
工作流能执行完成,但LLM节点输出"答非所问",可能是数据在节点间传递时被错误处理。
测试步骤
方法1: 使用测试脚本(推荐)
- 运行测试脚本:
cd /home/renjianbo/aiagent
python3 test_workflow_data_flow.py
- 观察输出:
- 查看每个节点的输入数据
- 特别关注LLM节点的输入数据格式
- 检查是否有嵌套的
{"input": {...}}结构
方法2: 查看执行日志数据库
- 查询最近的执行记录:
SELECT id, input_data, output_data, status, execution_time
FROM executions
WHERE agent_id IS NOT NULL
ORDER BY created_at DESC
LIMIT 1;
- 查询节点执行日志:
SELECT node_id, node_type, level, message, data, timestamp
FROM execution_logs
WHERE execution_id = 'YOUR_EXECUTION_ID'
ORDER BY timestamp ASC;
方法3: 添加临时调试代码
在 backend/app/services/workflow_engine.py 的 get_node_input 方法中添加:
# 在方法开始处
if node_id == 'llm-1': # 你的LLM节点ID
import json
print(f"[DEBUG] get_node_input for {node_id}")
print(f"[DEBUG] node_outputs: {json.dumps(node_outputs, ensure_ascii=False, indent=2)}")
print(f"[DEBUG] source_output: {json.dumps(node_outputs.get('start-1', {}), ensure_ascii=False, indent=2)}")
在 execute_node 方法的LLM节点处理部分添加:
# 在格式化prompt之前
if node_type == 'llm':
import json
print(f"[DEBUG] LLM节点输入: {json.dumps(input_data, ensure_ascii=False, indent=2)}")
print(f"[DEBUG] 原始prompt: {prompt}")
print(f"[DEBUG] user_query提取结果: {user_query}")
print(f"[DEBUG] 最终formatted_prompt: {formatted_prompt}")
然后重启后端并测试:
docker-compose -f docker-compose.dev.yml restart backend
方法4: 使用浏览器开发者工具
- 打开浏览器开发者工具(F12)
- 切换到 Network 标签
- 执行一次测试
- 查看请求:
POST /api/v1/executions- 查看发送的input_data
- 查看响应:
GET /api/v1/executions/{id}/status- 查看执行状态GET /api/v1/executions/{id}- 查看执行结果
关键检查点
1. Start节点输出
- 期望:
{"query": "苹果英语怎么讲?", "USER_INPUT": "苹果英语怎么讲?"} - 实际: 检查是否被包装成
{"input": {...}}或其他格式
2. LLM节点输入
- 期望: 直接从start节点获取,格式为
{"query": "...", "USER_INPUT": "..."} - 实际: 检查
get_node_input返回的数据格式
3. user_query提取
- 期望: 能正确提取到 "苹果英语怎么讲?"
- 实际: 检查提取逻辑是否正确处理嵌套结构
4. Prompt格式化
- 期望: 如果是通用指令"请处理用户请求。",应该直接使用user_query作为prompt
- 实际: 检查最终的formatted_prompt内容
预期问题位置
根据图片分析,输入数据可能是:
{
"input": {
"query": "苹果英语怎么讲?",
"USER_INPUT": "苹果英语怎么讲?"
}
}
这可能是以下原因导致的:
get_node_input方法在某个分支将数据包装成了{"input": ...}start节点的输出被错误保存- 数据在节点间传递时被错误处理
修复建议
如果发现数据被包装成 {"input": {...}},需要:
- 在
get_node_input中正确处理嵌套的input字段 - 确保
user_query提取逻辑能处理这种嵌套结构 - 确保prompt格式化逻辑能正确使用提取的
user_query