处理agent答非所问的问题

This commit is contained in:
rjb
2026-01-20 09:40:16 +08:00
parent e4aa6cdb79
commit f6568f252a
11 changed files with 1420 additions and 44 deletions

View File

@@ -0,0 +1,233 @@
================================================================================
工作流调用测试总结
================================================================================
测试时间2026-01-19
测试场景Agent工作流执行 - LLM节点"答非所问"问题诊断与修复
================================================================================
一、问题描述
================================================================================
1. 问题现象:
- LLM节点单独测试时能正常回答用户问题
- 整个Agent调用时LLM返回通用欢迎语而不是回答用户的具体问题
- 用户输入:"苹果英语怎么讲?"
- LLM返回通用欢迎语 + 最后附加用户问题
2. 工作流结构:
- 开始节点 (start-1) → LLM处理节点 (llm-1) → 结束节点 (end-1)
- LLM节点配置prompt = "请处理用户请求。"
================================================================================
二、测试方法与工具
================================================================================
1. 执行日志查看脚本:
- 文件check_execution_logs.py
- 功能查看最近的Agent执行记录包括输入数据、输出数据、执行日志
- 使用方法python3 check_execution_logs.py
2. 数据流转测试脚本:
- 文件test_workflow_data_flow.py
- 功能:模拟完整工作流执行,详细记录每个节点的输入输出
- 使用方法python3 test_workflow_data_flow.py
3. 日志查看命令:
- 后端日志docker-compose -f docker-compose.dev.yml logs --tail=500 backend | grep "\[rjb\]"
- Celery日志docker-compose -f docker-compose.dev.yml logs --tail=500 celery | grep "\[rjb\]"
================================================================================
三、问题定位过程
================================================================================
1. 数据流转检查:
- 输入数据(正确):{"query": "苹果英语怎么讲?", "USER_INPUT": "苹果英语怎么讲?"}
- Start节点输出正确{"query": "苹果英语怎么讲?", "USER_INPUT": "苹果英语怎么讲?"}
- LLM节点输入问题从执行日志看数据被包装成了 {"input": {"query": "...", "USER_INPUT": "..."}}
- LLM节点输出问题返回通用欢迎语而不是回答用户问题
2. 关键发现:
- 通过添加详细的调试日志([rjb]标记),发现:
* user_query提取逻辑能正确提取到用户问题
* 但prompt格式化时通用指令检测可能有问题
* 或者LLM服务接收到的prompt不是格式化后的prompt
3. 日志分析结果:
- 从Celery worker日志中发现
* user_query正确提取"苹果英语怎么说?"
* 通用指令检测成功is_generic_instruction=True
* formatted_prompt正确设置为"苹果英语怎么说?"
* 实际发送给DeepSeek的prompt也是"苹果英语怎么说?"
* LLM正确回答"苹果的英语是 **apple**。"
================================================================================
四、问题根因分析
================================================================================
1. 主要问题:
- LLM节点的prompt配置是通用指令"请处理用户请求。"
- 当prompt是通用指令时应该直接使用用户输入作为prompt
- 但之前的逻辑可能没有正确处理这种情况
2. 数据流转问题:
- get_node_input方法在处理非字典类型的source_output时会包装成{"input": source_output}
- 这导致LLM节点接收到的输入数据格式为{"input": "..."}
- user_query提取逻辑需要处理这种嵌套结构
3. End节点问题
- End节点在提取输出时会将所有文本字段组合
- 包括query字段导致最终输出包含用户问题
================================================================================
五、修复方案
================================================================================
1. 修复user_query提取逻辑backend/app/services/workflow_engine.py
- 添加对嵌套input字段的处理
- 优先从嵌套的input中提取query等字段
- 如果嵌套input不存在从顶层提取
- 支持多层嵌套结构
2. 修复prompt格式化逻辑backend/app/services/workflow_engine.py
- 增强通用指令检测:识别"请处理用户请求。"等通用指令
- 当检测到通用指令时直接使用user_query作为prompt
- 添加详细的调试日志,记录整个格式化过程
3. 修复End节点输出处理backend/app/services/workflow_engine.py
- 在exclude_keys中添加'query', 'USER_INPUT', 'user_input', 'user_query'
- 优先使用input字段LLM的实际输出
- 避免将用户查询字段包含在最终输出中
4. 添加LLM服务调用日志backend/app/services/llm_service.py
- 在DeepSeek API调用前记录实际发送的prompt
- 便于调试和验证prompt是否正确
================================================================================
六、修复后的验证
================================================================================
1. 测试输入:
- 用户问题:"苹果英语怎么说?"
- 输入数据:{"query": "苹果英语怎么说?", "USER_INPUT": "苹果英语怎么说?"}
2. 执行日志验证:
[rjb] 开始提取user_query: input_data={'USER_INPUT': '苹果英语怎么说?', 'query': '苹果英语怎么说?'}
[rjb] 从顶层提取: key=query, value=苹果英语怎么说?, value_type=<class 'str'>
[rjb] 提取到字符串user_query: 苹果英语怎么说?
[rjb] 最终提取的user_query: 苹果英语怎么说?
[rjb] 检测到通用指令直接使用用户输入作为prompt: 苹果英语怎么说?
[rjb] LLM节点prompt格式化: final_prompt前200字符='苹果英语怎么说?'
[rjb] 准备调用LLM: prompt前200字符='苹果英语怎么说?'
[rjb] DeepSeek实际发送的prompt前200字符: 苹果英语怎么说?
3. LLM输出验证
- LLM正确回答"苹果的英语是 **apple**。"
- 包含发音、例句、相关表达等详细信息
4. End节点输出验证
- 最终输出只包含LLM的回答内容
- 不再包含用户问题
================================================================================
七、关键代码修改点
================================================================================
1. user_query提取逻辑第467-525行
- 添加嵌套input字段检查
- 支持多层数据提取
- 添加详细的调试日志
2. prompt格式化逻辑第527-568行
- 增强通用指令检测
- 当检测到通用指令时直接使用user_query作为prompt
- 添加is_generic_instruction变量初始化
3. End节点输出处理第1780-1799行
- 在exclude_keys中添加用户查询相关字段
- 优先使用input字段
- 避免拼接用户问题
4. LLM服务调用日志backend/app/services/llm_service.py
- 在API调用前记录实际发送的prompt
================================================================================
八、测试经验总结
================================================================================
1. 调试方法:
- 使用详细的调试日志([rjb]标记)追踪数据流转
- 在关键位置添加日志数据提取、格式化、API调用
- 查看Celery worker日志工作流在Celery中执行
2. 问题定位技巧:
- 对比节点测试和完整工作流执行的差异
- 检查数据在节点间的传递格式
- 验证实际发送给LLM的prompt内容
3. 常见问题:
- 数据被包装成嵌套结构(如{"input": {...}}
- 通用指令没有被正确识别
- End节点输出包含了不应该包含的字段
4. 最佳实践:
- 在LLM节点配置中如果prompt是通用指令应该直接使用用户输入
- End节点应该只输出LLM的实际回答排除用户查询字段
- 添加详细的调试日志,便于问题定位
================================================================================
九、测试工具说明
================================================================================
1. check_execution_logs.py
- 功能查看最近的Agent执行记录和详细日志
- 输出输入数据、输出数据、执行时间线、LLM节点详细分析
- 使用方法python3 check_execution_logs.py
2. test_workflow_data_flow.py
- 功能:模拟完整工作流执行,追踪数据流转
- 输出:每个节点的输入输出、数据格式转换过程
- 使用方法python3 test_workflow_data_flow.py
3. 日志查看脚本view_logs.sh
- 功能:实时查看包含[rjb]标记的调试日志
- 使用方法:./view_logs.sh
================================================================================
十、修复验证结果
================================================================================
✅ 问题1LLM答非所问
- 状态:已修复
- 验证LLM能正确回答用户问题
✅ 问题2End节点输出包含用户问题
- 状态:已修复
- 验证最终输出只包含LLM的回答
✅ 问题3数据流转问题
- 状态:已修复
- 验证:数据在节点间正确传递,格式正确
================================================================================
十一、后续建议
================================================================================
1. 节点配置建议:
- 如果LLM节点的prompt是通用指令如"请处理用户请求。"系统会自动使用用户输入作为prompt
- 如果需要更具体的指令可以在prompt中明确说明任务类型
2. 测试建议:
- 使用check_execution_logs.py查看执行日志
- 使用Celery日志查看详细的调试信息
- 在节点配置面板中单独测试节点,对比完整工作流的执行
3. 监控建议:
- 定期检查执行日志,确认数据流转正常
- 关注LLM节点的输入输出确保prompt格式化正确
- 检查End节点的输出确保不包含用户查询字段
================================================================================
测试完成时间2026-01-19 23:55
测试人员AI Assistant
================================================================================