核心概念:什么是 RAG?
想象一下,你是一位專家,需要回答一個復雜的問題。你不會憑空編造答案,而是會:
- 檢索 (Retrieval):先去查閱相關的書籍、論文、報告或數據庫,找到最相關的信息片段。
- 理解與整合 (Comprehension & Integration):閱讀這些信息,理解其核心內容。
- 生成 (Generation):基于你檢索到的信息和你自身的專業知識,組織語言,生成一個準確、全面、連貫的回答。
RAG 就是讓大型語言模型 (LLM) 模擬這個過程。 它不是讓 LLM 單純依賴其訓練時學到的(可能過時或不完整的)知識來生成答案,而是在生成答案之前,先從一個外部知識庫中檢索出與當前問題最相關的信息,然后將這些信息作為上下文提供給 LLM,指導它生成更準確、更可靠、更具時效性的答案。
RAG 的核心原理與工作流程
RAG 系統通常包含兩個主要階段:
階段一:離線構建階段(知識庫準備)
這個階段是“打地基”,為后續的檢索做準備。
-
數據收集與預處理:
- 收集你需要模型能夠回答的問題相關的所有知識來源。這可以是:
- 公司內部文檔(產品手冊、技術文檔、HR政策、銷售記錄)
- 領域知識庫(醫學文獻、法律條文、學術論文)
- 網頁內容(新聞、博客、論壇帖子)
- 數據庫記錄
- 對收集到的原始數據進行清洗(去除無關信息、格式錯誤)、分塊 (Chunking)。分塊是關鍵步驟,因為 LLM 的上下文窗口長度有限,且小塊信息更容易精準匹配。例如,將一篇長文檔按段落、句子或語義單元分割成多個小塊。
- 收集你需要模型能夠回答的問題相關的所有知識來源。這可以是:
-
文本嵌入 (Embedding):
- 使用一個嵌入模型 (Embedding Model),如
text-embedding-ada-002
(OpenAI),BAAI/bge-large-en-v1.5
,sentence-transformers/all-MiniLM-L6-v2
等。 - 將每個文本塊(Chunk)轉換成一個向量 (Vector),也叫嵌入 (Embedding)。這個向量是一個由數字組成的列表(例如,長度為 768, 1536 等),它語義上代表了該文本塊的核心含義。
- 核心思想:語義相似的文本塊,在向量空間中的位置(向量)會非常接近;語義不相關的文本塊,向量位置會相距較遠。(具體如何衡量“接近”,詳見附錄 A:余弦相似度)
- 使用一個嵌入模型 (Embedding Model),如
-
構建向量數據庫 (Vector Database):
- 將所有文本塊及其對應的向量存儲在一個專門的向量數據庫 (Vector Database) 中。常見的向量數據庫包括:
- 開源/自托管: Chroma, FAISS, Weaviate, Qdrant, Milvus
- 云服務: Pinecone, Azure Cognitive Search, Google Vertex AI Matching Engine
- 這個數據庫建立了文本塊 -> 向量 以及 向量 -> 文本塊 的映射關系。它支持高效的相似性搜索,能快速找到與給定向量最相似的向量(及其對應的文本塊)。(在海量數據下,這種搜索通常使用“近似最近鄰”算法,詳見附錄 B:近似最近鄰)
- 將所有文本塊及其對應的向量存儲在一個專門的向量數據庫 (Vector Database) 中。常見的向量數據庫包括:
離線階段總結: 我們將所有知識源處理成小塊,用嵌入模型把它們變成向量,存進向量數據庫。這個數據庫就像一個巨大的、按語義組織的“索引”。
階段二:在線推理階段(回答用戶問題)
當用戶提出一個問題時,RAG 系統開始工作:
-
用戶問題嵌入 (Query Embedding):
- 用戶輸入一個問題,例如:“蘋果公司最新發布的 iPhone 型號是什么?它的主要創新點有哪些?”
- 使用同一個嵌入模型,將這個問題也轉換成一個向量。
-
相似性檢索 (Similarity Search):
- 將用戶問題的向量,輸入到向量數據庫中。
- 向量數據庫執行相似性搜索,找到與問題向量最接近的 Top K 個(例如,Top 5)向量。
- 數據庫返回這些最相似向量對應的原始文本塊。這些文本塊就是從知識庫中檢索到的、與用戶問題最相關的信息片段。
-
提示詞構建 (Prompt Construction):
- 將檢索到的相關文本塊(作為上下文 Context)和用戶的原始問題組合成一個精心設計的提示詞 (Prompt)。
- 這個提示詞通常包含:
- 指令 (Instruction):告訴 LLM 它的角色和任務(例如:“你是一個樂于助人的知識助手。請根據以下提供的背景信息,準確回答用戶的問題。”)。
- 上下文 (Context):插入檢索到的 Top K 個文本塊(用分隔符分開,如
---
)。 - 問題 (Ques