使用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
相关产品推荐
相关产品推荐

