成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

綜述:從零構建RAG系統全面指南(含代碼)

人工智能
本文詳細介紹了RAG的概念、發展歷程、重要性,以及使用Python和開源庫從零構建RAG系統的全過程,包括文檔加載、文本分塊、向量存儲和響應生成等核心組件的實現。

盡管大語言模型具備出色的推理能力和廣泛的通用知識,但它們在檢索精確信息、獲取最新數據或提供可驗證的回答時常常遇到困難。檢索增強生成(Retrieval-Augmented Generation,RAG)應運而生,這一創新性方法通過將大語言模型與外部知識源相結合,有效提升了其性能。本文將深入探討RAG的概念、重要性,并使用Python和流行的開源庫從零開始構建一個完整的RAG系統。

一、RAG是什么

RAG是一種將信息檢索與文本生成相結合的架構。其核心原理是在生成回答之前,從外部知識庫中檢索相關信息,以此增強語言模型的能力。這一過程主要包含以下幾個關鍵步驟:

  1. 檢索當系統接收到一個查詢時,檢索系統會在知識庫中搜索最相關的文檔或文本塊。例如,當用戶詢問“蘋果公司最新的產品有哪些”,檢索系統會在包含蘋果公司產品信息的知識庫中進行查找。
  2. 增強檢索到的信息會被注入到發送給語言模型的提示中。這些額外的信息為語言模型提供了更豐富的上下文,幫助它生成更準確的回答。
  3. 生成語言模型結合其預訓練的知識和檢索到的特定信息,生成最終的回答。在上述例子中,語言模型會參考檢索到的蘋果公司產品信息,給出如“蘋果公司最新的產品包括iPhone 15系列手機、Apple Watch Series 9等”這樣的回復。

RAG的出現有效解決了傳統大語言模型存在的多個關鍵問題:

  1. 知識局限標準的大語言模型知識受限于訓練數據,而RAG允許模型訪問更新或更專業的信息。以醫學領域為例,大語言模型可能在訓練時使用的是幾年前的醫學研究成果,而RAG可以通過連接最新的醫學數據庫,為用戶提供最新的醫學研究進展和治療方案。
  2. 幻覺問題大語言模型有時會生成看似合理但實際錯誤的信息。RAG通過將回答基于可驗證的來源,大大減少了這種“幻覺”情況的發生。例如,在回答歷史事件相關問題時,RAG會依據歷史文獻等可靠來源,避免編造不存在的事件細節。
  3. 透明度RAG系統中的模型能夠引用其信息來源,這使得驗證回答變得更加容易。在學術研究場景中,這一特性尤為重要,研究人員可以根據模型提供的來源進一步查閱資料,確保信息的準確性。
  4. 適應性RAG系統可以通過更新知識庫來適應新信息,而無需重新訓練整個模型。這意味著在面對快速變化的信息,如金融市場數據、科技新聞時,RAG系統能夠及時提供最新的信息。

二、RAG的發展歷程

RAG的概念在2020年由Facebook AI Research(現Meta AI)的研究人員在一篇題為“Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”的論文中正式提出。該論文建議將稀疏和密集檢索器與序列到序列模型相結合,用于處理知識密集型任務。

然而,RAG背后的理念在多個領域有著深厚的根源:

  1. 問答系統早期的問答系統在嘗試回答問題之前,就已經使用文檔檢索來查找相關信息。這些早期系統為RAG的發展奠定了基礎,啟發了將信息檢索與答案生成相結合的思路。
  2. 信息檢索搜索引擎領域數十年的研究為高效的文檔檢索提供了堅實的基礎。從簡單的關鍵詞匹配到復雜的語義理解,信息檢索技術的不斷進步為RAG中的檢索環節提供了有力支持。
  3. 神經信息檢索神經網絡在信息檢索領域的應用,使得檢索能夠更加關注語義層面的意義。通過將文本轉化為向量表示,神經網絡可以更好地理解文本之間的語義關聯,提高檢索的準確性。
  4. 自然語言處理中的遷移學習像BERT這樣的預訓練語言模型的出現,使得文檔表示和檢索變得更加有效。預訓練語言模型可以學習到豐富的語言特征和語義信息,為RAG系統中的文本處理提供了強大的工具。

隨著GPT-3、GPT-4、Claude以及LLaMA等開源替代模型的興起,RAG的受歡迎程度迅速飆升。企業很快意識到,盡管這些模型功能強大,但為了在商業應用中可靠使用,它們需要與可信的信息來源相結合。如今,RAG已成為應用大語言模型開發的基石,LangChain、LlamaIndex等框架為簡化RAG的實現提供了豐富的工具。

三、RAG為何重要

RAG在人工智能領域具有諸多顯著優勢:

  1. 獲取最新信息RAG系統能夠訪問最新的信息,克服了大語言模型知識截止的局限性。在新聞資訊、科技動態等領域,用戶可以通過RAG系統獲取到最新的事件報道和技術進展。
  2. 領域專業化通過提供特定領域的知識庫,RAG可以使通用的大語言模型表現得像專業模型一樣。在法律領域,結合法律條文和案例的知識庫,RAG系統可以為用戶提供專業的法律咨詢;在金融領域,連接金融數據和市場分析的知識庫,RAG系統可以為投資者提供精準的投資建議。
  3. 減少幻覺RAG將回答建立在檢索到的文檔基礎上,顯著降低了大語言模型生成錯誤信息的可能性。這一特性在醫療健康領域尤為關鍵,確保為患者提供的醫療建議準確可靠,避免因錯誤信息導致的醫療風險。
  4. 降低成本與微調或重新訓練大型模型相比,RAG只需更改知識庫就能適應新的領域,大大降低了成本。對于資源有限的小型企業或研究團隊來說,這一優勢使得他們能夠以較低的成本開發出高效的智能應用。
  5. 可驗證性RAG系統能夠引用信息來源,使其輸出更加透明和可驗證。在學術研究、商業報告等場景中,這一特性增加了信息的可信度,方便用戶進一步查閱和核實信息。
  6. 隱私和安全敏感信息可以保留在受控的知識庫中,而無需包含在模型的訓練數據中。這在處理個人醫療記錄、企業商業機密等敏感信息時,有效保護了數據的隱私和安全。

四、構建RAG系統:核心組件

一個典型的RAG系統由多個關鍵組件構成:

  1. 文檔加載器負責從各種來源(如PDF文件、網頁、數據庫等)導入文檔。在處理PDF文件時,它能夠提取其中的文本內容,為后續的處理做準備。
  2. 文本分塊器將文檔分割成便于索引和檢索的小塊。合理的分塊策略對于系統性能至關重要,分塊過大可能包含過多無關信息,分塊過小則可能丟失重要上下文。
  3. 嵌入模型將文本塊轉換為數值向量,這些向量能夠捕捉文本的語義含義。通過向量表示,文本之間的語義相似度可以通過計算向量之間的距離來衡量。
  4. 向量存儲對向量進行索引和存儲,以便高效地檢索。常見的向量存儲工具如FAISS,提供了快速的相似性搜索功能。
  5. 檢索器根據給定的查詢,在向量存儲中找到最相關的文檔。檢索器的性能直接影響系統返回結果的質量。
  6. 語言模型根據查詢和檢索到的信息生成回答。語言模型的選擇和配置會影響回答的質量和風格。
  7. 提示模板指導語言模型如何使用檢索到的信息。精心設計的提示模板可以引導語言模型生成更符合用戶需求的回答。

五、實現:逐步構建RAG系統

(一)設置環境

構建RAG系統需要使用多個Python庫,包括langchain、langchain-core、langchain-community、langchain-experimental、pymupdf、langchain-text-splitters、faiss-cpu、langchain-ollama、langchain-openai等。這些庫各自承擔著不同的功能:

  1. LangChain提供了構建大語言模型應用的整體框架和組件,簡化了開發流程。
  2. PyMuPDF能夠從PDF文檔中提取文本,支持多種PDF特性的處理。
  3. FAISS為向量數據庫提供高效的相似性搜索能力。
  4. Ollama和OpenAI集成允許使用不同的語言模型,為用戶提供了更多選擇。

可以使用pip命令安裝這些庫:

pip install langchain langchain-core langchain-community langchain-experimental pymupdf langchain-text-splitters faiss-cpu langchain-ollama langchain-openai

(二)組件1:PDF加載器

from langchain_community.document_loaders import PyMuPDFLoader


class PdfLoader:
    def __init__(self):
        pass

    def read_file(self, file_path):
        loader = PyMuPDFLoader(file_path)
        docs = loader.load()
        return docs

上述代碼定義了一個PdfLoader類,其read_file方法使用PyMuPDFLoader從指定的PDF文件路徑中加載文檔。PyMuPDFLoader基于PyMuPDF庫(也稱為fitz),能夠高效地處理各種PDF特性,包括文本、表格,甚至通過OCR處理一些圖像。load()方法返回一個Document對象列表,每個對象代表PDF文件中的一頁,包含提取的文本內容(page_content)和元數據(metadata),如源文件路徑和頁碼。在實際應用中,可擴展該類以處理其他文檔類型。

(三)組件2:文本分塊

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document


class Chunker:
    def __init__(self, chunk_size=1000, chunk_overlap=100):
        self.text_splitter = RecursiveCharacterTextSplitter(
            separators=["\n\n", "\n", " ", ".", ",", "\u200b", "\uff0c", "\u3001", "\uff0e", "\u3002", ""],
            chunk_size=chunk_size,
            chunk_overlap=chunk_overlap,
            length_functinotallow=len,
            is_separator_regex=False
        )

    def chunk_docs(self, docs):
        list_of_docs = []
        for doc in docs:
            tmp = self.text_splitter.split_text(doc.page_content)
            for chunk in tmp:
                list_of_docs.append(
                    Document(
                        page_cnotallow=chunk,
                        metadata=doc.metadata
                    )
                )
        return list_of_docs

Chunker類負責將加載的文檔分割成較小的文本塊。在初始化時,通過設置chunk_size(默認1000個字符)和chunk_overlap(默認100個字符)來控制分塊的大小和重疊程度。RecursiveCharacterTextSplitter使用一系列分隔符(包括段落分隔符、換行符、空格、標點符號等)來分割文本,優先在自然邊界處分割。chunk_docs方法對輸入的文檔列表進行處理,為每個文本塊創建新的Document對象,并保留原始文檔的元數據。

(四)組件3:向量存儲

import faiss
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings
from uuid import uuid4


class VectorStore:
    def __init__(self):
        self.embeddings = OllamaEmbeddings(model="llama3.2:3b")
        self.index = faiss.IndexFlatL2(len(self.embeddings.embed_query("hello world")))
        self.vector_store = FAISS(
            embedding_functinotallow=self.embeddings,
            index=self.index,
            docstore=InMemoryDocstore(),
            index_to_docstore_id={}
        )

    def add_docs(self, list_of_docs):
        uuids = [str(uuid4()) for _ in range(len(list_of_docs))]
        self.vector_store.add_documents(documents=list_of_docs, ids=uuids)

    def search_docs(self, query, k=5):
        results = self.vector_store.similarity_search(
            query,
            k=k
        )
        return results

VectorStore類是檢索系統的核心。在初始化時,創建一個OllamaEmbeddings嵌入模型(這里使用llama3.2:3b模型),并基于FAISS創建一個用于L2距離計算的索引,同時初始化一個包含嵌入函數、索引和文檔存儲的向量存儲。add_docs方法為每個文檔生成唯一ID,并將文檔添加到向量存儲中,向量存儲會計算文檔內容的嵌入并進行索引。search_docs方法將輸入的查詢轉換為嵌入,在向量存儲中執行相似性搜索,并返回最相似的k個文檔。在實際生產中,可考慮使用持久化向量存儲、添加元數據過濾功能或實現混合搜索。

(五)組件4:RAG系統

from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain_ollama import OllamaLLM
from pdf_loader import PdfLoader
from vector_store import VectorStore
from chunk_text import Chunker


class RAG:
    def __init__(self):
        self.instructor_prompt = """Instruction: You're an expert problem solver you answer questions from context given below. You strictly adhere to the context and never move away from it. You're honest and if you do not find the answer to the question in the context you politely say "I Don't know!"
        So help me answer the user question mentioned below with the help of the context provided
        User Question: {user_query}
        Answer Context: {answer_context}
        """
        self.prompt = PromptTemplate.from_template(self.instructor_prompt)
        self.llm = OllamaLLM(model="llama3.2:3b")  # OpenAI()
        self.vectorStore = VectorStore()
        self.pdfloader = PdfLoader()
        self.chunker = Chunker()

    def run(self, filePath, query):
        docs = self.pdfloader.read_file(filePath)
        list_of_docs = self.chunker.chunk_docs(docs)
        self.vectorStore.add_docs(list_of_docs)
        results = self.vectorStore.search_docs(query)
        answer_context = "\n\n"
        for res in results:
            answer_context = answer_context + "\n\n" + res.page_content
        chain = self.prompt | self.llm
        response = chain.invoke(
            {
                "user_query": query,
                "answer_context": answer_context
            }
        )
        return response


if __name__ == "__main__":
    rag = RAG()
    filePath = "investment.pdf"
    query = "How to invest?"
    response = rag.run(filePath, query)
    print(response)

RAG類將前面構建的各個組件整合在一起,形成一個完整的RAG系統。在初始化時,定義一個指導語言模型的提示模板,創建PromptTemplate對象,并初始化語言模型、向量存儲、PDF加載器和文本分塊器。run方法實現了完整的RAG工作流程:加載PDF文檔,分塊處理,添加到向量存儲,根據用戶查詢搜索相關文本塊,組合檢索到的文本塊形成上下文,將提示模板與語言模型結合生成回答。在主程序中,創建RAG實例,指定PDF文件路徑和查詢,運行系統并打印結果。

六、高級考慮與改進

盡管上述實現為RAG系統奠定了堅實的基礎,但在實際生產應用中,還有許多方面可以進一步優化和改進:

  1. 文檔處理增強支持多種文檔格式,如Word文檔、網頁、數據庫等;提取文檔的元數據,如創建日期、作者、標題等;集成OCR技術,處理掃描文檔或圖像;實現表格數據的專門提取和處理。
  2. 分塊策略優化采用語義分塊,基于文本的語義含義進行分割,而非單純依據字符數量;實施層次分塊,維護文檔結構,建立塊之間的父子關系;在分塊元數據中包含章節標題或文檔結構信息,提升檢索和理解效果。
  3. 嵌入和檢索改進增加重排序步驟,對初始檢索結果進行優化;結合向量相似性和基于關鍵詞(如BM25)的混合搜索,提高檢索的準確性;自動擴展查詢,提升檢索性能;使用交叉編碼器重排序,雖然計算成本較高,但能獲得更精確的結果。
  4. 大語言模型集成優化實現流式響應,提升用戶體驗,特別是在處理長回答時;修改提示,引導模型進行逐步推理;讓模型對自己的回答進行評估和優化;將復雜查詢分解為子問題,提高處理復雜任務的能力。
  5. 評估和監測評估檢索到的文檔與查詢的相關性;在有標準答案的情況下,對比生成的答案與標準答案,評估回答的準確性;檢測模型是否產生幻覺信息;建立用戶反饋循環,根據用戶反饋不斷改進系統性能。

七、生產環境中的RAG擴展

(一)安全和合規

在生產環境中,RAG系統處理的數據可能包含敏感信息,如企業的商業機密、客戶的個人數據等。因此,實施嚴格的安全和合規措施至關重要。

  1. 訪問控制對敏感文檔設置多層次的訪問權限,確保只有經過授權的人員或服務才能訪問特定的知識庫內容。可以基于用戶角色、部門、數據敏感度等因素進行權限劃分,例如,財務部門的用戶只能訪問與財務相關的文檔,且不同職級的人員訪問權限也有所區別。
  2. 日志記錄詳細記錄系統操作日志,包括文檔的訪問記錄、查詢內容、模型的響應等。這些日志不僅有助于追蹤系統的使用情況,還能為安全審計提供依據。通過分析日志,可以及時發現潛在的安全風險,如異常的查詢行為或未經授權的訪問嘗試。
  3. 數據合規處理確保對個人可識別信息(PII)的處理符合相關法規,如GDPR、CCPA等。在數據收集、存儲、使用和共享過程中,遵循嚴格的數據保護原則,對PII進行加密存儲和傳輸,避免數據泄露帶來的法律風險。

(二)性能優化

為了滿足生產環境中大量用戶和復雜查詢的需求,需要對RAG系統進行全面的性能優化。

  1. 預計算嵌入對于大規模的文檔集合,在系統初始化或文檔更新時預先計算文本塊的嵌入向量。這樣在查詢時,無需實時計算嵌入,大大減少了響應時間。可以定期重新計算嵌入,以適應文檔內容的變化或采用更先進的嵌入模型。
  2. 緩存機制在多個層面實現緩存,包括查詢緩存、嵌入緩存和響應緩存。查詢緩存可以存儲常見查詢及其對應的檢索結果,當相同查詢再次出現時,直接返回緩存的結果;嵌入緩存用于保存已經計算過的文本塊嵌入向量,避免重復計算;響應緩存則存儲模型生成的回答,提高相同問題的響應速度。
  3. 量化技術采用量化技術將高維的嵌入向量轉換為低精度的表示,在不顯著損失語義信息的前提下,減小向量的存儲空間和計算量。例如,將32位浮點數的向量轉換為16位或8位的表示形式,加快相似性搜索的速度,同時降低內存和計算資源的消耗。

(三)基礎設施

合理的基礎設施架構是保障RAG系統在生產環境中穩定運行和可擴展的關鍵。

  1. 容器化部署使用容器技術(如Docker)將RAG系統的各個組件(文檔加載器、文本分塊器、向量存儲、語言模型等)封裝成獨立的容器。容器化部署使得組件的部署、管理和更新更加便捷,同時隔離了不同組件的運行環境,提高了系統的穩定性和安全性。
  2. 微服務架構將RAG系統拆分為多個微服務,每個微服務負責特定的功能,如文檔處理服務、檢索服務、語言模型服務等。微服務架構提高了系統的可擴展性,可以根據業務需求獨立擴展各個服務的資源,同時降低了系統的耦合度,便于維護和升級。
  3. 隊列系統引入隊列系統(如Kafka、RabbitMQ)來處理大量文檔的異步任務,如文檔加載、嵌入計算等。當有大量文檔需要處理時,將任務放入隊列中,由后臺的工作進程依次處理,避免因任務堆積導致系統性能下降,確保系統在高負載情況下仍能穩定運行。

(四)持久性

確保RAG系統中的數據和模型狀態能夠持久保存,以便在系統重啟或故障恢復時能夠快速恢復運行。

  1. 持久化存儲選擇可靠的持久化數據庫(如Pinecone、Weaviate、Chroma等向量數據庫,以及關系型數據庫或NoSQL數據庫用于存儲文檔元數據)來存儲嵌入向量和文檔信息。這些數據庫提供了數據的持久化存儲、高效的索引和查詢功能,保證數據的安全性和可訪問性。
  2. 增量更新實現增量更新機制,當有新文檔添加或現有文檔更新時,只對變化的部分進行處理,而不是重新處理整個文檔集合。例如,在向量存儲中,只更新新增或修改文檔的嵌入向量,減少數據處理的開銷,提高系統的更新效率。

檢索增強生成(RAG)作為大語言模型發展中的重要突破,通過結合外部知識源,顯著提升了語言模型的實用性、可靠性和可信度。本文詳細介紹了RAG的概念、發展歷程、重要性,以及使用Python和開源庫從零構建RAG系統的全過程,包括文檔加載、文本分塊、向量存儲和響應生成等核心組件的實現。

同時,針對生產環境的需求,探討了一系列高級改進策略和擴展要點,涵蓋文檔處理優化、分塊策略改進、嵌入檢索增強、大語言模型集成優化、系統評估監測以及生產環境部署等多個方面。通過這些措施,可以不斷完善RAG系統,使其更好地適應各種實際應用場景。

責任編輯:武曉燕 來源: 大模型之路
相關推薦

2024-05-29 12:50:49

2025-02-06 13:50:06

2025-06-27 06:30:08

2025-05-19 08:26:37

RAG架構項目

2024-12-06 08:20:26

2025-06-03 02:55:00

2024-06-19 16:11:22

2024-09-10 08:26:40

2017-08-16 11:00:38

TCPIP協議

2025-05-14 01:40:00

RAG數據工具

2025-06-04 08:21:28

2016-01-07 13:23:35

構建實時推薦系統

2024-11-25 09:10:03

2024-03-01 19:53:37

PyBuilderPython開發

2024-01-11 16:24:12

人工智能RAG

2014-12-03 10:37:30

2024-05-17 17:29:00

CurdlingPython開發

2024-11-29 18:37:07

2024-01-09 12:53:40

數據模型

2025-01-26 16:57:02

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品av | 日韩有码在线观看 | av毛片在线播放 | 日韩精品一区二区三区视频播放 | 亚洲精品视频免费 | 久久的色 | 伊人久久国产 | 国产成人精品一区二区三区网站观看 | 18gay男同69亚洲网站 | 成人影院免费视频 | 国产线视频精品免费观看视频 | 18gay男同69亚洲网站 | 丁香久久| 亚洲成年在线 | 日韩波多野结衣 | 三级黄色片在线播放 | 精品亚洲永久免费精品 | 国产ts一区| 成人福利网站 | 一本色道久久综合亚洲精品高清 | 成人精品一区二区户外勾搭野战 | 色视频网站在线观看 | 一级看片免费视频 | 国产美女一区二区 | 国产精品久久久久久久久免费 | 久久国产精品一区二区 | 韩日精品视频 | 色婷婷av一区二区三区软件 | 国内久久精品 | 不卡一区 | 国产日韩欧美一区二区 | 日韩精品免费在线观看 | 日韩欧美国产一区二区三区 | 欧美a区| 久久久爽爽爽美女图片 | 伊伊综合网| 2022国产精品 | 中文字幕亚洲一区二区va在线 | 夜夜爽99久久国产综合精品女不卡 | 99精品视频网| 国产中的精品av涩差av |