| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import sys
- import os
- import json
- # Ensure project root is in python path
- sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
- from app.agent.real_god import RealGodAgent
- def test_god_realism():
- print("=== RealGodAgent 逻辑与真实性深度测试 ===\n")
-
- # 增加 max_steps 到 10,确保有足够的思考空间
- # 提示词要求更具体,迫使必须搜索
- agent = RealGodAgent(max_steps=10)
-
- prompt = "生成两位datawhale的角色"
-
- print(f"测试提示词: {prompt}\n")
- print("正在启动 ReAct 循环监测...")
- print("-" * 50)
-
- results = []
- step_count = 0
- search_count = 0
- has_observation = False
-
- # 手动迭代生成器以捕获每个事件
- # Pass n=None to test dynamic N detection
- generator = agent.run(prompt, n=None)
-
- try:
- while True:
- try:
- event = next(generator)
- except StopIteration:
- break
-
- e_type = event.get("type")
- content = event.get("content")
-
- if e_type == "thought":
- step_count += 1
- print(f"\n[第 {step_count} 步 - 思考] 🤔:")
- print(f" {content}")
-
- elif e_type == "action":
- print(f"\n[行动] 🎬:")
- print(f" {content}")
- if "Search" in content or "搜索" in content:
- search_count += 1
-
- elif e_type == "observation":
- has_observation = True
- print(f"\n[观察/搜索结果] 👀:")
- # 截取部分内容展示
- preview = str(content)[:300].replace('\n', ' ') + "..."
- print(f" {preview}")
-
- elif e_type == "result":
- # Handle single or list results and accumulate
- new_results = content
- if isinstance(new_results, list):
- if isinstance(results, list):
- results.extend(new_results)
- else:
- results = new_results
- else:
- if isinstance(results, list):
- results.append(new_results)
- else:
- results = [new_results]
-
- print(f"\n[最终生成结果] 🎉:")
- print(json.dumps(content, ensure_ascii=False, indent=2))
-
- elif e_type == "error":
- print(f"\n[错误] ❌: {content}")
- except Exception as e:
- print(f"\n程序执行异常: {e}")
- print("\n" + "-" * 50)
- print("=== 测试结论分析 ===")
-
- # 1. 验证 ReAct 流程完整性
- if step_count > 0:
- print(f"✅ 逻辑测试: 智能体进行了 {step_count} 步思考。")
- else:
- print("❌ 逻辑测试: 智能体未展示思考过程,可能直接生成了结果。")
-
- # 2. 验证搜索功能
- if search_count > 0:
- print(f"✅ 工具测试: 智能体触发了 {search_count} 次搜索。")
- else:
- print("❌ 工具测试: 智能体完全未触发搜索,可能在“幻觉”或依赖预训练知识。")
-
- # 3. 验证搜索结果利用
- if has_observation:
- print("✅ 数据流测试: 智能体成功接收到了搜索结果(Observation)。")
- else:
- print("❌ 数据流测试: 智能体未获得有效的搜索反馈。")
-
- # 4. 验证最终结果真实性
- if results and isinstance(results, list) and len(results) >= 2:
- names = [p.get('name', '') for p in results]
- bios = [p.get('bio', '') for p in results]
-
- print(f"✅ 生成人物: {', '.join(names)}")
-
- # 检查是否包含目标人物
- found_target = any("Altman" in n or "奥特曼" in n for n in names) and \
- any("Musk" in n or "马斯克" in n for n in names)
-
- if found_target:
- print("✅ 真实性测试: 成功识别并生成了指定人物。")
-
- # 检查 Bio 深度
- avg_len = sum(len(b) for b in bios) / len(bios)
- if avg_len > 200:
- print(f"✅ 深度测试: 平均生平长度 {int(avg_len)} 字,符合深度要求。")
- else:
- print(f"⚠️ 深度测试: 平均生平长度 {int(avg_len)} 字,略显单薄。")
- else:
- print("❌ 真实性测试: 生成的人物与要求不符。")
- else:
- print("❌ 结果测试: 未能生成有效的 JSON 列表。")
- if __name__ == "__main__":
- test_god_realism()
|