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

使用Prisma调用Neon SQL向量匹配函数失败问题求助

解决Prisma调用自定义向量检索SQL函数的类型不匹配问题

问题核心

报错的根本原因是参数类型不匹配:

  • 自定义SQL函数match_documents期望的参数类型为vector(1536)、float、int
  • Prisma自动将JavaScript的number[]转换为PostgreSQL的numeric[],number类型分别转为numeric和bigint,导致数据库找不到匹配的函数签名

解决方案

1. 在Raw SQL中显式转换参数类型

直接在查询语句里给每个参数添加PostgreSQL类型转换,强制匹配函数定义的类型:

const embeddingResponse = await openai.embeddings.create({
    model: 'text-embedding-ada-002',
    input,
})

const [{ embedding }] = embeddingResponse.data

const query_embedding: number[] = embedding
const match_threshold: number = .73
const match_count: number = 4

// 给参数添加显式类型转换
const data = await prisma.$queryRaw`
  SELECT * FROM match_documents(
    ${query_embedding}::vector(1536),
    ${match_threshold}::float,
    ${match_count}::int
  )
`

通过::vector(1536)将数值数组转为pgvector类型,::float和::int分别修正阈值和计数的类型,让参数完全匹配函数定义。

2. 确认依赖环境正确性

  • 确保Neon数据库已安装pgvector扩展(vector类型由该扩展提供),若未安装,执行以下SQL:
CREATE EXTENSION IF NOT EXISTS vector;
  • 检查sources表的vector字段类型是否为vector(1536),需和函数参数的向量维度完全一致。

3. 可选:使用Prisma类型安全辅助(避免类型歧义)

如果需要更强的类型约束,可以用Prisma.Sql构建查询,确保参数类型传递准确:

import { Prisma } from '@prisma/client';

const query = Prisma.sql`
  SELECT * FROM match_documents(
    ${Prisma.raw(`${JSON.stringify(query_embedding)}::vector(1536)`)},
    ${match_threshold}::float,
    ${match_count}::int
  )
`;
const data = await prisma.$queryRaw(query);

注意:使用Prisma.raw时需确保输入安全,避免SQL注入风险。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:32:31