---
# System prepended metadata

title: 'Day 1 宵夜場. [PPT Chatbot] 讀取PPT的策略整理'
tags: [RAG]

---

# Day 1 宵夜場. [PPT Chatbot] 讀取PPT的策略整理

## 0. 前言

身為懶人，把能找到的現成方式都要試一下。由於ppt內容是機敏資訊，除了微軟copilot之外，無法測試其他雲端的方案，只能自己寫程式爬內容。


## 1. 讀取策略整理

### 1-1. Docling

IBM的開源方案。在所有嘗試過的方法裡，`Docling`真的是最泛用的工具。不只迅速，OCR、VLM、Langchain、LlamaIndex等工具都有整合，可以針對不同情境用不同方法取得內容。

``` python
from docling_parse.parsers.pptx_parser import parse_pptx
from docling_parse.utils.markdown import to_markdown
from docling.datamodel.pipeline_options import PptxPipelineOptions, TableStructureOptions, EasyOcrOptions

# Define pipeline options for enhanced extraction
options = PptxPipelineOptions(
    do_table_structure=True,                # Enable structured table parsing
    do_picture_description=True,            # Enable image captioning (if supported)
    do_ocr=True,                            # Enable OCR for text in images
    ocr_options=EasyOcrOptions(lang=["en", "zh"]),  # OCR languages
    table_structure_options=TableStructureOptions(
        do_cell_matching=True,              # Match predicted cells to layout
        mode="accurate"                     # Use accurate mode for table parsing
    )
)

# Path to your PowerPoint file
pptx_path = "example.pptx"

# Parse the PPTX file with custom options
doc = parse_pptx(pptx_path, options=options)

# Convert the structured document to Markdown
markdown = to_markdown(doc)

# Save the Markdown output
with open("output.md", "w", encoding="utf-8") as f:
    f.write(markdown)

# Optional: inspect the structured document
print(doc.to_dict())
```

但就像我在[Day 0. [PPT Chatbot] 前言](https://hackmd.io/@9Ecf9gbnTv294Ng2ICWo9g/S1k4AgaCxg)這篇文章講的，合併儲存格的問題一定要解決，不然針對user prompt做語意搜尋時，可能被認為關聯性不高，導致資料蒐集不完全。

### 1-2. OCR

在使用OCR前，都先把ppt轉成PDF或圖片，然後嘗試`pytesseract`、`PaddleOCR`。可能是沒時間研究參數怎麼調整，所以做出來的效果差強人意。再加上我的ppt內容可能不太適合用OCR讀取(特殊字、合併儲存格的辨識效果、字型限制、字體太小辨識率低)，所以最後就放棄這個方法。

### 1-3. markitdown

微軟的開源方案，也是非常強大的套件，文件丟進去就直接產出markdown文件。只要一行程式就能轉換，好像在變魔術。跟`Docling`相比，我覺得markitdown還需要更多可以客製的設定。

``` python
from markitdown import MarkItDown
from openai import OpenAI

client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o", llm_prompt="optional custom prompt")
result = md.convert("example.jpg")
print(result.text_content)
```

### 1-4. Microsoft Copilot

唯一個雲端方案。因為有簽訂合約，所以上傳機敏資訊比較放心。如果這個成功的話，就不用花太多心思在爬資料，而且有一個現成的機器人可以用XD

使用前提：可以使用Copilot Studio建立代理人
建立代理人：上傳ppt→建立代理人→設定system prompt→開始使用

使用方式非常簡單，但是讀取的過程如同黑盒子，無法從中客製化。測試過程中，我認為應該是有直接排除picture object和OLE object。

## 2. 策略選定

- OCR
    - 只能當輔助工具，不能真的當懶人法使用。

- `docling`和`markitdown`都非常不錯，但有幾個點不是我想要的：
    - 沒有補滿合併儲存格。
    - 無法讀取OLE object物件類型
    - 如果需要客製化讀取的方式，要自己改source code。

- 微軟Copilot
    - 無法讀取image object和OLE object類型。
    - 如果只詢問一個檔案的內容，效果非常好。
    - 如果詢問的內容跨多個檔案，效果就不如預期，可能會漏內容
        - 例如詢問「請給我專案B12在各客戶的每月進度」，回應內容可能會漏掉某幾個slide。

## 3. 最後選擇

稍微讀了`python-pptx`的範例，算是簡單上手，所以最後還是選擇自己手刻，比較多可以客製的地方。

例如：
- 運用LLM判斷slide內提到的item、客戶有哪些，並呼叫API存到DB
- 尋找OLE Object的截圖，並丟到LLM詢問圖片內容
- 客製metadata在內容上方
