demo_scoring_methods.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #!/usr/bin/env python3
  2. """
  3. 演示不同算分方法的效果
  4. """
  5. import asyncio
  6. from lib.text_embedding import compare_phrases
  7. import time
  8. async def demo_default_method():
  9. """演示默认算分方法"""
  10. print("=" * 70)
  11. print("1. 默认算分方法: ai_direct")
  12. print("=" * 70)
  13. print()
  14. print("默认情况下,compare_phrases() 使用 AI 直接判断语义相似度")
  15. print("这与 semantic_similarity.py 的方法完全相同\n")
  16. phrase_a = "深度学习"
  17. phrase_b = "神经网络"
  18. print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")
  19. # 不指定 method,使用默认值 ai_direct
  20. result = await compare_phrases(phrase_a, phrase_b)
  21. print("返回结果:")
  22. print(f" 相似度: {result['相似度']}")
  23. print(f" 说明: {result['说明']}")
  24. print()
  25. print("工作原理:")
  26. print(" 1. AI 读取两个短语")
  27. print(" 2. AI 理解它们的语义")
  28. print(" 3. AI 直接给出相似度分数和理由")
  29. print()
  30. async def demo_all_methods():
  31. """演示所有算分方法"""
  32. print("=" * 70)
  33. print("2. 对比所有算分方法")
  34. print("=" * 70)
  35. print()
  36. test_pairs = [
  37. ("深度学习", "神经网络"),
  38. ("机器学习", "人工智能"),
  39. ("Python编程", "Java开发"),
  40. ("今天吃饭", "深度学习"),
  41. ]
  42. methods = {
  43. "ai_direct": "AI 直接判断(默认)",
  44. "cosine": "余弦相似度",
  45. "euclidean": "欧氏距离",
  46. "manhattan": "曼哈顿距离",
  47. "dot_product": "点积相似度",
  48. }
  49. for pair_idx, (phrase_a, phrase_b) in enumerate(test_pairs, 1):
  50. print(f"\n测试 {pair_idx}: 【{phrase_a}】 vs 【{phrase_b}】")
  51. print("-" * 70)
  52. results = []
  53. for method, description in methods.items():
  54. result = await compare_phrases(
  55. phrase_a, phrase_b,
  56. method=method,
  57. dim=128 # 使用较小维度加快测试
  58. )
  59. results.append((method, description, result['相似度']))
  60. # 按相似度排序
  61. results.sort(key=lambda x: x[2], reverse=True)
  62. for method, description, score in results:
  63. bar = "█" * int(score * 30) # 可视化
  64. print(f" {description:25s} {score:.3f} {bar}")
  65. print()
  66. async def demo_speed_comparison():
  67. """演示不同方法的速度对比"""
  68. print("=" * 70)
  69. print("3. 速度对比(缓存机制演示)")
  70. print("=" * 70)
  71. print()
  72. phrase_a = "测试文本A"
  73. phrase_b = "测试文本B"
  74. print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")
  75. # 第一次调用(无缓存)
  76. print("第一次调用(无缓存):")
  77. start = time.time()
  78. result1 = await compare_phrases(phrase_a, phrase_b)
  79. time1 = time.time() - start
  80. print(f" 耗时: {time1:.2f} 秒")
  81. print(f" 相似度: {result1['相似度']}")
  82. print()
  83. # 第二次调用(有缓存)
  84. print("第二次调用(有缓存):")
  85. start = time.time()
  86. result2 = await compare_phrases(phrase_a, phrase_b)
  87. time2 = time.time() - start
  88. print(f" 耗时: {time2:.2f} 秒")
  89. print(f" 相似度: {result2['相似度']}")
  90. print(f" 加速比: {time1/time2:.1f}x")
  91. print()
  92. print("结论:")
  93. print(" - 首次调用需要请求 AI,耗时较长")
  94. print(" - 缓存命中后,速度极快(几乎瞬间)")
  95. print(" - 生产环境中,缓存大幅降低成本和延迟")
  96. print()
  97. async def demo_accuracy_vs_speed():
  98. """演示准确度 vs 速度的权衡"""
  99. print("=" * 70)
  100. print("4. 准确度 vs 速度权衡")
  101. print("=" * 70)
  102. print()
  103. test_cases = [
  104. ("深度学习", "神经网络", "高度相关"),
  105. ("机器学习", "人工智能", "相关"),
  106. ("Python", "Java", "弱相关"),
  107. ("编程", "吃饭", "不相关"),
  108. ]
  109. print("测试不同语义关系的短语对:\n")
  110. for phrase_a, phrase_b, relation in test_cases:
  111. print(f"【{phrase_a}】 vs 【{phrase_b}】 (预期: {relation})")
  112. # AI 直接判断(最准确)
  113. result_ai = await compare_phrases(phrase_a, phrase_b, method="ai_direct")
  114. # 余弦相似度(次准确)
  115. result_cosine = await compare_phrases(phrase_a, phrase_b, method="cosine", dim=128)
  116. print(f" AI 判断: {result_ai['相似度']:.3f} - {result_ai['说明'][:40]}...")
  117. print(f" 余弦相似度: {result_cosine['相似度']:.3f}")
  118. # 对比差异
  119. diff = abs(result_ai['相似度'] - result_cosine['相似度'])
  120. print(f" 差异: {diff:.3f}")
  121. print()
  122. print("结论:")
  123. print(" - AI 直接判断: 准确度最高,能给出详细理由")
  124. print(" - 余弦相似度: 速度更快,但可能不如 AI 准确")
  125. print(" - 建议: 默认使用 AI 直接判断,批量计算时考虑余弦")
  126. print()
  127. async def demo_method_selection_guide():
  128. """演示如何选择算分方法"""
  129. print("=" * 70)
  130. print("5. 算分方法选择指南")
  131. print("=" * 70)
  132. print()
  133. print("┌─────────────────────────────────────────────────────────┐")
  134. print("│ 场景 │ 推荐方法 │")
  135. print("├─────────────────────────────────────────────────────────┤")
  136. print("│ 日常使用,追求准确度 │ ai_direct (默认) ⭐ │")
  137. print("│ 批量计算,已有向量 │ cosine │")
  138. print("│ 需要详细解释原因 │ ai_direct (默认) │")
  139. print("│ 对成本敏感,大量计算 │ cosine │")
  140. print("│ 与 semantic_similarity 兼容 │ ai_direct (默认) │")
  141. print("│ 需要稳定可复现的结果 │ cosine/euclidean │")
  142. print("└─────────────────────────────────────────────────────────┘")
  143. print()
  144. print("使用建议:")
  145. print()
  146. print("1️⃣ 99% 的情况,直接用默认值(不传 method 参数)")
  147. print(" result = await compare_phrases('A', 'B') # 使用 ai_direct")
  148. print()
  149. print("2️⃣ 批量计算时,可以考虑 cosine")
  150. print(" result = await compare_phrases('A', 'B', method='cosine')")
  151. print()
  152. print("3️⃣ 不确定时,用默认值就对了!")
  153. print()
  154. async def main():
  155. """运行所有演示"""
  156. print("\n")
  157. print("╔══════════════════════════════════════════════════════════════════╗")
  158. print("║ 默认算分逻辑演示 - text_embedding.py ║")
  159. print("╚══════════════════════════════════════════════════════════════════╝")
  160. print()
  161. # 1. 默认方法
  162. await demo_default_method()
  163. input("按回车继续下一个演示...")
  164. print("\n")
  165. # 2. 对比所有方法
  166. await demo_all_methods()
  167. input("按回车继续下一个演示...")
  168. print("\n")
  169. # 3. 速度对比
  170. await demo_speed_comparison()
  171. input("按回车继续下一个演示...")
  172. print("\n")
  173. # 4. 准确度 vs 速度
  174. await demo_accuracy_vs_speed()
  175. input("按回车继续下一个演示...")
  176. print("\n")
  177. # 5. 选择指南
  178. await demo_method_selection_guide()
  179. print("=" * 70)
  180. print("所有演示完成!")
  181. print("=" * 70)
  182. print()
  183. print("核心结论:")
  184. print(" ✅ 默认使用 ai_direct(不需要指定 method 参数)")
  185. print(" ✅ 与 semantic_similarity.py 完全兼容")
  186. print(" ✅ 有缓存机制,第二次调用极快")
  187. print(" ✨ 支持多种算分方法,按需选择")
  188. print()
  189. if __name__ == "__main__":
  190. asyncio.run(main())