1. 什么是 RAG?
????????在許多大模型(LLM)應用場景中,我們需要使用特定的用戶數據,而這些數據并未包含在模型的訓練集中。檢索增強生成(Retrieval Augmented Generation,RAG)是一種有效的解決方案,它通過從外部數據源檢索相關數據,并在生成回答時將其傳遞給 LLM,以提高回答的準確性和相關性。
????????LangChain 提供了一整套用于構建 RAG 應用的模塊,包括:
-
文檔加載(Document loaders):從 HTML、PDF、代碼等多種格式的數據源加載文檔。
-
文檔轉換(Document transformers):將大文檔拆分為更小的、相關的片段,以提升檢索效果。
-
文本嵌入模型(Text embedding models):將文本轉換為向量,以便進行相似度搜索。
-
向量存儲(Vector stores):用于存儲和檢索嵌入向量的數據庫。
-
檢索器(Retrievers):從存儲的數據中獲取最相關的信息。
2. 文檔加載(Document Loaders)
????????LangChain 提供了多種文檔加載工具,例如 CSVLoader、PyPDFLoader 和 OnlinePDFLoader。
from langchain.document_loaders import PyPDFLoaderloader = PyPDFLoader("./docs/pdf/MachineLearning-Lecture01.pdf")
pages = loader.load_and_split()
print(len(pages))
3. 文檔轉換(Document Transformers)
????????在檢索過程中,將長文檔拆分為較小的塊有助于提高查詢效率。
from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=100
)
docs = text_splitter.split_documents(pages)
print(len(docs))
4. 文本嵌入(Text Embedding Models)
????????文本嵌入用于將文本轉換為向量,以便進行相似度計算。
from langchain.embeddings import HuggingFaceInstructEmbeddings
import torchembedding_model = HuggingFaceInstructEmbeddings(model_name='hkunlp/instructor-base',model_kwargs={'device': torch.device('cuda' if torch.cuda.is_available() else 'cpu')}
)
5. 向量存儲(Vector Stores)
????????我們可以使用 FAISS 進行向量存儲和檢索。
from langchain.vectorstores import FAISSvectordb = FAISS.from_documents(docs, embedding_model)
vectordb.save_local("./vectordb_path/ml-andrew-ng")
6. 檢索器(Retrievers)
????????檢索器用于從存儲的數據中提取最相關的片段。
retriever = vectordb.as_retriever(search_type="similarity")
query = "What is Linear Regression"
docs = retriever.get_relevant_documents(query)
print(docs)
7. 多查詢檢索(MultiQueryRetriever)
????????LangChain 允許自動生成多個查詢,以便獲取更全面的檢索結果。
from langchain.chat_models import ChatOpenAI
from langchain.retrievers.multi_query import MultiQueryRetrieverllm = ChatOpenAI(temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectordb.as_retriever(), llm=llm
)
query = "What is the difference between Linear Regression and Logistic Regression?"
docs = retriever_from_llm.get_relevant_documents(query)
print(len(docs))
8. 向量存儲緩存(Caching)
????????緩存嵌入結果可以減少重復計算,提高檢索效率。
from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import LocalFileStorefs = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(embedding_model, fs, namespace=embedding_model.model_name
)
9. 結論
????????在本篇博文中,我們介紹了 RAG 在自然語言處理中的應用,涵蓋了文檔加載、文本嵌入、向量存儲和檢索等核心組件。使用 LangChain,可以輕松構建一個高效的檢索增強生成系統,以提升 LLM 的回答質量。
📌 參考鏈接:
-
LangChain 文檔加載
-
LangChain 向量存儲
如果你覺得這篇博文對你有幫助,請點贊、收藏、關注我,并且可以打賞支持我!
歡迎關注我的后續博文,我將分享更多關于人工智能、自然語言處理和計算機視覺的精彩內容。
謝謝大家的支持!