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

news2025/3/22 7:28:52

目录

  • 前言
  • 一.大语言模型(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 PromptTemplate


class 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_store

    def 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("对话结束。")
            break
        result = qa_system.ask(query)
        print(f"问题:{query}")
        print(f"答案:{result}")

PDF内容:

银行贷款的五级分类:
一、 正常贷款: 借款人能够履行合同,一直能正常还本付息,不存在任何影响贷款本息及时全额偿还的消极因素,银行对借款人按时足额偿还贷款本息有充分把握。 贷款损失的概率为 0。
二、 关注贷款:尽管借款人有能力偿还贷款本息,但存在一些可能对偿还产生不利影响的因 素,如这些因素继续下去,借款人的偿还能力受到影响,贷款损失的概率不会超过 5%。
三、 次级贷款: 借款人的还款能力出现明显问题,完全依靠其正常营业收入无法足额偿还贷 款本息,需要通过处分资产或对外融资乃至执行抵押担保来还款付息。贷款损失的概率在 30%-50%。
四、 可疑贷款: 借款人无法足额偿还贷款本息,即使执行抵押或担保,也肯定要造成一部分损失,只是因为存在借款人重组、兼并、合并、抵押物处理和未决诉讼等待定因素, 损失金 额的多少还不能确定,贷款损失的概率在50%-75%之间。
五、 损失贷款: 指借款人已无偿还本息的可能,无论采取什么措施和履行什么程序,贷款都注定要损失了,或者虽然能收回极少部分,但其价值也是微乎其微,从银行的角度看,也没有意义和必要再将其作为银行资产在账目上保留下来,对于这类贷款在履行了必要的法律程 序之后应立即予以注销,其贷款损失的概率在75%-100%。
银行贷款的流程:
一、贷款申请借款人需要向银行提出借款申请,并提交相关资料。这些资料通常包括有效的身份证明(如身份证)、户口本、婚姻状况证明(如结婚证)、收入证明以及银行流水等。这些资料有助于银行评估借款人的信用状况和还款能力。
二、贷款调查银行在收到借款申请后,会对借款人的合法性、安全性、盈利性等情况进行调查。这一步骤主要是为了进一步核实借款人提供的资料,并评估贷款的风险。
三、贷款审批银行会根据审贷分离、分级审批的贷款管理制度进行贷款审批。在此过程中,银行会综合考虑借款人的信用记录、还款能力、担保情况等因素,决定是否批准贷款申请以及贷款的额度、期限和利率等。
四、签订合同若银行批准了贷款申请,下一步便是与银行签订借款合同。合同会详细列明贷款金额、期限、利率、还款方式等关键条款。签订合同是双方达成法律约束的重要环节。
五、贷款发放一旦合同签署完毕,银行会根据约定将贷款金额发放到借款人指定的账户。这标志着贷款流程的正式完成,借款人可以开始使用贷款资金。
六、贷后检查与贷款归还在贷款发放后,银行会定期对借款人执行借款合同情况及经营情况进行追踪调查和检查,以确保贷款按照合同规定使用并按时归还。借款人需要按照约定的还款计划定期偿还本金和利息。如果借款人需要展期,应在借款到期日之前向银行提出贷款延 期申请,由银行决定是否批准延期。
综上所述,银行贷款的具体流程包括贷款申请、贷款调查、贷款审批、签订合同、贷款发放
以及贷后检查与贷款归还等步骤。在整个流程中,借款人需要配合银行提供必要的资料和信 息,并确保按照合同约定使用贷款并按时还款

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

在VMware上部署【Ubuntu】

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

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

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

使用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、核心特性与优势 多…

springboot整合mybatis-plus【详细版】

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

Qt之MVC架构MVD

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

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

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

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

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

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

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

HashMap添加元素的流程图

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

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

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

AI大模型介绍

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

OpenPCDet详细部署与复现

OpenPCDet简介 OpenPCDet是一个用于3D目标检测的开源工具箱,它提供了多种数据集的加载器,支持多种模型,并且易于扩展。 本人使用硬件与环境 Linux操作系统(Ubuntu20.04) Python环境(Anaconda下独立创建&…

同旺科技USB to I2C 适配器 ---- 指令之间延时功能

所需设备: 内附链接 1、同旺科技USB to I2C 适配器 1、指令之间需要延时发送怎么办?循环过程需要延时怎么办?如何定时发送?现在这些都可以轻松解决; 2、只要在 “发送数据” 栏的Delay单元格里面输入相应的延迟时间就…

网络华为HCIA+HCIP NFV

目录 NFV关键技术:虚拟化 NFV关键技术:云化 NFV架构 NFV标准架构 ​编辑 NFV架构功能模块 NFV架构接口 NFV关键技术:虚拟化 在NFV的道路上,虚拟化是基础,云化是关键。传统电信网络中,各个网元都是…

MySQL0基础学习记录-下载与安装

下载 下载地址: (Windows)https://dev.mysql.com/downloads/file/?id536787 安装 直接点next,出现: 点execute 然后一直next到这页: next 然后需要给root设置一个密码: 在next。。很多页…

集成学习(下):Stacking集成方法

一、Stacking的元学习革命 1.1 概念 Stacking(堆叠法) 是一种集成学习技术,通过组合多个基学习器(base learner)的预测结果,并利用一个元模型(meta-model)进行二次训练&#xff0c…