如何修改OpenAI Embeddings API的嵌入输出维度?
如何限制text-embedding-ada-002返回的嵌入向量长度
text-embedding-ada-002模型本身固定返回1536维的嵌入向量,OpenAI官方接口没有提供直接修改向量长度的参数,你需要在获取到完整向量后自行处理,以下是两种可行方案:
方案一:直接截断向量
最简单的方式是截取向量的前N个元素,快速得到目标长度的向量,适合对计算效率要求高的场景:
import { Configuration, OpenAIApi } from 'openai'; const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, }); const openai = new OpenAIApi(configuration); async function getTruncatedEmbedding(text, targetLength) { const parameters = { model: 'text-embedding-ada-002', input: text, }; const resp = await openai.createEmbedding(parameters); const fullEmbedding = resp.data.data[0].embedding; // 若目标长度大于原向量长度,直接返回原向量;否则截取前targetLength个元素 return fullEmbedding.slice(0, targetLength); } // 调用示例:获取长度为512的嵌入向量 const truncatedEmbedding = await getTruncatedEmbedding('需要生成嵌入的文本', 512);
方案二:使用降维算法保留关键信息
如果希望尽可能保留向量的核心特征,可以用PCA(主成分分析)等降维算法,需要引入第三方机器学习库(比如ml.js):
import { Configuration, OpenAIApi } from 'openai'; import { PCA } from 'ml-pca'; const configuration = new Configuration({ apiKey: process.env.OPENAI_API_KEY, }); const openai = new OpenAIApi(configuration); async function getReducedEmbedding(text, targetLength) { const parameters = { model: 'text-embedding-ada-002', input: text, }; const resp = await openai.createEmbedding(parameters); const fullEmbedding = resp.data.data[0].embedding; // 初始化PCA并训练(单向量训练仅作演示,实际场景建议用批量数据训练PCA模型) const pca = new PCA([fullEmbedding]); // 将向量降维到目标长度 const reducedEmbedding = pca.predict(fullEmbedding, { nComponents: targetLength }); return reducedEmbedding; } // 调用示例:将向量降维到512维 const reducedEmbedding = await getReducedEmbedding('需要生成嵌入的文本', 512);
两种方案对比
- 截断法:实现简单、计算快,但可能丢失尾部维度的信息,适合对精度要求不高的场景。
- 降维法:能保留更多关键特征,但需要额外的计算资源和依赖库,适合对向量精度有要求的场景。
内容的提问来源于stack exchange,提问作者Nadsah
相关产品推荐
相关产品推荐

