介绍
大型语言模型(LLMs)是一类特定的人工智能模型,旨在理解和生成类似于人类的文本。术语“大型”通常通过它们拥有的参数数量来量化。例如,OpenAI的GPT-3模型有1750亿个参数。可以将其用于各种任务,例如文本翻译、回答问题、写作论文、总结文本。尽管有很多资源展示了LLMs的能力,并提供了有关如何设置聊天应用程序的指导,但很少有人深入研究它们在现实业务场景中的适用性。在本文中,您将学习如何使用LangChain和Flan-T5 XXL构建基于大型语言的应用程序来创建文档查询系统。
学习目标
在深入研究技术细节之前,让我们确定本文的学习目标:
- 了解如何利用LangChain构建基于大型语言的应用程序
- 简要介绍文本到文本框架和Flan-T5模型
- 如何使用LangChain和任何LLM模型创建文档查询系统
现在让我们深入了解这些部分,以理解每个概念。
本文是Data Science Blogathon的一部分。
LangChain在构建LLM应用程序中的作用
LangChain框架旨在开发各种应用程序,例如聊天机器人、生成式问答(GQA)和摘要,以发挥大型语言模型(LLMs)的能力。LangChain为构建文档查询系统提供了全面的解决方案。这涉及通过分块对语料库进行预处理,将这些块转换为向量空间,在提出查询时识别相似块,并利用语言模型将检索到的文档细化为合适的答案。
Flan-T5模型概述
Flan-T5是谷歌研究人员开发的一种商业可用的开源LLM。它是T5(文本到文本转换Transformer)模型的变体。T5是一种先进的语言模型,它通过将NLP任务转换为基于文本的格式来训练。FLAN是Finetuned Language Net的缩写。
让我们深入构建文档查询系统
我们可以利用LangChain和Flan-T5 XXL模型在Google Colab的免费版中构建此文档查询系统。要在Google Colab中执行以下代码,我们必须选择“T4 GPU”作为我们的运行时。按照以下步骤构建文档查询系统:
1:导入必要的库
我们需要导入以下库:
from langchain.document_loaders import TextLoader #用于文本文件
from langchain.text_splitter import CharacterTextSplitter #文本分割器
from langchain.embeddings import HuggingFaceEmbeddings #用于使用HugginFace模型
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.chains.question_answering import load_qa_chain
from langchain import HuggingFaceHub
from langchain.document_loaders import UnstructuredPDFLoader #加载PDF
from langchain.indexes import VectorstoreIndexCreator #使用Chromadb对数据库索引进行向量化
from langchain.chains import RetrievalQA
from langchain.document_loaders import UnstructuredURLLoader #将URL加载到文档加载器中
from langchain.chains.question_answering import load_qa_chain
from langchain import HuggingFaceHub
import os
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "xxxxx"
2: 使用PyPDFLoader加载PDF文件
我们在这里使用LangChain库中的PyPDFLoader来加载我们的PDF文件 – “Data-Analysis.pdf”。 “loader”对象有一个名为“load_and_split()”的属性,根据页面分割PDF。
# 导入csv
from langchain.document_loaders import PyPDFLoader
# 从当前工作目录加载PDF文件
loader = PyPDFLoader("Data-Analysis.pdf")
# 将PDF分割为页面
pages = loader.load_and_split()
3: 根据块大小分割文本
使用模型生成嵌入向量时,对输入的文本片段有最大限制。如果我们要使用这些模型为文本数据生成嵌入向量,将数据分块到特定大小之前将数据传递给这些模型变得很重要。我们在这里使用RecursiveCharacterTextSplitter来拆分数据,它通过使用一组字符将一个大文本拆分为指定的块大小。
# 导入
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 定义块大小、重叠和分隔符
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1024,
chunk_overlap=64,
separators=['\n\n', '\n', '(?=>\. )', ' ', '']
)
docs = text_splitter.split_documents(pages)
4: 获取文本的数值嵌入向量
为了对文本、文档、图像、音频等非结构化数据进行数值表示,我们需要嵌入向量。数值形式捕捉了我们要嵌入的内容的上下文含义。在这里,我们使用HuggingFaceHubEmbeddings对象为每个文档创建嵌入向量。该对象使用“all-mpnet-base-v2”句子转换模型将句子和段落映射到一个768维的稠密向量空间。
# 嵌入向量
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
5: 将嵌入向量存储在向量存储中
现在我们需要一个向量存储来存储我们的嵌入向量。这里我们使用FAISS。FAISS是Facebook AI相似性搜索的缩写,是一个功能强大的库,专门设计用于高效搜索和聚类密集向量,提供了一系列算法,可以搜索任意大小的向量集,甚至可以超过可用的RAM容量。
# 创建向量化的数据库
# Vectorstore: https://python.langchain.com/en/latest/modules/indexes/vectorstores.html
from langchain.vectorstores import FAISS
db = FAISS.from_documents(docs, embeddings)
6: 使用Flan-T5 XXL进行相似性搜索
在这里,我们连接到Hugging Face Hub来获取Flan-T5 XXL模型。
我们可以为模型定义一系列模型设置,如温度和最大长度。
load_qa_chain函数提供了一种简单的方法,可以将文档提供给LLM。通过将链类型设置为“stuff”,该函数接受一个文档列表,将它们组合成一个单一的提示,并将该提示传递给LLM。
llm=HuggingFaceHub(repo_id="google/flan-t5-xxl", model_kwargs={"temperature":1, "max_length":1000000})
chain = load_qa_chain(llm, chain_type="stuff")
#查询
query = "详细解释什么是定量数据分析?"
docs = db.similarity_search(query)
chain.run(input_documents=docs, question=query)
7: 使用Flan-T5 XXL模型创建QA链
使用RetrievalQAChain通过检索器检索文档,然后使用QA链根据检索到的文档回答问题。它结合了语言模型和VectorDB的检索能力。
from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}))
8: 查询我们的PDF
query = "不同类型的数据分析有哪些?"
qa.run(query)
#输出
"描述性数据分析、理论驱动的数据分析、数据或叙述驱动的分析"
query = "描述性数据分析的意义是什么?"
qa.run(query)#import csv
#输出
"描述性数据分析只关注对数据进行处理和总结。"
现实世界的应用
在当前数据泛滥的时代,从庞大的文本数据中获取相关信息是一个持续的挑战。传统的搜索引擎经常无法准确地对用户的特定查询提供准确和上下文敏感的响应。因此,对于精确文档问答(DQA)系统的需求越来越大,旨在提供精确的文档问题回答的自然语言处理(NLP)方法日益增多。像我们构建的这样一个文档查询系统,可以极大地方便自动化与各种类型的文档(如PDF、Excel表格、HTML文件等)的交互。使用这种方法,可以从广泛的文档集合中提取出许多上下文感知的有价值的见解。
结论
在本文中,我们首先讨论了如何利用LangChain从PDF文档加载数据。将这种能力扩展到其他文档类型,如CSV、HTML、JSON、Markdown等。我们进一步学习了根据特定块大小对数据进行分割的方法,这是在生成文本嵌入之前必要的步骤。然后,使用HuggingFaceHubEmbeddings获取文档的嵌入。在将嵌入存储在向量存储中之后,我们将检索与我们的LLM模型’Flan-T5 XXL’相结合,进行问题回答。将检索到的文档和用户输入的问题传递给LLM,生成对所提问题的答案。
关键要点
- LangChain提供了一个全面的框架,用于与LLM、外部数据源、提示和用户界面的无缝交互。它允许围绕LLM构建独特的应用程序,通过“链接”来自多个模块的组件。
- Flan-T5是一种商业可用的开源LLM。它是由Google Research开发的T5(文本到文本转换Transformer)模型的一个变体。
- 向量存储以高维向量的形式存储数据。这些向量是各种特征或属性的数学表示。设计向量存储以有效管理密集向量并提供高级相似性搜索功能。
- 使用LLM模型和Langchain构建基于文档的问答系统的过程包括获取和加载文本文件,将文档分成可管理的部分,将这些部分转换为嵌入,将它们存储在向量数据库中,并创建一个QA链,以便对文档进行问题回答。
常见问题
本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。