“文本生成的新时代:RAG,LangChain和矢量数据库”

美妆时尚专家解读:RAG、LangChain和矢量数据库的时尚新纪元

介绍

创新的技术不断重塑着机器在自然语言处理迅速发展的领域中理解和生成人类语言的方式。其中一种开创性的方法是检索增强生成(RAG),它将GPT(生成预训练变换器)等生成模型的强大能力与向量数据库和语言链的效率相结合。

RAG代表了机器处理语言的范式转变,弥合了生成模型和检索模型之间的鸿沟,实现了以前无与伦比的上下文理解和响应能力。在本博文中,我们将探讨RAG的核心概念,以及它与GPT模型的整合,向量数据库的作用以及其在现实世界中的应用。

学习目标

  • 了解检索增强生成(RAG)的基本原理。
  • 深入了解向量数据库以及使用向量的创新数据存储和检索方法。
  • 了解RAG、语言链和向量数据库如何协同工作,解释用户查询,检索相关信息并生成连贯的回应。
  • 开发在特定应用中应用集成技术的实际技能。

本文是数据科学博文马拉松的一部分。

什么是RAG?

检索增强生成(RAG)代表了生成模型和检索模型的融合。它无缝地将生成模型的创造性能力与检索系统的准确性结合起来,实现多样且与上下文相关的内容生成。

在一些传统的语言生成任务中,例如文本补全或问题回答,生成模型如GPT(生成预训练变换器)在生成与上下文相关的文本方面表现出色。然而,当输入的上下文含糊不清或数据稀缺时,它们可能会产生不正确或不一致的回应。

另一方面,基于检索的模型可以从庞大的预先编写的回应或文档数据库中高效提取相关的回应。为了提供准确的回应,聊天机器人和信息检索系统经常使用它们。然而,由于它们局限于数据库中的回应,它们缺乏生成模型的独创性和适应性。

理解RAG的本质

RAG的核心是一种复杂的方法,将自然语言处理的两个基本方面和谐地融合在一起。

生成模型

生成模型,如OpenAI的GPT(生成预训练变换器),以基于大规模训练数据集预测和生成单词序列的复杂神经结构而闻名。这些模型可以高度创意地生成类似人类语言的文本。

检索模型

另一方面,检索模型的设计目的是从庞大的数据集中高效搜索和检索特定的信息。这些模型通常利用向量嵌入等先进技术,可以根据输入查询快速识别相关的文档、段落或句子。

什么是Langchain?

在我们解读LangChain的微妙之前,先捕捉其本质。一个可靠的库称为LangChain被创建出来,使得与不同的大型语言模型(LLM)供应商(如OpenAI、Cohere、Bloom、Huggingface等)的交互更加轻松。创建链条和逻辑连接以帮助桥接一个或多个LLM是LangChain与其他平台的区别之处。

为什么选择LangChain?

LangChain提供无数的机会,只有想象力是限制。

  • 想象一下聊天机器人除了提供信息外还具有智慧和魅力。
  • 想象一下电子商务平台可以准确推荐产品并促使客户购买。
  • 设想一下健康应用程序提供个性化的医学见解,使人们能够明智地为自己的健康选择。

你可以通过LangChain获得非凡的体验。你拥有使这些概念变为现实的力量。

RAG中的向量数据库

向量数据库是一种复杂的系统,它以向量格式存储和处理数据。与依赖结构化表的传统数据库不同,向量数据库使用多维空间中数据点的向量数学表示来组织信息。这种独特的方法使得对庞大数据集的高效存储、检索和操作成为可能,这使它们非常适合处理复杂和非结构化的数据。

向量数据库如何存储和检索数据?

将数据存储为向量

在向量数据库中,数据以向量的形式存储,以保留不同数据点之间的关系和相似性。例如,在推荐系统中,用户对电影的喜好可以表示为向量。如果两个用户具有相似的电影偏好,他们各自的向量在向量空间中会非常接近。

向量数据库利用专门的数据结构和算法高效地存储这些向量。一种常见的技术是使用嵌入,将原始数据使用诸如词嵌入(用于自然语言处理)或图像嵌入(用于计算机视觉任务)等技术转换为固定大小的向量。

索引和检索数据

传统数据库严重依赖索引技术来加速数据检索。向量数据库也使用索引策略,但它们侧重于向量的几何属性。其中一个广泛使用的方法是创建空间索引,如树结构(如R树)或近似最近邻搜索算法(如局部敏感哈希)。这些方法使数据库能够快速识别与给定查询向量接近的向量。

当查询要求找到与参考图像相似的图像时,参考图像的向量表示将与所有存储图像的向量进行比较,使用余弦相似度或欧氏距离等相似度度量。这种比较由专门的算法完成,使数据库能够高效地检索相似的图像。

在RAG中使用向量数据库的好处

RAG将传统语言生成技术与检索方法结合,使AI系统能够从数据集中获取特定信息,然后生成响应。当与向量数据库整合时,RAG成为一个强大的工具,具有几个明显的优势:

上下文相关性

向量数据库可以以保留不同数据点之间关系和相似性的方式存储上下文信息。在应用于RAG时,生成的内容可以更具上下文相关性。通过检索和分析与查询上下文相似的向量,AI系统可以制定与对话上下文紧密对齐的响应,极大增强用户体验。

高效的信息检索

传统数据库通常在处理大型数据集和复杂查询时遇到困难,导致响应时间较慢。而针对相似度搜索进行优化的向量数据库在高效的信息检索方面表现出色。与RAG模型整合后,它们能够快速访问相关数据点。在聊天机器人、客户支持系统和内容推荐引擎等需要及时响应的应用中,这种速度至关重要。

准确的语义

向量表示捕捉单词和短语之间的语义相似性。在使用RAG生成响应时,向量数据库有助于理解查询的关键词和语义细微差别。这确保生成的内容不仅是关键词匹配,而且是语义准确和有意义的响应,提升了整体交互质量。

增强的决策能力

通过利用存储在向量数据库中的丰富数据,RAG系统可以做出更明智的决策。无论是生成产品推荐、回答复杂查询还是辅助数据分析,从向量表示中获取的全面理解都可以帮助AI系统提供有价值的见解和建议。

将向量数据库纳入检索增强生成中可以提高生成内容的准确性和相关性,并在个性化、上下文理解和实时响应方面开启新的可能性。

将一切整合在一起

我们可以通过将OpenAI的GPT模型、LangChain和Pinecone向量数据库的优势结合起来开发一个既具有生成能力又具有检索能力的检索增强型AI系统。该系统可以在生成富有创意和类似人类文本的同时,检索和使用特定的信息。

  • Loading:我们首先需要加载数据。LangChain中可以使用不同的加载器。
  • 切割:文本分割器将文档分割为预定大小的分割。
  • 存储:分割,如矢量存储,将被保留并频繁嵌入存储中。
  • 检索:应用程序从存储中检索分割,通常与类似的输入问题嵌入一起。
  • 生成:LLM使用包含查询和检索到数据的提示来生成答案。

在LangChain中实现问题回答

在LangChain中有不同的实现问题回答的方式。以下是一些讨论:

1. load_qa_chain

每次在传递所有文档的情况下调用时,它都会执行问题回答。它简单而全面,但由于可能不集中在问题的最关键部分上,因此可能比RetrievalQA更慢和更低效。

2. RetrievalQA

RetrievalQA对最相关的文本部分执行问题回答。它比load_qa_chain更快和更有效,底层上在每个块上使用它。由于文档可能不总是为问题提供最佳的文本块,所以这些性能提升可能会失去一些上下文或信息。

3. VectorstoreIndexCreator

由于VectorstoreIndexCreator是一个更高级的包装器,RetrievalQA可以以更少的代码运行。

4. ConversationalRetrievalChain

ConversationalRetrievalChain提供了一个聊天历史组件,它是RetriervalQAChat的一个改进。

让我们详细讨论这些。

导入所需库

from langchain.chains import RetrievalQAfrom langchain.llms import OpenAIfrom langchain.document_loaders import TextLoaderfrom langchain.document_loaders import PyPDFLoaderfrom langchain.indexes import VectorstoreIndexCreatorfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Chromaimport osos.environ["OPENAI_API_KEY"] = ""llm = OpenAI()

load_qa_chain

这将加载一个可以用于在一组文档上回答问题的链。它使用所有文档,因此在使用大文件时可能会出现问题。

from langchain.chains.question_answering import load_qa_chain# load documentloader = PyPDFLoader("/content/example.pdf")documents = loader.load()chain = load_qa_chain(llm=OpenAI(), chain_type="map_reduce")query = "2021年有多少AI出版物?"chain.run(input_documents=documents, question=query)

我们使用的是map_reduce类型的链。如果使用stuff,令牌数将超过限制,因为它获取文档列表,将它们全部插入一个提示中,并将该提示传递给LLM。

对于多个文档

对于多个文档loaders = [....]documents = []for loader in loaders:     documents.extend(loader.load())     chain = load_qa_chain(llm=OpenAI(), chain_type="map_reduce")query = "2021年有多少AI出版物?"chain.run(input_documents=documents, question=query)

检索QA链

RetrievalQA链在底层使用load_qa_chain。我们检索最相关的文本块,将其馈送给我们选择的大型语言模型。

加载文档

第一步是加载用于回答问题的数据。我们可以使用Langchain的许多内置数据加载器之一。在这里,我们使用PyPDFLoader从p中加载目前的pdf文件数据。

加载器 = PyPDFLoader("/content/example.pdf")文档 = 加载器.load()

拆分文档

在完成抓取和加载后,我们开始对数据进行拆分和清理。将数据拆成块对于在向量索引中嵌入大量上下文非常重要。只嵌入几个词是不够的,因为它们不包含足够的信息以匹配相关向量,而嵌入整个页面则会占用太多提示上下文窗口的空间。

Langchain支持许多文本分割器。这里,我们使用了按字符分割,因为这样可以直接管理上下文长度,对于此用例选择了大约1000个令牌的块大小。我们还设置了一个小的重叠长度,以保留块之间的文本连续性。

# 将文档拆分成块text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=20)文本 = text_splitter.split_documents(文档)

使用嵌入和向量数据库

在收集数据源之后,我们需要创建知识库索引。通过创建索引,您可以基于特定条件(例如相似性或距离)快速定位向量,索引实际上是一个映射或引用。

使用OpenAI进行嵌入,ChromaDB作为向量数据库。可以在创建后将文档向量添加到索引中。

# 选择要使用的嵌入embeddings = OpenAIEmbeddings()# 创建用作索引的向量存储db = Chroma.from_documents(文本, embeddings)

使用检索

在向量存储已经建立索引后,需要定义检索器。检索模块使用其搜索算法从向量数据库中确定如何检索相关文档。

在自然语言处理中,检索至关重要,特别是在使用搜索引擎、问答系统和信息检索的应用中。检索器的目标是有效地搜索大规模文档语料库,以找到最有可能包含特定用户信息的文档。

# 在检索器中公开此索引retriever = db.as_retriever(search_type="similarity", search_kwargs={"k":2})

搜索类型

检索方法可以使用不同的搜索类型。

  • 语义相似性:语义搜索获取所有相似的文档,但不强制多样性。
  • MMR(最大边际相关性):不仅考虑相似性,还考虑多样性。第一个块与第二个块略有不同。

创建链

现在我们拥有了所有必要的部分,可以构建对话检索链。为了方便对话交互,该链在RetrievalQAChain的基础上扩展了一个聊天历史元素。我们使用了”stuff”类型的chain。

# 创建用于回答问题的链qa = RetrievalQA.from_chain_type(    llm=OpenAI(), chain_type="stuff", retriever=retriever, return_source_documents=True)query = "什么是AI出版物的总数量?"result = qa({"query": query})

对话检索链

ConversationalRetrievalQA链构建在RetrievalQAChain的基础上,提供了聊天历史组件。

  • 首先将聊天历史和问题组合成一个单一问题。
  • 然后从检索器中查找相关文档。
  • 然后将这些文档和问题传递给问答链以返回响应。
from langchain.chains import ConversationalRetrievalChain# 加载文档loader = PyPDFLoader("/content/example.pdf")文档 = 加载器.load()# 将文档拆分成块text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)文本 = text_splitter.split_documents(文档)# 选择要使用的嵌入embeddings = OpenAIEmbeddings()# 创建用作索引的向量存储db = Chroma.from_documents(文本, embeddings)# 在检索器中公开此索引retriever = db.as_retriever(search_type="similarity", search_kwargs={"k":2})# 创建用于回答问题的链qa = ConversationalRetrievalChain.from_llm(OpenAI(), retriever)

第一个查询

我们首先创建一个空的聊天记录,将所有用户查询和聊天机器人的回答都添加进去。

chat_history = []query = "什么是人工智能出版物的总数量?"result = qa({"question": query, "chat_history": chat_history})

第二个查询

聊天记录现在包含了之前的用户查询和聊天机器人的回答。

chat_history = [(query, result["answer"])]query = "这个数字除以2是多少?"result = qa({"question": query, "chat_history": chat_history})

使用RAG减少GenAI应用中的幻觉

在生成型人工智能的背景下,特别是像检索辅助生成(RAG)这样的模型中,减轻幻觉的发生至关重要。RAG结合了信息检索和语言生成技术,使得人工智能系统能够根据检索到的相关信息生成内容。然而,仍然可能出现幻觉。

幻觉的原因

  • 数据偏见:如果训练数据包含有偏见的信息,模型可能生成有偏见或幻觉的内容。
  • 过度优化:过于复杂或训练时间过长的模型可能会记住训练数据中的罕见模式,导致幻觉的产生。
  • 训练数据的歧义性:如果训练数据缺乏上下文或包含歧义性的信息,模型可能会用幻觉的内容填补空缺。

以下是您可以有效地使用RAG来减少这些幻觉的方法:

使用有针对性的查询

制定精确的查询以进行信息检索。通过制定专注的查询,可以减少检索到无关或误导性信息的机会,从而降低幻觉的发生几率。

# 使用RAG进行有针对性的查询示例query = "用于生成响应的相关上下文。"retrieved_information = retrieve_information(query)

融入丰富的上下文

RAG允许在生成回复时融入上下文。将检索到的相关信息中的相关上下文包含进来可以使生成的内容更加扎实,并且更不容易产生幻觉。

# 将检索到的信息作为生成上下文进行融入context = preprocess_retrieved_info(retrieved_information)generated_response = generate_response_with_context(user_query, context)

置信度分数

为检索到的信息分配置信度分数。较高的置信度分数表示可靠的信息。根据这些置信度分数过滤回复,以确保只有可信赖的信息对生成的内容做出贡献。

# 基于置信度分数过滤检索到的信息confident_retrieved_info = filter_high_confidence_info(retrieved_information)generated_response = generate_response(user_query, confident_retrieved_info)

人工验证循环

引入人工验证步骤。人工审查员可以审查生成的回复。如果回复中包含可能存在幻觉内容,系统可以在向用户呈现之前将其标记为待人工审查。

# 生成回复的人工验证循环generated_response = generate_response(user_query, retrieved_information)if requires_human_validation(generated_response):    reviewed_response = human_review(generated_response)    send_response_to_user(reviewed_response)else:    send_response_to_user(generated_response)

通过整合这些策略,RAG可以在生成型人工智能应用中显著减少幻觉的出现。

评估RAG应用

对于我们的RAG应用的各个组成部分,我们迄今为止选择了典型/任意值。然而,如果我们改变了某些东西,比如LLM、嵌入模型或切分逻辑,我们如何确保我们的配置比以前更好呢?我们必须创建可靠的方法来定量评估这样的生成任务,因为这是非常具有挑战性的。我们必须进行单元或组件评估和端到端评估,因为我们的应用包含了许多移动的部分。

逐分量评估

它可能需要评估以下内容:

孤立检索:这是我们检索到的块中最好的来源。

LLM的回应:鉴于来源,LLM能否产生高质量的答案?

总体而言,系统的质量评估

此外,我们可以评估整个系统的质量,包括数据源的访问和终端评估的响应质量。

先进信息技术时代的道德考量

道德考虑在塑造先进信息技术创新轨迹中起着关键作用,检索增强生成(RAG)、LangChain和向量数据库无缝交织其中。随着这些前沿技术重新定义我们处理信息和与数据的互动方式,审视这一变革性景观中的道德影响至关重要。

隐私和数据安全

RAG、LangChain和向量数据库的结合处理、检索和生成大量的数据。有关该数据的隐私和安全引发了道德关注。确保强大的加密、严格的访问控制和透明的数据使用政策对于保护用户信息免受未经授权的访问和滥用至关重要。

偏见和公平性

这些技术基于大量数据集训练算法,潜在地继承数据中存在的偏见。解决算法偏见对于防止特别是在语言处理和内容生成应用中的歧视性结果至关重要。

责任和透明度

开发人员、组织和政策制定者必须对他们的创作负责。对于这些系统的操作方式、数据来源和使用的算法进行透明的沟通有助于建立用户的信任。

结论

总之,检索增强生成(RAG)、LangChain和向量数据库等前沿技术的融合标志着自然语言处理和信息检索的重要里程碑。这些先进工具之间的协同作用增强了数据检索的效率,并将生成内容的质量提升到前所未有的水平。

通过检索增强生成,我们填补了传统搜索方法和自然语言理解之间的差距。通过整合LangChain的语言能力和向量数据库的强大数据结构,我们创造了一个无缝的生态系统,使机器能够迅速理解人类语言的复杂性,访问相关信息,并产生有上下文、连贯和准确的内容。随着我们不断前进,RAG、LangChain和向量数据库之间的协作将带来一个未来,在这个未来中,人机交互既高效又深具意义。旅程没有结束,只是在演变,随着每一步的迈进,我们离一个真正增强我们能力的技术世界更近,使复杂变得简单,难以想象的变得可实现。

关键要点

  • 通过利用RAG的自然语言理解、LangChain的语言分析和向量数据库的结构化数据检索能力,企业和个人可以高效地获取相关信息。
  • RAG、LangChain和向量数据库之间的合作使内容生成达到了前所未有的水平。
  • 更出色的虚拟助手、直观的聊天机器人和富有见地的数据分析工具成为可能,提升了用户在各种应用中的体验。这种转变确保技术成为人类能力的真正增强。

常见问题

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。