LangChain 框架簡化了大語言模型(LLM)應用開發的流程,並能有效整合外部資料來源。本文將示範如何結合 LangChain 和 MongoDB Atlas 的向量搜尋功能,實作根據 PDF 檔案內容的語義搜尋和問答系統。首先,我們會逐步說明 LangChain 的安裝設定、如何從公開 PDF 檔案抓取和分割資料,並將其上傳至 MongoDB Atlas。接著,會詳細介紹如何建立向量搜尋索引,並使用 LangChain 進行語義搜尋。最後,將示範如何根據此功能建構一個檢索增強生成(RAG)解決方案,讓 LLM 能夠參考搜尋結果,更精準地回答使用者提問。過程中會提供完整的程式碼範例與流程圖解,幫助讀者理解並快速上手實作。

AI/ML 框架

AI/ML 框架是開發和佈署機器學習模型的重要工具,提供預建演算法、最佳化效能和可擴充套件解決方案。這些框架使開發者能夠專注於模型的精煉和應用,而不是陷入基礎實作的細節中。MongoDB 支援多個 AI/ML 框架,包括 LangChain、LlamaIndex、Haystack 等。

LangChain 框架

LangChain 是一個用於開發 AI 應用的框架,簡化了 LLM 應用的每個階段。它允許開發者建立連線外部資料來源和計算資源到 LLM 的應用。LangChain 提供了一種基本的 LLM鏈,可以根據提示範本生成回應,並允許開發者延伸這些鏈以進行高階處理。

使用 LangChain 進行語義搜尋

LangChain 可以用於在資料中進行語義搜尋和建立檢索增強生成(RAG)實作。要開始使用 LangChain,需要安裝必要的工具和函式庫,包括 langchainlangchain-mongodbpymongo 等。

LangChain 安裝和設定

  1. 安裝 LangChain 和相關函式庫:pip3 install --quiet --upgrade langchain==0.1.22 langchain-mongodb==0.1.8
  2. 匯入必要的套件:import getpass, os, pymongo, pprint
  3. 設定環境變數:儲存 OpenAI API 金鑰和 MongoDB Atlas 連線字串為環境變數。
  4. 連線到 MongoDB Atlas 叢集:使用 MongoClient 連線到 MongoDB Atlas 資料函式庫。
  5. 定義集合和索引名稱:指定資料函式庫名稱、集合名稱和向量搜尋索引名稱。

從公共 PDF 檔案中抓取和分割資料

使用 PyPDFLoader 可以輕松抓取公共 PDF 檔案並將其分割成小塊,以便於 LLM 消耗。這個過程可以使用 LangChain 的函式庫函式來實作,無需從頭開始建立。

# 載入 PDF 檔案
loader = PyPDFLoader("https://example.com/public.pdf")
data = loader.load()

這樣就可以使用 LangChain 和 MongoDB 來建立一個基本的語義搜尋應用,實作從公共 PDF 檔案中抓取和分割資料,並將其上傳到 MongoDB 資料函式庫中。

分割PDF檔案並建立向量搜尋

首先,我們需要將PDF檔案分割成小塊的檔案,以便進行向量搜尋。這可以透過使用RecursiveCharacterTextSplitter類別來實作,該類別可以根據指定的塊大小和重疊度將檔案分割成小塊。

text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
docs = text_splitter.split_documents(data)

接下來,我們需要建立一個向量搜尋引擎,以便對分割後的檔案進行搜尋。這可以透過使用MongoDBAtlasVectorSearch類別來實作,該類別可以根據指定的檔案和嵌入模型建立一個向量搜尋引擎。

vector_store = MongoDBAtlasVectorSearch.from_documents(
    documents=docs,
    embedding=OpenAIEmbeddings(disallowed_special=()),
    collection=atlas_collection,
    index_name=vector_search_index
)

在建立向量搜尋引擎之前,我們需要建立一個索引定義,以便指定向量搜尋引擎的欄位和相似度度量。以下是索引定義的範例:

{
    "fields": [
        {
            "type": "vector",
            "path": "embedding",
            "numDimensions": 1536,
            "similarity": "cosine"
        },
        {
            "type": "filter",
            "path": "page"
        }
    ]
}

這個索引定義指定了兩個欄位:embeddingpageembedding欄位是一個向量型別的欄位,用於儲存使用OpenAI的文字嵌入模型建立的嵌入。page欄位是一個過濾型別的欄位,用於根據PDF頁面的頁碼進行過濾。

進行語義搜尋

建立好向量搜尋引擎後,我們可以使用similarity_search_with_score方法進行語義搜尋。這個方法可以根據指定的查詢和傳回的檔案數量傳回相關的檔案。

query = "MongoDB Atlas security"
results = vector_store.similarity_search_with_score(
    query=query, k=3
)
pprint.pprint(results)

這個方法傳回了一個包含三個相關檔案的列表,每個檔案都有一個相似度分數。分數越高,表示檔案與查詢越相關。

圖表翻譯:

  graph LR
    A[查詢] --> B[向量搜尋引擎]
    B --> C[傳回相關檔案]
    C --> D[排序和過濾]
    D --> E[傳回結果]

這個圖表展示了語義搜尋的流程,從查詢到傳回相關檔案的過程。

瞭解語義搜尋與RAG解決方案

語義搜尋是一種強大的技術,能夠根據使用者查詢的意圖和相關性傳回最相關的檔案。MongoDB Atlas提供了一種高效的方式來執行語義搜尋,透過使用向量搜尋來計算檔案之間的相似度。

語義搜尋的優點

  • 能夠傳回最相關的檔案,提高查詢的準確性
  • 可以使用預過濾來縮小搜尋空間,提高效能
  • 支援使用LangChain等工具來構建強大的GenAI應用

LangChain的功能

LangChain是一個強大的工具,能夠幫助您構建GenAI應用。它提供了一種簡單的方式來設定MongoDB Atlas向量搜尋檢索器,傳回最相關的檔案,並使用LLM(大語言模型)回答問題。

實作基本RAG解決方案

以下是實作基本RAG解決方案的步驟:

  1. 設定MongoDB Atlas Vector Search檢索器:使用vector_store.as_retriever方法設定檢索器,指定搜尋型別為"similarity",並設定搜尋引數。
  2. 定義自定義RAG提示:使用PromptTemplate.from_template方法定義一個自定義提示,包含上下文和問題。
  3. 傳回最相關的檔案:使用檢索器傳回最相關的檔案,根據查詢的意圖和相關性。
  4. 使用LLM回答問題:使用LLM回答問題,根據傳回的檔案和自定義提示。

程式碼範例

# Instantiate Atlas Vector Search as a retriever
retriever = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 3}
)

# Define a prompt template
template = """
Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.

{context}

Question: {question}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
llm = ChatOpenAI()

使用 LangChain 建立問答系統

LangChain 是一個強大的框架,能夠幫助您建立問答系統。以下是使用 LangChain 建立問答系統的步驟:

步驟 1:安裝 LangChain

首先,您需要安裝 LangChain。您可以使用 pip 安裝 LangChain:

pip install langchain

步驟 2:建立 retriever

Retriever 是一個用於查詢相關檔案的介面。您可以使用 MongoDB Atlas Vector Search 作為 retriever。以下是建立 retriever 的示例程式碼:

from langchain import Retriever

retriever = Retriever.from_mongodb_atlas_vector_search(
    mongo_uri="mongodb://localhost:27017/",
    database="mydatabase",
    collection="mycollection"
)

步驟 3:建立 prompt template

Prompt template 是一個用於生成提示的範本。您可以使用 PromptTemplate.from_template 方法建立 prompt template。以下是建立 prompt template 的示例程式碼:

from langchain import PromptTemplate

template = """
You are a expert in MongoDB Atlas Security. 
You have been given a question about MongoDB Atlas Security. 
Please answer the question based on your knowledge.
"""

prompt_template = PromptTemplate.from_template(template)

步驟 4:建立 chain

Chain 是一個用於指定三個主要元件的介面:retriever、prompt template 和 LLM。以下是建立 chain 的示例程式碼:

from langchain import Chain

chain = (
    retriever
    | prompt_template
    | llm
)

步驟 5:處理使用者詢問

當使用者提出詢問時,您可以使用 chain 處理詢問。以下是處理使用者詢問的示例程式碼:

question = "How can I secure my MongoDB Atlas cluster?"

answer = chain.invoke(question)

print("Question:", question)
print("Answer:", answer)

步驟 6:傳回源檔案

最終,您可以傳回源檔案給使用者。以下是傳回源檔案的示例程式碼:

documents = retriever.get_relevant_documents(question)

print("Source documents:")
pprint.pprint(documents)

這就是使用 LangChain 建立問答系統的基本步驟。您可以根據您的需求自行定製 prompt template 和 chain。

LangChain 的優點

LangChain 有以下優點:

  • 簡單易用:LangChain 提供了一個簡單易用的 API,讓您可以輕鬆地建立問答系統。
  • 強大的功能:LangChain 支援多種 retriever 和 LLM,讓您可以根據您的需求選擇合適的工具。
  • 高可擴充套件性:LangChain 設計為高可擴充套件性,讓您可以輕鬆地處理大量的使用者詢問。

深入剖析 LangChain 與 MongoDB Atlas 的整合應用後,可以發現,其在構建根據大語言模型 (LLM) 的語義搜尋和問答系統方面展現了顯著的優勢。透過向量搜尋技術,LangChain 能夠有效地從 MongoDB Atlas 中檢索相關檔案,並結合自定義提示範本和 LLM,提供更精準、更具上下文理解的答案。分析其技術架構,可以看出 LangChain 簡化了與外部資料來源和 LLM 的互動流程,降低了開發門檻。然而,目前 LLM 的準確性和可靠性仍存在挑戰,需要持續最佳化模型和提示策略,並關注資料隱私和安全等議題。從技術演進角度來看,LangChain 代表了 LLM 應用開發的未來趨勢,值得深入研究和應用。對於希望提升資訊檢索效率和構建智慧問答系統的企業,結合 MongoDB Atlas 的向量搜尋功能和 LangChain 框架,將是極具價值的解決方案。玄貓認為,此技術組合在特定領域,例如企業知識函式庫搜尋、客戶服務自動化等,已展現出相當的實用價值,適合積極匯入。