Files
aiagent/test_node_input_output.md
2026-01-20 09:40:16 +08:00

3.6 KiB
Raw Permalink Blame History

工作流数据流转测试方案

问题描述

工作流能执行完成但LLM节点输出"答非所问",可能是数据在节点间传递时被错误处理。

测试步骤

方法1: 使用测试脚本(推荐)

  1. 运行测试脚本
cd /home/renjianbo/aiagent
python3 test_workflow_data_flow.py
  1. 观察输出
    • 查看每个节点的输入数据
    • 特别关注LLM节点的输入数据格式
    • 检查是否有嵌套的{"input": {...}}结构

方法2: 查看执行日志数据库

  1. 查询最近的执行记录
SELECT id, input_data, output_data, status, execution_time 
FROM executions 
WHERE agent_id IS NOT NULL 
ORDER BY created_at DESC 
LIMIT 1;
  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.pyget_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: 使用浏览器开发者工具

  1. 打开浏览器开发者工具F12
  2. 切换到 Network 标签
  3. 执行一次测试
  4. 查看请求:
    • POST /api/v1/executions - 查看发送的 input_data
  5. 查看响应:
    • 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": "苹果英语怎么讲?"
  }
}

这可能是以下原因导致的:

  1. get_node_input 方法在某个分支将数据包装成了 {"input": ...}
  2. start 节点的输出被错误保存
  3. 数据在节点间传递时被错误处理

修复建议

如果发现数据被包装成 {"input": {...}},需要:

  1. get_node_input 中正确处理嵌套的 input 字段
  2. 确保 user_query 提取逻辑能处理这种嵌套结构
  3. 确保prompt格式化逻辑能正确使用提取的 user_query