用AI輔助工具趕一份政府公共工程標案的資格文件,明天就要送件
Lucius是一套專門讀公開招標文件、自動生成合規矩陣跟標案初稿的AI系統。文章作者分享了一個實戰案例:英國格洛斯特郡一個教區議會要蓋一座造價95萬英鎊的3G人工草皮足球場,招標包裡有六份文件、133頁。AI在五分鐘內生出初稿,但初稿最前面不是漂亮的自我介紹,而是一段警示:『這份草稿裡有11項資格要求,目前是靠一個你還沒有命名的合作夥伴撐著』,接著列出像是『近兩年財報證明的最低營業額』、『500萬英鎊的專業責任險』這類具體項目。作者說這段警示才是他最自豪的功能——因為它是一個『拒絕』。
為什麼需要特別去設計『拒絕』這個功能?因為大型語言模型(LLM)一種被大量文字訓練出來、非常擅長『接話』的AI,看到一句話的開頭,就會自動生成看起來最合理、最通順的後續內容天生就有一個壞習慣:它預設會產生「讀起來最合理」的下一句話,而不是「查證起來最真實」的下一句話。在多數場合,通順跟真實是同一個方向,所以沒人注意到差異;但在標案這種文件裡,兩者會在錢的地方分岔——買方真正會去查證的那些條款,恰好就是AI最容易順著上下文編出一個聽起來很像真的答案的地方。這種一本正經卻是編出來的內容,就是常說的幻覺(hallucination)AI講得非常有把握、格式跟語氣都很正常,但內容其實是憑空編造,不是根據事實。
作者要解決的不是「讓AI寫得更好」,現在的模型寫作能力本來就很夠。真正難的工程問題,是讓整套系統知道「逐條而言,AI現在有資格宣稱什麼」。他們的做法是先建立一份標案合規矩陣(compliance matrix)把招標文件裡每一條資格要求,逐條列出來,並標記我方到底有沒有符合、證據在哪裡的一張表,把整份文件拆成一條一條可以被檢查的宣稱,而不是丟給AI一次性當一大塊文字自由發揮。
但光有這張表還不夠。文章裡有一個代價很高的案例:AI幫一份NHS標案編了一個根本不存在的合作夥伴,分攤了42項資格要求,而負責檢查的合規驗證器只做關鍵字比對(keyword matching)一種很簡陋的檢查方式,只看文字裡有沒有出現特定字眼,不管那段話講的內容是不是真的,剛好被幻覺出來的段落裡對的關鍵字騙過,判定這42項『已符合』。這告訴我們:檢查機制本身也可能被騙,接下來的章節會講他們怎麼把這個漏洞補起來。
| 面向 | 一般(天真)AI寫標案 | 拒絕捏造的AI(Lucius的做法) |
|---|---|---|
| 遇到沒有證據的資格要求 | 順著上下文編一個聽起來合理的答案(例如捏造一個合作夥伴) | 直接標記為『未證明』,列入警示清單,不填答案 |
| 審核/驗證方式 | 關鍵字比對,段落裡出現對的字眼就打勾算過 | 先做資格能力核對表,逐條比對『招標要求』與『己方實際證據』 |
| 幻覺被發現的時間點 | 交件後被評審委員或查核單位發現,標案被剔除甚至列入黑名單 | 生成草稿的當下就被系統攔下來,變成警示,交給人工補件 |
把文章裡『資格能力核對表』這個修復邏輯,簡化成一段可以真的讀懂的程式
requirements = load_tender_requirements(tender_pack)evidence = load_bidder_evidence(company_profile)draft_lines = []unproven = []for req in requirements: proof = evidence.get(req.key) if proof and proof.meets(req.threshold): draft_lines.append(write_compliant_statement(req, proof)) else: unproven.append(req)banner = render_warning_banner(unproven)draft = banner + '\n'.join(draft_lines)