# 默认算分逻辑说明 ## 两个模块的默认算分逻辑对比 ### 1. `semantic_similarity.py` 的默认算分逻辑 #### 默认方法 **AI 直接判断**(唯一方法) #### 工作原理 ``` 用户输入: "深度学习" vs "神经网络" ↓ 发送给 AI 的 Prompt: 从语意角度,判断【深度学习】和【神经网络】的相似度,从0-1打分,输出json格式 ```json { "说明": "简明扼要说明理由", "相似度": 0.0, } ``` ↓ AI 理解语义后返回: { "说明": "两者都是人工智能领域的核心概念,深度学习是基于神经网络的...", "相似度": 0.85 } ``` #### 特点 - ✅ **优点**: AI 深度理解语义,准确度高 - ✅ **优点**: 能理解上下文、隐含关系 - ⚠️ **缺点**: 需要调用 AI,速度较慢(首次) - ⚠️ **缺点**: 有 token 成本 --- ### 2. `text_embedding.py` 的默认算分逻辑 #### 默认方法 **AI 直接判断** (`method="ai_direct"`) 与 `semantic_similarity.py` 完全相同! #### 工作原理(默认) ``` 用户输入: "深度学习" vs "神经网络" ↓ 发送给 AI 的 Prompt: 请计算以下两个文本的语义相似度,输出 0-1 之间的分数。 文本A:【深度学习】 文本B:【神经网络】 输出格式: ```json { "similarity": 0.0, "method": "semantic_analysis", "explanation": "相似度判断的理由" } ``` ↓ AI 返回结果后,转换为兼容格式: { "说明": "相似度判断的理由", "相似度": 0.85 } ``` #### 额外支持的算分方法 除了默认的 AI 直接判断,还支持基于向量的计算方法: --- ## 详细算分方法对比 ### 方法 1: `ai_direct` (默认,推荐)⭐ **原理**: AI 直接理解语义并打分 **优点**: - ✅ 准确度最高 - ✅ 能理解复杂的语义关系 - ✅ 能理解上下文、同义词、隐含意义 **缺点**: - ⚠️ 需要调用 AI(但有缓存,第二次很快) - ⚠️ 有 token 成本 **适用场景**: - 需要高准确度的语义分析 - 文本有复杂的语义关系 - 不在意首次调用的时间成本 **示例**: ```python result = await compare_phrases("深度学习", "神经网络", method="ai_direct") # 相似度: 0.85 # 说明: "两者都是AI领域的核心概念..." ``` --- ### 方法 2: `cosine` (余弦相似度) **原理**: 1. 先把两段文字转换成向量(数字数组) 2. 计算两个向量的夹角 3. 夹角越小 → 相似度越高 **数学公式**: ``` 相似度 = cos(θ) = (A·B) / (|A| × |B|) 其中: - A, B 是两个向量 - A·B 是点积 - |A|, |B| 是向量的模(长度) ``` **取值范围**: -1 到 1 - 1: 完全相同 - 0: 无关 - -1: 完全相反 **优点**: - ✅ 计算速度快(向量生成后) - ✅ 数学方法,结果稳定 - ✅ 不受向量长度影响 **缺点**: - ⚠️ 需要先生成向量(首次需要调用 AI) - ⚠️ 对语义的理解不如 AI 直接判断 **适用场景**: - 需要批量计算相似度 - 需要结果稳定可复现 - 已经有向量,不想再调用 AI **示例**: ```python result = await compare_phrases("深度学习", "神经网络", method="cosine", dim=128) # 相似度: 0.78 # 说明: "基于 cosine 方法计算的向量相似度" ``` --- ### 方法 3: `euclidean` (欧氏距离) **原理**: 1. 把文字转换成向量(多维空间中的点) 2. 计算两点之间的直线距离 3. 距离越近 → 相似度越高 **数学公式**: ``` 距离 = √[(a1-b1)² + (a2-b2)² + ... + (an-bn)²] 相似度 = 1 / (1 + 距离) # 归一化到 0-1 ``` **取值范围**: 0 到 1 - 1: 完全相同(距离=0) - 0: 完全不同(距离→∞) **优点**: - ✅ 直观(就是空间距离) - ✅ 计算简单 **缺点**: - ⚠️ 受向量长度影响 - ⚠️ 高维空间中可能不够准确 **适用场景**: - 需要直观的距离度量 - 向量长度有意义的场景 **示例**: ```python result = await compare_phrases("深度学习", "神经网络", method="euclidean", dim=128) # 相似度: 0.65 # 说明: "基于 euclidean 方法计算的向量相似度" ``` --- ### 方法 4: `manhattan` (曼哈顿距离) **原理**: 类似走城市街道,只能沿坐标轴方向移动 **数学公式**: ``` 距离 = |a1-b1| + |a2-b2| + ... + |an-bn| 相似度 = 1 / (1 + 距离) # 归一化到 0-1 ``` **取值范围**: 0 到 1 **优点**: - ✅ 对噪声不敏感 - ✅ 计算快 **缺点**: - ⚠️ 不适合高维空间 **适用场景**: - 数据有噪声 - 需要对异常值鲁棒 **示例**: ```python result = await compare_phrases("深度学习", "神经网络", method="manhattan", dim=128) # 相似度: 0.62 # 说明: "基于 manhattan 方法计算的向量相似度" ``` --- ### 方法 5: `dot_product` (点积) **原理**: 计算两个向量的点积,用 sigmoid 归一化 **数学公式**: ``` 点积 = a1×b1 + a2×b2 + ... + an×bn 相似度 = 1 / (1 + e^(-点积)) # sigmoid 归一化 ``` **取值范围**: 0 到 1 **优点**: - ✅ 计算最快 - ✅ 考虑向量长度(方向+幅度) **缺点**: - ⚠️ 受向量长度影响大 **适用场景**: - 向量长度有意义 - 需要极快的计算速度 **示例**: ```python result = await compare_phrases("深度学习", "神经网络", method="dot_product", dim=128) # 相似度: 0.71 # 说明: "基于 dot_product 方法计算的向量相似度" ``` --- ## 方法选择指南 ### 📊 准确度排名 ``` ai_direct > cosine > euclidean ≈ manhattan ≈ dot_product ``` ### ⚡ 速度排名(向量已生成) ``` dot_product > manhattan > euclidean > cosine >> ai_direct ``` ### 💰 成本排名 ``` ai_direct (需要调用 AI) >> 向量方法 (首次需要生成向量) ``` --- ## 实际测试对比 ```python # 测试短语 phrase_a = "深度学习" phrase_b = "神经网络" # 不同方法的结果(示例) ┌──────────────┬──────────┬────────────────────────────┐ │ 方法 │ 相似度 │ 说明 │ ├──────────────┼──────────┼────────────────────────────┤ │ ai_direct │ 0.850 │ AI 深度理解,最准确 │ │ cosine │ 0.780 │ 向量夹角,次准确 │ │ euclidean │ 0.650 │ 欧氏距离 │ │ manhattan │ 0.620 │ 曼哈顿距离 │ │ dot_product │ 0.710 │ 点积 │ └──────────────┴──────────┴────────────────────────────┘ ``` --- ## 默认选择建议 ### 如果你不确定用哪个,建议: **1. 默认使用 `ai_direct`** ⭐ ```python # 不传 method 参数,默认就是 ai_direct result = await compare_phrases("深度学习", "神经网络") ``` **原因**: - ✅ 准确度最高 - ✅ 有缓存机制,第二次很快 - ✅ 与 semantic_similarity 完全一致 --- **2. 批量计算时可以考虑 `cosine`** ```python # 如果要计算大量相似度,可以先生成所有向量 model = SentenceModel(dim=128) # 生成向量(只需一次) vectors = await model.encode(all_texts) # 然后用 cosine 快速计算 for i in range(len(all_texts)): for j in range(i+1, len(all_texts)): result = await compare_phrases( all_texts[i], all_texts[j], method="cosine" ) ``` --- ## 总结 ### `semantic_similarity.py` - **唯一方法**: AI 直接判断 - **返回格式**: `{说明, 相似度}` ### `text_embedding.py` 的 `compare_phrases()` - **默认方法**: AI 直接判断(与 semantic_similarity 相同) - **返回格式**: `{说明, 相似度}` (完全兼容) - **额外功能**: 支持 5 种计算方法 - `ai_direct` - AI 判断(默认)⭐ - `cosine` - 余弦相似度 - `euclidean` - 欧氏距离 - `manhattan` - 曼哈顿距离 - `dot_product` - 点积 ### 推荐 - **日常使用**: 默认 `ai_direct`,不需要指定 method - **批量计算**: 考虑 `cosine` - **完全兼容**: 可以直接替换 `semantic_similarity.compare_phrases()`