COFACTS.AI 出處品質|下週討論用
維基百科來源評級,能幫 Cofacts.ai 挑出處嗎?
把 Cofacts.ai 近五個月實際用過的出處,拿去比對中文維基《來源評級/列表》與英文 WP:RSP,看列表涵蓋多少、評級回傳給 writer 之後可能改變什麼。
資料期間 2026-05-13 – 2026-10-13
來源 Langfuse traces
維基快照 2026-10-13
ADK 1.26.0
第一部分 研究:列表命中度與影響
第二部分 技術討論:怎麼接進 agent 流程
第一部分
研究
結論
中文列表命中約 四成 出處(草稿 41%)。英文列表只再多 2–3 個百分點 ,可以晚點再做。
最大的影響是維基百科本身 :23% 的草稿引用維基,而兩個列表都把維基評為「通常不可靠」。
約一半 的命中落在「依主題分評級」的條目,而且分歧點正好是政治報導 。只回傳基準評級會誤導,必須回傳摘要讓模型依主題判斷。
writer 現在已經會避開「應停用」來源(入選率 5%),所以評級對這類來源的邊際效果不大。
沒被列表涵蓋的約 56%,大宗是政府網站、查核組織、學術期刊,需要另訂規則。
命中度
列表涵蓋了多少出處
41.2% 草稿出處命中中文列表
+2.8 再加英文列表只多這幾個百分點(合計 44.0%)
588 / 765 至少有一個出處命中的草稿
階段 呼叫數 出處 URL 中文列表 英文列表 合計 命中網域
investigator 搜尋結果 1,023 9,653 39.8% 14.4% 41.9% 297 / 2,572
verifier 讀過的頁面 809 2,347 44.4% 11.1% 46.2% 142 / 742
草稿 references 765 3,252 41.2% 13.2% 44.0% 125 / 655
草稿只計成功送出的 draft_factcheck_response。investigator 另有 321 筆未解析的 Vertex 轉址網址不計入。命中率以 URL 筆數計,熱門媒體權重較高。
影響一
草稿大量引用維基百科
176 / 765 草稿引用了維基百科(23%)
193 個逐項主張以維基頁面為佐證(claim_sources)
239 筆 references 指向 zh / en / ja 維基
維基百科本身並非可靠來源,因為開放維基是個人出版物……經驗不足的編者有時可能會無意中引用關於某個出版物的維基百科條目,而不是該出版物本身;在這種情況下,應修正引用,而不是刪除它。
中文維基《來源評級/列表/維基百科》,評級 通常不可靠 (WP:CIRCULAR)
維基條目通常附有原始出處。回傳評級後,writer 比較可能改引條目背後的報導或文件,這是這次評估中最直接、量也最大的改變。
影響二
評級依主題而定,政治報導最常被降級
中文列表 363 筆中有 86 筆在摘要裡依主題給出不同評級。Cofacts.ai 的命中有一半落在這類條目(investigator 52%、verifier 54%、草稿 45%)。台灣主流媒體的分歧點幾乎都是政治報導,也就是 Cofacts 訊息的大宗。
來源 基準評級 摘要中的主題評級 草稿引用
聯合報系 半可靠 政治 半可靠 、其他 通常可靠 、轉角國際 通常可靠 、udn 部落格 通常不可靠 103
旺旺中時媒體集團 半可靠 政治 通常不可靠 、非政治 半可靠 58
自由時報 半可靠 政治與兩岸 半可靠 、報導自家事務 通常不可靠 、其他 通常可靠 159
精鏡傳媒(鏡週刊、鏡新聞) 半可靠 政治 半可靠 、其他 通常可靠 、READr 通常可靠 48
三立電視 應替代 陰謀論、社群轉述 通常不可靠 、其他 應替代 27
Google(YouTube) 半可靠 YouTube 屬用戶生成內容;媒體官方帳號依該媒體評級 35
中央通訊社 通常可靠 留意親執政黨傾向 70
公共電視台 通常可靠 — 84
「應替代」與「通常不可靠」同色是因為兩者都表示不宜作為主要佐證。自由時報草稿引用數含 news / def / health 等子網域。
所以工具不能只回傳 sr 這類代碼。需要把整段摘要交給模型,並請它依這則訊息的主題判斷適用哪一條。
影響三
writer 已經在篩,評級的增量在哪裡
在同一個 trace 裡,investigator 找到的候選出處有多少比例最後被寫進草稿:
英文列表獨有・通常可靠 35.3% 18 / 51
中文・通常可靠 26.5% 129 / 486
未列・政府網站 26.5% 197 / 743
未列・查核組織 23.2% 67 / 289
未列・學術 19.5% 26 / 133
中文・半可靠 18.4% 232 / 1,258
中文・通常不可靠 16.9% 85 / 503(多為維基、FB、YouTube)
未列・其他 15.7% 362 / 2,305
中文・應替代 12.0% 17 / 142
未列・轉載平台 6.3% 15 / 237(LINE Today 等)
中文・應停用 5.0% 5 / 101
0% 10% 20% 30% 40%
可作為佐證的類別 不宜作為主要佐證的類別
只計有成功草稿的 trace。滑鼠移到長條上可看筆數。
可靠來源與政府網站的入選率本來就最高,「應停用」只有 5%。評級真正的增量集中在三類:
目前仍進入草稿的 草稿引用 評級會帶來的提示
維基百科(zh / en / ja) 239 改引條目背後的原始出處
中時、聯合、三立的政治報導 188 政治議題降級,找其他來源交叉佐證
Facebook、YouTube 71 只能證明「誰說過」,不能證明內容為真
中國官媒與大紀元系(人民日報、新華社、環球時報、大紀元、新唐人) 17 依用途區分:引述官方立場可以,作為事實依據不行
中時、聯合、三立一列是這三家所有草稿引用的總數,沒有逐篇判斷是否為政治議題。
涵蓋缺口
沒被列表涵蓋的 56%
類別 佔草稿出處 常見網域
政府網站 18.9% mohw.gov.tw、fda.gov.tw、cdc.gov.tw、law.moj.gov.tw、wra.gov.tw、gov.taipei
查核組織 4.7% mygopen.com、tfc-taiwan.org.tw、cofacts.tw、165 反詐騙
學術 2.8% pmc / pubmed.ncbi.nlm.nih.gov、大學網站
轉載平台 1.8% today.line.me、n.yam.com、share.google
其他未列 27.9% Taipei Times、Focus Taiwan、Taiwan News、上報、食力、ntl.edu.tw、openbook.org.tw
WP:RSP 自己也說明,沒列在表上只代表沒被反覆討論過,不代表不可靠。政府、查核組織、學術期刊需要另訂規則,例如比照維基的醫學來源準則(WP:MEDRS)處理健康類訊息。LINE Today 這類轉載平台則要先追到原始媒體才能判斷。
英文列表
英文 WP:RSP 值得接嗎
英文列表 497 筆。它的 13% 命中大多和中文列表重疊,主要也是維基、Facebook、YouTube。只有英文列表才命中的出處,在草稿中佔 2.8%,其中「通常可靠」1.8%,包括 Guardian、Reuters、SCMP、海峽時報、Al Jazeera、JAMA。
它的優點是結構整齊:依主題分評級時直接拆成多列,例如 Fox News 的政治與非政治分開,不用解析內文。適合當國際媒體的補充,優先順序可以放後面。
研究面待決
內容上要決定的事
維基百科出處怎麼處理? 只提示、要求改引原始出處,或由 draft_factcheck_response 驗證時擋下。
如何區分「佐證」和「說法的出處」? FB、YouTube、官媒在 Cofacts 常是被查核的對象,提示內容需要能表達這個差別。
未列來源的備援規則 政府網站、查核組織、學術期刊、轉載平台各自怎麼處理。
要不要接英文列表? 增量約 2.8 個百分點,以國際媒體為主。
方法與限制
這份數字怎麼來的
出處取自 Langfuse 的 TOOL observation:investigator 與 verifier 取輸出的 sources[].url,草稿取 draft_factcheck_response 輸入的 references。
中文列表逐頁讀取《Wikipedia:來源評級/列表/*》共 363 / 364 頁,只缺「看中國」(持續被限流)。基準評級取 infobox 的 status,主題評級取摘要中的 {{通常不可靠}}、{{RSNG|…}} 等模板。
網址比對採網域或其子網域;條目若宣告了路徑(例如 facebook.com/taipeibo),則要求網址路徑也相符。
入選率以同一 trace 內的 URL 完全比對計算,同一則報導若換了網址形式(例如加了追蹤參數)會被算成未入選。
從雲端 IP 呼叫 MediaWiki API 會被回 429,這次改用 action=raw 慢速抓取。正式同步需要固定主機與帶聯絡資訊的 User-Agent。
第二部分
技術討論
目前的提案是在 investigator 與 verifier 之後加一個便宜模型,替 sources 中的每個來源補上一段給 writer 看的評級提示。以下是這個做法的結構、在 ADK 1.26.0 上要注意的細節,以及其他可行的設計。
現況
Before:sources 只有標題和網址
flowchart LR
W["writer"] -->|"request"| INV
subgraph INV["AgentTool: investigator"]
direction LR
I1["LlmAgent investigator<br/>google_search"] --> C1["after_model_callback<br/>append_grounding_sources"]
end
C1 -->|"{content, sources: [title, url]}"| N["writer after_tool<br/>_normalized_response"]
N --> W
W -->|"claims + URLs"| VER
subgraph VER["AgentTool: verifier"]
direction LR
V1["LlmAgent verifier<br/>url_context"] --> C2["after_model_callback<br/>append_url_context_sources"]
end
C2 -->|"{content, sources: [title, url]}"| N
writer 可以在同一輪平行呼叫多個 investigator。每次 AgentTool 呼叫都是獨立的 in-memory session。
提案 A
After:SequentialAgent 後接評級模型
flowchart LR
SYNC["每週同步工作<br/>MediaWiki API"] --> DB[("評級資料<br/>363 筆 + 摘要全文")]
W["writer"] -->|"request"| SEQ
subgraph SEQ["AgentTool: investigator(SequentialAgent,沿用原名)"]
direction LR
I1["LlmAgent investigator_search<br/>google_search<br/>output_key"] --> R0{"before_agent_callback<br/>網域比對"}
R0 -->|"沒命中或只有單一評級"| P["直接輸出<br/>不呼叫模型"]
R0 -->|"命中依主題分評級的條目"| R1["LlmAgent source_rater<br/>便宜模型"]
R1 --> M["merge<br/>寫回 sources[].rating_hint"]
end
DB -.-> R0
P -->|"{content, sources: [title, url, rating_hint]}"| N["writer after_tool<br/>_normalized_response"]
M --> N
N --> W
verifier 用同樣的結構包裝。rater 的輸入有三樣:上一個 agent 的 sources、這些來源在維基的評級全文,以及 request 原文(用來判斷主題)。輸出則是要替哪幾個來源加上提示。合併後的 sources 長這樣:
{
"title": "中時新聞網",
"url": "https://www.chinatimes.com/realtimenews/...",
"rating_hint": {
"source": "旺旺中時媒體集團",
"wiki_url": "https://zh.wikipedia.org/wiki/Wikipedia:來源評級/列表/旺旺中時媒體集團",
"hint": "這則是兩岸政治議題,維基社群認定旺中的政治報導通常不可靠。請改用中央社或官方文件佐證,或只用來說明某方的說法。"
}
}
69% investigator 呼叫命中依主題分評級的條目,需要 rater
31% 沒命中(13%)或只命中單一評級(18%),可直接略過模型
~700 字 每次呼叫需附的評級摘要中位數(p90 約 1,700 字)
verifier 的對應比例為 52% 需要 rater、48% 可略過,摘要中位數約 270 字。依歷史 trace 估算。
ADK 1.26.0 細節
提案 A 實作時要注意的地方
項目 ADK 的行為 對設計的影響
工具結果取哪一段 AgentTool 取子 session 中最後一個有內容的 event最後一步必須輸出完整的 {content, sources} JSON,包含 _search_widget_html
rater 不能設 output_schema AgentTool 會沿 sub_agents[-1] 找 output_schema,並用它驗證最後的輸出;generate_content_config 也不允許另設 response_schemarater 改用提示要求 JSON 並寬鬆解析,或在最後加一個沒有 schema 的自訂 merge agent
略過 rater before_agent_callback 回傳 Content 時,會略過該 agent 並把 Content 當成輸出沒命中時直接輸出原 JSON,加上單一評級的固定提示,不需要模型
output_key 存什麼after_model_callback 改寫後才產生 event,所以存的是改寫後的 JSONrater 可直接從 state 讀到 investigator 的 sources
state 會流回 writer 子 session 的 state_delta 會同步寫回 writer 的 session 中間結果的 key 加 temp: 前綴,避免寫進 writer 的 session,也避免平行呼叫互相覆蓋。要寫測試確認
名稱綁定 工具名稱等於最外層 agent 的名稱 SequentialAgent 要沿用 investigator / verifier,內層 LlmAgent 改名;_normalized_response、_EMPTY_RETRY_HINTS、writer_citations 才不用改
非 JSON 輸出 investigator 可能回 [SYSTEM] 重試字串;verifier 沒有 grounding 時回原始文字 這些情況 rater 原樣放行
用 Haiku 5.5 ADK 內建 Claude model class,透過 AsyncAnthropicVertex 走 Vertex AI 需要新增 anthropic[vertex] 依賴、在 Model Garden 啟用模型。instrumentation.py 的 usage 對應是依 Gemini 寫的,Langfuse 計價要另外確認。也可考慮同一個 stack 內的輕量 Gemini 模型
延遲 rater 在 investigator 之後依序執行 只有 69% 的呼叫多一次小模型往返;rater 失敗或逾時就退回不加提示,不阻擋流程
「state 會流回 writer」這一列中,temp: 前綴在 AgentTool 之間的轉發行為還沒實測。其餘各列已對照 google-adk 1.26.0 原始碼(tools/agent_tool.py、agents/base_agent.py、agents/llm_agent.py)。
其他做法
Design alternatives
B 離線先寫好提示,callback 直接附上
每週同步時,用模型一次把每個條目的摘要壓成「主題 → 評級 → 一句提示」,例如「政治:通常不可靠|其他:半可靠」。執行時由現有的 append_grounding_sources / append_url_context_sources 查表附上,判斷主題的工作交給 writer。
優點 不改 agent 結構,不增加執行時的模型呼叫,延遲為零,也最好測試。
缺點 writer 要自己對照主題;每個命中的來源都會附上提示,writer 的 context 會變長。
C 在 writer 的 after_tool_callback 裡呼叫便宜模型
不包成 SequentialAgent,而是在 _normalized_response 之後直接呼叫 rater 模型(genai client 或 Claude client),合併回 tool result。
優點 工具名稱、測試、引用機制都不用動;同一輪的多個工具結果可以合併成一次 rater 呼叫。
缺點 rater 不是 ADK agent,Langfuse 上要手動加 span;callback 裡呼叫模型比較不直觀。
D 交給 verifier 自己判斷
verifier 本來就逐項判斷主張,request 裡也有主張原文。用 before_model_callback 把 request 中 URL 的評級注入,由 verifier 在報告中直接說明。
優點 不增加 agent 或模型呼叫。verifier 手上有主張原文,也讀過頁面內容,看得出是政治新聞、評論專欄還是官方帳號,判斷主題的條件最好。進入草稿的 claim_sources 都要求 verifier_confirmed,所以實際被引用的來源都會經過這一關。
缺點 「內容是否支持主張」和「來源是否可信」要分開輸出,否則 verifier 可能把有支持但來源弱的主張打 ✗,連帶讓「誰說過」這類合理引用被丟掉。investigator 階段沒有提示,writer 可能先拿弱來源跑一輪 verifier 才知道要換。提示寫在報告文字裡,較難統計和強制。另外 verifier_confirmed 是 writer 自己填的布林值,覆蓋率取決於 writer 有沒有真的呼叫 verifier。
E writer 主動查詢的工具
新增 check_source_reliability(urls) function tool,由 writer 自己決定何時查。
優點 實作最簡單,只在需要時花 token。
缺點 writer 可能不查;多一輪工具呼叫。
F 草稿送出時的硬性檢查
在 draft_factcheck_response 的驗證中加規則,例如 claim_sources 若指向維基百科,就退回並要求改引原始出處。
優點 確定會生效,可以和其他任何方案疊加。
缺點 只適合規則明確的情況,處理不了依主題判斷的評級。
方案 執行時多的模型呼叫 依主題判斷 結構變動 trace 可見度
A SequentialAgent + rater 69% 的 investigator 呼叫多一次 rater 依 request 判斷 大:包裝、改名、改測試 好:rater 是獨立 agent
B 離線提示 + callback 無 writer 判斷 小:改兩個 callback 提示寫在 tool output 裡
C writer callback 呼叫 rater 每輪最多一次 rater 判斷 中:改 writer 的 callback 需手動加 span
D verifier 判斷 無(verifier 輸入多約 270 字) verifier 依主張與頁面內容判斷 小:改 verifier 指令與 callback 寫在 verifier 報告裡,可另由 callback 標註命中的條目
E 查詢工具 writer 決定 writer 判斷 小 獨立工具呼叫
F 送出時檢查 無 不處理 小 驗證錯誤訊息
一種分階段的路線
先做 B + F。B 的離線提示本來就是 A 和 C 也需要的資料,F 直接處理量最大的維基引用。上線後用 Langfuse 觀察兩項指標:草稿引用維基的比例,以及政治類主張只靠「政治報導通常不可靠」來源佐證的比例。如果 writer 常套錯主題,再升級到 A 或 C,B 的資料可以沿用為 rater 的輸入。A 和 C 之間的取捨,在於 trace 是否清楚、結構變動能否接受。
另一條同樣不需要新模型的路線是 D + F:由 verifier 依主張判斷評級,F 擋下維基引用。前提是 verifier 的報告把「是否支持」和「來源可信度」分成兩欄。investigator 階段可以再用 B 的查表結果附上簡短提示,減少 writer 拿弱來源去驗證的來回。
技術面待決
架構上要決定的事
評級在哪一段加入? A 包裝成 SequentialAgent、B 在現有 callback 查表、C 在 writer callback 呼叫 rater,或分階段進行。
依主題的判斷由誰做? rater 小模型、writer,或 verifier。
rater 用哪個模型? Haiku 5.5(需接 Vertex 上的 Anthropic 與 Langfuse 計價),或 stack 內的輕量 Gemini 模型。
評級資料放哪裡、怎麼同步? 打包進容器、放 GCS,或寫進資料庫;由哪台機器每週同步,以符合 Wikimedia 的流量規範。
怎麼驗證效果? 用這次的歷史 trace 建 Langfuse dataset,比較改動前後的引用分布。
這屬於 agent 協作流程(adk/)的變動。決定後依專案慣例另寫一份決策紀錄(docs/decisions/)。