AI 模型与平台

LlamaIndex:使用自定义数据轻松增强LLM应用程序

mm
将 Unite.AI 添加到您在 Google 上的首选来源

像OpenAI的GPT系列这样的大型语言模型(LLM)已经在各种公开可访问的数据上进行了训练,展示了它们在文本生成、摘要、问答和规划方面的出色能力。尽管它们具有多功能性,但一个经常被提出的问题是如何将这些模型与自定义的私有或专有数据无缝集成。

企业和个人都被大量的独特和自定义数据淹没,这些数据通常存储在诸如Notion、Slack和Salesforce等各种应用程序中,或者存储在个人文件中。为了利用LLM处理这些特定数据,已经提出了并尝试了几种方法。

微调代表了一种这样的方法,它涉及调整模型的权重以纳入特定数据集的知识。然而,这个过程并非没有挑战。它需要大量的数据准备工作,并且需要一个具有挑战性的优化过程,需要一定的机器学习专业知识。此外,尤其是在处理大型数据集时,财务影响可能会很显著。

上下文学习已经成为一种替代方法,优先考虑输入和提示的制作,以便为LLM提供生成准确输出所需的上下文。这一方法减少了对大量模型重新训练的需求,提供了一种更高效和更易用的方式来集成私有数据。

但是,这种方法的缺点是它依赖于用户在提示工程方面的技能和专业知识。另外,上下文学习可能不如微调那么精确或可靠,尤其是在处理高度专业或技术数据时。模型的预训练基于互联网文本的广泛范围,并不能保证对特定术语或上下文的理解,这可能导致输出不准确或不相关。这在私有数据来自特定领域或行业时尤其成问题。

此外,单个提示中可以提供的上下文数量是有限的,随着任务复杂性的增加,LLM的性能可能会下降。还有数据隐私和安全性的挑战,因为提供的提示中的信息可能是敏感或机密的。

随着社区探索这些技术,像LlamaIndex这样的工具正在引起关注。

Llama Index

Llama Index

它由Jerry Liu创立,他是一位前Uber研究科学家。在去年秋天尝试使用GPT-3时,Liu注意到该模型在处理私有数据(如个人文件)方面的局限性。这一观察导致了开源项目LlamaIndex的开始。

该项目已经吸引了投资者,在最近的一轮种子资金中获得了850万美元的资金。

LlamaIndex实现了LLM与自定义数据的增强,弥合了预训练模型和自定义数据用例之间的差距。通过LlamaIndex,用户可以利用自己的数据与LLM一起工作,解锁带有个性化见解的知识生成和推理。

用户可以无缝地为LLM提供自己的数据,创造一个知识生成和推理深度个性化和富有洞察力的环境。LlamaIndex通过提供一个更用户友好和安全的数据交互平台来解决上下文学习的局限性,确保即使对于机器学习专业知识有限的人也能利用LLM的全部潜力与私有数据合作。

高级概念和见解

1. 检索增强生成(RAG):

LlamaIndex RAG

LlamaIndex RAG

RAG是一种两阶段的过程,旨在将LLM与自定义数据相结合,从而增强模型生成更准确和更具信息的响应的能力。该过程包括:

  • 索引阶段:这是准备阶段,知识库的基础在此阶段奠定。
LlamaIndex INDEXES

LlamaIndex Indexing

  • 查询阶段:在这里,知识库被搜索以找到相关的上下文,以帮助LLM回答查询。
LlamaIndex QUERY STAGE

LlamaIndex Query Stage

使用LlamaIndex的索引之旅:

  • 数据连接器:可以将数据连接器视为数据的护照,用于将数据从各种来源和格式导入到LlamaIndex中。数据连接器可以在LlamaHub中找到,LlamaHub是一个开源存储库,包含数据加载器。这些加载器旨在易于集成,提供与任何LlamaIndex应用程序的插件式体验。
Llama hub

LlamaIndex hub (https://llamahub.ai/)

  • 文档/节点:文档就像一个通用的手提箱,可以容纳各种数据类型,例如PDF、API输出或数据库条目。另一方面,节点是文档中的一个片段或“块”,用元数据和与其他节点的关系进行了增强,以确保后续数据检索的坚实基础。
  • 数据索引:在数据摄取后,LlamaIndex会将数据索引到可检索的格式。幕后,它将原始文档分解为中间表示形式,计算向量嵌入,并推断元数据。在索引中,’VectorStoreIndex’通常是首选。

LlamaIndex中的索引类型:组织数据的关键

LlamaIndex提供了不同类型的索引,每种索引都有不同的需求和用例。在这些索引的核心是上面讨论的“节点”。让我们尝试了解LlamaIndex索引及其机制和应用。

1. 列表索引:

  • 机制:列表索引将节点按顺序排列,如列表一样。在将输入数据分解为节点后,它们以线性方式排列,准备好被顺序或通过关键字或嵌入查询。
  • 优势:当需要顺序查询时,此索引类型会发挥作用。LlamaIndex确保利用所有输入数据,即使超过LLM的令牌限制,也会智能地从每个节点查询文本并在遍历列表时完善答案。

2. 向量存储索引:

  • 机制:在这里,节点转换为向量嵌入,存储在本地或专用的向量数据库中,如Milvus。当查询时,它会检索最相似的前k个节点,并将它们传递给响应合成器。
  • 优势:如果您的工作流依赖于通过向量搜索的语义相似性,则可以使用此索引。

3. 树索引:

  • 机制:在树索引中,输入数据演变成树结构,从叶节点(原始数据块)自下而上构建。父节点作为叶节点的摘要出现,使用GPT构建。在查询时,树索引可以从根节点遍历到叶节点,或直接从选定的叶节点构造响应。
  • 优势:使用树索引,可以更高效地查询长文本块,并简化了从各种文本段中提取信息的过程。

4. 关键字索引:

  • 机制:关键字索引的核心是一个将关键字映射到节点的映射。当查询时,关键字从查询中提取,并且仅检索映射的节点。
  • 优势:当您有明确的用户查询时,可以使用关键字索引。例如,筛选与COVID-19相关的医疗文件变得更加高效。

安装LlamaIndex

安装LlamaIndex是一个直接的过程。您可以选择直接从Pip安装或从源代码安装。(确保在系统中安装了Python或使用Google Colab)

1. 从Pip安装:

  • 执行以下命令:
    pip install llama-index
  • 注意:在安装过程中,LlamaIndex可能会下载和存储某些包(如NLTK和HuggingFace)的本地文件。要指定这些文件的目录,请使用“LLAMA_INDEX_CACHE_DIR”环境变量。

2. 从源代码安装:

  • 首先,从GitHub克隆LlamaIndex存储库:
    git clone https://github.com/jerryjliu/llama_index.git
  • 一旦克隆完成,导航到项目目录。
  • 您需要Poetry来管理包依赖项。
  • 现在,使用Poetry创建一个虚拟环境:
    poetry shell
  • 最后,使用以下命令安装核心包要求:
    poetry install

为LlamaIndex设置您的环境

1. OpenAI设置:

  • 默认情况下,LlamaIndex使用OpenAI的gpt-3.5-turbo进行文本生成和text-embedding-ada-002进行检索和嵌入。
  • 要使用此设置,您需要拥有OPENAI_API_KEY。通过在OpenAI网站注册并创建新的API令牌来获取一个。
  • 您有灵活性来根据项目需求自定义底层的大型语言模型(LLM)。根据您的LLM提供商,您可能需要额外的环境密钥和令牌。

2. 本地环境设置:

  • 如果您更喜欢不使用OpenAI,LlamaIndex会自动切换到本地模型,即LlamaCPPllama2-chat-13B用于文本生成,以及BAAI/bge-small-en用于检索和嵌入。
  • 要使用LlamaCPP,请按照提供的安装指南进行操作。确保安装llama-cpp-python包,理想情况下应编译以支持您的GPU。这种设置将在CPU和GPU上使用大约11.5GB的内存。
  • 对于本地嵌入,请执行pip install sentence-transformers。这种本地设置将使用大约500MB的内存。

通过这些设置,您可以根据项目需求和资源定制环境,以利用OpenAI的力量或在本地运行模型。

使用LlamaIndex和OpenAI的简单用例:查询网页

以下是Python脚本的示例,演示如何查询网页以获取特定见解:

!pip install llama-index html2text


<p>import os
from llama_index import VectorStoreIndex, SimpleWebPageReader</p>

<p># 输入您的OpenAI密钥:
os.environ["OPENAI_API_KEY"] = ""</p>

<p># 您要加载到向量存储中的URL:
url = "http://www.paulgraham.com/fr.html"</p>

<p># 将URL加载到文档(可能有多个文档)中:
documents = SimpleWebPageReader(html_to_text=True).load_data([url])</p>

<p># 从文档创建向量存储:
index = VectorStoreIndex.from_documents(documents)</p>

<p># 创建查询引擎以便询问问题:
query_engine = index.as_query_engine()</p>

<p># 提出问题并打印答案:
response = query_engine.query("Paul为筹集资金提出的三个最佳建议是什么?")
print(response)
Paul为筹集资金提出的三个最佳建议是:
1. 从低数字开始。这样可以提供灵活性,并增加筹集更多资金的机会。
2. 如果可能,努力实现盈利。拥有实现盈利的计划,使初创企业对投资者更具吸引力。
3. 不要优化估值。虽然估值很重要,但它并不是筹集资金的最关键因素。专注于获取必要的资金,并找到好的投资者。
Google Colab Llama Index Notebook

Google Colab Llama Index Notebook

使用此脚本,您已经创建了一个强大的工具,可以通过简单地提问来从网页中提取特定见解。这只是使用LlamaIndex和OpenAI查询网页数据时可以实现的功能的一瞥。

LlamaIndex与Langchain:根据您的目标进行选择

您的选择取决于项目的目标。如果您想开发一个智能搜索工具,LlamaIndex是一个不错的选择,因为它擅长作为数据检索的智能存储机制。另一方面,如果您想创建一个具有插件功能的类似ChatGPT的系统,Langchain是您的首选。它不仅可以处理多个ChatGPT和LlamaIndex实例,还可以通过构建多任务代理来扩展功能。例如,使用Langchain,您可以创建能够执行Python代码的同时进行Google搜索的代理。简而言之,虽然LlamaIndex擅长处理数据,但Langchain则编排多个工具以提供整体解决方案。

LlamaIndex Logo Artwork created using Midjourney

LlamaIndex Logo Artwork created using Midjourney

我已经沉浸在了令人着迷的机器学习和深度学习世界中五年了。我的热情和专业知识让我为超过50个不同的软件工程项目做出了贡献,特别关注AI/ML。我的持续的好奇心也让我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。