宣布 LlamaCloud 全面上市(以及我们的 1900 万美元 A 轮融资)!
LlamaIndex

Wassim Chegham 2024-08-27

使用 LlamaIndex 和 Azure OpenAI 构建无服务器 RAG 应用

使用 LlamaIndex 和 Azure OpenAI 并部署到 Microsoft Azure 的 RAG 应用创建入门指南。

如果您正在阅读本文,您很可能已经使用过 ChatGPT 或 Azure OpenAI 等生成式 AI。您可能已利用它来改进您的日常工作流程,或者将 AI 集成到您的应用中以提供更好的客户体验。

理想情况下,您希望智能应用在向客户提供响应时使用您自己的业务数据。为满足此需求,您的应用需要实现一种称为检索增强生成 (RAG) 的架构。LlamaIndex 是一个出色的框架,可以帮助您实现这一目标,这也是本文的重点。

在本文中,您将了解

  • RAG 架构以及 LlamaIndex 如何帮助您实现 RAG 多代理应用。
  • 示例 LlamaIndex 应用的架构。
  • 使用 Azure Developer CLI (azd) 将 LlamaIndex 应用部署到 Microsoft Azure。

什么是 RAG - 检索增强生成?

检索增强生成 (RAG) 是一个框架,通过结合两个关键组件来改进 AI 文本生成

  • 检索器:此部分搜索大量文档以查找与给定查询相关的有用信息。
  • 生成器:此模型使用检索到的信息生成更准确且上下文更丰富的响应。

通过结合这两个组件,RAG 允许 AI 模型引入外部知识,从而生成更高质量且更相关的响应。

LlamaIndex 如何实现 RAG?

要使用 LlamaIndex 实现 RAG 系统,您可以按照以下一般步骤进行,其中包括设置数据摄取和生成组件

  1. 数据摄取
    • 使用文档加载器(例如 SimpleDirectoryReader)将您的文档加载到 LlamaIndex 中。例如,此读取器有助于从各种来源(例如 PDF、API 或 SQL 数据库)导入数据。
    • 使用 SentenceSplitter 将大型文档分解成更小、更易管理的块。
  2. 索引创建
    • 使用 VectorStoreIndex 为这些文档块创建向量索引。这使得基于嵌入的相似性搜索高效。
    • 可选地,对于复杂的数据集,您可以使用递归检索技术来管理分层结构化数据并根据用户查询检索相关部分。
  3. 查询引擎设置
    • 使用 asQueryEngine 将向量索引转换为查询引擎,并使用 similarityTopK 等参数来定义应检索多少个排名靠前的文档。
    • 对于更高级的设置,使用代理。创建一个多代理系统,其中每个代理负责特定文档,并且顶级代理协调整个检索过程。
  4. 检索与生成
    • 通过定义一个目标函数来实施 RAG 管道,该函数接收用户查询并检索相关的文档块。此函数还可以评估检索到的块,以确保它们与用户的查询匹配。
    • 使用 RetrieverQueryEngine 执行实际的检索和查询处理。这可以包括额外的后处理步骤,例如使用 CohereRerank 等工具对检索到的文档进行重新排名。

为了方便您实践,我们提供了一个示例应用,演示了使用 Azure OpenAI 作为 AI 提供商的完整 RAG 实现。

实践性 RAG 示例应用

在本文的其余部分,我们将重点介绍使用 LlamaIndex 和 Azure OpenAI 在 Azure 上构建 RAG 类型应用这一用例。您将使用提供的入门模板之一:TypeScript 或 Python。

运行示例的要求

首先,我们解释一下您需要准备什么

  • Azure Developer CLI (azd):这是一个 CLI(命令行工具),可以轻松部署您的整个应用,包括后端、前端、数据库等。您可以将 azd 与可扩展的蓝图模板一起使用,这些模板包含了在 Azure 上启动和运行应用所需的一切。
  • Azure 帐户:您需要一个 Azure 帐户来部署。获取免费的 Azure 帐户,您将获得一些免费的 Azure 信用额度以开始使用
  • 示例:我们创建了两个示例,将在 Azure 上部署 RAG 类型应用。azd 入门模板旨在帮助您通过几个简单的步骤创建使用 LlamaIndex 和 Azure OpenAI 的无服务器 RAG 应用。我们将重点介绍基于出色的 create-llama 工具创建的两个示例应用。

1. 对于 TypeScript:https://github.com/Azure-Samples/llama-index-javascript 

2. 对于 Python:https://github.com/Azure-Samples/llama-index-python 

高级架构

这两个示例应用均基于相同的架构构建

应用的架构依赖于以下服务和组件

  • Azure OpenAI 是我们向其发送用户查询的 AI 提供商。
  • LlamaIndex 是一个框架,可帮助我们摄取、转换内容(PDF 文件)并将其向量化,并从数据创建搜索索引。
  • Azure Container Apps 是托管应用的容器环境。
  • Azure Managed Identity 有助于我们确保一流的安全性,并消除了作为开发人员处理凭据和 API 密钥的要求。

要了解在 Azure 上部署哪些云资源,请查看我们所有示例中提供的 infra 文件夹

用户工作流程示例

示例应用包含以下两个工作流程的逻辑代码

1. 数据摄取,在此过程中抓取数据并将其向量化,然后创建搜索索引。向量索引存储在 cache 子文件夹中。数据本身存储在 data 文件夹中。如果您想添加更多文件,例如其他 PDF 或 Word 文件,应将其添加到此处。存在现有的向量索引,但如果需要生成新的索引(如果您更改了 data 文件夹的内容),则可以运行以下命令

npm run generate

此命令将调用 TypeScript 中的以下代码

async function generateDatasource() { 
  console.log(`Generating storage context...`); 
  // Split documents, create embeddings and store them in the storage context 
  const ms = await getRuntime(async () => { 
    const storageContext = await storageContextFromDefaults({ 
      persistDir: STORAGE_CACHE_DIR, 
    }); 
    const documents = await getDocuments(); 
    await VectorStoreIndex.fromDocuments(documents, { 
      storageContext, 
    }); 
  }); 

或 Python 中的代码

cd backend 
poetry run generate 

这将调用此代码

def generate_datasource(): 
    init_settings() 
    logger.info("Creating new index") 
    storage_dir = os.environ.get("STORAGE_DIR", "storage") 
    # load the documents and create the index 
    documents = get_documents() 
    index = VectorStoreIndex.from_documents( 
        documents, 
    ) 
    # store it for later 
    index.storage_context.persist(storage_dir) 
    logger.info(f"Finished creating new index. Stored in {storage_dir}") 

2. 提供提示请求服务。在应用的此部分中,我们接收用户输入(即提示),这些输入会发送到 Azure OpenAI。为了增强这些提示,会创建一个聊天引擎,该引擎由连接到 LLM 和作为检索器加载的向量索引组成。配置对 Azure OpenAI 的访问权限非常简单,只需几行代码即可。

在 TypeScript 中

const credential = new DefaultAzureCredential(); 
  const azureADTokenProvider = getBearerTokenProvider( 
    credential, 
    "https://cognitiveservices.azure.com/.default", 
  ); 
  
  const azure = { 
    azureADTokenProvider, 
    deployment: "gpt-35-turbo", 
  }; 

  Settings.llm = new OpenAI({ azure }); 

或在 Python 中

credential = DefaultAzureCredential() 
token_provider = get_bearer_token_provider( 
  credential,  
  "https://cognitiveservices.azure.com/.default"
) 
llm_config = { 
  "engine": llm_deployment, 
  "azure_endpoint": azure_openai_endpoint, 
  "azure_ad_token_provider": token_provider, 
  "use_azure_ad": True, 
  "temperature":float(os.getenv("LLM_TEMPERATURE", DEFAULT_TEMPERATURE)), 
  "max_tokens": int(max_tokens) if max_tokens is not None else None, 
} 

Settings.llm = AzureOpenAI(**llm_config) 

在此示例中,我们使用 @azure/identity Node.js 或 PyPI 包并导入 DefaultAzureCredential 链式凭据策略,该策略根据当前环境中的可用内容,无缝检查并使用现有 Azure 会话中的有效令牌,而无需更改您的代码。

当您的应用托管在 Azure 中时,托管标识也用于在生产环境中实现无缝身份验证。

JavaScript 示例中使用的重要包

以下是解决方案中使用的一些值得提及的包。有关所有使用包的详细列表,请查看 package.json 文件

  • llamaindex 核心库提供连接到 LLM 的核心功能,并简化向量索引创建等。
  • @llamaindex/pdf-viewer 用于从 PDF 中检索结构化信息,例如表格、列表、段落等,并且是分块过程的一部分,在此过程中数据被分成更小的片段(例如块),每个块都转换为向量化形式,以便以后用于语义比较。
  • 如前所述,@azure/identity 用于使用 Azure Managed Identity 连接到 Azure(托管标识意味着 Azure 通过 Microsoft EntraID 为您处理身份,而不是使用安全性较低的 API 密钥)。

Python 示例中使用的重要包

Python 示例使用 Poetry 进行依赖管理和安装。有关所有使用包的详细列表,请查看 pyproject.toml 文件

  • llamaindex 核心 Python 库提供连接到 LLM 的核心功能,并简化向量索引创建等。
  • FastAPI 是一个 Python Web 框架,用于创建接收用户输入并返回响应的 API。
  • Python azure-identity 包用于使用 Azure Managed Identity 连接到 Azure(托管标识意味着 Azure 通过 Microsoft EntraID 为您处理身份,而不是使用安全性较低的 API 密钥)。

运行示例

在运行任何示例和使用 Azure OpenAI 之前,值得一提的是您需要预配必要的 Azure 资源。

您可以使用 GitHub Codespaces 运行这些模板。按照这些链接操作,然后单击“Create codespace”(创建 Codespace),即可在浏览器中启动一个 VS Code 实例(构建容器可能需要几分钟)。

对于 TypeScript:https://github.com/Azure-Samples/llama-index-javascript

对于 Python:https://github.com/Azure-Samples/llama-index-python

1. 在您的 Codespaces 实例中打开一个终端窗口。

2. 输入以下命令登录您的 Azure 帐户

azd auth login

3. 运行以下命令以在 Azure 上预配、打包和部署示例应用

azd up

命令完成后,您应该会在终端中看到指示成功的输出。

恭喜!此时,您应该可以通过提供的 URL 端点访问您部署的应用。要在本地运行和开发应用,您需要

4. 运行以下命令以安装应用依赖项并运行应用

npm install

npm run dev

这将在您的 Codespaces 实例中或在您本地浏览器中打开应用,使用默认端口 3000 或 http://localhost:3000。您应该会看到您的应用如下所示呈现

注意:如果您想在 VS Code 开发容器中或直接在文件系统中本地运行这些示例,示例中的 README 文件包含了有关工具和要求的详细信息。

接下来是什么?

本指南演示了如何使用 LlamaIndex 和 Azure OpenAI 构建无服务器 RAG(检索增强生成)应用,并将其部署到 Microsoft Azure。提出的关键论点是,将您自己的业务数据集成到 AI 应用中可以提高响应的相关性和质量,这是为客户提供服务的智能应用的关键需求。

在本文中,我们阐述了使用 LlamaIndex 实现 RAG 架构的过程,详细介绍了从数据摄取和索引创建到查询引擎设置和 Azure 部署的步骤。按照本指南操作,您可以利用 Azure 强大的基础架构和 LlamaIndex 的功能创建强大的 AI 应用,这些应用可根据您的数据提供上下文丰富的响应。

通过部署到 Azure,您还可以从可伸缩性、安全性和易管理性中受益,从而强化了 RAG 模型在现实场景中的实际应用。

我们很高兴看到您使用这些示例应用能构建出什么。欢迎随意分叉并点赞 GitHub 存储库,以便接收最新的更改和新功能。