便携式使用文本嵌入的最佳方法是使用 Parquet 和 Polars
Max Woolf 关于嵌入的精彩文章,他使用 32,000 个《万智牌》卡片嵌入的矢量集合来探索存储和处理它们的有效方法。
Max 提倡使用暴力方法来进行最近邻计算:
许多人不知道文本嵌入的是,如果您的数据不太大,则不需要矢量数据库来计算最近邻相似度。使用numpy和我的 Magic 卡嵌入,维度为 768D 的 32,254 个
float32
嵌入的 2D 矩阵(常见于“较小的”LLM 嵌入模型)占用94.49 MB的系统内存,这对于现代个人计算机来说相对较低,并且可以适合云虚拟机的免费使用层。
他使用这段精彩的 Python 代码片段按距离查找前 K 个匹配项:
def fast_dot_product (查询,矩阵, k = 3 ): dot_products =查询@矩阵。时间 idx = np . argpartition ( dot_products , - k )[ - k :] idx = idx [ np . argsort ( dot_products [ idx ])[:: - 1 ]] 分数=点产品[ idx ] 返回idx ,分数
由于点积是线性代数的一个基本方面,numpy 的实现速度非常快:在额外的 numpy排序技巧的帮助下,在我的 M3 Pro MacBook Pro 上,计算所有 32,254 个点积,找到前 3 个最相似的嵌入,并返回它们相应的矩阵
idx
和余弦相似度score
,平均只需要1.08 毫秒。
我通过 Claude 3.7 Sonnet 运行了该 Python 代码以获得解释,我可以使用他们全新的“共享聊天”功能在此处分享。直到关于numpy.argpartition !
他探索了多种有效存储这些嵌入向量的选项,发现简单的 CSV 存储需要 631.5 MB,而 pickle 使用 94.49 MB,而他的首选选项 Parquet via Polars使用94.3 MB ,并启用了一些简洁的零拷贝优化技巧。
标签:嵌入, parquet , python , max-woolf , claude
原文: https://simonwillison.net/2025/Feb/24/text-embeddings-parquet/#atom-everything