使用BedrockEmbeddings时OpenSearch向量库维度不匹配问题
问题:AWS OpenSearch Serverless向量库维度不匹配及数据不显示问题
向量库索引配置
- 引擎:faiss
- 精度:Binary
- 维度:1024
- 距离类型:hamming
- M:16
- ef_construction:16
- ef_search:512
遇到的问题
- 调用代码添加向量时无报错,但控制台查看不到向量数据
- 执行相似性搜索时抛出错误,提示查询向量维度为8192,但Bedrock的Titan模型最多生成1024维嵌入
排查步骤
单独使用BedrockEmbeddings生成嵌入,确认其维度确实为1024
示例代码
const embeddings = new BedrockEmbeddings({ region: process.env.AWS_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }, model: 'amazon.titan-embed-text-v2:0' }); const vectorStore = new OpenSearchVectorStore(embeddings, { client, indexName: 'bedrock-knowledge-base-default-index', vectorFieldName: 'bedrock-knowledge-base-default-vector', service: 'aoss', vectorSearchOptions: { engine: 'hnsw' } }); const doc = await vectorStore.similaritySearch('what do you know about poc?', 1);
错误信息及堆栈跟踪
error ResponseError: search_phase_execution_exception: [query_shard_exception] Reason: failed to create query: Query vector has invalid dimension: 8192. Dimension should be: 1024 at onBody (/home/usr/Projects/backend/conversation/node_modules/@opensearch-project/opensearch/lib/Transport.js:426:23) at IncomingMessage.onEnd (/home/usr/Projects/backend/conversation/node_modules/@opensearch-project/opensearch/lib/Transport.js:341:11) at IncomingMessage.emit (node:events:531:35) at IncomingMessage.emit (node:domain:488:12) at endReadableNT (node:internal/streams/readable:1696:12) at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
系统及依赖信息
系统信息
- 平台:Pop!_OS 22.04 LTS
- Node版本:20.16.0
- langchain版本:0.3.11
依赖项
- @langchain/openai: >=0.1.0 <0.4.0
- @langchain/textsplitters: >=0.0.0 <0.2.0
- js-tiktoken: ^1.0.12
- js-yaml: ^4.1.0
- jsonpointer: ^5.0.1
- langsmith: ^0.2.8
- openapi-types: ^12.1.3
- p-retry: 4
- uuid: ^10.0.0
- yaml: ^2.2.1
- zod-to-json-schema: ^3.22.3
- zod: ^3.22.4
解决方法
修正向量搜索引擎配置
向量库实际使用faiss引擎,但代码中vectorSearchOptions指定为hnsw,引擎不匹配会导致向量处理逻辑错误。修改代码中的引擎配置:vectorSearchOptions: { engine: 'faiss' }适配Binary精度的向量转换
配置的是二进制精度向量,但Titan模型生成的是浮点型向量,需将浮点向量转为二进制后再存入。可以扩展BedrockEmbeddings类实现转换:class BinaryBedrockEmbeddings extends BedrockEmbeddings { async embedQuery(text) { const floatEmbedding = await super.embedQuery(text); // 将浮点值转为二进制(大于0为1,否则为0) return floatEmbedding.map(val => val > 0 ? 1 : 0); } async embedDocuments(texts) { const floatEmbeddings = await super.embedDocuments(texts); return floatEmbeddings.map(embedding => embedding.map(val => val > 0 ? 1 : 0)); } }替换原BedrockEmbeddings使用该自定义类:
const embeddings = new BinaryBedrockEmbeddings({ region: process.env.AWS_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }, model: 'amazon.titan-embed-text-v2:0' });检查索引字段映射
确认向量字段bedrock-knowledge-base-default-vector的映射类型为binary_vector,而非knn_vector。若索引自动创建导致映射错误,可手动调整索引映射:{ "mappings": { "properties": { "bedrock-knowledge-base-default-vector": { "type": "binary_vector", "dimension": 1024, "similarity": "hamming" } } } }验证数据写入逻辑
添加日志或返回值检查,确保数据写入没有静默失败:const result = await vectorStore.addDocuments([new Document({ pageContent: "test content" })]); console.log("数据写入结果:", result);
内容的提问来源于stack exchange,提问作者Dixit Tilaji
相关产品推荐
相关产品推荐

