iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
AI Engineering

30 天打造 AI 後端:從 LLM、RAG 到 AI Agent系列 第 8

[Day 8] 問「特休沒休完會怎樣」,程式怎麼知道要看規章哪一段?

  • 分享至 

  • xImage
  •  

昨天說 RAG 像讓 LLM 開卷考:不用死背,考試時翻資料夾找答案。但動手做才發現,開卷考有個前提——你要先翻得到那一頁。整本課本丟給你卻不知道答案在第幾章,開卷跟沒開一樣。所以今天進入 Stage 2,只做一件事:給一個問題,要能找出最相關的段落,而且能量測準不準,不是看起來會動就好。

一、素材:一份虛構的《員工請假管理規範》

企業導入 LLM 第一個撞到的牆,是模型不知道公司內部資料,所以我自己造了一份擬真語料:《員工請假管理規範》,共 12 條,涵蓋特休申請與遞延結算、病假診斷證明、補休效期、婚喪假、家庭照顧假、職務代理人、緊急事故補請、曠職處分(聲明:內容純屬虛構)。之後整個系列都用這份文件。


二、實作:三步做出最小可用的檢索

第一步,把文件依「## 第 N 條」直接切成一條一段。不過真實文件不會這麼配合,留給明天談。

第二步,用 OpenAI 的 text-embedding-3-small 這個 embedding model 把 12 條條文一次全部轉成向量。每段文字變成一個 1536 維的數值向量,語意越接近、向量距離越近,「相關不相關」從一種感覺變成可以計算的數字。

第三步,使用者的問題同樣轉成向量,跟 12 條條文逐一算餘弦相似度,排序取前三名。整個「檢索」就這樣完成。


三、這樣做一次,到底花多少錢?

text-embedding-3-small 定價是每百萬 token 0.02 美元。把整份規範(12 條)加上 10 個測試問題全部 embedding 一次,實際用量:消耗 1801 tokens,成本約 0.000036 美元 ≈ 新台幣 0.0011 元(快取命中部分不計費)。


四、小實驗:10 個問題,實測準不準

Demo 部分總共設計了 10 題,分兩組:5 個直白問法,用詞跟文件幾乎一樣,例如「婚假總共有幾天?」;5 個口語問法,故意用文件沒出現過的講法,例如「加班換的假放到過期會怎樣?」(文件寫「補休」)、「特休沒休完會怎樣?」(文件寫「遞延與結算」)。每題事先標好預期條文,判定標準是 top-1 是否命中。

類型 問題 Top-1 條文 相似度 命中
直白 病假連續請幾天以上需要附診斷證明? 第 4 條(病假) 0.6089
直白 特休假最晚要在幾天前提出申請? 第 2 條(特休假) 0.5947
直白 婚假總共有幾天? 第 7 條(婚假) 0.6587
直白 請假幾天以上需要指定職務代理人? 第 10 條(請假程序與職務代理人) 0.6984
直白 事假一年最多可以請幾天? 第 5 條(事假) 0.5940
口語 加班換的假放到過期會怎樣? 第 6 條(補休) 0.5880
口語 特休沒休完會怎樣? 第 2 條(特休假) 0.5588
口語 早上突然掛急診,來不及先請假怎麼辦? 第 11 條(緊急事故之補請) 0.5247
口語 沒來上班也沒跟任何人講,會有什麼後果? 第 11 條(緊急事故之補請) 0.4218
口語 小孩要打疫苗需要我帶去,可以請什麼假? 第 4 條(病假) 0.4270

結果: 直白問法 5 題全中;口語問法 5 題中 2 題;總命中率 7/10。


五、沒中的那幾題,才是今天最有價值的部分

把沒命中的題目 top-3 攤開看:

  1. 特休沒休完會怎樣?(預期第 3 條)→ top-1 是第 2 條(0.5588),第 3 條被擠到第三名(0.5274)
  2. 沒來上班也沒跟任何人講,會有什麼後果?(預期第 12 條・曠職)→ top-1 是第 11 條(緊急事故之補請,0.4218),第 12 條連第三名都吊車尾(0.4078)
  3. 小孩要打疫苗需要我帶去,可以請什麼假?(預期第 9 條・家庭照顧假)→ top-1 卻抓到第 4 條(病假,0.4270),正確答案只差 0.0008 分屈居第二

問題出在使用者說的話和文件寫的字是兩種語言:文件內容和口語通常沒幾個字重疊。Embedding 雖然抓語意不抓字面,但語意距離仍會被用詞拉開——相似度分數直接反映這件事。值得注意的是,正確答案往往就在 top-2、top-3,分數差距很小,代表方向沒錯,只是被表面用詞蓋過

我今天不解決它,這是之後 query 改寫與 rerank 的主題,先把洞挖在這裡。但如果只跑一個 happy path demo,根本不會知道這個問題存在——這就是為什麼檢索要量測,不能用感覺驗收。

小結

一句話總結:

Embedding 不是讓程式「看懂」文字,是把「相關不相關」變成可以計算的距離。而且這個距離量得出來、也量得出極限——它會被「使用者的口語」和「文件的公文體」之間的用詞落差拉開。
今天還有一個沒解決的問題:這份文件一條剛好一段,是我運氣好。真實世界的文件是 30 頁的 PDF,切太大會塞爆 context,切太小語意會碎掉。到底要怎麼切?明天 Day 9:Chunking,我會拿三種切法實測給你看。

程式連結及請假文件:
https://drive.google.com/drive/folders/13an60AFCLHaoEISJV3ZxcKUWPsFMPCay?usp=drive_link
OpenAI Embeddings 文件
https://developers.openai.com/api/docs/models/text-embedding-3-small
定價:
https://openai.com/api/pricing/


上一篇
[Day 7] 一本正經胡說八道的 LLM :從三個先天限制走向 RAG
系列文
30 天打造 AI 後端:從 LLM、RAG 到 AI Agent8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言