AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


吴恩达DeepLearning.AI课程系列 —— 大模型检索增强生成(一)
发布日期:2025-01-04 18:03:50 浏览次数: 1594 来源:机智流



LangChain: Chat with Your Data

在前面的课程介绍里,我向大家讲解了大语言模型里的三大概念——预训练、微调以及提示词工程。相信大家看完后应该对大语言模型已经有了初步的了解。那这节课我们学习另一个在大语言模型大火后非常重要的概念——RAG(Retrieval-Augmented Generation)检索增强生产

RAG是一种结合信息检索与生成模型的架构。它通过先从数据库或文档中检索相关信息,然后将这些信息与生成模型结合,生成更准确、上下文相关的回答。这种方法在处理开放域问答、对话系统等任务时,能显著提升生成内容的质量和相关性。

在RAG中,也有很多的开源框架可供使用,比如说从开始就很火的LangChain,有现在后期比较常用的LlamaIndex。那在这门课程中,我们将基于LangChain来实现一些基本的工作。

LangChain概述

LangChain是一个基于Python的开源框架,旨在简化构建基于语言模型的应用,具有模块化设计、数据源集成和链式调用等特点。它支持多种语言模型的使用,适合开发聊天机器人、问答系统等自然语言处理应用,提供了丰富的文档和示例,便于快速上手。

根据LangChain 的主要组件可以分为以下几类,那我们在这门课主要学习的是关于Indexes索引部分的内容:

  1. Prompts(提示)
  • 提示模板(Prompt Templates):用于生成模型输入。
  • 输出解析器(Output Parsers):包含5种以上的实现,用于处理生成结果。
  • 示例选择器(Example Selectors):超过5种实现,用于选择适合的输入示例。
  • Models(模型)
    • 大型语言模型(LLMs):支持超过20种集成。
    • 聊天模型(Chat Models)。
    • 文本嵌入模型(Text Embedding Models):有10+种集成。
  • Indexes(索引)
    • 文档加载器(Document Loaders):有50多种实现,用于处理各种类型的文档。
    • 文本分割器(Text Splitters):10多种实现,用于对文本进行分段处理。
    • 向量存储(Vector Stores):支持10+种集成。
    • 检索器(Retrievers):有超过5种实现或集成。
  • Chains(链条)
    • 可以作为构建其他链条的基础模块。
    • 提供超过20种不同类型的应用程序特定链条。
  • Agents(代理)
    • 支持5种类型的代理,帮助语言模型使用外部工具。
    • 代理工具包(Agent Toolkits):提供超过10种实现,代理通过特定工具执行任务。

    这些组件共同构成了LangChain的核心架构,帮助开发者轻松构建复杂的语言模型应用。

    RAG 的全流程可以分为两个主要阶段:向量存储加载检索生成

    1. 向量存储加载(Vector Store Loading)
    • 首先,系统从不同的数据源加载文档。这些数据源可以包括URLs(网站链接)、PDF文件、数据库等各种文档形式。
    • 加载的文档经过处理后,会进行分割(Splitting),将长文档拆分为多个较小的片段,便于后续的检索和匹配。
    • 这些分割后的文档片段会被转化为向量表示,并存储在向量存储(Vector Store)中。向量存储是基于嵌入技术的高效存储方案,能够让文档的内容以数值形式表示,便于后续的相似性搜索和检索。
  • 检索生成(Retrieval-Augmented Generation)
    • 在用户输入问题(Query)后,系统会通过向量存储来检索与问题最相关的文档片段(Relevant Splits)。
    • 检索到的相关片段会被组合成一个提示(Prompt),该提示连同上下文一起传递给大型语言模型(LLM)。
    • 最后,语言模型根据检索到的片段生成答案,并返回给用户。

    其实我一直觉得说,RAG(检索增强生成)应用的基础搭建确实相对简单。通过利用现有的开源框架,我们只需要将文档导入系统,选择一个合适的嵌入模型进行向量化处理,然后将这些向量存储在RAG库中。调用模型时,先把用户问题传递给RAG模块,检索出相关的信息,再结合大语言模型生成回答即可。这一过程使我们能够轻松将大语言模型与现有数据结合,提供更精准的回答

    例如,像我之前参与过的超星集团培训项目中的AI助教,其能在平台上与学生进行对话,并基于课程资源反馈问题的答案。很多老师以为这些AI助教在上传数据后经过了重新训练,使模型更专业化,但其实,背后的原理是将老师上传的内容作为知识库,通过RAG技术检索相关信息,并将其传递给大语言模型,生成回答。整个过程中,大语言模型本身并没有发生变化,唯一变化的部分是通过RAG检索后传入模型的提示词内容变得更为精准。

    类似的情况我也在装配式建筑企业的调研中见到过,他们开发的RAG系统通过收集大量装配式建筑的资料,实现了更专业化的问答功能。RAG的火爆不仅在于其技术实现门槛相对较低,还因为它能够明显提升语言模型的应用效果。

    但要真正做好RAG并不是一件容易的事。茴香豆”项目的负责人白座曾多次提到,虽然RAG系统的基础搭建很简单,但要实现高效、稳定,并且符合安全性要求,尤其是保证内容符合社会主义核心价值观,仍然需要在输入输出的各个环节投入大量的精力和心思。简而言之,尽管技术门槛不高,但想要打造一个效果优异、安全性强的RAG系统,依然是一项复杂且精细的工作。

    文件加载

    在LangChain中其实支持非常多种来源的文件,包括了网页,Youtube等等。那这里面具体的数据类型就包括PDF文件、HTML、JSON以及Word等等。

    我们可以以公开和专有的信息以及结构化和非结构化的数据来对这些进行划分。

    结构化数据通常是有规则且格式化的数据,容易存储和查询。表格化的格式意味着数据已经组织好,可以轻松地在数据库或电子表格中进行处理。图中右侧列举的结构化数据示例包括:

    • 公共结构化数据:像DatasetsOpenWeather这样的开放数据集和天气数据。
    • 专有结构化数据:如AirtableExcelPandas等表格管理工具和数据库,包括Amazon S3AzureMySQL等数据存储服务。

    非结构化数据指的是没有固定格式或规则的数据,难以直接通过数据库查询处理。它包括文本、图片、视频等各种形式的内容。图中左侧列举的非结构化数据示例包括:

    • 公共非结构化数据:如YouTube视频、arXiv论文、WikipediaTwitterGitHub等,内容形式多样,包括文本、图片、视频等。
    • 专有非结构化数据:如公司内部的PDFTXT文件、电子邮件、聊天记录(如SlackMessengerWhatsApp等),这些数据通常没有严格的格式限制。

    我们就可以通过langChain的方式将大量的文件放进来了。Loader就相当于是提前把文件放到一个容器里面,我们就可以基于这个容器对文件内部进行更改。

    但是总的来说,Langchain是可以帮我们节省很多的整理文档的时间,我们常见的PDF、CSV、Word等等类型的文档都是能够直接导入的,甚至我们只需要给其Youtube视频链接就可以把整个视频的文本作为数据库然后来实现对话,这还是非常方便的一件事情。

    下面我就用代码实战一下,以下是我用的关键库的版本,假如各位想要亲自实践的话务必按照以下版本,不然可能回出现报错情况!

    langchain                0.3.0
    langchain-community      0.3.0
    pypdf                    5.0.0
    openai                   1.47.0
    beautifulsoup4           4.12.3

    那首先假如我们需要将pdf载入,目前最新的版本已经不再是通过from langchain.document_loaders import PyPDFLoader 的方式,而是通过from langchain_community.document_loaders import PyPDFLoader 的方式实现。那完整的代码如下,我们就可以打印出文件内所有的内容和信息。

    from langchain_community.document_loaders import PyPDFLoader
    loader = PyPDFLoader(r"D:\langchain\test1.pdf")
    pages = loader.load()
    print(pages)

    其实本质上就是langchain调用了PyPDF这个库来实现了这个事情,类似的我们也可以对一些URL链接来转变为我们的Document。

    from langchain_community.document_loaders import WebBaseLoader
    loader = WebBaseLoader("https://zh.d2l.ai/")
    docs = loader.load()
    print(docs[0].page_content[:500])

    这个URL并非所有链接都可以实现爬虫抓取,这里我用的是李沐老师写的《动手学深度学习》的开源代码官网,这个官网没有使用太多反爬虫的技巧。但是国内很多其他的网页其实都使用了动态加载技术、需要用户登录,或是有特定的反爬虫机制。WebBaseLoader 主要用于抓取静态 HTML 内容,对于动态生成的内容(例如由 JavaScript 加载的内容),它无法直接处理。

    除了PDF和URL以外,其实我们可以在Langchain在API官网上找到更多相关的信息。在下面图片右边都是一系列的Loader,包括Arxiv等等。但是我之前开发的时候就发现有些其实虽然写了但是用不了,还是得自己重新爬。又有一些其实是需要额外花费的,比如Google系列的很多可能初期是免费的,后期是需要额外花钱买key的额度的。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询