在資訊爆炸的時代,如何快速判斷新聞的可信度與嚴謹程度成為重要課題。今天要實作一個「新聞嚴謹度評估系統」,透過 Semantic Kernel Multi-Agent 的協作機制,從多個面向分析新聞內容,包含來源具體性、證據密度、推論穩健度、平衡與偏見、前後文一致性,以及清晰結構等六大維度,最終產出一份完整的評估報告與總體評分。
這個系統的設計概念是將複雜的新聞評估任務拆解成多個專業面向,每個 Agent 只專注於一個評估維度,這樣不僅能提高評估的準確性,也能讓每個 Agent 的 prompt 更加精簡易維護。最後再透過 Aggregator Agent 將所有評分彙總,計算加權總分並產出易讀的分析報告。
整體系統流程採用兩階段的設計:
ConcurrentOrchestration
並行處理來提高效率。所以這個實作有別於以往採用單一種 Multi-Agent 架構打到底的方式,而是混搭不同的 Agent 架構協作來完成,而這也說明了不同種的 Multi-Agent 架構或是 single Agent 都可以根據需求進行組合與調整。
這個系統的概念性再延伸可擴展成:
系統設計了六個專業評估代理,每個代理專注於一個特定面向,當然這僅是初步設計,真正要運作的評估準則會更細緻:
SourceSpecificityAgent(來源具體性評分)
EvidenceDensityAgent(證據密度評分)
InferenceRigorAgent(推論穩健度評分)
BalanceBiasAgent(平衡與偏見評分)
ConsistencyAgent(前後文一致性評分)
ClarityStructureAgent(清晰結構評分)
不同面向在總分計算中有不同的權重,做為整體得分的計算依據:
- 來源具體性(source_specificity):20%
- 證據密度(evidence_density):20%
- 推論穩健度(inference_rigor):20%
- 平衡與偏見(balance_bias):15%
- 前後文一致性(consistency):15%
- 清晰結構(clarity_structure):10%
最終總分計算公式:
總分 = Σ(各面向評分 × 權重) × 20
評分換算為 0-100 分,並根據分數判定等級:
首先建立 Semantic Kernel 實例:
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
apiKey: Config.OpenAI_ApiKey,
modelId: Config.ModelId)
.Build();
使用 ChatCompletionAgent
建立六個專業評估代理,每個代理都有明確的 Instructions,範例中使用同一個kernel對接同一個模型,實際運作中可以根據需求調整,對接不同的模型:
// === Helper:建立 ChatCompletionAgent(單一評分面向Agent) ===
/// <summary>
/// 建立 ChatCompletionAgent(單一評分面向Agent)
/// </summary>
/// <param name="name"> Agent Name</param>
/// <param name="description"> Agent Description</param>
/// <param name="instructions"> Agent Instructions</param>
/// <returns></returns>
private static ChatCompletionAgent MakeAgent(string name, string description, string instructions, Kernel kernel)
{
return new ChatCompletionAgent
{
Name = name,
Description = description,
Instructions = instructions,
Kernel = kernel
};
}
// 1. 來源具體性評分代理
var sourceSpecificityAgent = MakeAgent(
name: "SourceSpecificityAgent",
description: "來源具體性評分",
instructions:
"""
你是「SourceSpecificity Agent」。
任務:只根據本文文本,評估「來源具體性」,輸出 JSON:{"score":0-5,"reason":""}。
規則(0-5,整數):
- 5:具名人/職稱/機構 + 文件/報告名 +(可選)日期/連結/編號
- 3:僅具名其一,細節不足
- 0-1:僅「據可靠來源/消息人士/據了解」等籠統表述
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
// 2. 證據密度評分代理
var evidenceDensityAgent = MakeAgent(
name: "EvidenceDensityAgent",
description: "證據密度評分",
instructions:
"""
你是「EvidenceDensity Agent」。
任務:只根據本文文本,評估「證據密度」,輸出 JSON:{"score":0-5,"reason":""}。
規則:
- 5:多組可追溯量化數據/直接引述/文件片段
- 3:零星數據或二手轉述
- 0-1:純形容詞、無數字、無引述
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
// 3. 推論穩健度評分代理
var inferenceRigorAgent = MakeAgent(
name: "InferenceRigorAgent",
description: "推論穩健度評分",
instructions:
"""
你是「InferenceRigor Agent」。
任務:只根據本文文本,評估「推論穩健度」,輸出 JSON:{"score":0-5,"reason":""}。
規則:
- 5:清楚區分事實/推測,使用條件語,避免跳躍因果,結論對應證據
- 3:推論大致合理但未說明限制
- 0-1:以偏概全/錯誤因果/斷言式結論
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
// 4. 平衡與偏見評分代理
var balanceBiasAgent = MakeAgent(
name: "BalanceBiasAgent",
description: "平衡與偏見評分",
instructions:
"""
你是「BalanceBias Agent」。
任務:只根據本文文本,評估「平衡與偏見」,輸出 JSON:{"score":0-5,"reason":""}。
規則:
- 5:呈現多方觀點、語氣中性、標題不誤導
- 3:輕度傾向或缺少反方
- 0-1:高度單一路線、情緒化/貶抑性用語
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
// 5. 前後文一致性評分代理
var consistencyAgent = MakeAgent(
name: "ConsistencyAgent",
description: "前後文一致性評分",
instructions:
"""
你是「Consistency Agent」。
任務:只根據本文文本,評估「前後文一致性」,輸出 JSON:{"score":0-5,"reason":""}。
規則:
- 5:標題與內文一致,前後陳述不矛盾,數據互相對應
- 3:小瑕疵,但不影響主要結論
- 0-1:標題與內文不符或自我矛盾
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
// 6. 清晰結構評分代理
var clarityStructureAgent = MakeAgent(
name: "ClarityStructureAgent",
description: "清晰結構評分",
instructions:
"""
你是「ClarityStructure Agent」。
任務:只根據本文文本,評估「清晰結構」,輸出 JSON:{"score":0-5,"reason":""}。
規則:
- 5:標題貼題、導言有 5W1H、段落有層次、關鍵名詞有定義
- 3:可讀性尚可但重點分散
- 0-1:結構混亂、重複堆疊
輸出限制:不可加入外部事實,不可多輸出欄位,理由 ≤ 80 字,需指向文內可觀察片段。
""", kernel);
建立一個專門負責彙總所有評分的代理:
var aggregator = MakeAggregatorAgent();
// Aggregator Agent 建立方法
private static ChatCompletionAgent MakeAggregatorAgent()
{
const string weights = """
權重:
- source_specificity: 0.20
- evidence_density: 0.20
- inference_rigor: 0.20
- balance_bias: 0.15
- consistency: 0.15
- clarity_structure: 0.10
""";
const string targetSchema = """
請只輸出以下 JSON(所有欄位不可缺漏,不可多出):
{
"scores": {
"source_specificity": { "score": 0, "reason": "" },
"evidence_density": { "score": 0, "reason": "" },
"inference_rigor": { "score": 0, "reason": "" },
"balance_bias": { "score": 0, "reason": "" },
"consistency": { "score": 0, "reason": "" },
"clarity_structure": { "score": 0, "reason": "" }
},
"weighted_total": 0,
"grade": "A|B|C|D",
"highlights": [],
"red_flags": [],
"final_summary": ""
}
""";
var prompt = $"""
你是「Aggregator Agent」。
僅根據提供的 6 個評分結果(每個含 score 與 reason),計算總分與等級並輸出目標 JSON。
- 總分:Σ(各面向 score × 權重) × 20,四捨五入為整數(0-100)
- 等級:A ≥ 85、B 70–84、C 50–69、D < 50
- highlights:擇優點 1–3 條(簡短)
- red_flags:若 score ≤ 2 的面向,整理 1–5 條風險(簡短)
- final_summary:150–200 字,自然語氣,點出可用性與疑慮
{weights}
{targetSchema}
僅輸出 JSON,不得包含其他文字。
""";
return new ChatCompletionAgent
{
Name = "Aggregator",
Description = "彙總 6 面向評分為最終 JSON",
Instructions = prompt
};
}
使用 ConcurrentOrchestration
讓六個評估代理並行執行:
// 建立並行編排:6 個評分代理並行執行
ConcurrentOrchestration evaluatorOrchestration = new ConcurrentOrchestration(
sourceSpecificityAgent, evidenceDensityAgent, inferenceRigorAgent,
balanceBiasAgent, consistencyAgent, clarityStructureAgent);
// 建立 Runtime
var runtime = new InProcessRuntime();
await runtime.StartAsync();
準備新聞內容並執行兩階段評估:
// 準備測試新聞內容
var originalContent = """
昨(10)日是國慶日,中國選擇在這時機公布3名水軍名單,表示他們散布台獨相關言論。今(11)日更進一步發布懸賞通告,指稱掌握我軍方的「心戰大隊」,共18人的姓名、身分證號跟照片全被公開。
中共公安部門近日發布通告,聲稱接獲民眾舉報,指台灣民進黨當局涉嫌透過設置「反動宣傳媒介」與製作、傳播「反動遊戲」等手段,對兩岸民眾進行煽動與宣傳,造成惡劣影響。通告中中共指控台灣軍方的「政治作戰局心理作戰大隊」(簡稱「心戰大隊」)長期策劃並執行「煽動分裂國家」的相關行動。
中共公安機關宣布,決定懸賞徵集包括18名「心戰大隊」核心人員的違法犯罪線索,凡是提供有效線索者,或協助公安機關抓獲相關嫌疑人的民眾,將可獲得人民幣1萬元(約新台幣4萬3千元)獎勵。
而在公布這波名單前,昨日中共國家安全部也聲稱,發現一批疑似被用於「操控輿論、散播台獨言論」的網路帳號,並點名3人在網路上散布台獨相關言論,公布姓名和背景。對此,國防部軍事情報局進一步反擊,認為中共散布此類不實訊息,係其長期運用各種手段,污衊國軍之慣用伎倆。
""";
Console.WriteLine($"【原始文件】\n{originalContent}\n");
// 第一階段:並行執行 6 個評分代理
Console.WriteLine("【階段 1】執行 6 個評分代理並行評分...\n");
var evaluatorResult = await evaluatorOrchestration.InvokeAsync(originalContent, runtime);
var evaluatorReports = await evaluatorResult.GetValueAsync(TimeSpan.FromSeconds(300));
Console.WriteLine("【6 個評分結果】");
foreach (var report in evaluatorReports)
{
Console.WriteLine(report);
Console.WriteLine("---");
}
將所有評分結果傳給 Aggregator 進行彙總:
// 第二階段:將所有評分結果組合,傳給 Aggregator 彙總
Console.WriteLine("\n【階段 2】執行 Aggregator 彙總評分...\n");
var combinedScores = string.Join("\n\n", evaluatorReports);
var aggregatorInput = $"""
以下是 6 個評分面向的結果:
{combinedScores}
請根據上述評分結果,計算總分並輸出最終 JSON 報告。
""";
// 使用 aggregator 的 Kernel 直接呼叫
var aggregatorKernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(apiKey: Config.OpenAI_ApiKey, modelId: Config.ModelId)
.Build();
var chatService = aggregatorKernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.AddSystemMessage(aggregator.Instructions ?? "");
chatHistory.AddUserMessage(aggregatorInput);
var finalResponse = await chatService.GetChatMessageContentAsync(chatHistory);
var finalReport = finalResponse.Content;
Console.WriteLine("【最終評分 JSON】");
Console.WriteLine(finalReport);
執行系統後,會得到類似以下的輸出:
【原始文件】
昨(10)日是國慶日,中國選擇在這時機公布3名水軍名單,表示他們散布台獨相關言論。今(11)日更進一步發布懸賞通告,指稱掌握我軍方的「心戰大隊」,共18人的姓名、身分證號跟照片全被公開。
中共公安部門近日發布通告,聲稱接獲民眾舉報,指台灣民進黨當局涉嫌透過設置「反動宣傳媒介」與製作、傳播「反動遊戲」等手段,對兩岸民眾進行煽動與宣傳,造成惡劣影響。通告中中共指控台灣軍方的「政治作戰局心理作戰大隊」(簡稱「心戰大隊」)長期策劃並執行「煽動分裂國家」的相關行動。
中共公安機關宣布,決定懸賞徵集包括18名「心戰大隊」核心人員的違法犯罪線索,凡是提供有效線索者,或協助公安機關抓獲相關嫌疑人的民眾,將可獲得人民幣1萬元(約新台幣4萬3千元)獎勵。
而在公布這波名單前,昨日中共國家安全部也聲稱,發現一批疑似被用於「操控輿論、散播台獨言論」的網路帳號,並點名3人在網路上散布台獨相關言論,公布姓名和背景。對此,國防部軍事情報局進一=== Semantic Kernel AI Agent 系統 ===
Hello, News Rigor Agent!
【原始文件】
昨(10)日是國慶日,中國選擇在這時機公布3名水軍名單,表示他們散布台獨相關言論。今(11)日更進一步發布懸賞通告,指稱掌握我軍方的「心戰大隊」,共18人的姓名、身分證號跟照片全被公開。
中共公安部門近日發布通告,聲稱接獲民眾舉報,指台灣民進黨當局涉嫌透過設置「反動宣傳媒介」與製作、傳播「反動遊戲」等手段,對兩岸民眾進行煽動與宣傳,造成惡劣影響。通告中中共指控台灣軍方的「政治作戰局心理作戰大隊」(簡稱「心戰大隊」)長期策劃並執行「煽動分裂國家」的相關行動。
中共公安機關宣布,決定懸賞徵集包括18名「心戰大隊」核心人員的違法犯罪線索,凡是提供有效線索者,或協助公安機關抓獲相關嫌疑人的民眾,將可獲得人民幣1萬元(約新台幣4萬3千元)獎勵。
而在公布這波名單前,昨日中共國家安全部也聲稱,發現一批疑似被用於「操控輿論、散播台獨言論」的網路帳號,並點名3人在網路上散布台獨相關言論,公布姓名和背景。對此,國防部軍事情報局進一步反擊,認為中共散布此類不實訊息,係其長期運用各種手段,污衊國軍之慣用伎倆。
【階段 1】執行 6 個評分代理並行評分...
【6 個評分結果】
{"score":3,"reason":"文本多為描述性敘述與官方發布通告,包含1萬元懸賞、18人姓名身分等零星量化數據,但無明確文件片段或多組數據。"}
---
{"score":5,"reason":"文本同時呈現中共及台灣軍方的說法,標題和語氣中性,未見明顯傾向。"}
---
{"score":3,"reason":"有明確主題且大致分段,但導言缺乏全面5W1H,段落主題交錯。部分專有名詞如「心戰大隊」僅簡要提及,未詳細定義。"}
---
{"score":3,"reason":"有提及中共公安部門、國家安全部、國防部軍事情報局等具體機構,但未列舉具體報告、通告文件名或詳細日期。"}
---
{"score":5,"reason":"標題與內文描述皆圍繞中共公佈名單、懸賞,對台灣軍方與網路行動,細節前後呼應無矛盾。"}
---
{"score":5,"reason":"文本多次明確標示中共方、台灣國防部的主張和指控(如『聲稱』『認為』『指控』),區分敘述各方說法,無論斷因果。"}
---
【階段 2】執行 Aggregator 彙總評分...
【最終評分 JSON】
{
"scores": {
"source_specificity": { "score": 3, "reason": "有提及中共公安部門、國家安全部、國防部軍事情報局等具體機構,但未列舉具體報告、通告文件名或詳細日期。" },
"evidence_density": { "score": 3, "reason": "文本多為描述性敘述與官方發布通告,包含1萬元懸賞、18人姓名身分等零星量化數據,但無明確文件片段或多組數據。" },
"inference_rigor": { "score": 5, "reason": "文本多次明確標示中共方、台灣國防部的主張和指控(如『聲稱』『認為』『指控』),區分敘述各方說法,無論斷因果。" },
"balance_bias": { "score": 5, "reason": "文本同時呈現中共及台灣軍方的說法,標題和語氣中性,未見明顯傾向。" },
"consistency": { "score": 5, "reason": "標題與內文描述皆圍繞中共公佈名單、懸賞,對台灣軍方與網路行動,細節前後呼應無矛盾。" },
"clarity_structure": { "score": 3, "reason": "有明確主題且大致分段,但導言缺乏全面5W1H,段落主題交錯。部分專有名詞如「心戰大隊」僅簡要提及,未詳細定義。" }
},
"weighted_total": 80,
"grade": "B",
"highlights": [
"敘述雙方觀點,平衡公正",
"邏輯與細節前後一致",
"事實與立場分明標示"
],
"red_flags": [
"證據細節有限,量化數據稀少",
"部分專有名詞未充分解釋",
"缺乏官方文件原文及清楚來源"
],
"final_summary": "本文在平衡度及邏輯一致性方面表現優異,能夠分明標示事實與各方立場,呈現中共及台灣軍方說法並無明顯偏頗,是資訊透明度高的報導。但在證據呈現方面仍有不足,缺少明確的文件細節和量化數據,部分專有名詞未加詳解,使理解層次略有限制。總體而言,報導具備參考價值,能幫助讀者認識雙方立場,但若需深入研判事實細節,尚須輔以官方原始文件及更明確的佐證。"
}
今天實作的新聞嚴謹度評估系統展示了 Semantic Kernel Multi-Agent 的協作能力。透過將複雜任務拆解成多個專業 Agent 並行處理,再由 Aggregator 統一彙總,提升處理效率,也讓每個 Agent 的職責更加明確。
這種「分而治之」的設計模式在處理複雜分析任務時特別有效,每個 Agent 只需專注於自己的評估面向,不需要理解整個系統的複雜邏輯。同時,透過結構化的 JSON 輸出,也讓評估結果更容易被後續系統使用與分析。
在實際應用中,可以根據不同產業需求調整評估面向與權重,例如金融新聞可能更重視數據準確性,政治新聞可能更重視平衡性,讓這個系統具有高度的彈性與適用性。