test_real_god.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import sys
  2. import os
  3. import json
  4. # Ensure project root is in python path
  5. sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  6. from app.agent.real_god import RealGodAgent
  7. def test_god_realism():
  8. print("=== RealGodAgent 逻辑与真实性深度测试 ===\n")
  9. # 增加 max_steps 到 10,确保有足够的思考空间
  10. # 提示词要求更具体,迫使必须搜索
  11. agent = RealGodAgent(max_steps=10)
  12. prompt = "生成两位datawhale的角色"
  13. print(f"测试提示词: {prompt}\n")
  14. print("正在启动 ReAct 循环监测...")
  15. print("-" * 50)
  16. results = []
  17. step_count = 0
  18. search_count = 0
  19. has_observation = False
  20. # 手动迭代生成器以捕获每个事件
  21. # Pass n=None to test dynamic N detection
  22. generator = agent.run(prompt, n=None)
  23. try:
  24. while True:
  25. try:
  26. event = next(generator)
  27. except StopIteration:
  28. break
  29. e_type = event.get("type")
  30. content = event.get("content")
  31. if e_type == "thought":
  32. step_count += 1
  33. print(f"\n[第 {step_count} 步 - 思考] 🤔:")
  34. print(f" {content}")
  35. elif e_type == "action":
  36. print(f"\n[行动] 🎬:")
  37. print(f" {content}")
  38. if "Search" in content or "搜索" in content:
  39. search_count += 1
  40. elif e_type == "observation":
  41. has_observation = True
  42. print(f"\n[观察/搜索结果] 👀:")
  43. # 截取部分内容展示
  44. preview = str(content)[:300].replace('\n', ' ') + "..."
  45. print(f" {preview}")
  46. elif e_type == "result":
  47. # Handle single or list results and accumulate
  48. new_results = content
  49. if isinstance(new_results, list):
  50. if isinstance(results, list):
  51. results.extend(new_results)
  52. else:
  53. results = new_results
  54. else:
  55. if isinstance(results, list):
  56. results.append(new_results)
  57. else:
  58. results = [new_results]
  59. print(f"\n[最终生成结果] 🎉:")
  60. print(json.dumps(content, ensure_ascii=False, indent=2))
  61. elif e_type == "error":
  62. print(f"\n[错误] ❌: {content}")
  63. except Exception as e:
  64. print(f"\n程序执行异常: {e}")
  65. print("\n" + "-" * 50)
  66. print("=== 测试结论分析 ===")
  67. # 1. 验证 ReAct 流程完整性
  68. if step_count > 0:
  69. print(f"✅ 逻辑测试: 智能体进行了 {step_count} 步思考。")
  70. else:
  71. print("❌ 逻辑测试: 智能体未展示思考过程,可能直接生成了结果。")
  72. # 2. 验证搜索功能
  73. if search_count > 0:
  74. print(f"✅ 工具测试: 智能体触发了 {search_count} 次搜索。")
  75. else:
  76. print("❌ 工具测试: 智能体完全未触发搜索,可能在“幻觉”或依赖预训练知识。")
  77. # 3. 验证搜索结果利用
  78. if has_observation:
  79. print("✅ 数据流测试: 智能体成功接收到了搜索结果(Observation)。")
  80. else:
  81. print("❌ 数据流测试: 智能体未获得有效的搜索反馈。")
  82. # 4. 验证最终结果真实性
  83. if results and isinstance(results, list) and len(results) >= 2:
  84. names = [p.get('name', '') for p in results]
  85. bios = [p.get('bio', '') for p in results]
  86. print(f"✅ 生成人物: {', '.join(names)}")
  87. # 检查是否包含目标人物
  88. found_target = any("Altman" in n or "奥特曼" in n for n in names) and \
  89. any("Musk" in n or "马斯克" in n for n in names)
  90. if found_target:
  91. print("✅ 真实性测试: 成功识别并生成了指定人物。")
  92. # 检查 Bio 深度
  93. avg_len = sum(len(b) for b in bios) / len(bios)
  94. if avg_len > 200:
  95. print(f"✅ 深度测试: 平均生平长度 {int(avg_len)} 字,符合深度要求。")
  96. else:
  97. print(f"⚠️ 深度测试: 平均生平长度 {int(avg_len)} 字,略显单薄。")
  98. else:
  99. print("❌ 真实性测试: 生成的人物与要求不符。")
  100. else:
  101. print("❌ 结果测试: 未能生成有效的 JSON 列表。")
  102. if __name__ == "__main__":
  103. test_god_realism()