在Supabase Deno函数中使用postgres.js执行OpenAI嵌入查询报错求助
解决pg_vector查询时的"malformed vector literal"错误
问题原因
你遇到的错误是因为postgres.js在将OpenAI返回的嵌入数组插值到SQL语句时,直接把数组转换成了逗号分隔的纯字符串,而pg_vector要求向量字面量必须用方括号[]包裹(比如[0.1,0.2,...]),否则PostgreSQL无法识别为合法的vector类型。
解决方案
以下两种方式均可解决问题:
方式1:手动构造合法的向量字符串
将嵌入数组转换成带方括号的格式后再传入SQL:
const [{ embedding }] = embeddingResponse.data.data; // 手动给数组添加方括号,构造pg_vector能识别的字面量 const query_embedding = `[${embedding.join(',')}]`; const res = await sql` select id, content, 1 - (documents.embedding <=> ${query_embedding}) as similarity from documents where 1 - (documents.embedding <=> ${query_embedding}) > ${similarity_threshold} order by documents.embedding <=> ${query_embedding} limit ${match_count} `;
方式2:使用postgres.js的类型转换
利用postgres.js的sql.array方法指定类型为vector,确保参数被正确解析:
import postgres from 'https://deno.land/x/postgresjs/mod.js' const [{ embedding }] = embeddingResponse.data.data; const res = await sql` select id, content, 1 - (documents.embedding <=> sql.array(${embedding}, sql`vector`)) as similarity from documents where 1 - (documents.embedding <=> sql.array(${embedding}, sql`vector`)) > ${similarity_threshold} order by documents.embedding <=> sql.array(${embedding}, sql`vector`) limit ${match_count} `;
额外验证要点
- 确保你的
embedding数组长度是1536,和表中定义的vector(1536)一致; - 两种方式都能让PostgreSQL正确识别向量格式,避免字面量错误。
内容的提问来源于stack exchange,提问作者Rodrigo Rubio
相关产品推荐
相关产品推荐

