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

如何用SQLAlchemy在pgvector中存储高精度DeepFace图像嵌入向量?

解决方案:保留向量完整精度存储

问题根源在于默认的Vector类型使用单精度浮点数(float32)存储,而DeepFace生成的是双精度浮点数(float64),导致精度丢失。以下是两种可行的解决方式:

方案一:使用pgvector的Vector类型指定双精度

修改列定义时,为Vector指定dtype='double precision',让pgvector以双精度存储向量元素:

from sqlalchemy import (Column,String,Integer,CHAR,
                        Date,Float, DECIMAL,LargeBinary,select)
from sqlalchemy.orm import declarative_base
from pgvector.sqlalchemy import Vector
Base= declarative_base()

class Student(Base):
    __tablename__="student_details"
    name = Column("name",String,nullable=False)
    dob = Column("dob",Date,nullable=False)
    gender = Column("gender",CHAR(10),nullable=False)
    # 指定双精度存储,匹配DeepFace生成的向量精度
    front_vector = Column("front_vector",Vector(128, dtype='double precision'))

此方式创建的列类型为vector(128, double precision),会完整保留原始向量的精度。

方案二:直接使用PostgreSQL双精度数组类型

完全对应pgvector官网示例的double precision[]类型,用SQLAlchemy的ARRAY结合双精度浮点数定义列:

from sqlalchemy import (Column,String,Integer,CHAR,
                        Date,Float, DECIMAL,LargeBinary,select, ARRAY)
from sqlalchemy.orm import declarative_base
Base= declarative_base()

class Student(Base):
    __tablename__="student_details"
    name = Column("name",String,nullable=False)
    dob = Column("dob",Date,nullable=False)
    gender = Column("gender",CHAR(10),nullable=False)
    # Float(precision=53)对应PostgreSQL的double precision类型
    front_vector = Column("front_vector",ARRAY(Float(precision=53)))

若后续需要使用pgvector的索引功能,可执行以下SQL创建索引:

CREATE INDEX idx_student_front_vector ON student_details USING gist (front_vector vector_ops);

验证方式

插入数据后查询front_vector列,可看到元素完整保留原始精度(如-0.7108331918716431),而非截断后的-0.7108332。

内容的提问来源于stack exchange,提问作者jugesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:09