iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
生成式 AI

當 .NET 遇見 AI Agents:用 Semantic Kernel × MCP 打造智慧協作應用系列 第 28

Day 28: Semantic Kernel Multi-Agent 實戰 — 新聞內容嚴謹度評估系統

  • 分享至 

  • xImage
  •  

在資訊爆炸的時代,如何快速判斷新聞的可信度與嚴謹程度成為重要課題。今天要實作一個「新聞嚴謹度評估系統」,透過 Semantic Kernel Multi-Agent 的協作機制,從多個面向分析新聞內容,包含來源具體性、證據密度、推論穩健度、平衡與偏見、前後文一致性,以及清晰結構等六大維度,最終產出一份完整的評估報告與總體評分。

這個系統的設計概念是將複雜的新聞評估任務拆解成多個專業面向,每個 Agent 只專注於一個評估維度,這樣不僅能提高評估的準確性,也能讓每個 Agent 的 prompt 更加精簡易維護。最後再透過 Aggregator Agent 將所有評分彙總,計算加權總分並產出易讀的分析報告。

整體系統流程採用兩階段的設計:

  • 第一階段(並行評估):6 個評估代理(Evaluator Agents)同時對同一篇新聞進行不同面向的評分,每個代理輸出 JSON 格式的評分與理由,這部份可以使用先前介紹過的 ConcurrentOrchestration 並行處理來提高效率。
  • 第二階段(彙總報告):Aggregator Agent 接收所有評分結果,計算加權總分、判定等級(A/B/C/D),並整理出亮點(highlights)、風險警示(red flags)及最終摘要,這個部份交給一個簡單的報告生成器 Agent 來完成。

所以這個實作有別於以往採用單一種 Multi-Agent 架構打到底的方式,而是混搭不同的 Agent 架構協作來完成,而這也說明了不同種的 Multi-Agent 架構或是 single Agent 都可以根據需求進行組合與調整。

這個系統的概念性再延伸可擴展成:

  • 媒體監測:企業品牌監測新聞報導的品質與偏見程度。
  • 事實查核:協助事實查核組織快速初篩可疑新聞。
  • 教育訓練:作為媒體識讀教材,幫助學生理解新聞評估標準。
  • 內容治理:平台業者評估內容品質,建立分級機制。
  • 時序分析:追蹤同一新聞事件在不同媒體的報導變化
  • 跨媒體比較:比較不同新聞來源對同一事件的報導差異
  • 事實查核整合:串接事實查核資料庫,自動比對已知不實資訊
  • 資料庫儲存:將評估結果存入資料庫,建立新聞品質資料集

系統架構設計

六大評估面向

系統設計了六個專業評估代理,每個代理專注於一個特定面向,當然這僅是初步設計,真正要運作的評估準則會更細緻:

  1. SourceSpecificityAgent(來源具體性評分)

    • 評估新聞是否明確標示消息來源
    • 檢查是否有具名人士、職稱、機構名稱
    • 確認是否提供文件、報告名稱或編號
    • 評分範圍:0-5 分(5 分為最具體)
  2. EvidenceDensityAgent(證據密度評分)

    • 評估新聞是否提供充足的量化數據
    • 檢查是否有直接引述或文件片段
    • 確認證據是否可追溯
    • 評分範圍:0-5 分(5 分為證據最充足)
  3. InferenceRigorAgent(推論穩健度評分)

    • 評估新聞是否清楚區分事實與推測
    • 檢查因果關係是否合理
    • 確認結論是否對應證據
    • 評分範圍:0-5 分(5 分為推論最嚴謹)
  4. BalanceBiasAgent(平衡與偏見評分)

    • 評估新聞是否呈現多方觀點
    • 檢查用詞是否中性客觀
    • 確認標題是否誤導
    • 評分範圍:0-5 分(5 分為最平衡中立)
  5. ConsistencyAgent(前後文一致性評分)

    • 評估標題與內文是否一致
    • 檢查前後陳述是否矛盾
    • 確認數據是否互相對應
    • 評分範圍:0-5 分(5 分為最一致)
  6. ClarityStructureAgent(清晰結構評分)

    • 評估標題是否貼題
    • 檢查導言是否包含 5W1H
    • 確認段落是否有層次
    • 評分範圍:0-5 分(5 分為結構最清晰)

加權計算邏輯

不同面向在總分計算中有不同的權重,做為整體得分的計算依據:

- 來源具體性(source_specificity):20%
- 證據密度(evidence_density):20%
- 推論穩健度(inference_rigor):20%
- 平衡與偏見(balance_bias):15%
- 前後文一致性(consistency):15%
- 清晰結構(clarity_structure):10%

最終總分計算公式:

總分 = Σ(各面向評分 × 權重) × 20

評分換算為 0-100 分,並根據分數判定等級:

  • A 等級:85 分以上(高品質新聞)
  • B 等級:70-84 分(尚可接受)
  • C 等級:50-69 分(品質堪慮)
  • D 等級:50 分以下(嚴重問題)

系統實作

步驟 1:建立 Kernel

首先建立 Semantic Kernel 實例:

Kernel kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
        apiKey: Config.OpenAI_ApiKey,
        modelId: Config.ModelId)
    .Build();

步驟 2:建立六個評估代理

使用 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);

步驟 3:建立 Aggregator 彙總代理

建立一個專門負責彙總所有評分的代理:

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
    };
}

步驟 4:設定並行編排

使用 ConcurrentOrchestration 讓六個評估代理並行執行:

// 建立並行編排:6 個評分代理並行執行
ConcurrentOrchestration evaluatorOrchestration = new ConcurrentOrchestration(
    sourceSpecificityAgent, evidenceDensityAgent, inferenceRigorAgent,
    balanceBiasAgent, consistencyAgent, clarityStructureAgent);

// 建立 Runtime
var runtime = new InProcessRuntime();
await runtime.StartAsync();

步驟 5:執行評估流程

準備新聞內容並執行兩階段評估:

// 準備測試新聞內容
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("---");
}

步驟 6:彙總最終報告

將所有評分結果傳給 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 輸出,也讓評估結果更容易被後續系統使用與分析。

在實際應用中,可以根據不同產業需求調整評估面向與權重,例如金融新聞可能更重視數據準確性,政治新聞可能更重視平衡性,讓這個系統具有高度的彈性與適用性。


上一篇
Day 27: Semantic Kernel Multi-Agent 實戰 — 打造 PTT 熱門關鍵話題擷取系統
系列文
當 .NET 遇見 AI Agents:用 Semantic Kernel × MCP 打造智慧協作應用28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言