iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0

前言

今天要開始學習處理多模態應用,這裏使用者會輸入不僅是文字也可能是圖片需要辨識,
那我們就需要該技巧,今天,我們嘗試多模態AI的世界,
學習如何使用AWS Bedrock來建立能夠同時理解和處理文字與圖像的智慧應用

什麼是多模態AI

多模態AI是指能夠處理和理解多種類型輸入資料的人工智慧系統。這些模態可能包括

  • 文字:自然語言文本
  • 圖像:照片、圖表、截圖等
  • 音訊:語音、音樂
  • 視訊:影片內容

開始展示 AWS Bedrock 多模態應用

這裏比較代表性的為

Claude 3 系列:支援圖像和文字的理解
Claude 4 系列:更強大的多模態理解能力

claude 的應用可以處理

  • 圖像內容描述與分析
  • 基於圖像的問答
  • 圖表數據提取
  • 文件OCR與理解
  • 視覺推理

開始實作

建立一個能夠分析圖像並提供詳細描述的應用

import boto3
import json
import base64
from PIL import Image
import io

class MultimodalAIAssistant:
    def __init__(self, region_name='us-east-1'):
        self.bedrock_runtime = boto3.client(
            service_name='bedrock-runtime',
            region_name=region_name
        )
        self.model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'
    
    def encode_image(self, image_path):
        """將圖像編碼為base64格式"""
        with open(image_path, 'rb') as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    
    def analyze_image(self, image_path, prompt):
        """分析圖像並根據提示返回結果"""
        # 讀取並編碼圖像
        image_base64 = self.encode_image(image_path)
        
        # 構建請求
        request_body = {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 2048,
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "source": {
                                "type": "base64",
                                "media_type": "image/jpeg",
                                "data": image_base64
                            }
                        },
                        {
                            "type": "text",
                            "text": prompt
                        }
                    ]
                }
            ]
        }
        
        # 調用模型
        response = self.bedrock_runtime.invoke_model(
            modelId=self.model_id,
            body=json.dumps(request_body)
        )
        
        # 解析響應
        response_body = json.loads(response['body'].read())
        return response_body['content'][0]['text']

# 使用範例
assistant = MultimodalAIAssistant()

# 分析圖像
result = assistant.analyze_image(
    image_path='product_image.jpg',
    prompt='請詳細描述這張產品圖片,包括產品特徵、顏色、可能的用途等。'
)

print(result)

我們同時要考量到兼備圖表提取數據的內容

圖表數據提取

def extract_chart_data(self, chart_image_path):
    """從圖表圖像中提取數據"""
    prompt = """
    請分析這張圖表並提取以下資訊:
    1. 圖表類型(長條圖、折線圖、圓餅圖等)
    2. 標題和軸標籤
    3. 主要數據點
    4. 趨勢分析
    
    請以JSON格式返回結果。
    """
    
    result = self.analyze_image(chart_image_path, prompt)
    return result

# 使用範例
chart_analysis = assistant.extract_chart_data('sales_chart.png')
print(chart_analysis)

文件理解

class DocumentAnalyzer:
    def __init__(self):
        self.assistant = MultimodalAIAssistant()
        self.document_context = []
    
    def add_document_page(self, image_path, page_number):
        """添加文件頁面到上下文"""
        self.document_context.append({
            'page': page_number,
            'image_path': image_path
        })
    
    def query_document(self, question):
        """對整份文件進行查詢"""
        results = []
        
        for page_info in self.document_context:
            prompt = f"""
            這是文件的第{page_info['page']}頁。
            問題:{question}
            
            如果這一頁包含相關資訊,請提供答案。
            如果不包含相關資訊,請回答「本頁無相關資訊」。
            """
            
            answer = self.assistant.analyze_image(
                page_info['image_path'],
                prompt
            )
            
            if "無相關資訊" not in answer:
                results.append({
                    'page': page_info['page'],
                    'answer': answer
                })
        
        return results

# 使用範例
doc_analyzer = DocumentAnalyzer()
doc_analyzer.add_document_page('document_page1.jpg', 1)
doc_analyzer.add_document_page('document_page2.jpg', 2)
doc_analyzer.add_document_page('document_page3.jpg', 3)

answers = doc_analyzer.query_document('合約中關於付款條件的規定是什麼?')
for answer in answers:
    print(f"第{answer['page']}頁:{answer['answer']}\n")

自動化圖像標籤

class ImageTaggerSystem:
    def __init__(self):
        self.assistant = MultimodalAIAssistant()
    
    def generate_tags(self, image_path, categories=None):
        """為圖像生成標籤"""
        if categories:
            category_text = f"請從以下類別中選擇:{', '.join(categories)}"
        else:
            category_text = "請自由生成相關標籤"
        
        prompt = f"""
        請分析這張圖片並生成適當的標籤。
        {category_text}
        
        請返回:
        1. 5-10個描述性標籤
        2. 主要類別
        3. 圖片的情感色調(如:專業、溫馨、活潑等)
        4. 適用場景
        
        請以JSON格式返回。
        """
        
        result = self.assistant.analyze_image(image_path, prompt)
        return result
    
    def batch_tag_images(self, image_paths):
        """批量處理多張圖像"""
        results = {}
        for image_path in image_paths:
            try:
                tags = self.generate_tags(image_path)
                results[image_path] = tags
                print(f"已處理:{image_path}")
            except Exception as e:
                print(f"處理 {image_path} 時發生錯誤:{str(e)}")
                results[image_path] = None
        
        return results

# 使用範例
tagger = ImageTaggerSystem()
image_list = ['image1.jpg', 'image2.jpg', 'image3.jpg']
tags_results = tagger.batch_tag_images(image_list)

以上應用接下來會有實際的案例分析

  1. 電商產品管理
class EcommerceProductAnalyzer:
    def __init__(self):
        self.assistant = MultimodalAIAssistant()
    
    def analyze_product(self, product_image_path):
        """分析產品圖片並生成商品資訊"""
        prompt = """
        請分析這個產品圖片並提供以下資訊:
        
        1. 產品類型和名稱
        2. 主要特徵(顏色、材質、尺寸估計等)
        3. 建議的產品描述(吸引人的文案)
        4. 適合的目標客群
        5. 建議售價區間
        6. SEO關鍵字建議
        
        請以專業的電商角度分析。
        """
        
        return self.assistant.analyze_image(product_image_path, prompt)

# 使用範例
ecommerce_analyzer = EcommerceProductAnalyzer()
product_info = ecommerce_analyzer.analyze_product('new_product.jpg')
print(product_info)

  1. 內容審核系統

這範例可以適用於 blog 放審查不當言論等

class ContentModerationSystem:
    def __init__(self):
        self.assistant = MultimodalAIAssistant()
    
    def moderate_content(self, image_path, text_content=None):
        """檢查圖像和文字內容是否符合規範"""
        base_prompt = """
        請審核這張圖片,檢查是否包含:
        1. 不當內容
        2. 暴力或仇恨符號
        3. 個人隱私資訊(如身分證、信用卡號等)
        4. 侵權內容
        
        請返回:
        - 是否通過審核(pass/fail)
        - 違規類型(如有)
        - 建議處理方式
        """
        
        if text_content:
            base_prompt += f"\n\n同時請審核以下文字內容:\n{text_content}"
        
        return self.assistant.analyze_image(image_path, base_prompt)

# 使用範例
moderator = ContentModerationSystem()
moderation_result = moderator.moderate_content(
    'user_upload.jpg',
    text_content='這是用戶發布的文字內容'
)
print(moderation_result)
  1. 醫療影像輔助分析
class MedicalImageAssistant:
    def __init__(self):
        self.assistant = MultimodalAIAssistant()
    
    def analyze_medical_image(self, image_path, image_type):
        """輔助分析醫療影像(僅供參考,不能取代專業診斷)"""
        prompt = f"""
        這是一張{image_type}的醫療影像。
        
        請提供:
        1. 影像品質評估
        2. 可見的解剖結構
        3. 需要注意的區域(如有異常跡象)
        4. 建議的進一步檢查方向
        
        重要提醒:此分析僅供參考,所有診斷必須由專業醫師進行。
        """
        
        return self.assistant.analyze_image(image_path, prompt)

# 注意:此功能需要專業醫療人員監督使用

參考資料

搞定!


上一篇
A/B Testing與模型實驗管理
系列文
從零開始的AWS AI之路:用Bedrock與SageMaker打造智慧應用的30天實戰20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言