Files
aiagent/test_node_input_output.md

122 lines
3.6 KiB
Markdown
Raw Normal View History

2026-01-20 09:40:16 +08:00
# 工作流数据流转测试方案
## 问题描述
工作流能执行完成但LLM节点输出"答非所问",可能是数据在节点间传递时被错误处理。
## 测试步骤
### 方法1: 使用测试脚本(推荐)
1. **运行测试脚本**
```bash
cd /home/renjianbo/aiagent
python3 test_workflow_data_flow.py
```
2. **观察输出**
- 查看每个节点的输入数据
- 特别关注LLM节点的输入数据格式
- 检查是否有嵌套的`{"input": {...}}`结构
### 方法2: 查看执行日志数据库
1. **查询最近的执行记录**
```sql
SELECT id, input_data, output_data, status, execution_time
FROM executions
WHERE agent_id IS NOT NULL
ORDER BY created_at DESC
LIMIT 1;
```
2. **查询节点执行日志**
```sql
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` 方法中添加:
```python
# 在方法开始处
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节点处理部分添加
```python
# 在格式化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}")
```
然后重启后端并测试:
```bash
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内容
## 预期问题位置
根据图片分析,输入数据可能是:
```json
{
"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`