Files
aiagent/test_memory_functionality.py
2026-01-22 09:59:02 +08:00

176 lines
7.9 KiB
Python
Executable File
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.
#!/usr/bin/env python3
"""
测试记忆功能
参考工作流调用测试总结.txt的测试方法
"""
import sys
sys.path.insert(0, 'backend')
from app.core.database import SessionLocal
from app.models.agent import Agent
from app.models.execution import Execution
from app.models.execution_log import ExecutionLog
import json
from datetime import datetime
def test_memory_functionality():
"""测试记忆功能"""
db = SessionLocal()
try:
# 获取智能聊天助手Agent
agent = db.query(Agent).filter(
Agent.name == '智能聊天助手(完整示例)'
).first()
if not agent:
print("❌ 未找到'智能聊天助手(完整示例)'Agent")
return
print(f"✅ 找到Agent: {agent.name} (ID: {agent.id})")
print("="*80)
# 获取最近的两次执行(应该对应两次对话)
executions = db.query(Execution).filter(
Execution.agent_id == agent.id
).order_by(Execution.created_at.desc()).limit(2).all()
if len(executions) < 2:
print(f"⚠️ 只找到 {len(executions)} 次执行需要至少2次执行来测试记忆功能")
print("请先进行两次对话测试")
return
print(f"\n找到 {len(executions)} 次执行记录")
print("="*80)
# 分析每次执行
for i, exec_record in enumerate(reversed(executions), 1): # 按时间正序
print(f"\n{'='*80}")
print(f"执行 {i}: {exec_record.id}")
print(f"输入: {exec_record.input_data}")
print(f"时间: {exec_record.created_at}")
print(f"状态: {exec_record.status}")
# 检查关键节点的数据流转
nodes_to_check = [
('cache-query', '查询记忆'),
('transform-merge', '合并上下文'),
('llm-question', '问题回答'),
('cache-update', '更新记忆'),
('llm-format', '格式化回复'),
('end-1', '最终输出')
]
for node_id, label in nodes_to_check:
# 查找节点执行完成的日志
log = db.query(ExecutionLog).filter(
ExecutionLog.execution_id == exec_record.id,
ExecutionLog.node_id == node_id,
ExecutionLog.message.like(f'节点 {node_id}%执行完成')
).first()
if not log:
# 如果没有执行完成的日志,查找开始执行的日志
log = db.query(ExecutionLog).filter(
ExecutionLog.execution_id == exec_record.id,
ExecutionLog.node_id == node_id,
ExecutionLog.message.like(f'节点 {node_id}%开始执行')
).first()
if log and log.data:
data_key = 'output' if '执行完成' in log.message else 'input'
data = log.data.get(data_key, {})
print(f"\n{label} ({node_id}):")
if isinstance(data, dict):
print(f" keys: {list(data.keys())}")
# 检查memory字段
if 'memory' in data:
memory = data['memory']
if isinstance(memory, dict):
print(f" ✅ memory存在keys: {list(memory.keys())}")
if 'conversation_history' in memory:
history = memory['conversation_history']
if isinstance(history, list):
print(f" ✅ conversation_history: {len(history)}")
if history:
print(f" 最新一条: {history[-1].get('content', '')[:50]}")
else:
print(f" ❌ conversation_history不是list: {type(history)}")
# 检查conversation_history字段可能在顶层
elif 'conversation_history' in data:
history = data['conversation_history']
if isinstance(history, list):
print(f" ✅ conversation_history在顶层: {len(history)}")
if history:
print(f" 最新一条: {history[-1].get('content', '')[:50]}")
# 对于end节点检查最终输出
if node_id == 'end-1' and 'output' in data:
output = data['output']
if isinstance(output, str):
print(f" ✅ 最终输出: {output[:200]}")
# 检查是否包含名字
if '老七' in output:
print(f" ✅ 输出中包含名字'老七'")
else:
print(f" ❌ 输出中不包含名字'老七'")
elif isinstance(data, str):
print(f" 输出类型: str, 内容: {data[:200]}")
if '老七' in data:
print(f" ✅ 输出中包含名字'老七'")
else:
print(f" ❌ 输出中不包含名字'老七'")
else:
print(f"\n{label} ({node_id}): ❌ 未找到执行日志")
# 检查最终输出
if exec_record.output_data:
output_data = exec_record.output_data
if isinstance(output_data, dict):
result = output_data.get('result', '')
if isinstance(result, str):
print(f"\n最终结果: {result[:200]}")
if '老七' in result:
print(f"✅ 最终结果中包含名字'老七'")
else:
print(f"❌ 最终结果中不包含名字'老七'")
# 检查Redis中的记忆数据
print(f"\n{'='*80}")
print("检查Redis中的记忆数据:")
try:
from app.core.redis_client import get_redis_client
redis_client = get_redis_client()
if redis_client:
keys = redis_client.keys('user_memory_*')
if keys:
for key in keys:
value = redis_client.get(key)
if value:
try:
memory_data = json.loads(value)
if 'conversation_history' in memory_data:
history = memory_data['conversation_history']
print(f"{key}: {len(history)} 条对话记录")
if history:
print(f" 最新一条: {history[-1].get('content', '')[:50]}")
except:
print(f" ⚠️ {key}: 无法解析JSON")
else:
print(" ❌ Redis中没有找到记忆数据")
else:
print(" ⚠️ Redis客户端不可用")
except Exception as e:
print(f" ⚠️ 检查Redis失败: {str(e)}")
print(f"\n{'='*80}")
print("测试完成")
finally:
db.close()
if __name__ == '__main__':
test_memory_functionality()