rogerioc/vector-ranking-study
GitHub: rogerioc/vector-ranking-study
通过假设检验方法逆向重建黑盒向量数据库排名评分公式的研究项目,将余弦相似度、L∞ 范数归一化和分量惩罚项逐层分离并精确复现。
Stars: 0 | Forks: 0
# 逆向工程一个向量数据库的排名函数
一个小型研究项目:给定一个返回相似度分数但没有说明其排名机制的**黑盒向量数据库**,我仅通过线性代数和系统的假设检验,从观察到的输入/输出对中重建了其精确的评分公式。
## 问题描述
一个向量数据库为每个查询返回了排名,但分数与普通的余弦相似度不匹配。由此产生了两个问题:
1. 在余弦相似度之上应用了什么转换?
2. 能否精确复现它,使得本地的 `search()` 能够匹配引擎的输出?
## 方法
我将该引擎视为一个**预言机**:输入已知的查询/候选向量,记录它返回的分数,从而分离出公式。
**1 — 余弦基准。** 为每个候选者计算 `cos(q, c)`。返回的分数始终*大于*余弦值,因此应用了一个依赖于查询的因子。
**2 — 分离归一化因子。** 对于未被惩罚的候选者,我求解了 `F(q) = score / cos(q, c)`,并将其与查询的范数(L1、L2、L∞、各个分量)进行关联。结果与 **L∞ 范数** 完美匹配 —— 即查询的最大绝对值分量的倒数:
```
F(q) = 1 / ||q||∞ = 1 / max(|q_i|) → score_base = cos(q, c) / max(|q_i|)
```
(在采样的查询中,最大绝对值分量恰好是最后一个,这就是为什么 `1/|q_last|` 也能拟合数据的原因 —— 但 `1/||q||∞` 是正确的推广形式,这也是经过验证的实现所采用的。)
**3 — 寻找惩罚项。** 一部分候选者的得分远低于其余弦相似度所预测的值。它们的共同特征是:**第一个分量为负数**(`c[0] < 0`)。求解该比例得到了一个常数:
```
if c[0] < 0: score = score_base / 3.0
```
**4 — 验证。** 重新实现了 `search()`,并针对真实查询数据的预言机分数进行了比较 —— 完全匹配(见 `valida_search.py`)。
## 重建的函数
```
import math
from typing import List, Tuple
def search(query: List[float],
candidates: List[Tuple[str, List[float]]]) -> List[Tuple[str, float]]:
norm_q = math.sqrt(sum(x * x for x in query))
if norm_q == 0:
return [(cid, 0.0) for cid, _ in candidates]
factor = 1.0 / max(abs(x) for x in query) # 1 / L∞ norm of the query
results = []
for cid, c in candidates:
norm_c = math.sqrt(sum(x * x for x in c))
cos = 0.0 if norm_c == 0 else sum(q * v for q, v in zip(query, c)) / (norm_q * norm_c)
score = cos * factor
if c[0] < 0: # penalty for negative leading component
score /= 3.0
results.append((cid, score))
results.sort(key=lambda r: r[1], reverse=True)
return results
```
## 仓库内容
| 文件 | 用途 |
|---|---|
| `pipeline.py` | 重建的 `search()` 函数。 |
| `analyzer.py` | 探索工具 —— 探测预言机数据并测试范数假设。 |
| `valida_search.py` | 将 `search()` 输出与记录的分数进行比较的验证脚本。 |
| `constante_norma.md` | 详细的数学推导 (PT)。 |
| `dados.txt` | 采样查询/候选向量及其观察到的分数。 |
## 这展示了什么
- 熟悉 **embedding 和向量搜索背后的数学原理** —— 余弦相似度、L2/L∞ 范数、内积等价性。
- 对未公开文档的系统(探测预言机、一次分离一个变量)采用严谨的**假设检验方法**。
- 具备推理排名行为的能力,而不仅仅是调用 API。
## 技术栈
`Python` · 应用线性代数 · 向量相似度 · 排名分析
*由专注于应用 AI 的高级软件工程师 [Rogério Celestino](https://rogerioc.github.io/about/) 构建。*
标签:代码示例, 向量数据库, 数学建模, 数据分析, 相似度计算, 算法逆向分析, 逆向工具, 黑盒测试