256 lines
6.7 KiB
Markdown
256 lines
6.7 KiB
Markdown
# Phase R.4:高级特性(可选)
|
||
|
||
日期:2026-04-03
|
||
状态:已规划(可选)
|
||
工作量:4.5 天
|
||
|
||
---
|
||
|
||
## 1. 本阶段目的
|
||
|
||
探索更高级的 RAG 增强技术。
|
||
|
||
> **注意:** 本阶段为可选特性,不影响核心功能。根据实际需求决定是否实施。
|
||
|
||
---
|
||
|
||
## 2. 核心任务
|
||
|
||
### Task R.4.1:语义去重
|
||
|
||
**目标:** 消除冗余检索结果
|
||
|
||
**新增文件:** `backend/app/services/deduplicator.py`
|
||
|
||
```python
|
||
import numpy as np
|
||
|
||
class SemanticDeduplicator:
|
||
"""语义去重,消除冗余检索结果"""
|
||
|
||
DEDUP_THRESHOLD = 0.88 # 余弦相似度阈值
|
||
|
||
def deduplicate(
|
||
self,
|
||
results: list[SearchResult],
|
||
embeddings: list[np.ndarray]
|
||
) -> list[SearchResult]:
|
||
if len(results) <= 1:
|
||
return results
|
||
|
||
# 计算余弦相似度矩阵
|
||
n = len(results)
|
||
similarity_matrix = np.zeros((n, n))
|
||
|
||
for i in range(n):
|
||
for j in range(i + 1, n):
|
||
sim = self._cosine_similarity(embeddings[i], embeddings[j])
|
||
similarity_matrix[i][j] = sim
|
||
similarity_matrix[j][i] = sim
|
||
|
||
# 贪心去重
|
||
keep = [True] * n
|
||
for i in range(n):
|
||
if not keep[i]:
|
||
continue
|
||
for j in range(i + 1, n):
|
||
if keep[j] and similarity_matrix[i][j] > self.DEDUP_THRESHOLD:
|
||
keep[j] = False
|
||
|
||
return [r for r, k in zip(results, keep) if k]
|
||
|
||
def _cosine_similarity(self, a: np.ndarray, b: np.ndarray) -> float:
|
||
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
|
||
```
|
||
|
||
---
|
||
|
||
### Task R.4.2:语义分桶(可选)
|
||
|
||
**目标:** 按主题自动组织检索结果
|
||
|
||
**新增文件:** `backend/app/services/semantic_bucket.py`
|
||
|
||
```python
|
||
from collections import defaultdict
|
||
import numpy as np
|
||
|
||
class SemanticBucketing:
|
||
"""语义分桶,按主题自动组织检索结果"""
|
||
|
||
async def bucket_by_topic(
|
||
self,
|
||
results: list[SearchResult],
|
||
embeddings: list[np.ndarray]
|
||
) -> dict[str, list[SearchResult]]:
|
||
# 使用层次聚类
|
||
from sklearn.cluster import AgglomerativeClustering
|
||
|
||
n_clusters = min(5, len(results))
|
||
if n_clusters < 2:
|
||
return {"default": results}
|
||
|
||
clusterer = AgglomerativeClustering(n_clusters=n_clusters)
|
||
labels = clusterer.fit_predict(np.array(embeddings))
|
||
|
||
buckets = defaultdict(list)
|
||
for r, label in zip(results, labels):
|
||
buckets[f"topic_{label}"].append(r)
|
||
|
||
# 按每个桶内最高分排序
|
||
sorted_buckets = {}
|
||
for name, items in buckets.items():
|
||
sorted_items = sorted(items, key=lambda x: x.score, reverse=True)
|
||
sorted_buckets[name] = sorted_items
|
||
|
||
return sorted_buckets
|
||
```
|
||
|
||
---
|
||
|
||
### Task R.4.3:EPA 分析设计(探索)
|
||
|
||
**目标:** 语义空间投影分析方案设计
|
||
|
||
```python
|
||
class EPAModule:
|
||
"""
|
||
EPA: Embedding Projection Analysis
|
||
|
||
分析向量在语义空间中的投影,识别:
|
||
- 逻辑深度 (Logic Depth): 意图聚焦程度
|
||
- 熵 (Entropy): 信息散乱程度
|
||
- 共振 (Resonance): 跨域关联程度
|
||
|
||
注意:此模块为高级特性,复杂度高,建议后续探索。
|
||
"""
|
||
|
||
def project(self, vector: np.ndarray) -> dict:
|
||
"""
|
||
返回语义投影结果:
|
||
- logic_depth: 0~1, 高=意图聚焦
|
||
- entropy: 0~1, 高=信息散乱
|
||
- resonance: 跨域共振程度
|
||
- dominant_axes: 主要语义轴
|
||
"""
|
||
raise NotImplementedError("EPA 模块探索中")
|
||
|
||
def detect_cross_domain_resonance(self, vector: np.ndarray) -> dict:
|
||
"""
|
||
检测跨域共振:
|
||
- 当查询同时触及多个正交语义轴时触发
|
||
- 返回共振强度和涉及的主要领域
|
||
"""
|
||
raise NotImplementedError("EPA 模块探索中")
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 新增测试
|
||
|
||
```python
|
||
# backend/tests/services/test_deduplicator.py
|
||
|
||
class TestSemanticDeduplicator:
|
||
def test_deduplicate_similar_results(self):
|
||
dedup = SemanticDeduplicator()
|
||
|
||
results = [
|
||
SearchResult(chunk_id="1", score=0.9, ...),
|
||
SearchResult(chunk_id="2", score=0.85, ...),
|
||
SearchResult(chunk_id="3", score=0.8, ...),
|
||
]
|
||
embeddings = [
|
||
np.array([0.1, 0.2, 0.3]),
|
||
np.array([0.11, 0.21, 0.31]), # 与第一个高度相似
|
||
np.array([0.9, 0.8, 0.7]), # 与第一个不相似
|
||
]
|
||
|
||
deduped = dedup.deduplicate(results, embeddings)
|
||
assert len(deduped) < len(results) # 应该去掉一些重复结果
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 验收标准
|
||
|
||
- [ ] 语义去重测试通过
|
||
- [ ] 语义分桶原型完成(可选)
|
||
- [ ] EPA 分析方案设计完成(可选实现)
|
||
|
||
---
|
||
|
||
## 5. 变更文件清单
|
||
|
||
| 文件 | 操作 | 说明 |
|
||
|------|------|------|
|
||
| `backend/app/services/deduplicator.py` | 新增 | 语义去重 |
|
||
| `backend/app/services/semantic_bucket.py` | 新增(可选) | 语义分桶 |
|
||
| `backend/tests/services/test_deduplicator.py` | 新增 | 去重测试 |
|
||
|
||
---
|
||
|
||
## 6. 工作量估算
|
||
|
||
| 任务 | 估算 | 状态 |
|
||
|------|------|------|
|
||
| R.4.1 语义去重 | 1.5 天 | 必须 |
|
||
| R.4.2 语义分桶 | 2 天 | 可选 |
|
||
| R.4.3 EPA 设计 | 1 天 | 可选 |
|
||
| **R.4 总计(必须)** | **1.5 天** | |
|
||
| **R.4 总计(含可选)** | **4.5 天** | |
|
||
|
||
---
|
||
|
||
## 7. EPA 分析详细设计(供后续参考)
|
||
|
||
### 7.1 核心概念
|
||
|
||
EPA (Embedding Projection Analysis) 受 VCPToolBox TagMemo V6 启发,用于分析查询向量在语义空间中的投影特征。
|
||
|
||
### 7.2 关键指标
|
||
|
||
| 指标 | 定义 | 计算方式 |
|
||
|------|------|----------|
|
||
| Logic Depth | 意图聚焦程度 | 通过计算投影熵值判断 |
|
||
| Entropy | 信息散乱程度 | 向量分布的熵 |
|
||
| Resonance | 跨域共振 | 查询跨越多个语义轴的程度 |
|
||
|
||
### 7.3 动态 Beta 公式
|
||
|
||
```
|
||
β = σ(L · log(1 + R) - S · noise_penalty)
|
||
```
|
||
|
||
- L: Logic Depth
|
||
- R: Resonance
|
||
- S: 噪音程度
|
||
- σ: 归一化函数
|
||
|
||
### 7.4 残差金字塔
|
||
|
||
对查询向量进行多级剥离:
|
||
|
||
1. 首轮匹配 → 获取主要语义
|
||
2. 计算残差 → 提取被掩盖的微弱信号
|
||
3. 递归搜索 → 直到 90% 能量被解释
|
||
|
||
### 7.5 LIF 脉冲扩散
|
||
|
||
模拟神经元的脉冲传导:
|
||
|
||
1. 种子节点激活
|
||
2. 沿共现矩阵向外扩散(2跳限制)
|
||
3. 阈值过滤噪音
|
||
4. 涌现拓扑关联
|
||
|
||
---
|
||
|
||
## 8. 风险与注意事项
|
||
|
||
| 风险 | 影响 | 缓解措施 |
|
||
|------|------|----------|
|
||
| EPA 实现复杂度高 | 高 | Phase R.4 可选,暂不实现 |
|
||
| 聚类计算开销 | 中 | 限制聚类数量,使用高效算法 |
|
||
| 去重阈值调参 | 中 | 提供配置项,允许用户调整 |
|