• 一次不成功的 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]
  • Arg Parser

    前几天我写了一个简单的词法分析器项目:https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。 通过词法分析快速生成 lora 训练集。在这个过程中,我需要通过命令行参数给这个 java 程序传递一些参数。 [Read More]
    Tags: