使用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.mzph.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数据结构支持嵌…