当前位置: 首页 > article >正文

使用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%。
银行贷款的流程:
一、贷款申请借款人需要向银行提出借款申请,并提交相关资料。这些资料通常包括有效的身份证明(如身份证)、户口本、婚姻状况证明(如结婚证)、收入证明以及银行流水等。这些资料有助于银行评估借款人的信用状况和还款能力。
二、贷款调查银行在收到借款申请后,会对借款人的合法性、安全性、盈利性等情况进行调查。这一步骤主要是为了进一步核实借款人提供的资料,并评估贷款的风险。
三、贷款审批银行会根据审贷分离、分级审批的贷款管理制度进行贷款审批。在此过程中,银行会综合考虑借款人的信用记录、还款能力、担保情况等因素,决定是否批准贷款申请以及贷款的额度、期限和利率等。
四、签订合同若银行批准了贷款申请,下一步便是与银行签订借款合同。合同会详细列明贷款金额、期限、利率、还款方式等关键条款。签订合同是双方达成法律约束的重要环节。
五、贷款发放一旦合同签署完毕,银行会根据约定将贷款金额发放到借款人指定的账户。这标志着贷款流程的正式完成,借款人可以开始使用贷款资金。
六、贷后检查与贷款归还在贷款发放后,银行会定期对借款人执行借款合同情况及经营情况进行追踪调查和检查,以确保贷款按照合同规定使用并按时归还。借款人需要按照约定的还款计划定期偿还本金和利息。如果借款人需要展期,应在借款到期日之前向银行提出贷款延 期申请,由银行决定是否批准延期。
综上所述,银行贷款的具体流程包括贷款申请、贷款调查、贷款审批、签订合同、贷款发放
以及贷后检查与贷款归还等步骤。在整个流程中,借款人需要配合银行提供必要的资料和信 息,并确保按照合同约定使用贷款并按时还款

运行结果:
在这里插入图片描述
以上就是全部内容了,欢迎各位评论区提问。最后祝各位小伙伴学习顺利,毕业都能进大厂~

相关文章:

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM?2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain?1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …...

图像滤波中常用滤波器的相位响应——不是只有零相位滤波器

实偶函数滤波器 当滤波器是实偶函数时,其滤波结果的相位在通带内为 0 或 π \pi π,正频率和负频率成分的相位相同。这种相位特性使得实偶函数滤波器在低通滤波、平滑处理等需要保持信号相位不失真的应用中非常有用。 实偶函数特性: 滤波器…...

学习CSS滤镜属性 `filter: invert()`

一、核心机制 数学原理 invert(1) 对每个像素的RGB通道执行 颜色反相计算: 新通道值 255 - 原通道值 例如 rgb(255,0,0)(纯红)会转换为 rgb(0,255,255)(青色)。 透明度处理 该滤镜会保留元素的Alpha通道(…...

C++实现rabbitmq生产者消费者

RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP), 特点 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。灵活的路由:提供多种路由方式,如…...

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像,下面例举清华网站 清华镜像站点:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下: 创建虚拟机 准备:在其他空间大的盘中创建存储虚拟机的目录&#xff0c…...

【Pandas】pandas Series plot.barh

Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图(Stacked Area Plot)Series.plot.bar([x, y])用于绘制垂直条形图(Ver…...

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...

又双叒叕Scrapy爬虫相关的面试题及详细解答

Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…...

【QA】装饰模式在Qt中有哪些运用?

在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例: 一、QIODevice装饰体系(继承方式) 场景 …...

【保姆级】阿里云codeup配置Git的CI/CD步骤

以下是通过阿里云CodeUp的Git仓库进行CI/CD配置的详细步骤,涵盖前端(Vue 3)和后端(Spring Boot)项目的自动化打包,并将前端打包结果嵌入到Nginx的Docker镜像中,以及将后端打包的JAR文件拷贝至Do…...

使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)

1.STM32CubeMX配置 (1)配置SYS (2)配置RCC (3)配置串口,此处我用的是串口4,其他串口也是一样的 (4)配置DMA,将串口4的TX和RX添加到DMA中 &#…...

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述,根据里面的架构,把视觉提示学习分成两类,一类是单模态提示学习(以vit为代表&…...

(一)丶Windows安装RabbitMQ可能会遇到的问题

一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...

Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能

法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 ,该模型凭借240亿参数的轻量级设计,在多项基准测试中表现优异,甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…...

如何在IPhone 16Pro上运行python文件?

在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务,以下是具体实现方法和步骤: 一、本地运行方案(无需越狱) 使用 Python 编程类 App 以下应用可在 App Store 下载,支持直接在 iPhone 上编写并运行 …...

springboot整合mybatis-plus【详细版】

目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...

视频剪辑行业的现状与进阶之路:一个双视角分析

视频剪辑行业的现状与进阶之路:一个双视角分析 一、现状解析 商业角度分析 成本控制 培训需要投入时间和人力成本 快节奏的市场环境要求快速产出 人员流动性大,培训投入可能无法获得长期回报 市场需求 大量内容需要快速产出 标准化的剪辑模板更容易管理 …...

k近邻图(knn-graph)和局部线性嵌入图(LLE-graph)的相似性和区别

K 近邻图(KNN - graph)和局部线性嵌入图(LLE - graph)是用于构建数据点之间关系图的两种方法。 1. k近邻图(knn-graph) 核心思想:k近邻图通过计算样本之间的距离来构建图。具体来说&#xff0c…...

Qt之MVC架构MVD

什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…...

使用 Apktool 反编译、修改和重新打包 APK

使用 Apktool 反编译、修改和重新打包 APK 在 Android 逆向工程和应用修改过程中,apktool 是一个强大的工具,它允许我们解包 APK 文件、修改资源文件或代码,并重新打包成可安装的 APK 文件。本文将介绍如何使用 apktool 进行 APK 反编译、修…...

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状 引言 在计算机科学和工程领域的学术研究中,可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加,确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…...

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时,发现很多题目都用到了二分查找的变种问题,即二分查找上下界问题,例如以下题目: 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…...

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…...

Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx

stream 模块允许 Nginx 处理 TCP 和 UDP 流量,常用于负载均衡和端口转发等场景。本文将详细介绍如何检查 Nginx 是否支持 stream 模块,以及在需要时如何启用该模块。 1. 检查 Nginx 是否支持 stream 模块 首先,需要确认当前安装的 Nginx 是…...

HashMap添加元素的流程图

文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构(链表还是红黑树)5. 判断链表长度是否超过 …...

(八)Set 的使用

Set 的使用 Set 的特点 主要功能&#xff1a;去除重复内容。特性&#xff1a;无序且不支持重复的集合&#xff0c;不能通过索引访问元素。 示例代码 void main() {// 创建一个包含重复元素的列表List<String> fruits [香蕉, 苹果, 西瓜, 香蕉, 苹果, 香蕉, 苹果];//…...

Spring Boot 集成 Kafka 消息发送方案

一、引言 在 Spring Boot 项目中,Kafka 是常用的消息队列,可实现高效的消息传递。本文介绍三种在 Spring Boot 中使用 Kafka 发送消息的方式,分析各自优缺点,并给出对应的 pom.xml 依赖。 二、依赖引入 在 pom.xml 中添加以下依赖: <dependencies><!-- Sprin…...

面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)

面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求&#xff1a; 人工分拣效率低、出错率高&#xff08;如药品批次混淆、过期风险&#xff09;温控药品&#xff08;如疫苗、生物制…...

AI大模型介绍

大模型介绍 大模型是指具有大规模参数和复杂计算结构的机器学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数 开发大模型不是从0开始&#xff0c;是建立在已有的大模型基座模型上做开发&#xff0c;构建企业知识库&#xff08;向量数据库…...

Python日期时间向前向后N个月及对应月初和月末

Python日期和时间的计算主要使用自带的datetime和calendar库&#xff0c;部分需要借助第三方dateutil库。下面具体说明时间的加减运算&#xff0c;月份的起始和结束日期&#xff0c;向前向后移动的时间间隔等&#xff0c;代码如下&#xff1a; from datetime import date, dat…...