能否直接通过S3 URL调用Bedrock的Anthropic Claude进行OCR处理?
问题解答
目前AWS Bedrock的官方API(包括调用Anthropic Claude模型的InvokeModel或InvokeModelWithResponseStream)不支持直接指定S3 URL来自动拉取文件进行OCR处理,必须将文件内容转换为字节流或Base64编码后,作为请求体的一部分发送给Bedrock。
替代方案
1. 用AWS Lambda做中间层处理
你可以编写一个Lambda函数,让它负责从S3下载文件、转换格式,再调用Bedrock的Claude模型完成OCR。你只需要向Lambda传入S3存储桶和文件路径即可,不用在本地处理文件。示例代码如下:
import boto3 import json import base64 s3_client = boto3.client('s3') bedrock_runtime = boto3.client('bedrock-runtime', region_name='us-east-1') def lambda_handler(event, context): # 从事件中获取S3路径信息 bucket_name = event['bucket'] file_key = event['key'] # 从S3读取文件内容 s3_response = s3_client.get_object(Bucket=bucket_name, Key=file_key) file_content = s3_response['Body'].read() # 根据文件后缀判断媒体类型 media_type = "application/pdf" if file_key.endswith('.pdf') else \ "image/jpeg" if file_key.endswith('.jpg') or file_key.endswith('.jpeg') else \ "image/png" # 构造Claude的请求体(以Claude 3为例) request_body = { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 2048, "messages": [ { "role": "user", "content": [ { "type": "image" if media_type.startswith('image/') else "document", "source": { "type": "base64", "media_type": media_type, "data": base64.b64encode(file_content).decode('utf-8') } }, { "type": "text", "text": "请提取这份文档/图片中的所有文本内容" } ] } ] } # 调用Bedrock的Claude模型 bedrock_response = bedrock_runtime.invoke_model( modelId="anthropic.claude-3-sonnet-20240229-v1:0", body=json.dumps(request_body), contentType="application/json", accept="application/json" ) # 解析返回结果 result = json.loads(bedrock_response['Body'].read()) return {"extracted_text": result['content'][0]['text']}
2. 利用Bedrock知识库(适用于需反复处理或结合问答的场景)
如果你需要对S3中的文件进行OCR并用于后续的问答检索,可以创建一个Bedrock知识库并关联你的S3存储桶。Bedrock会自动对存储桶中的PDF、图片等文件进行OCR提取文本并建立索引,之后你可以通过RetrieveAndGenerate API获取文件中的文本内容或进行问答交互。不过这种方式更适合长期存储的文档管理,而非单次OCR处理。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

