總字數：約25000字 | 預計閱讀時長：70-80分鐘​

一、RAG概述與核心價值​

1.1 什麼是RAG​

RAG（Retrieval-Augmented Generation，檢索增強生成） 是一種將資訊檢索與大語言模型生成相結合的技術架構。它透過從外部知識庫中檢索相關資訊，將其注入到大模型的上下文中，從而讓模型生成更準確、更可靠、更有依據的回答。​

簡單來說，RAG就像是給大模型配備了一個"實時圖書館"——當使用者提出問題時，系統先從知識庫中找到相關的資料，然後把這些資料連同問題一起交給大模型，讓模型基於這些資料來回答問題，而不是完全依賴模型自己的"記憶"。​

RAG的核心思想：​

​

Code block​

Plain Text

使用者問題 → 檢索相關知識 → 注入上下文 → 大模型生成回答​

↓ ↓ ↓ ↓​

查詢 知識庫 Prompt 有據可依​

​

為什麼叫"增強生成"？​

傳統的生成式AI完全依賴模型內部引數來生成回答，而RAG透過引入外部知識來"增強"這個過程：​

​



| 生成方式 | 知識來源 | 回答質量 | 知識時效性 |
| --- | --- | --- | --- |
| 純生成 | 模型引數（訓練時學習） | 可能出現幻覺 | 受限於訓練資料截止時間 |
| RAG增強 | 模型引數 + 外部知識庫 | 更準確、有據可依 | 可實時更新知識庫 |



​

一個直觀的比喻：​

想象你在參加一場開卷考試：​

•

閉卷考試（純生成）：完全依賴記憶，可能記錯或遺漏​

•

開卷考試（RAG）：可以翻閱參考資料，答案更準確、更完整​

RAG就是讓大模型"開卷"回答問題的技術。​

1.2 為什麼需要RAG​

1）大模型的固有侷限​

儘管大語言模型能力強大，但它們存在一些無法迴避的侷限性：​

​



| 侷限性 | 具體表現 | 實際影響 |
| --- | --- | --- |
| 知識截止 | 訓練資料有時間截止點 | 無法回答最新事件、新漏洞、新技術 |
| 幻覺問題 | 模型會"編造"看似合理但錯誤的內容 | 在安全場景中可能導致錯誤判斷 |
| 領域知識不足 | 通用模型對專業領域知識覆蓋有限 | 企業私有知識、內部規範無法覆蓋 |
| 無法驗證來源 | 不知道回答依據是什麼 | 難以追溯和驗證資訊可靠性 |



​

安全場景中的風險：​

在網路安全領域，這些侷限性可能帶來嚴重後果：​

​

Code block​

Plain Text

使用者：最新的Log4j漏洞（CVE-2021-44228）如何修復？​

純生成回答：可能給出過時的修復建議，或者編造不存在的補丁​

RAG回答：從漏洞庫中檢索最新修復方案，給出準確指導​

​

2）RAG如何解決這些問題​

RAG透過檢索增強機制，有效緩解了大模型的固有侷限：​

​



| 侷限性 | RAG解決方案 | 效果 |
| --- | --- | --- |
| 知識截止 | 實時檢索最新知識庫 | 知識時效性問題得到解決 |
| 幻覺問題 | 基於檢索到的真實文件生成 | 有據可依，減少幻覺 |
| 領域知識不足 | 接入專業領域知識庫 | 可覆蓋任何專業領域 |
| 無法驗證來源 | 回答可追溯到具體文件 | 支援來源驗證和審計 |



​

實際效果對比：​

假設使用者問："如何檢測SQL隱碼攻擊漏洞？"​

純生成回答：​

SQL隱碼攻擊是一種常見的Web安全漏洞，可以透過引數化查詢來防禦...​

（回答正確但籠統，缺乏具體檢測方法和工具）​

RAG增強回答：​

根據《OWASP測試指南v4.2》第8章，SQL隱碼攻擊檢測可分為以下步驟：​

1.

資訊收集：識別所有資料庫互動點（登入表單、搜尋框、URL引數等）​

2.

手動測試：輸入單引號'觀察是否報錯​

3.

自動化掃描：使用sqlmap工具進行深度檢測​

...​

參考來源：OWASP Testing Guide v4.2, Section 8​

（回答有具體來源、步驟清晰、可追溯）​

3）RAG vs 微調：如何選擇​

除了RAG，微調（Fine-tuning） 也是讓大模型掌握專業知識的方式。兩者各有優劣：​

​



| 對比維度 | RAG | 微調 |
| --- | --- | --- |
| 知識更新 | 更新知識庫即可，實時生效 | 需要重新訓練模型 |
| 成本 | 低，只需維護知識庫 | 高，需要算力和資料 |
| 可追溯性 | 強，可指出來源文件 | 弱，無法追溯 |
| 幻覺控制 | 較好，有據可依 | 一般，仍可能幻覺 |
| 適用場景 | 知識頻繁更新、需要來源追溯 | 特定風格/格式輸出、深度定製 |
| 部署複雜度 | 低，無需訓練 | 高，需要訓練流程 |



​

選擇建議：​

•

優先選擇RAG：企業知識庫問答、安全知識檢索、文件問答等場景​

•

考慮微調：需要特定輸出風格、專業術語表達、深度定製化輸出格式​

•

兩者結合：先微調讓模型適應領域風格，再用RAG注入最新知識​

1.3 RAG在Agent技術棧中的定位​

在3.1和3.2章節中，我們學習了LangChain和LangGraph框架。RAG作為Agent的"知識引擎"，在整個技術棧中扮演著關鍵角色：​

​

Code block​

Plain Text

┌─────────────────────────────────────────────────────┐​

│ 應用層（安全工具/平臺） │​

├─────────────────────────────────────────────────────┤​

│ 多智慧體編排層（LangGraph） │​

├─────────────────────────────────────────────────────┤​

│ Agent框架層（LangChain） │​

│ ┌─────────┬─────────┬─────────┬─────────────────┐ │​

│ │ Chains │ Agents │ Memory │ RAG鏈 │ │​

│ └─────────┴─────────┴─────────┴─────────────────┘ │​

├─────────────────────────────────────────────────────┤​

│ 知識層（RAG系統） │​

│ ┌─────────────┬─────────────┬─────────────────┐ │​

│ │ 文件載入 │ 向量儲存 │ 語義檢索 │ │​

│ └─────────────┴─────────────┴─────────────────┘ │​

├─────────────────────────────────────────────────────┤​

│ 模型層（DeepSeek/GPT等） │​

└─────────────────────────────────────────────────────┘​

​

RAG與Agent的協作關係：​

​



| 元件 | 職責 | 與RAG的關係 |
| --- | --- | --- |
| Agent | 理解意圖、規劃任務、呼叫工具 | 將使用者問題交給RAG處理 |
| RAG | 檢索知識、增強上下文 | 為Agent提供知識支援 |
| Memory | 維護對話歷史 | 與RAG互補，一個管短期一個管長期 |
| Tools | 執行具體操作 | RAG可作為Agent的工具之一 |



​

RAG在不同Agent模式中的應用：​

1）ReAct Agent中的RAG​

​

Code block​

Plain Text

​

2）Multi-Agent中的RAG​

​

Code block​

Plain Text

​

二、RAG核心原理​

2.1 向量化與Embedding​

1）什麼是向量化​

向量化（Vectorization） 是將文字轉換為數學向量的過程。在RAG系統中，我們需要把所有的文件和使用者查詢都轉換成向量，才能進行相似度計算和檢索。​

通俗理解：​

想象你在圖書館找書，傳統方式是按書名或分類號查詢。而向量化就像是給每本書打上"特徵標籤"——比如一本關於"SQL隱碼攻擊"的書，它的標籤可能是：\[Web安全:0.9, 資料庫:0.8, 漏洞利用:0.7, 防禦技術:0.6\]​

當使用者問"如何防禦SQL隱碼攻擊"時，系統會計算問題與所有書籍標籤的相似度，找到最匹配的書。​

2）Embedding模型​

Embedding模型是執行向量化的AI模型。它接收文字輸入，輸出一個固定長度的數值向量。​

DeepSeek Embedding示例：​

​

Code block​

Python

\# embedding\_demo.py​

\# pip install langchain-deepseek​

​

from langchain\_deepseek import DeepSeekEmbeddings​

​

\# 初始化Embedding模型​

embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key="your\_api\_key\_here"​

)​

​

\# 將文字轉換為向量​

text = "SQL隱碼攻擊是一種常見的Web安全漏洞"​

vector = embeddings.embed\_query(text)​

​

批次向量化：​

​

Code block​

Python

​

3）向量相似度計算​

相似度計算是RAG檢索的核心。常用的相似度指標有：​

​



| 相似度指標 | 計算方式 | 特點 | 適用場景 |
| --- | --- | --- | --- |
| 餘弦相似度 | 計算向量夾角的餘弦值 | 與向量長度無關，只關注方向 | 文字相似度計算（最常用） |
| 歐氏距離 | 計算向量空間中的直線距離 | 考慮向量長度 | 影象特徵匹配 |
| 點積 | 對應位置相乘後求和 | 計算速度快 | 歸一化向量的相似度 |



​

餘弦相似度計算示例：​

​

Code block​

Python

​

2.2 語義檢索機制​

1）什麼是語義檢索​

語義檢索（Semantic Search） 是基於文字含義（而非關鍵詞）進行檢索的技術。它能理解查詢的真實意圖，找到語義上相關的內容，即使文件中沒有完全相同的關鍵詞。​

傳統關鍵詞檢索 vs 語義檢索對比：​

​



| 檢索方式 | 查詢 | 文件內容 | 能否匹配 |
| --- | --- | --- | --- |
| 關鍵詞檢索 | "如何防禦SQL隱碼攻擊" | "使用引數化查詢防止資料庫攻擊" | ❌ 關鍵詞不匹配 |
| 語義檢索 | "如何防禦SQL隱碼攻擊" | "使用引數化查詢防止資料庫攻擊" | ✅ 語義相關 |



​

語義檢索的工作原理：​

​

Code block​

Plain Text

1\. 使用者查詢 → Embedding → 查詢向量​

2\. 文件庫 → Embedding → 文件向量集​

3\. 計算查詢向量與所有文件向量的相似度​

4\. 返回相似度最高的Top-K個文件​

​

2）檢索策略​

基礎檢索策略：​

​



| 策略 | 原理 | 優點 | 缺點 |
| --- | --- | --- | --- |
| Top-K檢索 | 返回相似度最高的K個結果 | 簡單直接 | 可能返回不相關的結果 |
| 閾值過濾 | 只返回相似度超過閾值的結果 | 過濾低質量結果 | 可能遺漏部分相關內容 |
| MMR檢索 | 兼顧相關性和多樣性 | 結果更全面 | 計算成本更高 |



​

MMR（Maximal Marginal Relevance）檢索：​

MMR是一種平衡相關性和多樣性的檢索策略，避免返回過多重複內容：​

​

Code block​

Python

\# mmr\_retrieval.py​

\# pip install langchain-community faiss-cpu​

​

from langchain\_community.vectorstores import FAISS​

from langchain\_deepseek import DeepSeekEmbeddings​

​

embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key="your\_api\_key\_here"​

)​

​

\# 假設已有向量資料庫​

vectorstore = FAISS.load\_local("./security\_kb", embeddings)​

​

​

2.3 提示增強與上下文注入​

1）什麼是提示增強​

提示增強（Prompt Augmentation） 是將檢索到的相關文件注入到提示詞中的過程。這是RAG的最後一個關鍵步驟，直接影響生成質量。​

RAG提示詞結構：​

​

Code block​

Plain Text

​

2）上下文注入模板​

標準RAG提示模板：​

​

Code block​

Python

​

三、RAG系統架構設計​

3.1 離線索引流程​

離線索引是將原始文件處理並儲存到向量資料庫的過程，通常在系統初始化或知識更新時執行。​

索引流程圖：​

​

Code block​

Plain Text

原始文件 → 文件載入 → 文字分割 → 向量化 → 儲存到向量資料庫​

↓ ↓ ↓ ↓ ↓​

PDF/網頁 提取文字 分塊處理 Embedding FAISS等​

​

完整的索引流程實現：​

​

Code block​

Python

\# indexing\_pipeline.py​

\# pip install langchain-community langchain-deepseek faiss-cpu​

​

from langchain\_community.document\_loaders import DirectoryLoader, TextLoader​

from langchain\_text\_splitters import RecursiveCharacterTextSplitter​

from langchain\_deepseek import DeepSeekEmbeddings​

from langchain\_community.vectorstores import FAISS​

​

3.2 線上檢索流程​

線上檢索是在使用者查詢時，從向量資料庫中檢索相關文件的過程。​

檢索流程圖：​

​

Code block​

Plain Text

​

檢索實現：​

​

Code block​

Python

\# retrieval\_demo.py​

\# pip install langchain-community langchain-deepseek faiss-cpu​

​

from langchain\_community.vectorstores import FAISS​

from langchain\_deepseek import DeepSeekEmbeddings​

import os​

​

def search\_documents(query: str, index\_path: str, top\_k: int = 3):​

​

3.3 生成與回答流程​

生成流程是將檢索到的文件與使用者問題組合，交給大模型生成最終回答的過程。​

完整RAG流程：​

​

Code block​

Plain Text

使用者問題 → 檢索相關文件 → 構建增強提示 → 呼叫大模型 → 返回回答​

↓ ↓ ↓ ↓ ↓​

"如何防禦 \[文件1,文件2\] 注入上下文 DeepSeek 最終答案​

SQL隱碼攻擊"​

​

完整RAG鏈實現：​

​

Code block​

Python

\# rag\_chain\_demo.py​

\# pip install langchain-community langchain-deepseek langchain-core faiss-cpu​

​

from langchain\_community.vectorstores import FAISS​

from langchain\_deepseek import ChatDeepSeek, DeepSeekEmbeddings​

from langchain\_core.prompts import ChatPromptTemplate​

from langchain\_core.output\_parsers import StrOutputParser​

from langchain\_core.runnables import RunnablePassthrough​

import os​

​

class SecurityRAG:​

"""安全知識庫RAG系統"""​

​

def \_\_init\_\_(self, index\_path: str):​

\# 初始化Embedding模型​

self.embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

​

四、RAG關鍵技術實現​

4.1 文件預處理與分塊策略​

1）文件預處理​

文件預處理是將各種格式的原始文件轉換為統一文字格式的過程。​

常見文件格式處理：​

​



| 文件格式 | 載入器 | 安裝命令 | 使用場景 |
| --- | --- | --- | --- |
| TXT | TextLoader | 內建 | 純文字日誌、配置檔案 |
| PDF | PyPDFLoader | pip install pypdf | 安全報告、技術文件 |
| Markdown | UnstructuredMarkdownLoader | pip install unstructured | 專案文件、知識庫 |
| Word | Docx2txtLoader | pip install docx2txt | 企業文件、規範檔案 |
| 網頁 | WebBaseLoader | pip install beautifulsoup4 | 線上漏洞庫、技術部落格 |



​

多格式文件載入示例：​

​

Code block​

Python

\# document\_loader\_multi.py​

​

2）分塊策略​

分塊（Chunking） 是將長文件分割成適合向量化的小段落。分塊質量直接影響檢索效果。​

​



| 分塊策略 | 原理 | 優點 | 缺點 | 適用場景 |
| --- | --- | --- | --- | --- |
| 固定大小 | 按字元數分割 | 簡單快速 | 可能切斷語義 | 結構化文件 |
| 遞迴分割 | 按分隔符遞迴分割 | 保持語義完整 | 需要調整引數 | 通用文件 |
| 語義分割 | 基於語義邊界分割 | 語義最完整 | 計算成本高 | 高質量需求 |
| 結構分割 | 按文件結構分割 | 保持結構關係 | 需要解析結構 | Markdown/HTML |



​

常用分塊策略：​

遞迴分割最佳實踐：​

​

Code block​

Python

\# text\_splitter\_best\_practice.py​

\# pip install langchain-text-splitters​

​

4.2 向量資料庫選型與使用​

1）向量資料庫對比​

向量資料庫是儲存和檢索向量的專用資料庫。選擇合適的向量資料庫對RAG系統至關重要。​

主流向量資料庫對比：​

​



| 資料庫 | 型別 | 特點 | 適用場景 | 安裝命令 |
| --- | --- | --- | --- | --- |
| FAISS | 本地庫 | 輕量、高效能 | 開發測試、小規模 | pip install faiss-cpu |
| ChromaDB | 嵌入式 | 簡單易用、支援持久化 | 中小規模生產 | pip install chromadb |
| Milvus | 分散式 | 高可用、可擴充套件 | 大規模生產 | Docker部署 |
| Pinecone | 雲服務 | 全託管、免運維 | 快速上線 | API呼叫 |
| Weaviate | 混合檢索 | 支援向量+關鍵詞 | 複雜檢索需求 | Docker部署 |



​

2）FAISS使用詳解​

FAISS（Facebook AI Similarity Search） 是Facebook開源的向量檢索庫，適合本地開發和小規模應用。​

​

Code block​

Python

\# faiss\_demo.py​

\# pip install langchain-community langchain-deepseek faiss-cpu​

​

​

3）ChromaDB使用詳解​

ChromaDB是一個更現代的向量資料庫，支援持久化和更豐富的查詢功能。​

​

Code block​

Python

\# chromadb\_demo.py​

\# pip install langchain-community langchain-deepseek chromadb​

​

from langchain\_community.vectorstores import Chroma​

from langchain\_deepseek import DeepSeekEmbeddings​

from langchain\_core.documents import Document​

import os​

​

\# 初始化Embedding​

embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key=os.getenv("DEEPSEEK\_API\_KEY")​

)​

​

\# 建立文件​

documents = \[​

​

4）Milvus使用詳解​

Milvus是一個開源的分散式向量資料庫，專為大規模向量檢索場景設計，支援高可用、可擴充套件和混合查詢。​

核心特性：​

​



| 特性 | 說明 |
| --- | --- |
| 高效能 | 支援十億級向量的毫秒級檢索 |
| 可擴充套件 | 支援水平擴充套件，分散式架構 |
| 多索引 | 支援IVF、HNSW、ANNOY等多種索引演算法 |
| 混合查詢 | 支援向量+標量混合過濾 |
| 雲原生 | 支援Kubernetes部署 |



​

安裝部署（Docker方式）：​

​

Code block​

Bash

\# 下載Milvus Docker Compose檔案​

wget https://github.com/milvus-io/milvus/releases/download/v2.4-latest/milvus-standalone-docker-compose.yml -O docker-compose.yml​

​

\# 啟動Milvus服務​

docker-compose up -d​

​

\# 檢查服務狀態​

docker-compose ps​

​

Python SDK使用：​

​

Code block​

Python

\# milvus\_demo.py​

\# pip install pymilvus langchain-community langchain-milvus langchain-deepseek​

​

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility​

from langchain\_community.vectorstores import Milvus​

from langchain\_deepseek import DeepSeekEmbeddings​

​

帶過濾條件的檢索：​

​

Code block​

Python

\# milvus\_filter.py​

\# pip install pymilvus langchain-community langchain-milvus langchain-deepseek​

​

from langchain\_community.vectorstores import Milvus​

from langchain\_deepseek import DeepSeekEmbeddings​

import os​

​

embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key=os.getenv("DEEPSEEK\_API\_KEY")​

)​

​

\# 連線已有的Milvus集合​

vectorstore = Milvus(​

embedding\_function=embeddings,​

collection\_name="security\_knowledge",​

connection\_args={"host": "localhost", "port": "19530"}​

)​

​

​

原生Milvus SDK操作：​

​

Code block​

Python

\# milvus\_native.py​

\# pip install pymilvus​

​

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType, utility​

import numpy as np​

​

\# 連線Milvus​

connections.connect(alias="default", host="localhost", port="19530")​

​

\# 定義集合Schema​

fields = \[​

FieldSchema(name="id", dtype=DataType.INT64, is\_primary=True, auto\_id=True),​

FieldSchema(name="content", dtype=DataType.VARCHAR, max\_length=65535),​

FieldSchema(name="source", dtype=DataType.VARCHAR, max\_length=500),​

FieldSchema(name="embedding", dtype=DataType.FLOAT\_VECTOR, dim=1536)​

\]​

​

​

Milvus vs 其他向量資料庫對比：​

​



| 對比維度 | Milvus | FAISS | ChromaDB |
| --- | --- | --- | --- |
| 部署方式 | 獨立服務 | 本地庫 | 嵌入式 |
| 分散式 | 支援 | 不支援 | 不支援 |
| 持久化 | 內建 | 需手動儲存 | 內建 |
| 可擴充套件性 | 高（十億級） | 中（百萬級） | 低（十萬級） |
| 適用場景 | 大規模生產環境 | 開發測試 | 中小規模 |
| 運維複雜度 | 高 | 低 | 低 |



​

Milvus最佳實踐：​

1.

索引選擇​

◦

小規模（<100萬）：使用FLAT索引，精確檢索​

◦

中等規模（100萬-1000萬）：使用IVF\_FLAT或IVF\_SQ8​

◦

大規模（>1000萬）：使用HNSW或IVF\_PQ​

2.

資源規劃​

◦

記憶體：向量資料的1.5-2倍​

◦

CPU：根據併發查詢量調整​

◦

儲存：原始資料+索引資料​

3.

效能最佳化​

◦

批次插入資料，減少網路開銷​

◦

合理設定nprobe引數平衡精度和速度​

◦

使用分割槽（Partition）管理資料​

4.3 檢索策略最佳化​

1）混合檢索​

混合檢索（Hybrid Search） 結合向量檢索和關鍵詞檢索的優勢，提高檢索質量。​

​

Code block​

Python

\# hybrid\_search.py​

​

2）重排序（Reranking）​

重排序是對初步檢索結果進行二次排序，提高結果質量。​

​

Code block​

Python

\# reranking\_demo.py​

\# pip install langchain-community langchain-deepseek sentence-transformers​

​

from langchain.retrievers import ContextualCompressionRetriever​

from langchain.retrievers.document\_compressors import CrossEncoderReranker​

from langchain\_community.cross\_encoders import HuggingFaceCrossEncoder​

from langchain\_community.vectorstores import FAISS​

from langchain\_deepseek import DeepSeekEmbeddings​

import os​

​

\# 建立基礎檢索器​

embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key=os.getenv("DEEPSEEK\_API\_KEY")​

)​

vectorstore = FAISS.load\_local("./security\_index", embeddings)​

base\_retriever = vectorstore.as\_retriever(search\_kwargs={"k": 10})​

​

\# 建立重排序器​

cross\_encoder = HuggingFaceCrossEncoder(model\_name="BAAI/bge-reranker-base")​

reranker = CrossEncoderReranker(model=cross\_encoder, top\_n=3)​

​

4.4 大模型整合與Prompt設計​

1）大模型整合​

DeepSeek模型整合是RAG系統的最後一步，將檢索到的文件交給大模型生成回答。​

​

Code block​

Python

\# llm\_integration.py​

\# pip install langchain-deepseek​

​

from langchain\_deepseek import ChatDeepSeek​

from langchain\_core.prompts import ChatPromptTemplate​

from langchain\_core.output\_parsers import StrOutputParser​

import os​

​

\# 初始化DeepSeek​

llm = ChatDeepSeek(​

model="deepseek-chat",​

api\_key=os.getenv("DEEPSEEK\_API\_KEY"),​

temperature=0.3, \# 低溫度，提高確定性​

​

2）Prompt設計最佳實踐​

RAG場景下的Prompt設計原則：​

​



| 原則 | 說明 | 示例 |
| --- | --- | --- |
| 明確角色 | 定義模型的專業身份 | "你是一個資深安全專家" |
| 指定行為 | 明確回答要求 | "只基於參考資料回答" |
| 格式要求 | 指定輸出格式 | "使用Markdown格式，包含來源引用" |
| 邊界設定 | 說明不確定時的處理 | "如果資料不足，請明確說明" |



​

安全場景專用Prompt模板：​

​

Code block​

Python

\# security\_rag\_prompt.py​

from langchain\_core.prompts import ChatPromptTemplate​

​

SECURITY\_RAG\_PROMPT = ChatPromptTemplate.from\_template("""## 角色​

你是一名資深的網路安全專家，專注於Web安全、漏洞分析和安全運維。​

​

\## 參考資料​

{context}​

​

\## 回答要求​

1\. \*\*準確性\*\*：只基於參考資料回答，不要編造資訊​

2\. \*\*專業性\*\*：使用準確的安全術語，必要時給出解釋​

3\. \*\*實用性\*\*：提供可操作的建議和具體步驟​

4\. \*\*來源追溯\*\*：引用時註明來源文件​

5\. \*\*風險提示\*\*：對高風險操作給出警告​

​

\## 輸出格式​

\- 使用Markdown格式​

\- 重要資訊加粗​

​

五、RAG實戰：安全知識庫問答系統​

5.1 需求分析與架構設計​

1）需求分析​

安全知識庫問答系統的目標是構建一個能夠回答網路安全相關問題的智慧問答系統。​

功能需求：​

​



| 功能 | 說明 | 優先順序 |
| --- | --- | --- |
| 知識匯入 | 支援匯入安全文件、漏洞庫、最佳實踐 | 高 |
| 智慧問答 | 基於知識庫回答安全問題 | 高 |
| 來源追溯 | 顯示回答的參考來源 | 高 |
| 多輪對話 | 支援上下文連續對話 | 中 |
| 知識更新 | 支援動態更新知識庫 | 中 |



​

技術架構：​

​

Code block​

Plain Text

┌─────────────────────────────────────────────────────────┐​

│ 使用者介面層 │​

│ (Streamlit / Web API) │​

├─────────────────────────────────────────────────────────┤​

│ 應用服務層 │​

│ (FastAPI + RAG Chain + Memory) │​

├─────────────────────────────────────────────────────────┤​

│ 知識檢索層 │​

│ (FAISS/ChromaDB + Embedding + Reranker) │​

├─────────────────────────────────────────────────────────┤​

│ 模型服務層 │​

│ (DeepSeek API) │​

└─────────────────────────────────────────────────────────┘​

​

2）專案結構​

​

Code block​

Plain Text

security-rag-system/​

├── app.py # Streamlit介面​

├── api.py # FastAPI介面​

├── rag/​

│ ├── \_\_init\_\_.py​

│ ├── loader.py # 文件載入器​

│ ├── splitter.py # 文字分割器​

│ ├── embedder.py # 向量化模組​

│ ├── retriever.py # 檢索器​

│ └── chain.py # RAG鏈​

├── knowledge/ # 知識庫文件​

│ ├── owasp/​

​

5.2 安全知識庫構建​

1）知識庫文件準備​

安全知識庫應包含的文件型別：​

​



| 文件型別 | 內容 | 來源示例 |
| --- | --- | --- |
| 漏洞知識 | 漏洞原理、檢測方法、修復方案 | OWASP、CVE、CWE |
| 安全標準 | 安全規範、最佳實踐 | NIST、ISO27001 |
| 工具文件 | 安全工具使用指南 | Nmap、Burp Suite |
| 內部規範 | 企業安全策略、操作手冊 | 企業內部 |



​

建立示例知識文件：​

​

Code block​

Markdown

\# knowledge/sql\_injection.md​

​

\## SQL隱碼攻擊漏洞概述​

​

SQL隱碼攻擊（SQL Injection）是一種程式碼注入技術，攻擊者透過在應用程式的輸入中插入惡意SQL程式碼，從而控制後端資料庫。​

​

​

2）知識庫構建指令碼​

​

Code block​

Python

\# build\_knowledge\_base.py​

​

5.3 RAG鏈路實現​

1）完整RAG系統實現​

​

Code block​

Python

​

5.4 測試與最佳化​

1）測試用例設計​

​

Code block​

Python

\# test\_rag.py​

\# pip install langchain-community langchain-deepseek faiss-cpu python-dotenv​

​

from rag.chain import SecurityRAGChain​

from dotenv import load\_dotenv​

​

2）最佳化建議​

檢索質量最佳化：​

​



| 問題 | 原因 | 解決方案 |
| --- | --- | --- |
| 檢索結果不相關 | 向量化質量差 | 更換Embedding模型 |
| 遺漏相關文件 | 分塊過大/過小 | 調整chunk\_size |
| 重複內容過多 | 檢索策略單一 | 使用MMR或混合檢索 |



​

生成質量最佳化：​

​



| 問題 | 原因 | 解決方案 |
| --- | --- | --- |
| 回答不準確 | 上下文不足 | 增加檢索文件數量 |
| 回答過於冗長 | Prompt未限制 | 明確輸出格式要求 |
| 出現幻覺 | 模型過度推理 | 強調"只基於資料回答" |



​

六、RAG常見問題與最佳化​

6.1 檢索質量最佳化​

1）分塊策略最佳化​

分塊大小對檢索效果的影響：​

​



| chunk\_size | 優點 | 缺點 | 適用場景 |
| --- | --- | --- | --- |
| 小（200-500） | 檢索精度高 | 上下文資訊不足 | FAQ、術語解釋 |
| 中（500-1500） | 平衡精度和上下文 | 通用性好 | 技術文件 |
| 大（1500-3000） | 上下文完整 | 檢索精度下降 | 長篇報告 |



​

自適應分塊策略：​

​

Code block​

Python

\# adaptive\_splitter.py​

\# pip install langchain-text-splitters​

​

from langchain\_text\_splitters import RecursiveCharacterTextSplitter​

from typing import List​

​

class AdaptiveSplitter:​

"""自適應文字分割器"""​

​

def \_\_init\_\_(self, min\_chunk\_size: int = 200, max\_chunk\_size: int = 2000):​

self.min\_chunk\_size = min\_chunk\_size​

self.max\_chunk\_size = max\_chunk\_size​

​

def split(self, text: str, content\_type: str = "general") -> List\[str\]:​

"""根據內容型別選擇分塊策略"""​

​

\# 根據內容型別調整引數​

if content\_type == "faq":​

​

2）Embedding模型選擇​

主流Embedding模型對比：​

​



| 模型 | 維度 | 特點 | 安裝/使用 |
| --- | --- | --- | --- |
| DeepSeek Embedding | 1536 | 中文友好、價效比高 | API呼叫 |
| BGE-M3 | 1024 | 多語言、開源 | pip install sentence-transformers |
| OpenAI text-embedding-3 | 1536/3072 | 效果優秀、成本較高 | API呼叫 |
| Jina Embeddings v2 | 1024 | 長文字支援 | API呼叫 |



​

BGE本地Embedding示例：​

​

Code block​

Python

\# bge\_embedding.py​

\# pip install sentence-transformers langchain-huggingface​

​

from langchain\_huggingface import HuggingFaceEmbeddings​

​

\# 使用BGE模型​

embeddings = HuggingFaceEmbeddings(​

model\_name="BAAI/bge-m3",​

model\_kwargs={"device": "cpu"}, \# 使用CPU，如有GPU改為"cuda"​

encode\_kwargs={"normalize\_embeddings": True}​

)​

​

\# 向量化​

text = "SQL隱碼攻擊是一種常見的Web安全漏洞"​

vector = embeddings.embed\_query(text)​

print(f"向量維度: {len(vector)}")​

​

6.2 生成質量最佳化​

1）上下文視窗管理​

大模型上下文長度限制：​

​



| 模型 | 上下文長度 | 建議保留 |
| --- | --- | --- |
| DeepSeek Chat | 32K | 檢索文件控制在16K以內 |
| GPT-4 | 128K | 檢索文件控制在64K以內 |
| Claude 3 | 200K | 檢索文件控制在100K以內 |



​

上下文長度控制：​

​

Code block​

Python

\# context\_manager.py​

​

class ContextManager:​

"""上下文管理器"""​

​

def \_\_init\_\_(self, max\_tokens: int = 16000):​

self.max\_tokens = max\_tokens​

​

def truncate\_context(self, documents: list, question: str) -> str:​

"""截斷上下文以適應token限制"""​

​

\# 估算token數（中文約1.5字/token）​

def estimate\_tokens(text: str) -> int:​

return int(len(text) \* 1.5)​

​

\# 問題和模板的token開銷​

overhead\_tokens = estimate\_tokens(question) + 500​

​

\# 可用於文件的token數​

available\_tokens = self.max\_tokens - overhead\_tokens​

​

\# 逐步新增文件​

context\_parts = \[\]​

​

2）回答質量評估​

​

Code block​

Python

\# quality\_evaluator.py​

\# pip install langchain-deepseek​

​

from langchain\_deepseek import ChatDeepSeek​

from langchain\_core.prompts import ChatPromptTemplate​

import os​

​

class QualityEvaluator:​

"""回答質量評估器"""​

​

​

6.3 效能與成本最佳化​

1）快取策略​

快取可以顯著減少API呼叫次數，降低成本和延遲：​

​

Code block​

Python

\# cache\_demo.py​

\# pip install langchain-community langchain-deepseek faiss-cpu redis​

​

from langchain\_community.cache import RedisCache, InMemoryCache​

from langchain.globals import set\_llm\_cache​

import redis​

​

\# 方案1：記憶體快取（簡單，重啟失效）​

set\_llm\_cache(InMemoryCache())​

​

\# 方案2：Redis快取（持久化，支援分散式）​

redis\_client = redis.Redis(host="localhost", port=6379, db=0)​

set\_llm\_cache(RedisCache(redis\_client))​

​

​

2）批次處理最佳化​

​

Code block​

Python

\# batch\_processing.py​

\# pip install langchain-deepseek langchain-text-splitters​

​

from langchain\_deepseek import DeepSeekEmbeddings​

from typing import List​

import asyncio​

​

class BatchProcessor:​

"""批次處理器"""​

​

def \_\_init\_\_(self, batch\_size: int = 100):​

self.batch\_size = batch\_size​

self.embeddings = DeepSeekEmbeddings(​

model="deepseek-embedding",​

api\_key=os.getenv("DEEPSEEK\_API\_KEY")​

)​

​

async def batch\_embed(self, texts: List\[str\]) -> List\[List\[float\]\]:​

"""批次向量化"""​

all\_vectors = \[\]​

​

for i in range(0, len(texts), self.batch\_size):​

batch = texts\[i:i + self.batch\_size\]​

vectors = self.embeddings.embed\_documents(batch)​

​

3）成本估算​

DeepSeek API成本參考（2025年價格）：​

​



| 模型 | 輸入價格 | 輸出價格 | 說明 |
| --- | --- | --- | --- |
| deepseek-chat | ¥1/百萬token | ¥2/百萬token | 價效比高 |
| deepseek-embedding | ¥0.5/百萬token | \- | 向量化專用 |



​

成本最佳化建議：​

​



| 策略 | 效果 | 實現方式 |
| --- | --- | --- |
| 快取相似問題 | 減少50-80%呼叫 | Redis快取 |
| 批次向量化 | 降低API呼叫次數 | 批次處理 |
| 控制上下文長度 | 減少輸入token | 截斷策略 |
| 選擇合適模型 | 簡單任務用小模型 | 模型路由 |



​

七、RAG在網路安全中的應用場景​

7.1 安全知識問答​

場景描述：企業內部安全知識庫問答系統，幫助員工快速獲取安全知識。​

典型問題：​

•

"如何安全地處理使用者密碼？"​

•

"OWASP Top 10有哪些？"​

•

"什麼是零信任架構？"​

實現要點：​

​



| 要點 | 說明 |
| --- | --- |
| 知識庫內容 | 企業安全策略、安全培訓材料、行業標準 |
| 檢索策略 | 混合檢索（向量+關鍵詞），確保準確 |
| 回答風格 | 專業但易懂，適合非安全專業人員 |



​

7.2 漏洞分析輔助​

場景描述：輔助安全研究人員分析漏洞，提供漏洞詳情、影響範圍、修復建議。​

典型問題：​

•

"CVE-2021-44228（Log4j漏洞）的原理是什麼？"​

•

"這個漏洞影響哪些版本？"​

•

"如何檢測系統是否受此漏洞影響？"​

實現要點：​

​



| 要點 | 說明 |
| --- | --- |
| 知識庫內容 | CVE漏洞庫、安全公告、補丁資訊 |
| 檢索策略 | 精確檢索CVE編號，語義檢索漏洞描述 |
| 回答要求 | 提供準確的CVE編號、CVSS評分、修復連結 |



​

7.3 威脅情報檢索​

場景描述：從威脅情報庫中檢索相關資訊，輔助威脅分析。​

典型問題：​

•

"最近有哪些針對金融行業的APT攻擊？"​

•

"這個IP地址的歷史威脅記錄是什麼？"​

•

"Lazarus組織的最新活動是什麼？"​

實現要點：​

​



| 要點 | 說明 |
| --- | --- |
| 知識庫內容 | 威脅情報報告、IOC指標、APT組織資料 |
| 檢索策略 | 支援IoC（IP、域名、雜湊）精確檢索 |
| 回答要求 | 提供情報來源、置信度、關聯分析 |



​

7.4 安全報告生成​

場景描述：基於檢索到的安全資訊，輔助生成安全報告。​

典型功能：​

•

漏洞評估報告生成​

•

安全審計報告生成​

•

滲透測試報告生成​

實現要點：​

​



| 要點 | 說明 |
| --- | --- |
| 知識庫內容 | 報告模板、歷史報告、最佳實踐 |
| 生成策略 | 結構化輸出，支援Markdown/Word格式 |
| 質量控制 | 人工稽核機制，確保報告準確性 |



​

​

​

總結​

本文系統介紹了\*\*RAG（檢索增強生成）\*\*技術的原理、架構和實踐。作為Agent技術棧中的"知識引擎"，RAG透過將資訊檢索與大模型生成相結合，有效解決了大模型的知識截止、幻覺問題、領域知識不足等侷限性。​

核心要點回顧：​

1）RAG的本質：讓大模型"開卷"回答問題，透過檢索外部知識來增強生成質量​

2）三大核心元件：Embedding向量化、向量資料庫檢索、提示增強生成​

3）關鍵技術選擇：​

•

Embedding模型：DeepSeek Embedding、BGE-M3等​

•

向量資料庫：FAISS（本地）、ChromaDB（持久化）、Milvus（分散式）​

•

檢索策略：Top-K、MMR、混合檢索、重排序​

4）最佳化方向：​

•

分塊策略最佳化：根據內容型別自適應分塊​

•

檢索質量最佳化：混合檢索、重排序、過濾​

•

生成質量最佳化：Prompt設計、上下文管理​

•

效能成本最佳化：快取、批次處理、模型選擇​

5）安全場景應用：安全知識問答、漏洞分析、威脅情報、報告生成​

在下一章《3.4 Agent智慧體架構》中，我們將學習如何將RAG作為Agent的核心能力之一，構建具有知識檢索能力的智慧安全助手。​

​

​

作者：無涯​