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

122 lines
3.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工作流数据流转测试方案
## 问题描述
工作流能执行完成但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`