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

使用BedrockEmbeddings时OpenSearch向量库维度不匹配问题

问题:AWS OpenSearch Serverless向量库维度不匹配及数据不显示问题

向量库索引配置

  • 引擎:faiss
  • 精度:Binary
  • 维度:1024
  • 距离类型:hamming
  • M:16
  • ef_construction:16
  • ef_search:512

遇到的问题

  1. 调用代码添加向量时无报错,但控制台查看不到向量数据
  2. 执行相似性搜索时抛出错误,提示查询向量维度为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

解决方法

  1. 修正向量搜索引擎配置
    向量库实际使用faiss引擎,但代码中vectorSearchOptions指定为hnsw,引擎不匹配会导致向量处理逻辑错误。修改代码中的引擎配置:

    vectorSearchOptions: {
        engine: 'faiss'
    }
    
  2. 适配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'
    });
    
  3. 检查索引字段映射
    确认向量字段bedrock-knowledge-base-default-vector的映射类型为binary_vector,而非knn_vector。若索引自动创建导致映射错误,可手动调整索引映射:

    {
        "mappings": {
            "properties": {
                "bedrock-knowledge-base-default-vector": {
                    "type": "binary_vector",
                    "dimension": 1024,
                    "similarity": "hamming"
                }
            }
        }
    }
    
  4. 验证数据写入逻辑
    添加日志或返回值检查,确保数据写入没有静默失败:

    const result = await vectorStore.addDocuments([new Document({ pageContent: "test content" })]);
    console.log("数据写入结果:", result);
    

内容的提问来源于stack exchange,提问作者Dixit Tilaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:33:14