如何让ActiveRecord识别PgVector向量字段以实现相似性查询?
如何让ActiveRecord识别PostgreSQL向量字段并支持相似性查询?
问题描述
已通过如下迁移代码在PostgreSQL中创建了带向量字段的表:
create_table :scraped_documents do |t| t.references :client, null: false, foreign_key: true t.column :embedding, :vector, limit: 1536 t.text :content t.timestamps end
但执行ScrapedDocument.first查询时,出现如下错误:
unknown OID 42268: failed to recognize type of 'embedding'. It will be treated as String.
解决方案
该问题源于ActiveRecord默认不识别PostgreSQL的vector类型(由pgvector扩展提供),可通过以下步骤解决:
安装pgvector Ruby适配器
将pgvectorgem添加到Gemfile,执行bundle install:gem 'pgvector'注册向量字段类型
在app/models/scraped_document.rb中显式声明字段类型:class ScrapedDocument < ApplicationRecord belongs_to :client attribute :embedding, :vector end若需全局注册向量类型,可在
config/initializers/pgvector.rb中添加:ActiveRecord::Type.register(:vector, Pgvector::VectorType)验证修复效果
重启Rails控制台后,再次执行ScrapedDocument.first,embedding字段会被正确识别为Pgvector::Vector对象,不再出现OID错误。相似性查询示例
类型识别正常后即可执行向量相似性查询,例如余弦相似度排序:# 构造1536维目标向量 target_embedding = Array.new(1536) { rand(-1.0..1.0) } # 查询最相似的5条记录 ScrapedDocument.order("embedding <=> '#{target_embedding}'").limit(5) # 或使用pgvector简化语法 ScrapedDocument.order(embedding: :cosine).limit(5)
内容的提问来源于stack exchange,提问作者Petran
相关产品推荐
相关产品推荐

