🎯 Mục tiêu bài học
Visual Question Answering (VQA) cho phép hỏi và trả lời về hình ảnh. Document Vision giúp extract thông tin từ tài liệu scan, receipts, forms.
Sau bài này, bạn sẽ:
✅ Xây dựng Visual QA system tương tác ✅ Extract dữ liệu từ receipts, business cards, forms ✅ Implement table extraction từ hình ảnh ✅ Xử lý multi-page documents
🔍 Visual QA System
Interactive VQA
1from langchain_openai import ChatOpenAI2from langchain_core.messages import HumanMessage, AIMessage3import base6445llm = ChatOpenAI(model="gpt-4o")67class VisualQA:8 def __init__(self):9 self.history = []10 self.current_image = None11 12 def set_image(self, image_path):13 with open(image_path, "rb") as f:14 self.current_image = base64.b64encode(f.read()).decode()15 self.history = []16 17 def ask(self, question):18 messages = []19 20 # First message includes image21 if not self.history:22 messages.append(HumanMessage(content=[23 {"type": "text", "text": question},24 {"type": "image_url", "image_url": {25 "url": f"data:image/png;base64,{self.current_image}"26 }}27 ]))28 else:29 messages = self.history + [HumanMessage(content=question)]30 31 response = llm.invoke(messages)32 33 self.history = messages + [response]34 return response.content3536# Usage37vqa = VisualQA()38vqa.set_image("product.png")39print(vqa.ask("San pham nay la gi?"))40print(vqa.ask("Gia co on khong?"))41print(vqa.ask("Diem noi bat nhat?"))Checkpoint
Bạn đã hiểu cách xây dựng Visual QA system với conversation history chưa?
📝 Document Processing
Receipt/Invoice Extraction
1from pydantic import BaseModel, Field2from typing import List, Optional34class LineItem(BaseModel):5 name: str6 quantity: int7 unit_price: float8 total: float910class ReceiptData(BaseModel):11 store_name: str12 date: str13 items: List[LineItem]14 subtotal: float15 tax: Optional[float] = None16 total: float17 payment_method: Optional[str] = None1819receipt_extractor = llm.with_structured_output(ReceiptData)2021def extract_receipt(image_path):22 with open(image_path, "rb") as f:23 b64 = base64.b64encode(f.read()).decode()24 25 return receipt_extractor.invoke([26 HumanMessage(content=[27 {"type": "text", "text": "Extract tat ca thong tin tu receipt/hoa don nay."},28 {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}29 ])30 ])Business Card Scanner
1class BusinessCard(BaseModel):2 name: str3 title: Optional[str] = None4 company: Optional[str] = None5 email: Optional[str] = None6 phone: Optional[str] = None7 address: Optional[str] = None8 website: Optional[str] = None910card_scanner = llm.with_structured_output(BusinessCard)1112def scan_business_card(image_path):13 with open(image_path, "rb") as f:14 b64 = base64.b64encode(f.read()).decode()15 16 return card_scanner.invoke([17 HumanMessage(content=[18 {"type": "text", "text": "Extract contact info tu business card nay."},19 {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}20 ])21 ])Form Data Extraction
1class FormField(BaseModel):2 field_name: str3 value: str4 field_type: str # text, checkbox, date, number56class FormData(BaseModel):7 form_title: str8 fields: List[FormField]9 signatures: bool10 date_filled: Optional[str] = None1112form_extractor = llm.with_structured_output(FormData)Checkpoint
Bạn đã biết cách extract structured data từ receipts, business cards và forms chưa?
📊 Table Extraction
1class TableData(BaseModel):2 headers: List[str]3 rows: List[List[str]]4 total_rows: int56table_extractor = llm.with_structured_output(TableData)78def extract_table(image_path):9 with open(image_path, "rb") as f:10 b64 = base64.b64encode(f.read()).decode()11 12 result = table_extractor.invoke([13 HumanMessage(content=[14 {"type": "text", "text": "Extract bang du lieu tu hinh anh. Giu chinh xac tat ca cot va hang."},15 {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}16 ])17 ])18 19 # Convert to DataFrame20 import pandas as pd21 df = pd.DataFrame(result.rows, columns=result.headers)22 return dfCheckpoint
Bạn đã hiểu cách extract bảng dữ liệu từ hình ảnh và convert sang DataFrame chưa?
📐 Multi-page Document Processing
1from pathlib import Path23async def process_document(pages_dir):4 pages = sorted(Path(pages_dir).glob("*.png"))5 all_data = []6 7 for page in pages:8 with open(page, "rb") as f:9 b64 = base64.b64encode(f.read()).decode()10 11 result = await llm.ainvoke([12 HumanMessage(content=[13 {"type": "text", "text": f"Extract text va data tu trang {page.name}."},14 {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}15 ])16 ])17 all_data.append({"page": page.name, "content": result.content})18 19 return all_dataCheckpoint
Bạn đã biết cách xử lý multi-page documents bằng cách iterate qua từng trang chưa?
🎯 Tổng kết
Bài tập thực hành
- Build Visual QA chatbot cho product images
- Implement receipt scanner với structured output
- Extract thông tin từ business cards
- Build table extractor từ screenshots
Challenge: Document processing pipeline cho multi-page PDF (convert pages to images, extract data)
Câu hỏi tự kiểm tra
- Visual QA system hoạt động như thế nào để trả lời câu hỏi về nội dung hình ảnh?
- Làm sao extract bảng dữ liệu (tables) từ hình ảnh một cách chính xác với structured output?
- Multi-page document processing khác gì so với xử lý từng trang đơn lẻ về độ phức tạp và kỹ thuật?
- Các ứng dụng thực tế của document vision trong doanh nghiệp (receipt scanning, form extraction) là gì?
🎉 Tuyệt vời! Bạn đã hoàn thành bài học Visual QA va Document Vision!
Tiếp theo: Chúng ta sẽ xây dựng Multimodal Pipelines - kết hợp text và image để tạo ứng dụng toàn diện.
