在完成了 Day 9 的 Gemma 4 穩定度封裝、429 退避重試與對話上下文截斷後,今天我們正式進入學生「學習歷程與備審自傳 PDF」的多模態前處理與解析 AI 模組搭建——PDF 多模態視覺與文字內容提取器 (PDFParserService)。
💬 User Prompt:
「接下來 到了 Day10 我們需要來做 PDF 的資料多模態的內容取得工具的部分 內容可能有 "圖片"、"文字"、"圖表" 等等資訊 並有排版 (理論上) 幫我看一下這樣子的工具要怎麼完成。另外 因為有個資的關係 這部分的 pdf 和 tests ignore 掉。」
針對學生備審資料包含文字排版、嵌入式架構圖表、個人照與活動照片的多模態特性,我們設計了:
docs/system_prompts/application_multimodal_analysis.md 產出學習歷程亮點與教授可能質疑之盲點切入點。app/services/document_parser.py)class PDFParserService:
def extract_multimodal_components(self, pdf_bytes: bytes) -> Dict[str, Any]:
"""同時提取 PDF 頁面文字與內嵌視覺圖片圖表 Metadata"""
reader = pypdf.PdfReader(io.BytesIO(pdf_bytes))
page_summaries = []
image_metadata_list = []
for idx, page in enumerate(reader.pages, 1):
page_text = page.extract_text() or ""
page_img_details = []
for img_idx, img_obj in enumerate(page.images, 1):
pil_img = Image.open(io.BytesIO(img_obj.data))
page_img_details.append(f"Image #{img_idx} ({pil_img.format}, {pil_img.size[0]}x{pil_img.size[1]} px)")
image_metadata_list.append({"page": idx, "format": pil_img.format, "width": pil_img.size[0], "height": pil_img.size[1]})
summary = f"=== [頁次 Page {idx}/{len(reader.pages)}] ===\n圖片圖表: {len(page.images)} 個\n文字:\n{page_text.strip()}\n"
page_summaries.append(summary)
return {"total_pages": len(reader.pages), "total_images": len(image_metadata_list), "full_document_text": "\n\n".join(page_summaries)}
async def parse_multimodal_resume(self, pdf_bytes: bytes, target_school: str = "", target_major: str = "") -> Dict[str, Any]:
"""端到端多模態解析:PDF 提取 ➔ Gemma-4-31B 解析亮點與盲點"""
components = self.extract_multimodal_components(pdf_bytes)
analysis_result = await gemma_client.invoke_with_system_prompt(
prompt_name="application_multimodal_analysis",
target_major=target_major,
document_content=components["full_document_text"][:8000]
)
return {"total_pages": components["total_pages"], "total_images": components["total_images"], "multimodal_analysis_result": analysis_result}
測試檔案:備審歷程 PDF 資料(含成績單、專題架構圖與活動證明)。
scripts/run_day10_live_test.py)==================================================
UniMock AI - Day 10 Multimodal PDF Content Extractor Test
==================================================
Target PDF File: test_files/candidate_resume_portfolio.pdf (PII Protected)
--- [Step 1] Multimodal Extraction (Text, Layout & Image Components) ---
Total Pages: 6
Total Embedded Image Components: 10
Embedded Images Metadata List:
- Page 1: 360x445 px (JPEG) - 個人大頭相片與聯絡區塊
- Page 2: 524x213 px (PNG) - 核心專題架構圖
- Page 4: 524x213 px (PNG) - 物件偵測架構圖
- Page 5: 444x333 px (JPEG) - 資訊社團幹部活動照
- Page 6: 444x333 px (JPEG) - 雲端工作坊與系學會活動照
--- [Step 2] Live Multimodal Analysis with Gemma-4-31B ---
Gemma Multimodal Analysis Output Result:
這是一位背景極其強悍的資工系申請者。其特點在於 ....
### 1. Key Highlights (核心亮點解析)
....
### 2. 潛在弱點與挑戰切入點 (Potential Vulnerabilities)
....
### 3. 面試教授最可能抽考的發問切入點
....
==================================================
Day 10 Multimodal PDF Test Completed Successfully!
==================================================
今天我們完成了 PDF 多模態視覺圖表與文字前處理服務 (PDFParserService),成功讓 Gemma 4 具備閱讀學生真實 PDF 備審、提取 10 個內嵌圖表元件與精準剖析亮點盲點的能力。
明天 【Day 11】,我們將進入 專案系統設計,在 Day1 ~ Day10 的過程,我們準備並測試好各項重要功能的可行性,在 Day11 的階段,我們將開始進行完整的專案開發,開始將專案一步一步實現出來。