維基來源評級命中評估
COFACTS.AI 出處品質|下週討論用

維基百科來源評級,能幫 Cofacts.ai 挑出處嗎?

把 Cofacts.ai 近五個月實際用過的出處,拿去比對中文維基《來源評級/列表》與英文 WP:RSP,看列表涵蓋多少、評級回傳給 writer 之後可能改變什麼。

資料期間 2026-05-13 – 2026-10-13 來源 Langfuse traces 維基快照 2026-10-13 ADK 1.26.0
第一部分

研究

結論

  • 中文列表命中約 四成出處(草稿 41%)。英文列表只再多 2–3 個百分點,可以晚點再做。
  • 最大的影響是維基百科本身:23% 的草稿引用維基,而兩個列表都把維基評為「通常不可靠」。
  • 約一半的命中落在「依主題分評級」的條目,而且分歧點正好是政治報導。只回傳基準評級會誤導,必須回傳摘要讓模型依主題判斷。
  • writer 現在已經會避開「應停用」來源(入選率 5%),所以評級對這類來源的邊際效果不大。
  • 沒被列表涵蓋的約 56%,大宗是政府網站、查核組織、學術期刊,需要另訂規則。
命中度

列表涵蓋了多少出處

41.2%草稿出處命中中文列表
+2.8再加英文列表只多這幾個百分點(合計 44.0%)
588 / 765至少有一個出處命中的草稿
階段呼叫數出處 URL中文列表英文列表合計命中網域
investigator 搜尋結果1,0239,65339.8%14.4%41.9%297 / 2,572
verifier 讀過的頁面8092,34744.4%11.1%46.2%142 / 742
草稿 references7653,25241.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 找到的候選出處有多少比例最後被寫進草稿:

可作為佐證的類別不宜作為主要佐證的類別

只計有成功草稿的 trace。滑鼠移到長條上可看筆數。

可靠來源與政府網站的入選率本來就最高,「應停用」只有 5%。評級真正的增量集中在三類:

目前仍進入草稿的草稿引用評級會帶來的提示
維基百科(zh / en / ja)239改引條目背後的原始出處
中時、聯合、三立的政治報導188政治議題降級,找其他來源交叉佐證
Facebook、YouTube71只能證明「誰說過」,不能證明內容為真
中國官媒與大紀元系(人民日報、新華社、環球時報、大紀元、新唐人)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 的政治與非政治分開,不用解析內文。適合當國際媒體的補充,優先順序可以放後面。

研究面待決

內容上要決定的事

  1. 維基百科出處怎麼處理?

    只提示、要求改引原始出處,或由 draft_factcheck_response 驗證時擋下。

  2. 如何區分「佐證」和「說法的出處」?

    FB、YouTube、官媒在 Cofacts 常是被查核的對象,提示內容需要能表達這個差別。

  3. 未列來源的備援規則

    政府網站、查核組織、學術期刊、轉載平台各自怎麼處理。

  4. 要不要接英文列表?

    增量約 2.8 個百分點,以國際媒體為主。

方法與限制

這份數字怎麼來的

第二部分

技術討論

目前的提案是在 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_schemaAgentTool 會沿 sub_agents[-1] 找 output_schema,並用它驗證最後的輸出;generate_content_config 也不允許另設 response_schemarater 改用提示要求 JSON 並寬鬆解析,或在最後加一個沒有 schema 的自訂 merge agent
略過 raterbefore_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.5ADK 內建 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。

Ewriter 主動查詢的工具

新增 check_source_reliability(urls) function tool,由 writer 自己決定何時查。

優點 實作最簡單,只在需要時花 token。

缺點 writer 可能不查;多一輪工具呼叫。

F草稿送出時的硬性檢查

在 draft_factcheck_response 的驗證中加規則,例如 claim_sources 若指向維基百科,就退回並要求改引原始出處。

優點 確定會生效,可以和其他任何方案疊加。

缺點 只適合規則明確的情況,處理不了依主題判斷的評級。

方案執行時多的模型呼叫依主題判斷結構變動trace 可見度
A SequentialAgent + rater69% 的 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 拿弱來源去驗證的來回。

技術面待決

架構上要決定的事

  1. 評級在哪一段加入?

    A 包裝成 SequentialAgent、B 在現有 callback 查表、C 在 writer callback 呼叫 rater,或分階段進行。

  2. 依主題的判斷由誰做?

    rater 小模型、writer,或 verifier。

  3. rater 用哪個模型?

    Haiku 5.5(需接 Vertex 上的 Anthropic 與 Langfuse 計價),或 stack 內的輕量 Gemini 模型。

  4. 評級資料放哪裡、怎麼同步?

    打包進容器、放 GCS,或寫進資料庫;由哪台機器每週同步,以符合 Wikimedia 的流量規範。

  5. 怎麼驗證效果?

    用這次的歷史 trace 建 Langfuse dataset,比較改動前後的引用分布。

這屬於 agent 協作流程(adk/)的變動。決定後依專案慣例另寫一份決策紀錄(docs/decisions/)。