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

AWS Bedrock知识库同步失败:100+阿拉伯语文件嵌入报错求助

本地复现AWS Bedrock知识库同步流程并排查嵌入失败问题

一、本地复现核心步骤

Bedrock知识库同步的核心流程是「S3文件读取→文本提取→调用嵌入模型」,可以拆解为以下步骤在本地复现:

  • 1. 提取报错文件的纯文本内容
    用本地工具提取文件文本,确保和Bedrock的提取逻辑一致(保留阿拉伯语排版、特殊字符):

    • PDF文件:使用pdftotext命令
      pdftotext -layout "报错文件.pdf" "提取文本.txt"
      
    • MD/HTML文件:使用pandoc转纯文本
      pandoc -s "报错文件.md" -o "提取文本.txt"
      
  • 2. 直接调用Bedrock的Cohere嵌入模型API
    用AWS SDK在本地模拟Bedrock的模型调用,传入提取的文本,验证是否触发相同错误:

    import boto3
    import json
    
    # 初始化Bedrock客户端(替换为你的AWS区域)
    bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
    
    # 读取提取的文本
    with open("提取文本.txt", "r", encoding="utf-8") as f:
        text_content = f.read()
    
    # 构造模型请求参数(匹配Bedrock默认配置)
    request_payload = {
        "texts": [text_content],
        "input_type": "search_document",
        "truncate": "END"
    }
    
    try:
        response = bedrock.invoke_model(
            modelId="cohere.embed-multilingual-v3",
            contentType="application/json",
            accept="application/json",
            body=json.dumps(request_payload)
        )
        result = json.loads(response['body'].read())
        print(f"嵌入成功,向量长度:{len(result['embeddings'][0])}")
    except Exception as e:
        print(f"调用报错:{str(e)}")
    
  • 3. 模拟Bedrock默认分块逻辑
    即使未手动配置分块,Bedrock会默认按「1024 tokens单块、200 tokens重叠」拆分长文本。可以用Cohere的tokenizer模拟分块后再调用模型:

    from cohere import Client
    import boto3
    import json
    
    cohere_client = Client(api_key="你的Cohere API密钥") # 或用Bedrock兼容的token计算逻辑
    bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
    
    with open("提取文本.txt", "r", encoding="utf-8") as f:
        text_content = f.read()
    
    # 计算文本token数并拆分
    tokens = cohere_client.tokenize(text_content).tokens
    chunk_size = 1024
    overlap = 200
    text_chunks = []
    
    for i in range(0, len(tokens), chunk_size - overlap):
        chunk_tokens = tokens[i:i+chunk_size]
        chunk_text = cohere_client.detokenize(chunk_tokens).text
        text_chunks.append(chunk_text)
    
    # 逐个测试分块嵌入
    for idx, chunk in enumerate(text_chunks):
        try:
            payload = {"texts": [chunk], "input_type": "search_document", "truncate": "END"}
            response = bedrock.invoke_model(
                modelId="cohere.embed-multilingual-v3",
                contentType="application/json",
                accept="application/json",
                body=json.dumps(payload)
            )
            print(f"分块 {idx+1} 嵌入成功")
        except Exception as e:
            print(f"分块 {idx+1} 报错:{str(e)}")
    

二、针对性排查方向

  • 检查特殊字符与控制字符
    阿拉伯语可能包含变音符号、双向文本标记,或不可见控制字符(如零宽度空格)。可以用Python打印字符编码排查:

    text_content = open("提取文本.txt", "r", encoding="utf-8").read()
    # 检查前100个字符的Unicode编码
    for idx, char in enumerate(text_content[:100]):
        print(f"位置 {idx}: {repr(char)} (Unicode: {ord(char)})")
    
  • 验证文件编码
    确保文件为UTF-8编码,非标准编码可能触发参数错误:

    file -I "提取文本.txt"
    
  • 清除内置元数据
    部分文件(如PDF)内置XMP元数据,可能干扰模型处理,可移除后测试:

    exiftool -all= "报错文件.pdf"
    

三、快速定位问题

优先挑选1-2个报错文件,通过逐步缩短文本片段(比如只保留前100字、后100字)测试,快速定位触发错误的具体内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:52:37