RAG技術全解析:從概念到實踐,構建高效語義檢索系統——嵌入模型與向量數據庫搭建指南

一、RAG技術概述:為什么需要RAG?

1.1 什么是RAG?
RAG(Retrieval-Augmented Generation)是一種結合檢索生成能力的AI架構。其核心思想是通過外部知識庫動態增強大語言模型(LLM)的生成能力,解決傳統模型知識過時、幻覺(Hallucination)等問題。

1.2 RAG的核心優勢

  • 動態知識更新:無需重新訓練模型即可引入最新數據。
  • 降低幻覺風險:基于真實文檔生成答案,提升可信度。
  • 支持私有數據:企業可利用內部文檔構建專屬問答系統。

1.3 RAG的工作流程

  1. 數據預處理:加載并清洗文檔(PDF、HTML等),分割為小塊(Chunking)。
  2. 向量化:通過嵌入模型(Embedding Model)將文本轉為高維向量。
  3. 存儲與檢索:將向量存入向量數據庫,根據用戶查詢進行語義相似度匹配。
  4. 生成答案:將檢索結果與用戶問題結合,輸入LLM生成最終輸出。

二、核心組件詳解:嵌入模型與向量數據庫

2.1 嵌入模型:語義向量化的基石
嵌入模型(Embedding Model)將文本轉化為向量,決定檢索的準確性。

2.1.1 模型選擇與性能對比
通義千問提供的文本嵌入模型在MTEB(多語言任務)和CMTEB(中文任務)中表現優異:

模型名稱MTEB(通用任務)MTEB(檢索任務)CMTEB(中文任務)CMTEB(中文檢索任務)向量維度特點
text-embedding-v158.3045.4759.8456.591536維基礎模型,支持多語言通用語義檢索。
text-embedding-v260.1349.4962.1762.781536維優化中文與多語言處理能力,檢索效果提升顯著。
text-embedding-v363.3955.4168.9273.231024維旗艦模型,性能登頂MTEB/CMTEB榜單,支持自定義向量維度(需通過API指定)。

2.1.2 嵌入模型調用示例(LangChain框架)

from langchain_community.embeddings import DashScopeEmbeddings# 初始化嵌入模型
embeddings = DashScopeEmbeddings(model="text-embedding-v2")# 單個文本向量化
query_vector = embeddings.embed_query("This is a test document.")
print("文本向量長度:", len(query_vector))# 批量文本向量化
doc_vectors = embeddings.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"
])
print("文本向量數量:", len(doc_vectors), ",單個向量長度:", len(doc_vectors[0]))

2.2 向量數據庫:高效檢索的關鍵
向量數據庫(Vector Database)存儲并檢索高維向量,支持語義搜索。

2.2.1 常見向量數據庫對比

數據庫開源/閉源部署難度支持語言適用場景
Chroma開源Python本地開發、小規模測試
FAISS開源C++/Python高性能相似度搜索
Milvus開源多語言企業級大規模部署
Pinecone閉源多語言云端即服務(SaaS)

2.2.2 向量數據庫搭建示例(Chroma)

import chromadb
from chromadb.api.types import EmbeddingFunction
from sentence_transformers import SentenceTransformer# 自定義嵌入函數
class MyEmbeddingFunction(EmbeddingFunction):def __init__(self):self.model = SentenceTransformer('all-MiniLM-L6-v2')def __call__(self, input: List[str]) -> np.ndarray:return self.model.encode(input).tolist()# 初始化Chroma客戶端
client = chromadb.Client()
collection = client.create_collection(name="my_collection", embedding_function=MyEmbeddingFunction())# 添加文檔
collection.add(documents=["文檔1內容", "文檔2內容"], ids=["id1", "id2"])# 查詢示例
results = collection.query(query_texts=["用戶查詢內容"], n_results=3)
print(results)

三、RAG系統搭建全流程

3.1 數據預處理與向量化

  1. 文檔加載與分割

    • 使用工具如 UnstructuredPyPDF2 解析PDF/HTML。
    • 分割策略:按固定長度(如512 tokens)或語義邊界(如段落)。
    from unstructured.partition.auto import partition
    chunks = partition(filename="data.pdf", chunk_size=512)
    
  2. 嵌入模型生成向量

    • 推薦模型:all-MiniLM-L6-v2(輕量)、text-embedding-v3(高性能)。
    from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('all-MiniLM-L6-v2')
    embeddings = model.encode([chunk.text for chunk in chunks])
    

3.2 向量數據庫部署

  • 本地模式(Chroma)

    pip install chromadb
    
    import chromadb
    client = chromadb.PersistentClient(path="./chroma_db")
    
  • 云端模式(Milvus)

    from pymilvus import connections, Collection
    connections.connect(host='localhost', port='19530')
    collection = Collection(name="docs", schema=...)
    

3.3 檢索與生成集成

  1. 檢索引擎配置

    • 結合BM25(關鍵詞匹配)與向量相似度(混合檢索)。
    from langchain.retrievers import MilvusRetriever
    retriever = MilvusRetriever(collection_name="docs")
    
  2. 生成模型調用

    • 使用LLM(如Llama、GPT)生成答案。
    from langchain.llms import Llama2
    llm = Llama2(model_path="models/llama-2-7b")
    rag_chain = {"context": retriever, "question": lambda x: x} | llm.generate
    

四、實踐案例:基于DeepSeek的RAG系統

4.1 系統架構

  • 數據預處理:上傳PDF文檔 → 分割為Chunk → 生成向量。
  • 向量數據庫:使用Milvus存儲向量。
  • 檢索與生成:通過DeepSeek模型生成答案。

4.2 搭建步驟

  1. 環境準備

    # 安裝Ollama與DeepSeek
    curl -fsSL https://ollama.com/install.sh | sh
    ollama run deepseek-r1:1.5b
    
  2. 代碼實現

    # 使用Streamlit構建前端
    import streamlit as st
    from chatpdf_rag_deepseek import RAGrag = RAG(llm_model="deepseek-r1:1.5b", embedding_model="mxbai-embed-large")
    st.title("RAG問答系統")
    uploaded_file = st.file_uploader("上傳文檔", type="pdf")
    query = st.text_input("輸入問題")
    if st.button("提交"):answer = rag.query(query, uploaded_file)st.write("答案:", answer)
    

五、優化策略與最佳實踐

5.1 性能優化

  • 混合檢索:結合BM25與向量相似度,提升召回率。
  • 索引優化:使用HNSW或IVF-PQ加速大規模數據檢索。
  • 緩存機制:對高頻查詢結果進行緩存,降低延遲。

5.2 錯誤排查與調試

  • 日志分析:啟用Chroma的調試日志(CHROMA_LOG_LEVEL=DEBUG)。
  • 常見問題
    • 檢索不準確:檢查嵌入模型是否與訓練數據分布一致。
    • 連接失敗:確保向量數據庫服務已啟動,防火墻開放對應端口。

5.3 擴展應用場景

  • 多模態支持:結合圖像、音頻的向量化處理。
  • 安全增強:為向量數據庫添加訪問控制與加密傳輸。

六、總結與未來展望

RAG技術通過引入外部知識庫和高效檢索機制,顯著提升了大模型的輸出質量與適用性。嵌入模型與向量數據庫的選型與搭建是RAG系統的核心環節。通過本文的指南,開發者可以快速構建從數據預處理到生成的全流程系統,并在問答、推薦、智能客服等場景中實現落地。

進階方向

  1. 動態更新機制:設計自動化管道,確保知識庫實時同步。
  2. 多語言支持:探索跨語言嵌入模型(如text-embedding-v3)。
  3. 邊緣計算:將輕量級RAG系統部署到移動設備或IoT終端。

參考資源

  • 通義千問模型庫:https://tongyi.aliyun.com/models
  • LangChain官方文檔:https://docs.langchain.com/
  • Chroma官方文檔:https://docs.trychroma.com/

通過以上步驟與實踐,技術團隊可高效實現RAG系統的開發與優化,為各類知識驅動型應用奠定堅實基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83410.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【資源分享】手機玩轉經典游戲!小雞模擬器1.9.0:PSP/NDS/GBA完美運行!

阿燦今天給大家推薦一款小雞模擬器,這是一個老款PC和掌上游戲機模擬器。完美模擬街機(fbamamemameplus).PS、PSP、FC(NES)SFC(SNES)、GBA、GBC、MD、NDS、DC、NGP、WS (WSC) PCE、ONS 等18款經典掌機游戲機。小雞模擬器同時也提供海量熱門的漢化版游戲免…

matlab脈沖信號并繪制波形2025.6.11

以下是一個使用MATLAB生成5V、10MHz脈沖信號并繪制波形的示例代碼: % 5V 10MHz脈沖信號仿真 clc; clear; close all; % 參數設置 voltage = 5; % 信號幅度(V) frequency = 10e6; % 脈沖頻率(10MHz) duty_cycle =

ElasticJob初探

依賴版本 JDK版本是&#xff1a;jdk17 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>zookeeper elasticjo…

【Vue3】(三)vue3中的pinia狀態管理、組件通信方式及總結、插槽

目錄 一、vue3的pinia 1、什么是pinia&#xff1f; 2、為什么Vue3選擇pinia&#xff1f; 3、使用pinia的好處 4、安裝pinia 2、項目配置 3、存儲/讀取pinia中的數據 4、修改pinia中的數據 5、storeToRefs&#xff08;保持store中數據的響應式&#xff09; 6、getters 7、…

WEB3全棧開發——面試專業技能點P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循環 Node.js 的事件循環&#xff08;Event Loop&#xff09;是其異步編程的核心機制&#xff0c;它使得 Node.js 可以在單線程中實現非阻塞 I/O 操作。 &#x1f501; 簡要原理 Node.js 是基于 libuv 實現的&#xff0c;它使用事件循環來處理非阻塞操作。事件…

大數據學習棧記——Neo4j的安裝與使用

本文介紹圖數據庫Neofj的安裝與使用&#xff0c;操作系統&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安裝 Neofj可以進行官網安裝&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我這里安裝是添加軟件源的方法 最新版…

web架構4------(nginx常用變量,nginx中英文自動匹配,lnmp網站架構,正向代理,反向代理,負載均衡)

一.前言 本期來介紹nginx最后幾個知識點&#xff0c;看著要說的內容很多&#xff0c;其實一點也不多&#xff0c;都是所見即所得的東西。 二.nginx常用變量 2.1 常用變量 $args 請求中的參數&#xff0c;也叫查詢參數&#xff0c;如www.123.com/1.php?a1&b2的$args就是…

openeuler系統(CentOs)圖形化桌面黑屏/丟失(開啟VNC服務沖突)

1. VNC服務開啟如下&#xff1a; https://zhuanlan.zhihu.com/p/5049263261 在centos8系統上使用tigervnc-server搭建VNC_centos8 tigervnc-server-CSDN博客 2. 上述操作完成后&#xff0c;連接VNC仍會出現黑屏&#xff0c;則需要編輯/root/.vnc/xstartup&#xff1a; [運維…

MySQL:Prepared Statement 預處理語句

預處理語句&#xff08;Prepared Statements&#xff09;是 MySQL 中一種用于執行 SQL 查詢的高效、安全的方法。通過使用預處理語句&#xff0c;可以顯著提升查詢性能&#xff0c;并防止 SQL 注入攻擊。本文將詳細介紹 MySQL 預處理語句的概念、使用方法及其優勢。 一、預處理…

EPPLUS——CAD c#讀寫EXCEL的第三方庫

EPPLUS(可支持NET35) 在 CAD 的 C# 二次開發中&#xff0c;使用 EPPLUS 庫處理 Excel 文件具有以下顯著優點&#xff0c;尤其在兼容性、便捷性和性能等方面契合 CAD 項目的需求&#xff1a; 1. 跨.NET 版本兼容性強&#xff0c;適配 CAD 多環境部署 多框架支持&#xff1a;EP…

Linux知識回顧總結----進程狀態

本章將會介紹進程的一些概念&#xff1a;馮諾伊曼體系結構、進程是什么&#xff0c;怎么用、怎么表現得、進程空間地址、物理地址、虛擬地址、為什么存在進程空間地址、如何感性得去理解進程空間地址、環境變量是如何使用的。 目錄 1. 馮諾伊曼體系結構 1.1 是什么 1.2 結論 …

微信小程序之bind和catch

這兩個呢&#xff0c;都是綁定事件用的&#xff0c;具體使用有些小區別。 官方文檔&#xff1a; 事件冒泡處理不同 bind&#xff1a;綁定的事件會向上冒泡&#xff0c;即觸發當前組件的事件后&#xff0c;還會繼續觸發父組件的相同事件。例如&#xff0c;有一個子視圖綁定了b…

Android Test3 獲取的ANDROID_ID值不同

Android Test3 獲取的ANDROID_ID值不同 這篇文章來說明上一篇文章中說到的一個現象&#xff1a;在同一個項目中&#xff0c;創建不同的 app module&#xff0c;運行同一段測試代碼&#xff0c;獲取到的 ANDROID_ID 的值不同。 我也是第一次認真研究這個現象&#xff0c;這個還…

JSON 和 LabVIEW Data Types 互相轉換

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本對應關系怎么看?

docker和docker-compose的版本對應關系怎么看&#xff1f;最近在安裝這兩個工具&#xff0c;像知道他們的版本對應關系&#xff0c;查了不少資料才找到。 雖然 Docker 和 Docker Compose 的版本并不嚴格綁定&#xff0c;但是在某些情況下&#xff0c;新版本的 Docker Compose …

郵科ODM攝像頭:多維度護航高鐵安全系統方案解析

?高鐵作為現代交通的重要支柱&#xff0c;其安全穩定運行依賴于高效的監控體系。攝像頭系統作為高鐵安全管理的“視覺感知中樞”&#xff0c;憑借多場景覆蓋、智能分析以及環境適應性設計&#xff0c;在行車安全、設備維護、乘客服務等方面發揮著不可或缺的作用。本文將從技術…

盒模型小全

CSS盒子模型詳解 1. 定義 CSS盒子模型是用于描述HTML元素在頁面中布局和表現的核心概念之一。在CSS中&#xff0c;所有HTML元素都被視為一個矩形的盒子&#xff0c;這些盒子封裝了周圍的HTML元素&#xff0c;并允許在其他元素和周圍元素邊框之間的空間放置內容。 2. 組成部分…

自定義鼠標效果 - 瀏覽器擴展使用教程

自定義鼠標效果 - 瀏覽器擴展使用教程 這里寫目錄標題 自定義鼠標效果 - 瀏覽器擴展使用教程功能特點安裝方法Chrome/Edge瀏覽器 使用指南1. 更改鼠標光標樣式2. 啟用鼠標軌跡效果3. 自定義軌跡效果點狀/彩虹/漸隱軌跡&#xff1a;表情軌跡&#xff1a; 管理自定義光標支持的文…

基于SpringBoot實現的課程答疑系統設計與實現【源碼+文檔】

基于SpringBootVue實現的課程答疑系統采用前后端分離架構方式&#xff0c;系統設計了管理員、學生、老師三種角色&#xff0c;系統實現了用戶登錄與注冊、個人中心、學生管理、老師管理、科目類型管理、學生問題管理、老師回答管理、老師信息管理、關注列表管理、交流區、輪播圖…

御微半導體面試總結

前一陣子在公司干的難受&#xff0c;所以再合肥這邊面試了幾家公司&#xff0c;挑一個御微半導體來說一下吧&#xff0c;公司主要是做半導體晶元測量的&#xff0c;具體啥我也不太明白。 公司產品線多&#xff0c;每條產品線配有獨立的軟件、結構、光學控制等人員開發語言和框…