• 在 PG 中支持矩阵乘法

    在 PG 中支持矩阵乘法 Tensor Dancer 项目核心目标之一,是在 PostgreSQL 中提供张量计算能力。这里我们从一个最简单的需求开始:支持矩阵乘法,使我们可以对 pgvector 的向量使用 PCA 矩阵降维。 关键代码 将一个n维向量V降到m维,可以简单的理解为用一个 n*m的矩阵 T 乘以 n 的转置, $$ 这是一个非常基本的线性代数算法,在 BLAS 库中提供了通用的矩阵乘法。我们可以简单的调用这个函数。 int mul_matrix_vector_f32(struct Matrix *matrix, float *vector, float *result) { cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, (int) matrix->rows, 1, (int) matrix->columns, 1.0, (float *) matrix->data, (int) matrix->columns, vector, 1, 0.0, result,... [Read More]
  • 一次不成功的 pull request

    一次不成功的 pull request 昨天,我向 pgvector 提交的一个降维算法被拒绝了 Submit a simple vector dimensionality reduction function 。 这个结果对我来说,并不意外。顶多算是略有遗憾。我习惯使用ollama ,而ollama的embedding接口返回的是4096维度,远大于PGVector索引支持的最大维度2000。关于这个问题,我第一个想法是修改PGVector的维度限制,不过这个issue很快被拒绝了 Increased max dimensions for index from 2000 to 4096 。原因也很简单,PGVector这个限制其实来自PostgreSQL,PG的索引页最大为8K,所以PGVector的索引维度最大不能超过2000。 在此之后,我就开始尝试实现一个实用的降维算法。 一般来说,PCA(主成分分析)总是被首先推荐的,这玩意儿甚至是花书的一个重要示例。但是我并没有将 PCA 作为首选。这是因为: PCA 基于样本空间进行降维,但是我希望首先有一个不依赖预备知识,可以直接对任意向量进行降维操作的算法。 当然,完全零知识的前提下是无法有效降维的,我希望的是首先找到一个足够简单,但是对 ollama 的嵌入向量有效的压缩算法,可以将这些 4096 维的向量压缩到 256甚至更低的维度,但是仍然可以足够有效的用于 RAG 应用。如果能做到第一步,再继续尝试对其它类似的embedding向量构造算法。这样我就可以无状态的使用它。 PGVector并不是一个很大的项目,我希望我的降维算法也足够简单,可以不依赖很重的外部资源,使用朴素的c语言实现。而PCA需要计算协方差和特征值或奇异值矩阵,这需要引入LAPACK和BLAS库,或者自己写出相关的算法。 因此,我尝试了一些朴素的,甚至可以说是非常朴素的算法。例如对m维降到n维的,直接用 n/m 划分原向量,再对每一组取平均值(我称之为norm 或 integral reduce)。再比如先算出相邻维度的差分,然后找到前n-1个最大的差分,以此为边界将原向量分割为n份,再求平均值——我称之为diff reduce——这多少有点儿像PCA,没办法,对一个向量(1xN矩阵),实在没办法求特征值,我看到的同行的实现,都是加入了一些白噪声维度再计算PCA,而这比我期待的还是重了一些。 我的意思是,关于PG的浮点数计算,我有很多有野心的想法,但是目前我希望写出一个足够小的函数,可以让PGVector社区毫无压力的接受它。所以我重点实验了一下几种不需要样本数据集,不需要引入额外维度,不需要ggml,也不需要lapack之类的算法库支持的微型算法。 很意外,效果最好的,居然是最简单的按固定区间分组求平均值的算法——我称之为... [Read More]
  • 个人版 AI 辅助系统的尝试

    在 CSDN 的时候,我就一直想要有自己的 AI 工作环境。我们组只有一台高配的办公服务器,用于训练模型,分析数据。通常来说这台机器都很忙。如果想要 做一些研究工作或试验,资源就有点紧张了。而我自己的工作机,虽然是一台买了只有四五年的高配 MacBook Pro,但是做 AI 已经不太够用。即使训练一个非常 朴素的文本分类器,也要花费太多时间。那几年我偏好用传统的算法而非 AI 工具解决问题,其实也有这个原因。并非我不能驾驭 AI 技术,只是因地制宜而已。 何况团队里的年轻人们对 AI 相关工作做的非常好,我更关注那些更需要有人站出来解决的东西。 [Read More]