| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #!/usr/bin/env python3
- """
- 演示不同算分方法的效果
- """
- import asyncio
- from lib.text_embedding import compare_phrases
- import time
- async def demo_default_method():
- """演示默认算分方法"""
- print("=" * 70)
- print("1. 默认算分方法: ai_direct")
- print("=" * 70)
- print()
- print("默认情况下,compare_phrases() 使用 AI 直接判断语义相似度")
- print("这与 semantic_similarity.py 的方法完全相同\n")
- phrase_a = "深度学习"
- phrase_b = "神经网络"
- print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")
- # 不指定 method,使用默认值 ai_direct
- result = await compare_phrases(phrase_a, phrase_b)
- print("返回结果:")
- print(f" 相似度: {result['相似度']}")
- print(f" 说明: {result['说明']}")
- print()
- print("工作原理:")
- print(" 1. AI 读取两个短语")
- print(" 2. AI 理解它们的语义")
- print(" 3. AI 直接给出相似度分数和理由")
- print()
- async def demo_all_methods():
- """演示所有算分方法"""
- print("=" * 70)
- print("2. 对比所有算分方法")
- print("=" * 70)
- print()
- test_pairs = [
- ("深度学习", "神经网络"),
- ("机器学习", "人工智能"),
- ("Python编程", "Java开发"),
- ("今天吃饭", "深度学习"),
- ]
- methods = {
- "ai_direct": "AI 直接判断(默认)",
- "cosine": "余弦相似度",
- "euclidean": "欧氏距离",
- "manhattan": "曼哈顿距离",
- "dot_product": "点积相似度",
- }
- for pair_idx, (phrase_a, phrase_b) in enumerate(test_pairs, 1):
- print(f"\n测试 {pair_idx}: 【{phrase_a}】 vs 【{phrase_b}】")
- print("-" * 70)
- results = []
- for method, description in methods.items():
- result = await compare_phrases(
- phrase_a, phrase_b,
- method=method,
- dim=128 # 使用较小维度加快测试
- )
- results.append((method, description, result['相似度']))
- # 按相似度排序
- results.sort(key=lambda x: x[2], reverse=True)
- for method, description, score in results:
- bar = "█" * int(score * 30) # 可视化
- print(f" {description:25s} {score:.3f} {bar}")
- print()
- async def demo_speed_comparison():
- """演示不同方法的速度对比"""
- print("=" * 70)
- print("3. 速度对比(缓存机制演示)")
- print("=" * 70)
- print()
- phrase_a = "测试文本A"
- phrase_b = "测试文本B"
- print(f"测试短语: 【{phrase_a}】 vs 【{phrase_b}】\n")
- # 第一次调用(无缓存)
- print("第一次调用(无缓存):")
- start = time.time()
- result1 = await compare_phrases(phrase_a, phrase_b)
- time1 = time.time() - start
- print(f" 耗时: {time1:.2f} 秒")
- print(f" 相似度: {result1['相似度']}")
- print()
- # 第二次调用(有缓存)
- print("第二次调用(有缓存):")
- start = time.time()
- result2 = await compare_phrases(phrase_a, phrase_b)
- time2 = time.time() - start
- print(f" 耗时: {time2:.2f} 秒")
- print(f" 相似度: {result2['相似度']}")
- print(f" 加速比: {time1/time2:.1f}x")
- print()
- print("结论:")
- print(" - 首次调用需要请求 AI,耗时较长")
- print(" - 缓存命中后,速度极快(几乎瞬间)")
- print(" - 生产环境中,缓存大幅降低成本和延迟")
- print()
- async def demo_accuracy_vs_speed():
- """演示准确度 vs 速度的权衡"""
- print("=" * 70)
- print("4. 准确度 vs 速度权衡")
- print("=" * 70)
- print()
- test_cases = [
- ("深度学习", "神经网络", "高度相关"),
- ("机器学习", "人工智能", "相关"),
- ("Python", "Java", "弱相关"),
- ("编程", "吃饭", "不相关"),
- ]
- print("测试不同语义关系的短语对:\n")
- for phrase_a, phrase_b, relation in test_cases:
- print(f"【{phrase_a}】 vs 【{phrase_b}】 (预期: {relation})")
- # AI 直接判断(最准确)
- result_ai = await compare_phrases(phrase_a, phrase_b, method="ai_direct")
- # 余弦相似度(次准确)
- result_cosine = await compare_phrases(phrase_a, phrase_b, method="cosine", dim=128)
- print(f" AI 判断: {result_ai['相似度']:.3f} - {result_ai['说明'][:40]}...")
- print(f" 余弦相似度: {result_cosine['相似度']:.3f}")
- # 对比差异
- diff = abs(result_ai['相似度'] - result_cosine['相似度'])
- print(f" 差异: {diff:.3f}")
- print()
- print("结论:")
- print(" - AI 直接判断: 准确度最高,能给出详细理由")
- print(" - 余弦相似度: 速度更快,但可能不如 AI 准确")
- print(" - 建议: 默认使用 AI 直接判断,批量计算时考虑余弦")
- print()
- async def demo_method_selection_guide():
- """演示如何选择算分方法"""
- print("=" * 70)
- print("5. 算分方法选择指南")
- print("=" * 70)
- print()
- print("┌─────────────────────────────────────────────────────────┐")
- print("│ 场景 │ 推荐方法 │")
- print("├─────────────────────────────────────────────────────────┤")
- print("│ 日常使用,追求准确度 │ ai_direct (默认) ⭐ │")
- print("│ 批量计算,已有向量 │ cosine │")
- print("│ 需要详细解释原因 │ ai_direct (默认) │")
- print("│ 对成本敏感,大量计算 │ cosine │")
- print("│ 与 semantic_similarity 兼容 │ ai_direct (默认) │")
- print("│ 需要稳定可复现的结果 │ cosine/euclidean │")
- print("└─────────────────────────────────────────────────────────┘")
- print()
- print("使用建议:")
- print()
- print("1️⃣ 99% 的情况,直接用默认值(不传 method 参数)")
- print(" result = await compare_phrases('A', 'B') # 使用 ai_direct")
- print()
- print("2️⃣ 批量计算时,可以考虑 cosine")
- print(" result = await compare_phrases('A', 'B', method='cosine')")
- print()
- print("3️⃣ 不确定时,用默认值就对了!")
- print()
- async def main():
- """运行所有演示"""
- print("\n")
- print("╔══════════════════════════════════════════════════════════════════╗")
- print("║ 默认算分逻辑演示 - text_embedding.py ║")
- print("╚══════════════════════════════════════════════════════════════════╝")
- print()
- # 1. 默认方法
- await demo_default_method()
- input("按回车继续下一个演示...")
- print("\n")
- # 2. 对比所有方法
- await demo_all_methods()
- input("按回车继续下一个演示...")
- print("\n")
- # 3. 速度对比
- await demo_speed_comparison()
- input("按回车继续下一个演示...")
- print("\n")
- # 4. 准确度 vs 速度
- await demo_accuracy_vs_speed()
- input("按回车继续下一个演示...")
- print("\n")
- # 5. 选择指南
- await demo_method_selection_guide()
- print("=" * 70)
- print("所有演示完成!")
- print("=" * 70)
- print()
- print("核心结论:")
- print(" ✅ 默认使用 ai_direct(不需要指定 method 参数)")
- print(" ✅ 与 semantic_similarity.py 完全兼容")
- print(" ✅ 有缓存机制,第二次调用极快")
- print(" ✨ 支持多种算分方法,按需选择")
- print()
- if __name__ == "__main__":
- asyncio.run(main())
|