DeepSeek 推理鏈視覺化工具在香港高校教學中的創新應用

大型語言模型 (LLM) 已成為現代AI領域的核心,但其「黑箱」特性對初學者而言構成理解障礙。特別是在複雜的應用場景中,例如涉及工具使用 (Function Calling) 或檢索增強生成 (RAG) 時,模型做出決策的每一步往往難以追蹤。DeepSeek 作為性能卓越的LLM,其API提供了強大的基礎能力。本文將探討如何在香港高校教學中,利用DeepSeek API並結合推理鏈視覺化概念,幫助學生深入理解LLM的工作流程,提升AI應用開發與調試能力。

理解 DeepSeek 推理鏈視覺化的核心價值

在AI教育中,單純地呼叫LLM API並觀察最終輸出,往往不足以讓學生掌握模型運作的深層邏輯。推理鏈視覺化旨在將LLM應用程式中,從用戶輸入到最終輸出的多個中間步驟、API調用、數據處理和模型決策過程,以圖形化或結構化的方式呈現出來。這對於教學來說具有多重價值:

  1. 揭開黑箱:將抽象的推理過程具體化,幫助學生直觀理解模型如何處理資訊、做出判斷。
  2. 錯誤分析:當應用程式行為不如預期時,視覺化鏈條有助於迅速定位問題所在,是模型理解錯誤、工具調用失敗還是數據處理不當。
  3. 優化策略:透過觀察不同提示詞 (prompt) 或工具使用策略如何影響推理路徑,學生能學習如何更有效地設計和優化他們的AI應用。
  4. 協作與演示:清晰的視覺化圖表便於學生之間進行討論,或向教師、評審團演示其專案的內部邏輯。

DeepSeek API 以其高效能和對功能調用 (Function Calling) 的良好支持,成為構建多步驟AI應用的理想選擇。透過記錄和視覺化這些步驟,我們可以有效地在教學中實現「推理鏈視覺化」。

DeepSeek API 整合與基本配置

要在高校教學中使用 DeepSeek API,首先需要學生能夠獲取並配置API金鑰,並了解基本的API調用方式。

獲取 DeepSeek API 金鑰

學生可以在 DeepSeek 官方平台 (chat.deepseek.com) 註冊賬號並申請 API 金鑰。通常,平台會提供一定額度的免費試用或學術優惠,這對於教學實踐非常有利。

  1. 登錄 chat.deepseek.com。
  2. 導航至「API Keys」或類似的開發者設置頁面。
  3. 生成新的 API 金鑰,並妥善保管。

Python 環境配置與 API 調用範例

我們將使用 Python 作為教學語言,配合 requests 庫或 DeepSeek 提供的 SDK 進行 API 交互。

步驟 1:安裝必要的庫

pip install deepseek-llm # 如果有官方SDK
# 或者
pip install requests

步驟 2:基本 API 調用範例

以下是一個使用 DeepSeek API 進行簡單對話的 Python 範例。在實際的推理鏈視覺化中,我們需要擴展這個範例來捕捉更多中間狀態。

import os
import deepseek_llm # 假設官方SDK名稱為 deepseek_llm,實際請查閱官方文檔

# 從環境變數獲取 API 金鑰,這是推薦的最佳實踐
# export DEEPSEEK_API_KEY="YOUR_DEEPSEEK_API_KEY"
api_key = os.getenv("DEEPSEEK_API_KEY")

if not api_key:
    raise ValueError("請設定 DEEPSEEK_API_KEY 環境變數")

client = deepseek_llm.DeepSeek(api_key=api_key) # 根據實際SDK初始化方式調整

def get_deepseek_response(messages: list):
    """
    調用 DeepSeek API 獲取回應
    :param messages: 對話歷史,格式如 [{"role": "user", "content": "..."}]
    :return: 模型回應的內容
    """
    try:
        response = client.chat.completions.create(
            model="deepseek-chat", # 或 deepseek-coder,根據需求選擇
            messages=messages,
            stream=False
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"DeepSeek API 調用失敗: {e}")
        return None

# 範例使用
if __name__ == "__main__":
    conversation = [{"role": "user", "content": "香港的旗幟有什麼特色?"}]
    response_content = get_deepseek_response(conversation)
    if response_content:
        print("DeepSeek 回應:", response_content)

這個基礎範例展示了如何與 DeepSeek 進行交互。為了實現推理鏈視覺化,我們需要圍繞這些 API 調用,設計更複雜的應用邏輯,並記錄每個環節的輸入與輸出。

建構一個簡單的 DeepSeek 教學應用案例:智能學習助手

為了具體展示推理鏈視覺化的應用,我們設計一個「智能學習助手」的教學案例。這個助手可以幫助學生查詢課程信息,甚至執行簡單的計算。我們將重點放在如何記錄其內部「思考」流程。

應用場景:一個香港大學生想了解「機器學習」這門課的最新資訊,例如授課老師、上課時間等,或者要求助手進行一個複雜的數學計算。

應用架構概述

  1. 用戶輸入:學生提出問題。
  2. 意圖識別:DeepSeek 模型識別用戶意圖 (查詢課程、進行計算)。
  3. 工具調用 (Function Calling):如果需要,調用預定義的工具 (例如 get_course_infocalculator)。
  4. DeepSeek 再次判斷與生成:DeepSeek 接收工具輸出後,生成最終答案。
  5. 最終輸出:將答案呈現給學生。

這個流程中的每個數字編號的步驟,都是我們可以捕捉並視覺化的「推理鏈」環節。

import json
import logging
from datetime import datetime

# 配置日誌,便於記錄推理鏈的每一步
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 模擬的工具函數
def get_course_info(course_name: str):
    """模擬查詢課程信息的函數"""
    logging.info(f"工具調用: get_course_info(course_name='{course_name}')")
    # 模擬數據庫查詢
    course_data = {
        "機器學習": {"teacher": "陳教授", "time": "週二 14:00-17:00", "location": "NCL301", "description": "深入探討機器學習演算法與應用。"},
        "高等數學": {"teacher": "王博士", "time": "週一 10:00-12:00", "location": "SCI102", "description": "微積分與線性代數進階課程。"},
        "計算機網絡": {"teacher": "李博士", "time": "週四 09:00-12:00", "location": "ENG205", "description": "學習網絡協議與架構。"},
    }
    info = course_data.get(course_name, {"error": "未找到該課程信息"})
    logging.info(f"工具輸出: {info}")
    return json.dumps(info, ensure_ascii=False)

def calculator(expression: str):
    """模擬計算器函數"""
    logging.info(f"工具調用: calculator(expression='{expression}')")
    try:
        result = eval(expression) # 注意:在實際生產環境中eval存在安全風險,教學中為簡化演示
        logging.info(f"工具輸出: {result}")
        return json.dumps({"result": result})
    except Exception as e:
        logging.error(f"計算錯誤: {e}")
        return json.dumps({"error": f"計算表達式錯誤: {e}"})

# DeepSeek 函數定義 (Function Definitions)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_course_info",
            "description": "獲取指定課程的詳細信息,包括老師、時間、地點和描述。",
            "parameters": {
                "type": "object",
                "properties": {
                    "course_name": {"type": "string", "description": "課程的名稱,例如 '機器學習'"},
                },
                "required": ["course_name"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "calculator",
            "description": "執行數學計算,輸入為數學表達式字符串。",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {"type": "string", "description": "需要計算的數學表達式,例如 '10 * 5 + 2'"},
                },
                "required": ["expression"],
            },
        },
    },
]

# 擴展後的 DeepSeek 調用函數,支持工具調用並記錄推理過程
def chat_with_deepseek_and_log_chain(user_query: str):
    messages = [{"role": "user", "content": user_query}]
    logging.info(f"--- 新的查詢開始 ({datetime.now().isoformat()}) ---")
    logging.info(f"用戶輸入: {user_query}")

    # 第一輪 DeepSeek 調用,判斷是否需要工具
    logging.info("第一輪 DeepSeek 調用...")
    response_1 = client.chat.completions.create(
        model="deepseek-chat",
        messages=messages,
        tools=tools, # 傳遞工具定義
        stream=False
    )
    first_response_message = response_1.choices[0].message
    logging.info(f"DeepSeek 第一次回應: role={first_response_message.role}, content={first_response_message.content}, tool_calls={first_response_message.tool_calls}")
    messages.append(first_response_message) # 將 DeepSeek 的回應加入對話歷史

    # 檢查是否需要調用工具
    if first_response_message.tool_calls:
        for tool_call in first_response_message.tool_calls:
            function_name = tool_call.function.name
            function_args = json.loads(tool_call.function.arguments)

            logging.info(f"DeepSeek 判斷需要調用工具: {function_name} with args: {function_args}")

            # 根據函數名稱調用對應的工具
            if function_name == "get_course_info":
                tool_output = get_course_info(**function_args)
            elif function_name == "calculator":
                tool_output = calculator(**function_args)
            else:
                tool_output = json.dumps({"error": f"未知工具: {function_name}"})
                logging.error(tool_output)

            # 將工具輸出添加到對話歷史,再次調用 DeepSeek
            messages.append(
                {
                    "tool_call_id": tool_call.id,
                    "role": "tool",
                    "name": function_name,
                    "content": tool_output,
                }
            )
            logging.info(f"添加工具輸出到對話: {tool_output}")

            # 第二輪 DeepSeek 調用,生成最終答案
            logging.info("第二輪 DeepSeek 調用 (帶工具輸出)...")
            response_2 = client.chat.completions.create(
                model="deepseek-chat",
                messages=messages,
                stream=False
            )
            final_response_message = response_2.choices[0].message
            logging.info(f"DeepSeek 最終回應: {final_response_message.content}")
            messages.append(final_response_message) # 將最終回應加入對話歷史

            return final_response_message.content
    else:
        # 如果第一輪 DeepSeek 沒有調用工具,直接返回其內容
        return first_response_message.content

# 範例教學應用
if __name__ == "__main__":
    print("\n--- 查詢課程信息 ---")
    final_answer_1 = chat_with_deepseek_and_log_chain("機器學習這門課的授課老師是誰?")
    print("\n最終助手回答:", final_answer_1)

    print("\n--- 執行數學計算 ---")
    final_answer_2 = chat_with_deepseek_and_log_chain("請幫我計算 (150 + 20) * 5 是多少?")
    print("\n最終助手回答:", final_answer_2)

    print("\n--- 簡單對話 ---")
    final_answer_3 = chat_with_deepseek_and_log_chain("香港有哪些著名的旅遊景點?")
    print("\n最終助手回答:", final_answer_3)

視覺化實踐:從日誌到圖形化呈現

上述代碼通過 logging 模組記錄了智能學習助手與 DeepSeek API 交互的每一步。這本身就是一種文本形式的「推理鏈」呈現。對於教學而言,我們可以將這些日誌進一步轉化為更直觀的圖形。

日誌分析與數據提取

教學中,教師可以引導學生解析日誌,提取關鍵信息,例如:

  • 節點 (Nodes):用戶輸入、DeepSeek 回應 (第一輪)、工具調用、工具輸出、DeepSeek 回應 (第二輪)。
  • 邊 (Edges):表示信息流動的方向,例如「用戶輸入 -> DeepSeek 回應」。

選擇視覺化工具

對於香港高校的教學環境,可以選擇以下幾種視覺化方案:

  1. 基於文本的簡化圖表 (ASCII Art):對於快速理解或終端演示,可以用簡單的文本符號繪製流程圖。
  2. Graphviz (DOT 語言):一個強大的圖形視覺化軟件,可以根據結構化文本 (DOT 語言) 生成流程圖、UML 圖等。學生可以編寫 Python 腳本來自動生成 DOT 文件,再用 Graphviz 渲染。
  3. Mermaid.js / PlantUML:這些工具允許開發者用簡潔的文本語法描述圖表,然後在 Markdown 文件、網頁應用或 IDE 中渲染。非常適合在文檔或網頁中嵌入動態流程圖。
  4. 自定義網頁界面:對於進階課程,學生可以開發一個簡單的 Flask/Django 網頁應用,將日誌數據解析後動態渲染成互動式流程圖 (例如使用 D3.js 或 ECharts)。

Graphviz 為例,學生可以從日誌中提取信息,生成 DOT 文件:

digraph InferenceChain {
    rankdir=LR;
    node [shape=box, style=filled, fillcolor=lightgray];

    "User Input" [label="用戶輸入: 機器學習這門課的授課老師是誰?", fillcolor=lightblue];
    "DS_Response_1" [label="DeepSeek 回應 (第一輪):\n需要調用 get_course_info", fillcolor=lightgoldenrod];
    "Tool_Call_get_course_info" [label="工具調用:\nget_course_info(course_name='機器學習')", fillcolor=lightgreen];
    "Tool_Output_get_course_info" [label="工具輸出:\n{'teacher': '陳教授', ...}", fillcolor=lightgreen];
    "DS_Response_2" [label="DeepSeek 回應 (第二輪):\n最終答案", fillcolor=lightgoldenrod];
    "Final_Answer" [label="最終助手回答: 陳教授", fillcolor=lightcoral];

    "User Input" -> "DS_Response_1";
    "DS_Response_1" -> "Tool_Call_get_course_info" [label="要求工具"];
    "Tool_Call_get_course_info" -> "Tool_Output_get_course_info";
    "Tool_Output_get_course_info" -> "DS_Response_2" [label="工具結果"];
    "DS_Response_2" -> "Final_Answer";
}

這個 DOT 語言描述的圖表可以通過 Graphviz 命令行工具渲染為 PNG, SVG 等圖片格式,直觀地展示推理流程。

AI應用程式開發中的 DeepSeek 推理流程視覺化示意圖 圖示:AI應用程式開發中的 DeepSeek 推理流程視覺化示意圖

香港高校教學中的創新應用場景

DeepSeek 推理鏈視覺化工具不僅僅是技術演示,它能在香港高校的多種課程和專案中發揮創新作用:

  1. 提示工程 (Prompt Engineering) 課程:學生可以設計不同的提示詞來解決同一問題,然後視覺化它們的推理鏈。比較不同提示詞導致的模型決策路徑和工具調用情況,從而理解提示詞對模型行為的深遠影響。
  2. AI 倫理與偏見分析:在涉及敏感話題或決策的AI應用中,視覺化推理鏈可以幫助學生追溯模型的決策依據,識別潛在的數據偏見或模型邏輯缺陷,從而進行倫理審查和改進。
  3. 多模態 AI 應用開發:如果 DeepSeek 未來支持多模態功能,視覺化工具將能展示模型如何整合不同模態的信息進行推理。
  4. Agentic AI 與工具使用:深入教授 Agentic AI 概念時,學生可以設計複雜的代理人系統,讓 DeepSeek 作為核心決策引擎,並視覺化多步驟的工具選擇、執行與反思過程。
  5. 檢索增強生成 (RAG) 系統教學:學生可以構建一個 RAG 系統,讓 DeepSeek 結合外部知識庫生成答案。視覺化流程將清晰展示檢索階段如何為 DeepSeek 提供上下文,以及 DeepSeek 如何利用這些信息進行生成。
  6. 專案式學習 (Project-based Learning):在畢業設計或專題研習中,學生可以將 DeepSeek 視覺化工具整合到他們的 AI 應用開發中,作為開發、調試和最終演示的核心環節。這能大大提升專案的透明度和可解釋性。

實際操作步驟與教學建議

為了在香港高校有效地實施這一創新教學方法,教師可以遵循以下步驟並提供相應的建議:

實際操作步驟

  1. 課前準備
    • 確保 DeepSeek API 在香港地區的可訪問性與穩定性。
    • 為學生提供 DeepSeek 平台註冊和 API Key 申請的詳細指引。
    • 準備好基礎的 Python 環境與範例代碼 (如本文所示的智能學習助手)。
    • 介紹 Graphviz 或其他視覺化工具的安裝與基本用法。
  2. 課堂導入與講解
    • 簡要介紹 LLM 的「黑箱」問題和推理鏈視覺化的必要性。
    • 分步講解智能學習助手的代碼邏輯,特別是 chat_with_deepseek_and_log_chain 函數中如何記錄每一步。
    • 演示如何運行範例代碼,並分析生成的日誌內容。
  3. 實踐環節
    • 任務一:基礎視覺化:讓學生修改範例代碼,新增一個工具函數(例如,查詢天氣),並運行代碼生成新的日誌。
    • 任務二:日誌轉圖表:引導學生編寫一個簡單的 Python 腳本,從他們的日誌文件中提取關鍵信息,並生成 Graphviz 的 DOT 語句。
    • 任務三:渲染與分析:使用 Graphviz 渲染 DOT 文件為圖表,學生分析不同用戶查詢下的推理鏈有何異同。
  4. 進階挑戰 (可選)
    • 讓學生嘗試使用 Mermaid.js 或 PlantUML,將其嵌入到一個簡短的網頁或 Markdown 報告中。
    • 設計一個更複雜的 Agentic AI 應用,包含多個工具和決策節點,並嘗試視覺化其完整工作流程。

教學建議

  • 小組協作:鼓勵學生分組討論和完成任務,互相學習和解決問題。
  • 案例分析:提供更多真實世界的 AI 應用案例,讓學生思考如何為這些案例設計推理鏈視覺化方案。
  • 鼓勵實驗:強調「試錯」在 AI 開發中的重要性,鼓勵學生大膽嘗試不同的提示詞、工具定義和應用邏輯,並利用視覺化工具分析結果。
  • 結合專案作業:將 DeepSeek 推理鏈視覺化作為學期專案或畢業設計的一部分,要求學生在最終報告中包含其 AI 應用的推理鏈圖表和分析。

香港高校學生利用 DeepSeek API 進行專案學習與協作 圖示:香港高校學生利用 DeepSeek API 進行專案學習與協作,可結合視覺化工具提升學習效率

結語

DeepSeek API 結合推理鏈視覺化概念,為香港高校的 AI 教學提供了寶貴的創新機會。它不僅幫助學生深入理解大型語言模型的內部運作機制,更透過實際操作和圖形化分析,顯著提升了他們設計、開發和調試複雜 AI 應用程式的能力。透過將抽象的AI推理過程具體化,我們能夠更好地培養新一代AI人才,為香港乃至全球的科技發展貢獻力量。