iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
生成式 AI

阿,又是一個RAG系列 第 18

Day17: exam_and_structured_output_dataset

  • 分享至 

  • xImage
  •  

TL;DR

  • 今天的交付物是兩個 Dataset:
  • 完整程式碼:
    • 👉day17
      • 如何執行放在路徑下的 README.md
  • 接下來就讓我們看看這是怎麼做的,以及可以用來做什麼吧

Goal

  • 我們今天的目標是構造一個 structured_output_dataset 讓我們後續可以 benchmark llm 的 structured_output 功能

    • 具體來說他有:
      • reference_context: 是從 考題 pdf 抽出來的 文字片段,是純 python string
      • reference_answer: 是用 regex 擷取的 dictionary,會做為我們的ground-truth
    • 後續我們就會拿這個 dataset 來測試 llm 的結構化資訊提取能力
    • 然後我們會用 llm as a judge 先給出提取結果的評估
    • 最後我們會用原始的 ground-truth 來驗證我們的 judge
  • 還有一個副產物是 exam_dataset

    • 既然我們都已經 parse 考題了,我們當然也 parse 答案
    • 具體來說他有:
      • query: 就是一題帶有四個選項的單選題(針灸科學)
      • reference_answer: 就是單選題的答案
    • 這個dataset我們可以首先直接 prompt llm 回答 -> 驗證準確率
    • 讓 llm 可以查網路 -> 再一次驗證準確率
    • 其他就還可以測試用 json_mode、toolcalling 來回答的影響
    • 以及不同 prompt 結構的影響
  • 關於考題是怎麼來的,以及什麼是 structured_output,可以看我們昨天的文章: Day16: Pydantic 與 Structured Output

Key Insights / Pitfalls

  1. 從 PDF 提取表格
    • 考題的答案是 table 格式
    • 我們使用的是 pdfplumberextract_table 來解
      • 程式碼:page.extract_tables()
      • for page in pdf.pages ,就用 page.extract_tables() 來提取 table
      • 會回傳一個 list,長度代表這頁抓到的 table 數量
      • 每個 table 形如 [[row1], [row2], [row3],...]
  2. 切出 structured_output_datasetreference_context
    • ground-truth 的切分方式很單純:
      • 直接用 "數字. " 這個 pattern 把題目文字 chunk 切出來。
        • r"\n\d+\.\s"
    • 所以現在的 structured_output dataset 非常乾淨:
      • reference_context → 一段完整可提取的文字。
      • reference_answer → 提取好的 dictionary。
    • 但這個 dataset 也可以增加難度
      • 舉例來說:把前後題目的片段混進去,看看 llm 會不會搞混
      • 等於我們在「模擬 chunking 的場景」,只是做法是反過來的:
        • 先有一個乾淨的 chunk
        • 再透過插入前一個 node,或「截斷自己」,來營造更真實的場景
  3. Dataset 格式
  • 原本想直接用 llama-indexLabelledRagDataset 來做
    • 但過程中,比如他的 save_json 存出來的中文字不可讀,我還要繞過這個問題
    • 我們的 reference_answer 是 dict 但他規定型別要是 str
    • 雖然都可以繞過但是很煩
  • 因此最後決定就不套它的序列化,改用純 JSON
  • 不過他還是有很聰明的地方可以學,比如我們的 Dataset 現在就固定有以下欄位:
    • query, reference_context, reference_answer
  • 希望這樣後面不管在 predict 還是 eval 都可以簡單點
    • 當然還有我們最想做的 Evaluating Evaluators

Quick Results

  • structured_output_dataset

    • 共 80 筆
    • reference_context: 是純文字片段,包含了考題與選項資訊
    • reference_answer: 是 parse 後的考題 dictionary
    • 用途: 這個 dataset 的目的是想要讓我們測試 llm 的結構化資訊提取能力
    • 特點: 可增加混淆難度(混入前/後題)。
  • exam_dataset

    • 共 80 筆
    • query: 單選題的題目
    • reference_answer: 單選題答案
    • 用途:
      • 測試直接 prompt llm 回答考題的準確率
      • 測試加上 websearch 的效果

Plan for Tomorrow

  • 明天來把我們昨天學的 structured_output 結果跑出來

其他

  • 我們要開始收斂了,不然主題無限繁衍 30 篇會寫不完,加緊腳步
  • 講歸講,結果今天突然想到
    • 如果我們要求 llm 的 output 是帶有可選的 think 還有 tool_calling 的 json
      • 那這樣就可以繞過前面 ReAct 的 parser 問題,全程用 tool_calling 呼叫
      • 而且不用在 prompt 制式的規定說要說我已經不需要工具就可以回答這個問題
    • 另一個想法是要求輸出一個包含許多條目的 json ,而且規定一定要先去查網路,然後整理成帶有 citation 的一句話來填
      • 比如說傳一個名詞給他(例如:Non-measurable set),要求他去查網路回傳定義、概念、應用
    • 然後我去問 chatgpt ,他說這個現在大家本來就都是這樣做的

上一篇
Day16: Pydantic 與 Structured Output
下一篇
Day18: structured output challenge
系列文
阿,又是一個RAG20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言