LangChain: Chat with Your Data
RAG是一种结合信息检索与生成模型的架构。它通过先从数据库或文档中检索相关信息,然后将这些信息与生成模型结合,生成更准确、上下文相关的回答。这种方法在处理开放域问答、对话系统等任务时,能显著提升生成内容的质量和相关性。
在RAG中,也有很多的开源框架可供使用,比如说从开始就很火的LangChain,有现在后期比较常用的LlamaIndex。那在这门课程中,我们将基于LangChain来实现一些基本的工作。
LangChain概述
LangChain是一个基于Python的开源框架,旨在简化构建基于语言模型的应用,具有模块化设计、数据源集成和链式调用等特点。它支持多种语言模型的使用,适合开发聊天机器人、问答系统等自然语言处理应用,提供了丰富的文档和示例,便于快速上手。
根据LangChain 的主要组件可以分为以下几类,那我们在这门课主要学习的是关于Indexes索引部分的内容:
- 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 的全流程可以分为两个主要阶段:向量存储加载和检索生成。
- 向量存储加载(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等等。
我们可以以公开和专有的信息以及结构化和非结构化的数据来对这些进行划分。
结构化数据通常是有规则且格式化的数据,容易存储和查询。表格化的格式意味着数据已经组织好,可以轻松地在数据库或电子表格中进行处理。图中右侧列举的结构化数据示例包括:
-
公共结构化数据:像Datasets和OpenWeather这样的开放数据集和天气数据。
-
专有结构化数据:如Airtable、Excel、Pandas等表格管理工具和数据库,包括Amazon S3、Azure、MySQL等数据存储服务。
非结构化数据指的是没有固定格式或规则的数据,难以直接通过数据库查询处理。它包括文本、图片、视频等各种形式的内容。图中左侧列举的非结构化数据示例包括:
-
公共非结构化数据:如YouTube视频、arXiv论文、Wikipedia、Twitter、GitHub等,内容形式多样,包括文本、图片、视频等。
-
专有非结构化数据:如公司内部的PDF、TXT文件、电子邮件、聊天记录(如Slack、Messenger、WhatsApp等),这些数据通常没有严格的格式限制。
我们就可以通过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的额度的。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。