Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
10-3. 索引優化技巧(Database Index Optimization) 📌 什麼是索引? 簡單說: 索引就像書的目錄,幫助快速找到數據
定義: 數據庫索引是一種數據結構,用於加速數據查詢,就像書籍的目錄可以快速定位章節一樣。
🔍 索引的工作原理 沒有索引的查詢(全表掃描) -- 查詢用戶 SELECT * FROM users WHERE email = 'user@example.com'; -- 數據庫操作: 第 1 行: email = 'alice@example.com' → 不匹配 第 2 行: email = 'bob@example.com' → 不匹配 第 3 行: email = 'charlie@example.com' → 不匹配 ... 第 100萬行: email = 'user@example.com' → 匹配!✓ 時間複雜度: O(n) - 掃描所有行性能: 100 萬行數據 → 需要掃描 100 萬行
有索引的查詢(B-Tree 索引) B-Tree 索引結構: [m] / \ [c-l] [n-z] / \ / \ [a-f] [g-l] [m-r] [s-z] / \ [a-c] [d-f] / \ / \ [a][b][c][d][e][f] ↓ [user@example.
10-2. select_related vs prefetch_related 📌 核心區別一覽 特性 select_related prefetch_related 適用關係 ForeignKey, OneToOneField ManyToManyField, 反向 ForeignKey SQL 策略 JOIN(單次查詢) 分別查詢後 Python 組合 查詢次數 1 次 通常 2 次 適合數據 少量關聯 大量關聯 SQL 複雜度 中等 簡單 內存使用 較低 較高 🎯 select_related 詳解 工作原理 核心: 使用 SQL JOIN 在一次查詢中獲取關聯對象
# models.py class Author(models.Model): name = models.CharField(max_length=100) class Post(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE)基本用法 # ❌ 沒有優化:N+1 查詢 posts = Post.objects.all() for post in posts: print(post.
10-1. N+1 查詢問題(N+1 Query Problem) 📌 什麼是 N+1 查詢問題? 簡單說: 查詢 N 條數據,卻執行了 N+1 次數據庫查詢
定義: 在查詢主對象時執行 1 次查詢,然後在遍歷時為每個對象的關聯數據又執行 N 次查詢。
🔴 問題演示 場景:查詢所有文章及其作者 # models.py class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey(Author, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True)❌ 有問題的代碼 # views.py def post_list(request): # 查詢所有文章 posts = Post.objects.all() # 第 1 次查詢:SELECT * FROM post # 遍歷文章,獲取作者名稱 for post in posts: print(f"{post.
從 RAG 到 RA-LLM:為什麼需要訓練? 我們已經知道 RAG(Retrieval-Augmented Generation)的基本原理:
Query → Retrieve Documents → Generate Answer但在實際應用中,你可能會遇到這些問題:
❌ 問題 1:檢索器找不到真正相關的文檔
通用的檢索模型對你的領域術語理解不夠 ❌ 問題 2:LLM 不會利用檢索到的資訊
預訓練的 LLM 可能忽略提供的上下文 ❌ 問題 3:檢索器和 LLM 不協調
檢索器找到的資訊,LLM 不知道如何使用 解決方案:RA-LLM Training(檢索增強 LLM 訓練)
本文將深入解析:
Sequential Training(順序訓練)的概念 Retriever First(先訓練檢索器)策略 LLMs First(先訓練語言模型)策略 兩種方法的對比與選擇 🎯 什麼是 RA-LLM Training? 核心概念 RA-LLM = Retrieval-Augmented Large Language Model
不只是在推理時使用檢索(RAG),而是在訓練階段就整合檢索能力。
傳統 RAG(推理時整合): 預訓練的 Retriever + 預訓練的 LLM ↓ 在推理時組合使用 RA-LLM(訓練時整合): 訓練 Retriever 和/或 LLM ↓ 讓它們學會協作 ↓ 在推理時更好的配合為什麼需要訓練? 場景:醫療領域 RAG 系統 問題:「EGFR 突變的靶向治療方案有哪些?」 使用通用模型(未訓練): ├─ 檢索器:不理解醫療術語 │ └─ 找到:一般性的癌症治療文章 ❌ ├─ LLM:不知道如何利用檢索結果 │ └─ 生成:基於預訓練知識的通用答案 ❌ └─ 結果:答案不準確 使用訓練過的 RA-LLM: ├─ 檢索器:理解醫療術語 │ └─ 找到:EGFR 靶向藥物的具體文獻 ✅ ├─ LLM:知道如何整合檢索資訊 │ └─ 生成:基於文獻的專業答案 ✅ └─ 結果:準確且專業的回答 🔄 Sequential Training(順序訓練) 核心思想 「不同時訓練所有組件,而是按順序逐個訓練」
03-6. XSS 防禦完整指南:輸出編碼、CSP、HttpOnly ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐ (中等) ⚠️ 重要: 本篇是 XSS 系列最重要的一篇!
🎯 本篇重點 學習如何完全防禦 XSS:輸出編碼(HTML Escape)、Django Template 自動轉義、CSP(Content Security Policy)、HttpOnly Cookie,以及完整的安全檢查清單。
🛡️ 防禦的核心原則 黃金法則 永遠不要信任用戶輸入! 所有輸出到 HTML 的內容都必須編碼(Escape)為什麼需要輸出編碼? 沒有編碼(危險): 用戶輸入:<script>alert('XSS')</script> HTML 輸出:<div><script>alert('XSS')</script></div> 結果:JavaScript 被執行 有編碼(安全): 用戶輸入:<script>alert('XSS')</script> HTML 輸出:<div><script>alert('XSS')</script></div> 結果:顯示為純文字,不執行 關鍵: < 變成 < > 變成 > 瀏覽器會把 < 顯示為 <,但不會當成 HTML 標籤 1️⃣ 輸出編碼(Output Encoding) HTML 實體編碼 特殊字元 → HTML 實體 < → < > → > & → & " → " ' → ' / → /Python 手動編碼 import html # ✅ 手動編碼 def escape_html(text): return html.
一個關鍵問題:如何讓 LLM 知道它不知道的事? 當你想讓 LLM 回答關於你公司產品、內部文檔或最新資訊的問題時,你有三個選擇:
Prompt Engineering(提示工程):在 prompt 中直接提供資訊 RAG(檢索增強生成):從知識庫動態檢索相關資訊 Fine-tuning(微調):直接訓練模型學習新知識 但該如何選擇?Gao+ (2023) 的研究提供了一個清晰的框架來理解這三種方法的權衡。
本文將深入解析:
三種方法的核心差異 外部知識需求 vs 模型調整需求的二維分析 從基礎到進階的演進路徑 實際場景的選擇指南 📊 理解二維座標系統 兩個關鍵維度 根據 Gao+ (2023) 的研究框架,我們可以用兩個維度來評估不同方法:
維度 1:外部知識需求(Y 軸) 高 (High) │ │ 需要大量、頻繁更新的外部知識 │ 例如:最新新聞、公司資料、技術文檔 │ │ 低 (Low) 只需要通用知識或少量特定資訊 例如:常識問答、基礎對話維度 2:模型調整需求(X 軸) 低 (Low) 高 (High) 不需要改變模型行為 需要深度改變模型 例如:偶爾查詢 例如:領域專家、特定風格三種方法的定位 外部知識需求 (Y) ↑ │ 高 │ RAG 區域 │ (動態檢索) │ ▲ │ │ │ │ 中 │ Prompt Engineering │ (提供上下文) │ │ │ │ 低 │ │ │ ▼ │ Fine-tuning 區域 │ (內化知識) │ └──────────────────────→ 低 中 高 模型調整需求 (X) 💡 方法 1:Prompt Engineering(提示工程) 核心概念 「在輸入中直接提供需要的資訊或指導」