You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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扩展提供),可通过以下步骤解决:

  1. 安装pgvector Ruby适配器
    将pgvector gem添加到Gemfile,执行bundle install:

    gem 'pgvector'
    
  2. 注册向量字段类型
    在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)
    
  3. 验证修复效果
    重启Rails控制台后,再次执行ScrapedDocument.first,embedding字段会被正确识别为Pgvector::Vector对象,不再出现OID错误。

  4. 相似性查询示例
    类型识别正常后即可执行向量相似性查询,例如余弦相似度排序:

    # 构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:09