test_route_graph.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from __future__ import annotations
  2. """测试路线评估阶段子图:验证酒店位置评估与每日景点路线衔接。"""
  3. import asyncio
  4. from rich.console import Console
  5. from rich.table import Table
  6. from app.graph.route_builder import (
  7. build_route_graph,
  8. )
  9. console = Console()
  10. async def main() -> None:
  11. graph = await build_route_graph()
  12. result = await graph.ainvoke(
  13. {
  14. "user_query": (
  15. "我和妻子计划2026年8月10日"
  16. "从上海去成都,8月13日返回,"
  17. "总预算8000元。"
  18. "喜欢熊猫、自然景观和川菜,"
  19. "行程安排轻松一些。"
  20. "酒店每晚不超过600元,"
  21. "评分不低于4.5,"
  22. "并且希望靠近地铁。"
  23. "机票价格和便利性综合考虑。"
  24. ),
  25. "errors": [],
  26. "missing_fields": [],
  27. }
  28. )
  29. console.rule("[bold]路线评估结果")
  30. console.print(result["final_answer"])
  31. route_result = result.get(
  32. "route_evaluation_result"
  33. )
  34. if route_result is None:
  35. console.print(
  36. {
  37. "错误": result.get("errors"),
  38. "警告": result.get(
  39. "route_warnings"
  40. ),
  41. }
  42. )
  43. return
  44. console.print(
  45. {
  46. "参考景点": (
  47. route_result
  48. .reference_attractions
  49. ),
  50. "距离调用次数": (
  51. route_result
  52. .distance_call_count
  53. ),
  54. "周边搜索次数": (
  55. route_result
  56. .around_search_call_count
  57. ),
  58. "最终酒店ID": (
  59. route_result
  60. .selected_hotel_id
  61. ),
  62. "警告数": len(
  63. route_result.warnings
  64. ),
  65. }
  66. )
  67. table = Table(
  68. title="酒店综合路线排名"
  69. )
  70. table.add_column("排名")
  71. table.add_column("酒店")
  72. table.add_column("综合分")
  73. table.add_column("原酒店分")
  74. table.add_column("景点平均距离")
  75. table.add_column("平均驾车时间")
  76. table.add_column("最近地铁")
  77. table.add_column("原因")
  78. for index, hotel in enumerate(
  79. route_result.evaluated_hotels,
  80. start=1,
  81. ):
  82. average_distance = (
  83. f"{hotel.average_distance_meters / 1000:.1f}km"
  84. if hotel.average_distance_meters
  85. is not None
  86. else "未知"
  87. )
  88. average_duration = (
  89. f"{hotel.average_duration_seconds / 60:.0f}分钟"
  90. if hotel.average_duration_seconds
  91. is not None
  92. else "未知"
  93. )
  94. subway_distance = (
  95. f"{hotel.nearest_subway_distance_meters:.0f}m"
  96. if hotel
  97. .nearest_subway_distance_meters
  98. is not None
  99. else "未知"
  100. )
  101. table.add_row(
  102. str(index),
  103. hotel.hotel_name,
  104. f"{hotel.final_score:.2f}",
  105. f"{hotel.base_hotel_score:.2f}",
  106. average_distance,
  107. average_duration,
  108. subway_distance,
  109. ";".join(hotel.reasons),
  110. )
  111. console.print(table)
  112. if route_result.warnings:
  113. console.rule("[bold yellow]警告")
  114. for warning in route_result.warnings:
  115. console.print(f"- {warning}")
  116. if __name__ == "__main__":
  117. asyncio.run(main())