代理式AI RAG Intel SmolAgents GPU

從文件切分到索引構建逐步展示 實作文件AI問答系統

輕量模型搭建RAG代理 本地GPU支撐即時問答

2025-12-17
本文將探討如何運用輕量級代理框架SmolAgents,結合混合式檢索技術(FAISS + BM25)與本地加速的LLM,以打造高效能、可解釋性與具情境感知能力的模組化RAG系統。這裡將透過一個能夠智慧選擇使用文件檢索或網頁檢索的文件導向問答系統做說明。

檢索增強生成(Retrieval-Augmented Generation,RAG)是現代智慧系統的重要基石。然而,要將其融入能自主選擇工具的代理程式,同時兼顧計算效率並確保以本地文件為依據,並非易事。

本文將示範如何運用以下技術,構建一個混合式檢索的RAG流程:

‧SmolAgents:輕量級開源代理框架

‧Qwen2.5-3B:精簡且支援多語言的指令微調LLM

‧Intel Extension for PyTorch(IPEX):用於GPU加速的本地推論

‧FAISS + BM25:結合語義與詞彙的雙重檢索方案

‧LangChain:用於文件的解析、切分與索引管理。

這些代理程式具備工具使用的推理能力(會優先進行文件導向的檢索,僅在必要時才回退至網路搜尋),以確保同時兼顧效率與可信度。

語意遇上推理:混合式檢索與代理邏輯如何協同運作

接著,說明混合式檢索與代理邏輯如何協同運作。

混合式檢索:FAISS + BM25實現更深層的文件基礎

此系統的核心是一套混合式檢索策略,融合語意相似度與精確關鍵字匹配,以擷取最相關的文件片段。

‧FAISS(語意搜尋):利用Qwen3-Embedding-0.6B所生成的密集嵌入(Dense Embeddings),以尋找語意上相關的段落,即使查詢詞與文本未完全匹配也無妨。這在使用者提出概念性問題時特別有用。

‧BM25(句法搜尋):一種強大的詞彙檢索演算法,根據查詢詞在文件片段中出現的頻率及其獨特性進行排序。特別適用於注重精確度且詞彙密集的查詢。

這兩種系統相互配合,可確保高召回率(捕捉語意)與高精確度(鎖定關鍵字),為LLM提供兼具廣度與準確性的上下文。

代理式工作:SmolAgents智慧決策工具

不同於僅盲目套用單一檢索方法的靜態流程,SmolAgents引入了代理式推理,讓系統能夠根據查詢情境動態選擇工具。其運作方式如下:

‧CodeAgent接收查詢,並判斷是否能從提供的文件區塊中獲得答案。

‧它會優先透過HybridRetrieverTool進行檢索。

‧若文件上下文脈絡不足或不相關,代理程式可能會退回至使用DuckDuckGo進行網路搜尋。

‧所有步驟與工具輸出皆會被完整記錄,以提升代理決策的透明度與可解釋性。

這種模組化、以決策為驅動的方法,讓系統既具備資源效率,又可信賴——在依賴外部來源之前,優先運用本地知識。

技術架構

此代理式RAG系統架構整合了多個協同運作的元件,以確保檢索與生成的高效率。從整體架構來看,系統包括以下元件:

文件匯入與切分(Document Ingestion & Chunking)

PDF載入器(PDF Loader)使用LangChain的PyPDFLoader匯入來源文件;而文本分割器(Text Splitter)中,RecursiveCharacterTextSplitter能有效將內容分割成易於管理且適合嵌入的區塊。

混合式檢索

FAISS(語意搜尋)利用密集嵌入(來自Qwen3-Embedding-0.6B模型)取得語意上相似的內容;BM25(句法搜尋)則透過精確的關鍵字匹配對區塊進行評分,來輔助FAISS。這兩種檢索方法的結果,在交付前會被合併並刪除重複。

代理式決策(Agentic Decision Making)

SmolAgents框架的核心代理程式會評估查詢,決定要調用哪些工具,並安排檢索過程的順序;代理程式的提示(Prompt)會強制執行一項工具使用政策——優先使用本地文件檢索器,而不是備援方法,例如透過DuckDuckGo進行網路搜尋。

本地推論引擎(Local Inference Engine)

Qwen2.5-3B-Instruct with IPEX這個本地LLM經由Intel Extension for PyTorch(IPEX)優化,根據檢索到的上下文生成最終答案。

輸出交付(Output Delivery)

流程的最後是綜合檢索到的數據,並針對使用者的查詢生成一個流暢且有根據的答案。

程式碼詳解

以下透過幾個步驟來說明程式碼的執行。

步驟1:匯入必要的函式庫

程式碼首先匯入所有建構一個能在英特爾GPU上高效運行的混合式檢索代理RAG系統所需的Python函式庫(Code01)。

Code01

步驟2:使用英特爾GPU加速載入本地LLM

此函數使用Qwen/Qwen2.5-3B-Instruct模型檢查點從HuggingFace的transformers函式庫載入分詞器(tokenizer)和模型。它執行的操作,如Code02所示。

Code02

‧分詞器載入:載入一個適合基於transformer的生成任務的快速分詞器。

‧模型初始化:載入一個因果語言模型(AutoModelForCausalLM)並將其推送到xpu裝置,從而透過
intel_extension_for_pytorch在Intel Max系列GPU上執行。

‧流程創建:將模型包裝成一個文本生成流程,配置如下:max_new_tokens(控制輸出長度)、temperature(確保確定性、低變異數的回應)、repetition_penalty(防止循環和詞元重複)。

‧LangChain相容性:該流程以HuggingFacePipeline的形式返回,使其與LangChain的代理程式和工具相容。

步驟3:準備具備混合索引的文件資料庫

此函數透過載入PDF檔案、將其分割成區塊,並建立語意與詞彙檢索索引來設定知識庫。它會回傳混合式RAG所需的核心元件:FAISS向量儲存、BM25關鍵字排名器,以及處理後的文件區塊。

PDF載入

使用LangChain的PyPDFLoader載入輸入PDF,從每頁提取原始文本。驗證文件是否包含內容,若為空則拋出錯誤,如Code03所示。

Code03

文件切塊

使用Recursive Character Text Splitter將長文本分割成重疊的區塊。而相關參數包括:chunk_size=512(每個區塊的最大字元數)、chunk_overlap=128(區塊之間的重疊,以保留上下文)、strip_whitespace=True(清除開頭和結尾的空格)、add_start_index=True(添加元數據以進行位置追蹤)。最後,將每個區塊包裝成一個LangChain的Document物件,如Code04所示。

Code04

語意嵌入與FAISS索引

使用Qwen/Qwen3-Embedding-0.6B模型為文件區塊生成密集的向量表示;將嵌入儲存在FAISS索引中,以便快速進行語意相似度搜尋,如Code05所示。

Code05

使用BM25進行詞彙評分

將文件內容分詞為詞級單位;建立BM25索引,以實現關鍵字的排序;對匹配公式名稱、精確片語或專業術語特別有效,如Code06所示。

Code06

步驟4:定義自訂工具

定義自訂工具的方法如下:

混合式檢索工具(Hybrid Retriever Tool)

這個類別為SmolAgents定義了一個自訂工具,它結合了語意(FAISS)和詞彙(BM25)檢索,從PDF文件中提取相關區塊。它被設計為代理程式回答基於文件查詢的主要方法,如Code07所示。

Code07

搜尋工具(Search Tool)

添加了一個DuckDuckGoSearchTool,允許代理程式從網路上檢索答案,但僅在基於本地PDF的檢索無法產生相關結果時使用,如Code08所示。

Code08

步驟5:使用工具和本地LLM初始化代理程式

此步驟定義了由SmolAgents驅動的CodeAgent,為其配備混合式檢索與網路搜尋能力,並連接到本地加速的LLM以生成回應,如Code09所示。

Code09

工具

在程式碼中,hybrid_retriever_tool為使用FAISS + BM25從本地PDF中獲取區塊,而search_tool是基於DuckDuckGo的備援方案,用於在文件中找不到答案時的網路查詢。

模型

使用一個包裝在TransformersModel中的Qwen2.5-3B-Instruct LLM;透過device_map="auto"在英特爾硬體高效運行(如果可以,則使用xpu搭配IPEX)。

推理控制

max_steps=4用來限制工具呼叫的迭代次數,以防止無限循環;verbosity_level=3是為了啟用詳細的推理日誌,以便進行除錯和追溯。

步驟6:自訂系統提示以實現具備工具意識的推理

這一步透過將工具專屬指令直接注入系統提示,來增強代理程式的推理能力。它確保代理程式清楚了解可用工具、使用方式,以及在何種情況下應優先選擇特定工具。

工具描述與提示注入

動態生成所有工具的詳細列表(名稱、描述、輸入∕輸出架構),並確保未來新增工具時無須手動更新系統提示,如Code10所示。

Code10

提示自訂

將程序性邏輯附加到代理程式的基本系統提示中;強調工具使用順序,避免不必要的網路搜尋;讓工具使用過程可解釋且可審核,以提升信任度並便於除錯,如Code11所示。

Code11

步驟7:運行代理程式

首先進行查詢1:「縮放點積注意力(Scaled Dot-Product Attention)的公式是什麼? 」,如Code12所示。

Code12

隨後執行日誌,如Code13~14所示。

Code13
Code14

然後,輸出文本:縮放點積注意力(Scaled Dot-Product Attention)的公式如下所示:

QK^T / (√d_k * √d_v)

其中,Q代表查詢向量,K代表鍵向量,V代表值向量。運算結果會透過一個softmax函數來正規化權重(Code15)。

Code15

接著,進行查詢2:「Tell me about Intel Liftoff Days?」,過程如Code16~18所示。

Code16
Code17
Code18

然後輸出文本:Intel Liftoff Days是一個支持並加速AI新創公司的計畫,包含工作坊、導師輔導以及提供新創公司合作與優化其AI解決方案的機會(Code19)。先決條件是確保已安裝必要的函式庫,如Code20所示。

Code19
Code20

請注意,若未使用Tiber Cloud,須根據自身的硬體與環境安裝intel-extension-for-pytorch。完整可運行的程式碼如下: https://www.netadmin.com.tw/files/codes/B251015003/B251015003-sourcecode.py.txt

代理程式輸出行為說明

雖然此代理程式設計能夠有效對檢索到的內容進行推理,並利用本地LLM生成準確答案,但是仍須注意以下因素:

機率性推理

底層語言模型基於學習到的模式與機率生成回應。雖然通常準確,但在檢索到的內容含糊或不完整時,模型仍然可能產生幻覺或不精確的答案。

對檢索上下文的依賴性

代理程式的回應品質與檢索到的PDF區塊相關性密切相關,如果檢索工具提供的上下文薄弱或含有雜訊,生成的答案可能會受到影響。

模型訓練的限制

Qwen2.5-3B-Instruct模型雖然功能強大且支援多語言,但其訓練基於靜態數據集。除非資訊明確包含在PDF中或透過網路搜尋檢索,否則模型可能無法反映最新知識或特定領域的更新。

版本與提示的變異性

即使輸入相同,但由於分詞器行為、微調策略或生成參數的差異,不同執行或不同Qwen版本之間的輸出仍可能有所不同。

至於為何重要?主要原因包含:

‧效率:較小的模型在本地加速,可在降低計算開銷的同時提供即時性能。

‧可解釋性:代理程式透明地選擇工具,並遵循明確的推理流程。

‧模組化:檢索與網路搜尋等工具相互解耦,可重複使用。

‧可信度:優先使用本地文件進行檢索,僅在必要時才退回至網路來源。

結語

代理式RAG顛覆了傳統,我們不再依賴單一大型模型執行所有任務,而是在智慧協定下協調小型、專注的元件——包括檢索器、生成器與搜尋工具。這使得AI對企業與開發者而言,更具擴展性、可審核性與高效率。

可在Intel Tiber AI Cloud上親自體驗,將可以運行此程式碼,直接探索Intel Data Center GPU Max 1100的性能。Intel Tiber AI Cloud提供免費的JupyterLab環境,只須在cloud.intel.com註冊帳戶,並從「Training」部分啟動GPU加速筆記本,就能夠親手使用Max 1100 GPU進行訓練與實驗。

<本文作者:王宗業,美商英特爾公司客戶端邊緣運算事業群平台研發協理,負責Intel Edge AI平台生態系統的推廣,帶領過智慧零售、智慧製造、智慧交通與智慧醫療等專案的開發。在20多年的軟硬體開發、推廣、客戶支援經驗中,含括嵌入式系統、智慧型手機、物聯網、Linux及開源軟體、AI硬體加速器在影像與自然語言處理等領域,並擔任過台灣人工智慧學校經理人班、技術領袖班與Edge AI專班的講師,以及大專院校的深度學習課程業師。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!