[{"data":1,"prerenderedAt":1013},["ShallowReactive",2],{"navigation_docs":3,"-ai-rag-dense-retrieval-deep-dive":352,"-ai-rag-dense-retrieval-deep-dive-surround":1008},[4,54,83,116,125,161,179,200],{"title":5,"path":6,"stem":7,"children":8},"Ai","/ai","ai",[9,12,42,46,50],{"title":10,"path":6,"stem":11},"AI 技術探索","ai/index",{"title":13,"path":14,"stem":15,"children":16,"page":41},"Rag","/ai/rag","ai/RAG",[17,21,25,29,33,37],{"title":18,"path":19,"stem":20},"BM25 演算法深入解析：從 TF-IDF 到現代搜尋引擎的核心技術","/ai/rag/bm25-deep-dive-from-tf-idf-to-rag","ai/RAG/bm25-deep-dive-from-tf-idf-to-rag",{"title":22,"path":23,"stem":24},"Dense Retrieval（向量檢索）深入解析","/ai/rag/dense-retrieval-deep-dive","ai/RAG/dense-retrieval-deep-dive",{"title":26,"path":27,"stem":28},"RAG（Retrieval-Augmented Generation）原理與實作入門","/ai/rag/rag-intro-principles-and-implementation","ai/RAG/rag-intro-principles-and-implementation",{"title":30,"path":31,"stem":32},"RAG Retrieval Strategy 深入解析","/ai/rag/rag-retrieval-strategy-deep-dive","ai/RAG/rag-retrieval-strategy-deep-dive",{"title":34,"path":35,"stem":36},"Reciprocal Rank Fusion（RRF）教學：打造更穩定的檢索融合策略","/ai/rag/rrf-reciprocal-rank-fusion-guide","ai/RAG/rrf-reciprocal-rank-fusion-guide",{"title":38,"path":39,"stem":40},"TF-IDF（Term Frequency–Inverse Document Frequency）深入解析","/ai/rag/tf-idf-deep-dive","ai/RAG/tf-idf-deep-dive",false,{"title":43,"path":44,"stem":45},"Docus AI 功能完整實作指南","/ai/docus-ai-implementation","ai/docus-ai-implementation",{"title":47,"path":48,"stem":49},"llms.txt 是什麼？在 Nuxt 中控制 AI 與搜尋引擎爬蟲的新方式","/ai/llms-txt","ai/llms-txt",{"title":51,"path":52,"stem":53},"MCP（Model Context Protocol）是什麼？用「AI 的 USB-C」理解模型如何安全連接工具與資料","/ai/mcp_concept","ai/mcp_concept",{"title":55,"path":56,"stem":57,"children":58,"page":41},"Data Analysis","/data-analysis","data-analysis",[59,63,67,71,75,79],{"title":60,"path":61,"stem":62},"Exploratory Data Analysis（EDA）資料探索分析入門","/data-analysis/exploratory-data-analysis-eda","data-analysis/exploratory-data-analysis-eda",{"title":64,"path":65,"stem":66},"PR-AUC 深入解析：不平衡分類問題的重要評估指標","/data-analysis/pr-auc-for-imbalanced-classification","data-analysis/pr-auc-for-imbalanced-classification",{"title":68,"path":69,"stem":70},"ROC-AUC 深入解析：理解分類模型的判斷能力","/data-analysis/roc-auc-complete-guide","data-analysis/roc-auc-complete-guide",{"title":72,"path":73,"stem":74},"SHAP（SHapley Additive exPlanations）模型解釋方法深入解析","/data-analysis/shap-model-interpretation-complete-guide","data-analysis/shap-model-interpretation-complete-guide",{"title":76,"path":77,"stem":78},"Social Network Analysis（SNA）深入解析","/data-analysis/social-network-analysis-sna","data-analysis/social-network-analysis-sna",{"title":80,"path":81,"stem":82},"Time-based Split：為什麼時間序列資料不能使用 Random Split？","/data-analysis/time-based-split-vs-random-split","data-analysis/time-based-split-vs-random-split",{"title":84,"path":85,"stem":86,"children":87,"page":41},"MachineLearning","/machine_learning","machine_learning",[88,92,96,100,104,108,112],{"title":89,"path":90,"stem":91},"Confusion Matrix（混淆矩陣）完整解析","/machine_learning/confusion-matrix","machine_learning/confusion-matrix",{"title":93,"path":94,"stem":95},"Decision Tree 模型完整教學：從原理到 Python 實作","/machine_learning/decision-tree-complete-guide","machine_learning/decision-tree-complete-guide",{"title":97,"path":98,"stem":99},"為什麼 Decision Tree 在 Tabular Data 上常常勝過 Deep Learning？","/machine_learning/decision-tree-vs-deep-learning-on-tabular-data","machine_learning/decision-tree-vs-deep-learning-on-tabular-data",{"title":101,"path":102,"stem":103},"LightGBM 模型入門：理解高效能的 Gradient Boosting 演算法","/machine_learning/lightgbm-intro-for-tabular-data","machine_learning/lightgbm-intro-for-tabular-data",{"title":105,"path":106,"stem":107},"Logistic Regression（Logit 回歸）完整教學","/machine_learning/logistic-regression-complete-guide","machine_learning/logistic-regression-complete-guide",{"title":109,"path":110,"stem":111},"為什麼模型訓練需要 Train / Validation / Test Dataset？","/machine_learning/train-validation-test-dataset","machine_learning/train-validation-test-dataset",{"title":113,"path":114,"stem":115},"XGBoost 原理與實務教學","/machine_learning/xgboost-complete-guide","machine_learning/xgboost-complete-guide",{"title":117,"path":118,"stem":119,"children":120,"page":41},"Network","/network","network",[121],{"title":122,"path":123,"stem":124},"DNS 設定入門：CNAME vs A Record 完整解析","/network/dns-cname-vs-a-record-guide","network/dns-cname-vs-a-record-guide",{"title":126,"path":127,"stem":128,"children":129},"Nuxt","/nuxt","nuxt",[130,133,137,141,145,149,153,157],{"title":131,"path":127,"stem":132},"Nuxt 實戰指南","nuxt/index",{"title":134,"path":135,"stem":136},"Abstraction Layer 與 Adapter 的差別，一次搞懂設計角色","/nuxt/adapter_abstraction_layer","nuxt/adapter_abstraction_layer",{"title":138,"path":139,"stem":140},"Nuxt 4 全面理解 — 專案檔案結構解析","/nuxt/directory_structure","nuxt/directory_structure",{"title":142,"path":143,"stem":144},"Nuxt 前端 build 流程完整解析","/nuxt/frontend_build","nuxt/frontend_build",{"title":146,"path":147,"stem":148},"Nitro 是什麼？從 Nuxt 專案到 Server 與 Edge 的關鍵引擎","/nuxt/nitro","nuxt/nitro",{"title":150,"path":151,"stem":152},"深入理解 Nuxt 的 .nuxt 與 .output：為什麼部署時一定要分清楚？","/nuxt/nuxt_and_output","nuxt/nuxt_and_output",{"title":154,"path":155,"stem":156},"Nuxt 中 dev、build、preview 的差異一次搞懂","/nuxt/nuxt_dev_build_preview","nuxt/nuxt_dev_build_preview",{"title":158,"path":159,"stem":160},"Nuxt Image vs \u003Cimg>：為什麼 Nuxt 3 專案幾乎都該用 \u003CNuxtImg>？","/nuxt/nuxt_image","nuxt/nuxt_image",{"title":162,"path":163,"stem":164,"children":165},"Python 程式開發","/python","python/index",[166,167,171,175],{"title":162,"path":163,"stem":164},{"title":168,"path":169,"stem":170},"如何在 FastAPI 中調用記憶體 Buffer 回傳圖片 (附實例)","/python/memory_buffer","python/memory_buffer",{"title":172,"path":173,"stem":174},"Python 單元測試教學：如何為你的程式撰寫 Test","/python/python-unit-testing-unittest-pytest","python/python-unit-testing-unittest-pytest",{"title":176,"path":177,"stem":178},"如何使用 uv 取代 pip：改善 Python 專案的開發流程","/python/uv","python/uv",{"title":180,"path":181,"stem":182,"children":183,"page":41},"Statistic","/statistic","statistic",[184,188,192,196],{"title":185,"path":186,"stem":187},"卡方檢定（Chi-Square Test）入門教學","/statistic/chi-square-test-intro","statistic/chi-square-test-intro",{"title":189,"path":190,"stem":191},"常見抽樣方法（Sampling Methods）教學：Stratified、Quota、Convenience、Systematic、Simple Random","/statistic/common-sampling-methods-guide","statistic/common-sampling-methods-guide",{"title":193,"path":194,"stem":195},"Cramér’s V 指標介紹：如何衡量兩個類別變數之間的關聯","/statistic/cramers-v-for-categorical-association","statistic/cramers-v-for-categorical-association",{"title":197,"path":198,"stem":199},"Mann–Whitney U 與 Kolmogorov–Smirnov（KS）檢定：非參數統計檢定的入門指南","/statistic/mann-whitney-u-and-ks-test-intro","statistic/mann-whitney-u-and-ks-test-intro",{"title":201,"path":202,"stem":203,"children":204},"WebDev","/web_dev","web_dev",[205,208,234,248,282,312,334],{"title":206,"path":202,"stem":207},"Web 前端開發","web_dev/index",{"title":209,"path":210,"stem":211,"children":212},"瀏覽器與渲染","/web_dev/browser","web_dev/browser/index",[213,214,218,222,226,230],{"title":209,"path":210,"stem":211},{"title":215,"path":216,"stem":217},"瀏覽器儲存空間完整解析：Cookie、localStorage、IndexedDB 到 Cache Storage","/web_dev/browser/browser-storage-comprehensive-guide","web_dev/browser/browser-storage-comprehensive-guide",{"title":219,"path":220,"stem":221},"DOM (Document Object Model) 深入解析","/web_dev/browser/dom","web_dev/browser/dom",{"title":223,"path":224,"stem":225},"Service Worker Request Flow 深入解析","/web_dev/browser/service-worker-request-flow","web_dev/browser/service-worker-request-flow",{"title":227,"path":228,"stem":229},"CSR、SSR 與 SSG 是什麼？前端渲染策略完整比較","/web_dev/browser/ssr_csr_ssg","web_dev/browser/ssr_csr_ssg",{"title":231,"path":232,"stem":233},"Virtual DOM 深入解析：為什麼它能優化前端效能？","/web_dev/browser/virtual_dom","web_dev/browser/virtual_dom",{"title":235,"path":236,"stem":237,"children":238},"圖形技術","/web_dev/graphics","web_dev/graphics/index",[239,240,244],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"為什麼 Three.js 專案幾乎都選擇 CSR？從 SSR 問題談起","/web_dev/graphics/threejs_csr","web_dev/graphics/threejs_csr",{"title":245,"path":246,"stem":247},"WebGL 是什麼？為什麼前端 3D 幾乎都靠它？","/web_dev/graphics/webgl","web_dev/graphics/webGL",{"title":249,"path":250,"stem":251,"children":252},"架構與配置","/web_dev/infrastructure","web_dev/infrastructure/index",[253,254,258,262,266,270,274,278],{"title":249,"path":250,"stem":251},{"title":255,"path":256,"stem":257},"Zeabur + K3s + Nuxt 部署架構完整解析","/web_dev/infrastructure/k3s-zeabur","web_dev/infrastructure/K3s-zeabur",{"title":259,"path":260,"stem":261},"ECS vs Docker vs Kubernetes：從部署堆疊理解三層架構","/web_dev/infrastructure/ecs-docker-kubernetes-stack","web_dev/infrastructure/ecs-docker-kubernetes-stack",{"title":263,"path":264,"stem":265},"ECS vs VPS 是什麼？從部署網站的角度一次搞懂差別","/web_dev/infrastructure/ecs-vs-vps","web_dev/infrastructure/ecs-vs-vps",{"title":267,"path":268,"stem":269},"Zeabur 內網服務連線完整入門指南","/web_dev/infrastructure/k3s-internal-networking","web_dev/infrastructure/k3s-internal-networking",{"title":271,"path":272,"stem":273},"使用 Microservices 架構設計系統的優勢解析","/web_dev/infrastructure/microservices-architecture-advantages","web_dev/infrastructure/microservices-architecture-advantages",{"title":275,"path":276,"stem":277},"Nginx 入門教學：從反向代理到與 Kubernetes 的架構比較","/web_dev/infrastructure/nginx-intro","web_dev/infrastructure/nginx-intro",{"title":279,"path":280,"stem":281},"YAML 配置是什麼？為什麼現代開發都在用它","/web_dev/infrastructure/yaml-configuration","web_dev/infrastructure/yaml-configuration",{"title":283,"path":284,"stem":285,"children":286},"網絡與通訊","/web_dev/network","web_dev/network/index",[287,288,292,296,300,304,308],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"HTTP Request 結構完整解析：從 Request Line 到 Header 一次看懂","/web_dev/network/http-request-structure","web_dev/network/http-request-structure",{"title":293,"path":294,"stem":295},"OSI 模型（Open Systems Interconnection Model）完整解析","/web_dev/network/osi-model","web_dev/network/osi-model",{"title":297,"path":298,"stem":299},"RESTful API 設計原則與實務解析","/web_dev/network/restful-api","web_dev/network/restful-api",{"title":301,"path":302,"stem":303},"RESTful API 五大設計原則深入解析","/web_dev/network/restful-api-principles","web_dev/network/restful-api-principles",{"title":305,"path":306,"stem":307},"Server-Sent Events (SSE) 深入解析與實作教學","/web_dev/network/sse-introduction","web_dev/network/sse-introduction",{"title":309,"path":310,"stem":311},"WebSocket 入門教學：從概念到 Node.js 實作","/web_dev/network/websocket-introduction","web_dev/network/websocket-introduction",{"title":313,"path":314,"stem":315,"children":316},"認證與安全","/web_dev/security","web_dev/security/index",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"使用 Cookie 與 Session 建立使用者驗證（完整新手教學）","/web_dev/security/cookie-session-authentication","web_dev/security/cookie-session-authentication",{"title":323,"path":324,"stem":325},"JWT 驗證機制完整解析：從登入流程到實務應用","/web_dev/security/jwt-authentication","web_dev/security/jwt-authentication",{"title":327,"path":328,"stem":329},"Secret Key 簽名是什麼？從零理解資料簽名的本質","/web_dev/security/secret-key-signing","web_dev/security/secret-key-signing",{"title":331,"path":332,"stem":333},"SSH（Secure Shell）是什麼？從遠端登入到安全通道的核心概念","/web_dev/security/ssh","web_dev/security/ssh",{"title":335,"path":336,"stem":337,"children":338},"SEO 與規範","/web_dev/seo","web_dev/seo/index",[339,340,344,348],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Canonical URL 是什麼？用生活化方式搞懂前端 SEO 的基本保命符","/web_dev/seo/canonical_link","web_dev/seo/canonical_link",{"title":345,"path":346,"stem":347},"robots.txt 是什麼？SEO 的第一道守門員","/web_dev/seo/robot_txt","web_dev/seo/robot_txt",{"title":349,"path":350,"stem":351},"Nuxt SEO 中的 Meta 與 SEO 工具是如何運作的？","/web_dev/seo/seo","web_dev/seo/seo",{"id":353,"title":22,"body":354,"description":994,"extension":995,"links":996,"meta":997,"navigation":731,"path":23,"seo":1006,"stem":24,"__hash__":1007},"docs/ai/RAG/dense-retrieval-deep-dive.md",{"type":355,"value":356,"toc":971},"minimark",[357,362,371,374,377,388,391,394,397,401,407,410,413,426,429,431,435,440,443,449,452,455,470,474,477,491,498,502,505,516,519,530,532,536,539,542,546,549,560,564,567,573,576,580,583,589,592,594,598,601,605,613,617,620,631,634,638,641,643,647,654,660,663,671,674,676,680,687,918,924,926,930,933,947,950,952,955,958,961,967],[358,359,361],"h2",{"id":360},"為什麼我們需要-dense-retrieval","為什麼我們需要 Dense Retrieval？",[363,364,365,366,370],"p",{},"在資訊檢索（Information Retrieval）的世界中，最早的做法大多是基於「關鍵字比對」，例如 TF-IDF 或 BM25。這類方法的核心邏輯很直覺：",[367,368,369],"strong",{},"只要 query 和文件中出現相同的詞，就認為它們相關","。",[363,372,373],{},"然而，這種方法存在一個根本問題：它只理解「字面」，卻不理解「語意」。",[363,375,376],{},"舉個簡單例子：",[378,379,385],"pre",{"className":380,"code":382,"language":383,"meta":384},[381],"language-text","Query：如何提升汽車燃油效率？\nDocument：如何讓你的車更省油？\n","text","",[386,387,382],"code",{"__ignoreMap":384},[363,389,390],{},"對人類來說，這兩句話幾乎是同一件事，但因為「汽車 ≠ 車」、「燃油效率 ≠ 省油」，傳統 keyword-based 方法可能無法正確匹配。",[363,392,393],{},"這時候，Dense Retrieval 就登場了。",[395,396],"hr",{},[358,398,400],{"id":399},"dense-retrieval-的核心概念","Dense Retrieval 的核心概念",[363,402,403,404,370],{},"Dense Retrieval 的關鍵在於：",[367,405,406],{},"把文字轉換成向量（embedding），並用向量之間的距離來衡量語意相似度",[363,408,409],{},"與傳統方法不同，它不再關注「字有沒有出現」，而是關注「意思像不像」。",[363,411,412],{},"整體流程可以簡化成三個步驟：",[414,415,416,420,423],"ol",{},[417,418,419],"li",{},"將文件（documents）轉換成向量",[417,421,422],{},"將查詢（query）轉換成向量",[417,424,425],{},"計算向量之間的相似度（例如 cosine similarity）",[363,427,428],{},"在這個架構下，上面的例子會被 embedding 模型轉成語意相近的向量，因此能成功匹配。",[395,430],{},[358,432,434],{"id":433},"dense-retrieval-的運作流程","Dense Retrieval 的運作流程",[436,437,439],"h3",{"id":438},"_1-embedding把文字變成向量","1. Embedding：把文字變成向量",[363,441,442],{},"Dense Retrieval 的第一步，是透過模型（通常是 Transformer-based 模型）將文字轉成固定長度的向量，例如：",[378,444,447],{"className":445,"code":446,"language":383,"meta":384},[381],"\"如何讓車更省油\" → [0.12, -0.98, 0.33, ...]\n",[386,448,446],{"__ignoreMap":384},[363,450,451],{},"這個向量其實是一種「語意壓縮表示」，會保留句子的語意資訊。",[363,453,454],{},"常見模型包括：",[456,457,458,461,464,467],"ul",{},[417,459,460],{},"BERT-based models",[417,462,463],{},"Sentence Transformers（如 all-MiniLM）",[417,465,466],{},"OpenAI embedding models",[417,468,469],{},"BGE 系列（如 bge-base, bge-large）",[436,471,473],{"id":472},"_2-建立向量資料庫vector-database","2. 建立向量資料庫（Vector Database）",[363,475,476],{},"當所有文件都被轉成向量後，我們會把它們存進向量資料庫，例如：",[456,478,479,482,485,488],{},[417,480,481],{},"FAISS",[417,483,484],{},"Chroma",[417,486,487],{},"Milvus",[417,489,490],{},"Weaviate",[363,492,493,494,497],{},"這些資料庫支援 ",[367,495,496],{},"高效的相似度搜尋（ANN, Approximate Nearest Neighbor）","，可以在大量資料中快速找到最相似的向量。",[436,499,501],{"id":500},"_3-query-retrieval相似度搜尋","3. Query Retrieval：相似度搜尋",[363,503,504],{},"當使用者輸入 query 時：",[414,506,507,510,513],{},[417,508,509],{},"將 query 轉成向量",[417,511,512],{},"與資料庫中的向量做相似度比較",[417,514,515],{},"取出 Top-K 最相似的文件",[363,517,518],{},"常見的相似度計算方式包括：",[456,520,521,524,527],{},[417,522,523],{},"Cosine similarity",[417,525,526],{},"Dot product",[417,528,529],{},"Euclidean distance",[395,531],{},[358,533,535],{"id":534},"為什麼-dense-retrieval-在-rag-中很重要","為什麼 Dense Retrieval 在 RAG 中很重要？",[363,537,538],{},"在 RAG（Retrieval-Augmented Generation）系統中，Retrieval 的品質會直接影響最終答案。",[363,540,541],{},"Dense Retrieval 的優勢在於：",[436,543,545],{"id":544},"_1-能理解語意semantic-search","1. 能理解語意（Semantic Search）",[363,547,548],{},"不像 BM25 只看字詞，Dense Retrieval 能理解語意關聯，因此：",[456,550,551,554,557],{},[417,552,553],{},"可以處理同義詞",[417,555,556],{},"可以理解句子結構",[417,558,559],{},"對自然語言 query 更友善",[436,561,563],{"id":562},"_2-適合長文本與自然語言問題","2. 適合長文本與自然語言問題",[363,565,566],{},"在 RAG 系統中，使用者通常會問完整句子，而不是關鍵字，例如：",[378,568,571],{"className":569,"code":570,"language":383,"meta":384},[381],"公司什麼時候上市？\n",[386,572,570],{"__ignoreMap":384},[363,574,575],{},"Dense Retrieval 可以更好地理解這類 query，而不是只抓「上市」這個詞。",[436,577,579],{"id":578},"_3-與-llm-天然相容","3. 與 LLM 天然相容",[363,581,582],{},"因為 LLM 本身也是基於 embedding 的語意空間，Dense Retrieval 可以更自然地與生成模型搭配：",[378,584,587],{"className":585,"code":586,"language":383,"meta":384},[381],"Query → Dense Retrieval → Top-K Documents → LLM\n",[386,588,586],{"__ignoreMap":384},[363,590,591],{},"這樣可以大幅提升答案的正確性與可解釋性。",[395,593],{},[358,595,597],{"id":596},"dense-retrieval-的限制","Dense Retrieval 的限制",[363,599,600],{},"雖然 Dense Retrieval 很強，但它並不是萬能的。",[436,602,604],{"id":603},"_1-計算成本高","1. 計算成本高",[456,606,607,610],{},[417,608,609],{},"embedding 模型推論成本較高",[417,611,612],{},"建立向量資料庫需要額外資源",[436,614,616],{"id":615},"_2-對精確匹配不友善","2. 對精確匹配不友善",[363,618,619],{},"Dense Retrieval 有時會忽略「關鍵字精確匹配」，例如：",[456,621,622,625,628],{},[417,623,624],{},"法條編號",[417,626,627],{},"型號（iPhone 15 vs iPhone 14）",[417,629,630],{},"數字",[363,632,633],{},"這種情況下，BM25 反而更可靠。",[436,635,637],{"id":636},"_3-需要良好的-chunking-策略","3. 需要良好的 chunking 策略",[363,639,640],{},"如果文件切得不好（太長或太短），會影響 embedding 的品質，進而影響 retrieval 效果。",[395,642],{},[358,644,646],{"id":645},"hybrid-retrieval最佳實務做法","Hybrid Retrieval：最佳實務做法",[363,648,649,650,653],{},"在實務上，很少只用 Dense Retrieval，通常會搭配 BM25，形成 ",[367,651,652],{},"Hybrid Search","：",[378,655,658],{"className":656,"code":657,"language":383,"meta":384},[381],"Query\n├─ BM25（keyword match）\n└─ Dense Retrieval（semantic match）\n    ↓\nFusion（例如 RRF）\n    ↓\nReranker（cross-encoder）\n",[386,659,657],{"__ignoreMap":384},[363,661,662],{},"這樣可以同時兼顧：",[456,664,665,668],{},[417,666,667],{},"關鍵字精準度",[417,669,670],{},"語意理解能力",[363,672,673],{},"是目前 RAG 系統中最主流的設計。",[395,675],{},[358,677,679],{"id":678},"一個簡單的-python-範例","一個簡單的 Python 範例",[363,681,682,683,686],{},"以下示範如何使用 ",[386,684,685],{},"sentence-transformers"," 進行簡單的 Dense Retrieval：",[378,688,692],{"className":689,"code":690,"language":691,"meta":384,"style":384},"language-python shiki shiki-themes github-dark","from sentence_transformers import SentenceTransformer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# 載入模型\nmodel = SentenceTransformer(\"all-MiniLM-L6-v2\")\n\ndocuments = [\n    \"如何讓車更省油\",\n    \"Python 教學入門\",\n    \"如何投資股票\"\n]\n\n# 建立 document embeddings\ndoc_embeddings = model.encode(documents)\n\n# Query\nquery = \"如何提升汽車燃油效率\"\nquery_embedding = model.encode([query])\n\n# 計算相似度\nscores = cosine_similarity(query_embedding, doc_embeddings)[0]\n\n# 找最相似文件\nbest_idx = scores.argmax()\nprint(documents[best_idx])\n","python",[386,693,694,713,726,733,740,759,764,775,784,792,798,804,809,815,826,831,837,848,859,864,870,887,892,898,909],{"__ignoreMap":384},[695,696,699,703,707,710],"span",{"class":697,"line":698},"line",1,[695,700,702],{"class":701},"snl16","from",[695,704,706],{"class":705},"s95oV"," sentence_transformers ",[695,708,709],{"class":701},"import",[695,711,712],{"class":705}," SentenceTransformer\n",[695,714,716,718,721,723],{"class":697,"line":715},2,[695,717,702],{"class":701},[695,719,720],{"class":705}," sklearn.metrics.pairwise ",[695,722,709],{"class":701},[695,724,725],{"class":705}," cosine_similarity\n",[695,727,729],{"class":697,"line":728},3,[695,730,732],{"emptyLinePlaceholder":731},true,"\n",[695,734,736],{"class":697,"line":735},4,[695,737,739],{"class":738},"sAwPA","# 載入模型\n",[695,741,743,746,749,752,756],{"class":697,"line":742},5,[695,744,745],{"class":705},"model ",[695,747,748],{"class":701},"=",[695,750,751],{"class":705}," SentenceTransformer(",[695,753,755],{"class":754},"sU2Wk","\"all-MiniLM-L6-v2\"",[695,757,758],{"class":705},")\n",[695,760,762],{"class":697,"line":761},6,[695,763,732],{"emptyLinePlaceholder":731},[695,765,767,770,772],{"class":697,"line":766},7,[695,768,769],{"class":705},"documents ",[695,771,748],{"class":701},[695,773,774],{"class":705}," [\n",[695,776,778,781],{"class":697,"line":777},8,[695,779,780],{"class":754},"    \"如何讓車更省油\"",[695,782,783],{"class":705},",\n",[695,785,787,790],{"class":697,"line":786},9,[695,788,789],{"class":754},"    \"Python 教學入門\"",[695,791,783],{"class":705},[695,793,795],{"class":697,"line":794},10,[695,796,797],{"class":754},"    \"如何投資股票\"\n",[695,799,801],{"class":697,"line":800},11,[695,802,803],{"class":705},"]\n",[695,805,807],{"class":697,"line":806},12,[695,808,732],{"emptyLinePlaceholder":731},[695,810,812],{"class":697,"line":811},13,[695,813,814],{"class":738},"# 建立 document embeddings\n",[695,816,818,821,823],{"class":697,"line":817},14,[695,819,820],{"class":705},"doc_embeddings ",[695,822,748],{"class":701},[695,824,825],{"class":705}," model.encode(documents)\n",[695,827,829],{"class":697,"line":828},15,[695,830,732],{"emptyLinePlaceholder":731},[695,832,834],{"class":697,"line":833},16,[695,835,836],{"class":738},"# Query\n",[695,838,840,843,845],{"class":697,"line":839},17,[695,841,842],{"class":705},"query ",[695,844,748],{"class":701},[695,846,847],{"class":754}," \"如何提升汽車燃油效率\"\n",[695,849,851,854,856],{"class":697,"line":850},18,[695,852,853],{"class":705},"query_embedding ",[695,855,748],{"class":701},[695,857,858],{"class":705}," model.encode([query])\n",[695,860,862],{"class":697,"line":861},19,[695,863,732],{"emptyLinePlaceholder":731},[695,865,867],{"class":697,"line":866},20,[695,868,869],{"class":738},"# 計算相似度\n",[695,871,873,876,878,881,885],{"class":697,"line":872},21,[695,874,875],{"class":705},"scores ",[695,877,748],{"class":701},[695,879,880],{"class":705}," cosine_similarity(query_embedding, doc_embeddings)[",[695,882,884],{"class":883},"sDLfK","0",[695,886,803],{"class":705},[695,888,890],{"class":697,"line":889},22,[695,891,732],{"emptyLinePlaceholder":731},[695,893,895],{"class":697,"line":894},23,[695,896,897],{"class":738},"# 找最相似文件\n",[695,899,901,904,906],{"class":697,"line":900},24,[695,902,903],{"class":705},"best_idx ",[695,905,748],{"class":701},[695,907,908],{"class":705}," scores.argmax()\n",[695,910,912,915],{"class":697,"line":911},25,[695,913,914],{"class":883},"print",[695,916,917],{"class":705},"(documents[best_idx])\n",[363,919,920,921,370],{},"這段程式碼的核心就是：",[367,922,923],{},"用語意相似度取代關鍵字比對",[395,925],{},[358,927,929],{"id":928},"dense-retrieval-在現代-ai-系統中的角色","Dense Retrieval 在現代 AI 系統中的角色",[363,931,932],{},"如果用一個更高層的角度來看：",[456,934,935,938,941,944],{},[417,936,937],{},"BM25：負責字面搜尋",[417,939,940],{},"Dense Retrieval：負責語意搜尋",[417,942,943],{},"Reranker：負責精細排序",[417,945,946],{},"LLM：負責生成答案",[363,948,949],{},"Dense Retrieval 正好位於「理解問題」與「找到資料」之間，是整個系統的關鍵橋樑。",[395,951],{},[358,953,954],{"id":954},"結論",[363,956,957],{},"Dense Retrieval 是現代搜尋與 RAG 系統的核心技術之一。透過 embedding 與向量相似度，它讓系統能夠理解語意，而不只是比對字詞。",[363,959,960],{},"然而，在實務應用中，Dense Retrieval 通常不會單獨使用，而是與 BM25、Reranker 等技術結合，形成一套完整的檢索架構。",[363,962,963,964],{},"當你理解 Dense Retrieval 的運作方式後，你會發現：",[367,965,966],{},"搜尋這件事，早就不只是找關鍵字，而是理解語意的問題。",[968,969,970],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":384,"searchDepth":715,"depth":715,"links":972},[973,974,975,980,985,990,991,992,993],{"id":360,"depth":715,"text":361},{"id":399,"depth":715,"text":400},{"id":433,"depth":715,"text":434,"children":976},[977,978,979],{"id":438,"depth":728,"text":439},{"id":472,"depth":728,"text":473},{"id":500,"depth":728,"text":501},{"id":534,"depth":715,"text":535,"children":981},[982,983,984],{"id":544,"depth":728,"text":545},{"id":562,"depth":728,"text":563},{"id":578,"depth":728,"text":579},{"id":596,"depth":715,"text":597,"children":986},[987,988,989],{"id":603,"depth":728,"text":604},{"id":615,"depth":728,"text":616},{"id":636,"depth":728,"text":637},{"id":645,"depth":715,"text":646},{"id":678,"depth":715,"text":679},{"id":928,"depth":715,"text":929},{"id":954,"depth":715,"text":954},"從原理到實務應用，完整理解 Dense Retrieval 在現代搜尋與 RAG 系統中的角色與運作方式。","md",null,{"tags":998,"category":1004,"date":1005},[999,1000,1001,1002,1003],"dense retrieval","embeddings","rag","vector search","nlp","RAG","2026-03-17",{"title":22,"description":994},"l11z9Z22FoovXTrK7uRGZ7cD0kxk50g_CLaa78z8mt8",[1009,1011],{"title":18,"path":19,"stem":20,"description":1010,"children":-1},"本文帶你理解 BM25 的原理、公式推導與實務應用，並說明它在搜尋與 RAG 系統中的關鍵角色。",{"title":26,"path":27,"stem":28,"description":1012,"children":-1},"介紹 Retrieval-Augmented Generation（RAG）的核心概念、系統架構與實作流程，理解大型語言模型如何透過外部知識提升回答品質。",1776690844447]