使用LangChain實現基于LLM和RAG的PDF問答系統

目錄

  • 前言
  • 一.大語言模型(LLM)
    • 1. 什么是LLM?
    • 2. LLM 的能力與特點
  • 二、增強檢索生成(RAG)
  • 三. 什么是 LangChain?
    • 1. LangChain 的核心功能
    • 2. LangChain 的優勢
    • 3. LangChain 的應用場景
    • 4. 總結
  • 四.使用 LangChain 實現基于 PDF 的問答系統


前言

本文將介紹 LLM 和 RAG 的基本概念,并通過一個實際的代碼示例,展示如何使用 LangChain 構建一個基于 PDF 文檔的問答系統。


提示:以下是本篇文章正文內容,下面案例可供參考

一.大語言模型(LLM)

1. 什么是LLM?

LLM,即大型語言模型(Large Language Model),是一種基于深度學習的自然語言處理模型。它通過海量文本數據的訓練,學習語言的統計規律和語義信息,從而能夠理解和生成人類語言。近年來,隨著計算能力的提升和數據量的爆炸式增長,LLM 取得了突破性進展,例如 OpenAI 的 GPT 系列、Google 的 LaMDA 和 PaLM 等。

2. LLM 的能力與特點

LLM 擁有強大的語言理解和生成能力,其特點主要體現在以下幾個方面:

  • 強大的文本生成能力: LLM 能夠生成流暢、連貫、語法正確的文本,包括新聞、故事、詩歌、代碼等多種形式。例如,GPT-3 可以生成高質量的新聞報道,甚至可以模仿特定作家的寫作風格。
  • 廣泛的語言理解能力: LLM 能夠理解人類語言的語義、語境和情感,并完成問答、翻譯、摘要等任務。例如,LaMDA 可以進行開放域對話,并展現出一定的邏輯推理能力。
  • 強大的學習能力: LLM 能夠從海量數據中學習,并不斷改進其性能。例如,通過 fine-tuning,LLM 可以適應特定領域的任務,例如醫療、法律等。
  • 可擴展性強: LLM 的規模越大,其性能通常也越強。隨著計算資源的不斷提升,LLM 的潛力也將不斷被挖掘。

二、增強檢索生成(RAG)

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種結合檢索和生成的技術,能夠從外部知識庫中檢索相關信息,并將其作為上下文輸入到生成模型中。RAG的流程圖如下所示。
我將RAG 的核心思想概括為以下三個步驟:

  • 知識準備階段:先通過嵌入(embedding)模型將文檔、圖片或其他格式的數據轉為向量格式,然后創建向量存儲索引,將文本或其他信息與向量對應起來。最后存到外部知識庫中。
  • 查詢階段:根據用戶的問題,從向量數據庫中檢索最相關的信息并返回。
  • 生成階段:將檢索到的信息作為上下文,輸入到生成(generate)模型中,生成最終的回答。
    RAG 的優勢
    動態知識更新:通過檢索外部知識庫,RAG 可以實時獲取最新信息。
    減少幻覺問題:生成模型的回答基于檢索到的真實信息,減少了錯誤生成的可能性。
    擴展性強:可以輕松集成多種數據源(如 PDF、網頁、數據庫)。RAG示意圖

三. 什么是 LangChain?

LangChain 是一個用于構建基于大語言模型(LLM)應用的框架。它提供了一套模塊化的工具和抽象層,幫助開發者更高效地構建復雜的 LLM 應用。無論是問答系統、對話機器人,還是自動化任務,LangChain 都能顯著簡化開發流程。

1. LangChain 的核心功能

LangChain 的核心功能包括:

  • 任務鏈(Chains):支持將多個任務(如檢索、生成、工具調用)串聯起來,形成復雜的任務鏈。提供了多種預定義鏈(如 RetrievalQA、ConversationalRetrievalChain),簡化常見任務的開發。
  • 模型抽象:提供統一的接口,支持多種 LLM 提供商(如 OpenAI、Hugging Face、Anthropic 等)。支持將多個 LLM 調用串聯起來,形成復雜的任務鏈(Chain)。
  • 上下文管理:提供多種記憶模塊(如 ConversationBufferMemory、ConversationSummaryMemory),用于管理多輪對話的上下文。自動維護對話歷史,確保 LLM 能夠基于上下文生成連貫的回答。
  • 檢索增強:支持從多種數據源(如 PDF、網頁、數據庫)加載文檔。集成了多種向量數據庫(如 FAISS、Pinecone、Weaviate),用于存儲和檢索文檔嵌入。提供了基于向量檢索的接口,方便開發者實現檢索增強生成(RAG)。
  • 工具集成:支持將外部工具(如搜索引擎、API、數據庫)與 LLM 結合,擴展 LLM 的能力。提供了代理框架,允許 LLM 根據任務動態選擇工具并執行操作。

綜上,LangChain 的特點:

  1. 強大的任務鏈功能,支持將多個任務串聯起來,形成復雜的任務流。例如:RAG和多步推理。
  2. 模塊化設計,開發者可以根據需求自由組合。
  3. 多種記憶模塊,用于管理對話歷史和多輪上下文。
  4. 代理框架,允許 LLM 根據任務動態選擇工具并執行操作
  5. 工具集成

2. LangChain 的優勢

由Langchain的特點可見,LangChain 的優勢主要包括:

  • 簡化開發流程:LangChain 提供了豐富的模塊化組件,開發者無需從頭實現 LLM 的集成、上下文管理、檢索增強等功能,可以專注于業務邏輯。
  • 靈活性強:LangChain 支持多種 LLM 提供商、向量數據庫和外部工具,開發者可以根據需求靈活選擇組件。
  • 擴展性強:LangChain 的模塊化設計使得它易于擴展。開發者可以輕松集成新的數據源、工具或任務鏈。
  • 社區支持:LangChain 擁有活躍的社區和豐富的文檔,開發者可以快速上手并解決遇到的問題。

3. LangChain 的應用場景

LangChain的應用場景非常廣泛,涵蓋了問答系統、對話機器人、數據增強應用和自動化任務等多個領域。無論是基于文檔的智能問答、上下文感知的多輪對話,還是結合外部數據源的復雜任務自動化,LangChain都能通過其模塊化設計和強大的工具集成能力,幫助開發者快速構建高效、靈活的 LLM 應用。

4. 總結

LangChain 是一個強大的框架,能夠顯著簡化基于 LLM 應用的開發流程。它的模塊化設計、靈活性和擴展性使得它成為構建復雜 LLM 應用的理想選擇。無論是問答系統、對話機器人,還是自動化任務,LangChain 都能幫助你快速實現目標。

四.使用 LangChain 實現基于 PDF 的問答系統

前提是你已經安裝好了langchain的包

from langchain.chains import RetrievalQA
from langchain_ollama import OllamaLLM
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.prompts import PromptTemplateclass PDFQASystem:def __init__(self, pdf_path: str):"""初始化 PDF 問答系統。"""# 初始化 LLM 和嵌入模型self.llm = OllamaLLM(model="qwen2.5:7b")self.embeddings = OllamaEmbeddings(model="nomic-embed-text")# 加載 PDF 文件并生成嵌入向量self.vector_store = self.load_pdf_and_generate_embeddings(pdf_path)# 初始化提示模板self.prompt_template = PromptTemplate(input_variables=["context", "question"],template=("你是一個助手,幫助用戶解答問題。\n""請根據以下背景資料回答問題:\n""背景資料:\n{context}\n\n""用戶的問題:\n{question}"))# 初始化檢索增強生成鏈self.qa_chain = RetrievalQA.from_chain_type(llm=self.llm,chain_type="stuff",retriever=self.vector_store.as_retriever(),chain_type_kwargs={"prompt": self.prompt_template})def load_pdf_and_generate_embeddings(self, pdf_path: str):"""加載 PDF 文件并生成嵌入向量。"""# 加載 PDF 文件loader = PyPDFLoader(pdf_path)documents = loader.load()# 將文檔拆分為小塊text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)texts = text_splitter.split_documents(documents)# 生成嵌入向量并構建 FAISS 索引vector_store = FAISS.from_documents(texts, self.embeddings)return vector_storedef ask(self, query: str) -> str:"""接收用戶的問題,檢索相關文本并生成答案。"""result = self.qa_chain.invoke({"query": query})return result["result"]# 主程序
if __name__ == "__main__":pdf_path = "E:/dcit/files/貸款.pdf"qa_system = PDFQASystem(pdf_path)# 循環對話while True:query = input("\n請輸入您的問題(輸入 'exit' 退出):")if query.lower() in ["exit", "quit"]:print("對話結束。")breakresult = qa_system.ask(query)print(f"問題:{query}")print(f"答案:{result}")

PDF內容:

銀行貸款的五級分類:
一、 正常貸款: 借款人能夠履行合同,一直能正常還本付息,不存在任何影響貸款本息及時全額償還的消極因素,銀行對借款人按時足額償還貸款本息有充分把握。 貸款損失的概率為 0。
二、 關注貸款:盡管借款人有能力償還貸款本息,但存在一些可能對償還產生不利影響的因 素,如這些因素繼續下去,借款人的償還能力受到影響,貸款損失的概率不會超過 5%。
三、 次級貸款: 借款人的還款能力出現明顯問題,完全依靠其正常營業收入無法足額償還貸 款本息,需要通過處分資產或對外融資乃至執行抵押擔保來還款付息。貸款損失的概率在 30%-50%。
四、 可疑貸款: 借款人無法足額償還貸款本息,即使執行抵押或擔保,也肯定要造成一部分損失,只是因為存在借款人重組、兼并、合并、抵押物處理和未決訴訟等待定因素, 損失金 額的多少還不能確定,貸款損失的概率在50%-75%之間。
五、 損失貸款: 指借款人已無償還本息的可能,無論采取什么措施和履行什么程序,貸款都注定要損失了,或者雖然能收回極少部分,但其價值也是微乎其微,從銀行的角度看,也沒有意義和必要再將其作為銀行資產在賬目上保留下來,對于這類貸款在履行了必要的法律程 序之后應立即予以注銷,其貸款損失的概率在75%-100%。
銀行貸款的流程:
一、貸款申請借款人需要向銀行提出借款申請,并提交相關資料。這些資料通常包括有效的身份證明(如身份證)、戶口本、婚姻狀況證明(如結婚證)、收入證明以及銀行流水等。這些資料有助于銀行評估借款人的信用狀況和還款能力。
二、貸款調查銀行在收到借款申請后,會對借款人的合法性、安全性、盈利性等情況進行調查。這一步驟主要是為了進一步核實借款人提供的資料,并評估貸款的風險。
三、貸款審批銀行會根據審貸分離、分級審批的貸款管理制度進行貸款審批。在此過程中,銀行會綜合考慮借款人的信用記錄、還款能力、擔保情況等因素,決定是否批準貸款申請以及貸款的額度、期限和利率等。
四、簽訂合同若銀行批準了貸款申請,下一步便是與銀行簽訂借款合同。合同會詳細列明貸款金額、期限、利率、還款方式等關鍵條款。簽訂合同是雙方達成法律約束的重要環節。
五、貸款發放一旦合同簽署完畢,銀行會根據約定將貸款金額發放到借款人指定的賬戶。這標志著貸款流程的正式完成,借款人可以開始使用貸款資金。
六、貸后檢查與貸款歸還在貸款發放后,銀行會定期對借款人執行借款合同情況及經營情況進行追蹤調查和檢查,以確保貸款按照合同規定使用并按時歸還。借款人需要按照約定的還款計劃定期償還本金和利息。如果借款人需要展期,應在借款到期日之前向銀行提出貸款延 期申請,由銀行決定是否批準延期。
綜上所述,銀行貸款的具體流程包括貸款申請、貸款調查、貸款審批、簽訂合同、貸款發放
以及貸后檢查與貸款歸還等步驟。在整個流程中,借款人需要配合銀行提供必要的資料和信 息,并確保按照合同約定使用貸款并按時還款

運行結果:
在這里插入圖片描述
以上就是全部內容了,歡迎各位評論區提問。最后祝各位小伙伴學習順利,畢業都能進大廠~

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

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

相關文章

群核科技持續虧損近18億:營銷費用偏高,市場份額優勢面臨挑戰

《港灣商業觀察》施子夫 2025年開年,DeepSeek的爆火讓大眾將目光聚焦到了“杭州六小龍”。其中,杭州群核信息技術有限公司(以下簡稱,群核科技)因系“六小龍”中首家啟動上市的公司而被外界更多關注。 在此次遞表港交…

java版嘎嘎快充玉陽軟件互聯互通中電聯云快充協議充電樁鐵塔協議汽車單車一體充電系統源碼uniapp

演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系統管理員 admin/123456 運營管理員 yyadmin/Yyadmin2024 運營商 operator/operator2024 系統特色: 多商戶、汽車單車一體、互聯互通、移動管理端(開發中) 另…

音視頻學習(三十):fmp4

FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的擴展版本,它支持流式傳輸,并被廣泛應用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming&#xf…

26考研——圖_圖的存儲(6)

408答疑 文章目錄 二、圖的存儲圖的存儲相關概念鄰接矩陣存儲方式鄰接矩陣的定義頂點的度計算鄰接矩陣的特點鄰接矩陣的局限性 應用場景鄰接矩陣的冪次意義(了解即可) 鄰接表存儲方式鄰接表定義鄰接表結構鄰接表的特點 鄰接矩陣和鄰接表的適用性差異十字…

以高斯(GaussDB) 為例, 在cmd 命令行連接數據,操作數據庫,關閉數據庫的詳細步驟

以下是使用 Windows 命令行(cmd) 操作 GaussDB(以 GaussDB(for openGauss) 社區版為例) 的詳細步驟,涵蓋 連接數據庫、基本操作、關閉數據庫 的全流程: 1. 環境準備 前提條件: 安裝 GaussDB&a…

HAL庫定時器配置

定時器的開啟需要手動開啟,例如在driver_capature.c開啟,該文件主要寫了具體的函數實現,與driver_can.c一樣,同時還有回調函數等一些高級的自定義函數。 這段代碼是 STM32 HAL 庫中用于初始化 定時器 2 (TIM2) 的函數 MX_TIM2_In…

使用Python開發自動駕駛技術:車道線檢測模型

友友們好! 我是Echo_Wish,我的的新專欄《Python進階》以及《Python!實戰!》正式啟動啦!這是專為那些渴望提升Python技能的朋友們量身打造的專欄,無論你是已經有一定基礎的開發者,還是希望深入挖掘Python潛力的愛好者,這里都將是你不可錯過的寶藏。 在這個專欄中,你將會…

Modern C++面試題及參考答案

目錄 解釋右值引用的定義及其與左值引用的核心區別 std::move 的實現原理是什么?為什么它本身不執行移動操作? 移動構造函數與拷貝構造函數的調用場景有何不同? 實現一個支持移動語義的類需要遵循哪些原則? 完美轉發(Perfect Forwarding)的實現原理及 std::forward 的…

Thinkphp(TP)框架漏洞攻略

1.環境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.訪問靶場 遠程命令執行: ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 遠程代碼執行: ? s/Index/\think\app/invokefunc…

QT筆記---JSON

QT筆記---JSON JSON1、JSON基本概念1.1、判斷.json文件工具 2、生成.json數據3、解析.json數據 JSON 在現代軟件開發中,數據的交換和存儲格式至關重要。JSON(JavaScript Object Notation)作為一種輕量級的數據交換格式,以其簡潔易…

Unity 使用 Protobuf(Pb2)二進制數據全流程工具詳解

前言 在Unity游戲開發中,高效、快速、安全地讀取配置數據是一項重要需求。本文介紹一種完整的解決方案——使用Protobuf二進制格式(Pb2)存儲和讀取游戲數據,并詳細分享實現全流程的Unity工具。 一、技術流程概覽 實現Unity讀取…

MySQL-----視圖與索引

目錄 視圖 1.視圖 2.操作 11.索引 1.定義 2.優缺點: 3.分類 4.索引的設計原則 5.索引的使用 作業 視圖 1.視圖 ?如果需要在原表中隱藏部分字段時,怎么辦? 視圖 📖視圖: 是一個沒有存儲任何數據的表,可以對其CRUD視圖…

stm32-IIC

i^2c,iiCBus,集成電路總線,同步串行半雙工通信總線方式 sck:時鐘同步信號 SDA:發送數據 GND:接地 通信對象:芯片與芯片 主從應答方式: SDA:數據總線 SCL:時鐘總線 在硬件設計中: 上拉電阻&#…

`chromadb` 是什么

chromadb 是什么 chromadb 是一個開源的向量數據庫,它專門用于存儲、索引和查詢向量數據。在處理自然語言處理(NLP)、計算機視覺等領域的任務時,通常會將文本、圖像等數據轉換為向量表示,而 chromadb 可以高效地管理這些向量,幫助開發者快速找到與查詢向量最相似的向量數…

機器視覺工程師如何看機器視覺展會,有些機器視覺兄弟參加機器視覺展會,真的是參加了?重在參與?

作為機器視覺工程師,參加機器視覺展會不僅是了解行業前沿技術的窗口,也是拓展專業網絡、尋找解決方案的重要機會。以下是結合展會信息和工程師視角的綜合建議: 一、聚焦技術趨勢與創新應用 參與技術論壇與研討會 展會同期的技術論壇是獲取行業洞見的核心渠道。例如: 上海展…

Centos操作系統安裝及優化

Centos操作系統安裝及優化 零、環境概述 主機名 centos版本 cpu 內存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介質下載 1、7.6版本下載 CentOS7.6標準版下載鏈接: https://archive.kernel.org/centos-vault/7.6.1810/i…

Edge瀏覽器如何默認啟動某個工作區 / 為工作區添加快捷方式

Edge瀏覽器的工作區確實非常好用,可以多端同步標簽頁。但是打開Edge時默認是沒有在工作區的狀態,這個狀態下的標簽頁可能會丟失。所以我研究了一下,如何點擊快捷方式時自動啟動一個工作區,方法如下: 先找到WorkspaceCa…

mac上安裝nvm及nvm的基本語法使用!!

種一棵樹,最好是十年前,其次是現在!想要改變,從此刻開始,一切都不晚! 目錄 nvm是什么?前提條件:安裝homebrew如果系統已經有node版本:在mac上安裝nvm:用nvm安…

CPP中的numeric庫中的accumulate求和函數說明

導入 accumulate函數位于numeric庫中,作用是對數組或向量求和 // 設定初始值為0,從dp[0]到dp[n-1]進行累加 accumulate(dp,dpn,0);注意:這里的第二個參數是開區間,所以求和時不包含dp[n]這一位

Qt 高效讀寫JSON文件,玩轉QJsonDocument與QJsonObject

一、前言 JSON作為輕量級的數據交換格式,已成為開發者必備技能。Qt框架為JSON處理提供了完整的解決方案,通過QJsonDocument、QJsonObject和QJsonArray三大核心類,輕松實現數據的序列化與反序列化。 JSON vs INI 特性JSONINI數據結構支持嵌…