”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 LlamaIndex.ts 和 Azure OpenAI 构建 RAG 应用程序:入门!

使用 LlamaIndex.ts 和 Azure OpenAI 构建 RAG 应用程序:入门!

发布于2024-11-08
浏览:737

随着人工智能继续塑造我们的工作方式以及与技术交互的方式,许多企业正在寻找在智能应用程序中利用自己的数据的方法。如果你使用过 ChatGPT 或 Azure OpenAI 等工具,那么你已经熟悉生成式 AI 如何改进流程并增强用户体验。然而,为了真正定制和相关的响应,您的应用程序需要合并您的专有数据。

这就是检索增强生成 (RAG) 的用武之地,它提供了一种结构化方法,将数据检索与人工智能驱动的响应相集成。借助 LlamaIndex 等框架,您可以轻松地将这种功能构建到您的解决方案中,从而释放业务数据的全部潜力。

Building a RAG app with LlamaIndex.ts and Azure OpenAI: Getting started!

想要快速运行并探索该应用程序?点击这里。

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

检索增强生成 (RAG) 是一种神经网络框架,通过包含检索组件来访问相关信息并集成您自己的数据,从而增强 AI 文本生成。它由两个主要部分组成:

  • Retriever:密集检索器模型(例如,基于 BERT),用于搜索大型文档语料库以查找与给定查询相关的相关段落或信息。
  • 生成器:序列到序列模型(例如,基于 BART 或 T5),它将查询和检索到的文本作为输入,并生成连贯的、上下文丰富的响应。

检索器查找相关文档,生成器使用它们来创建更准确、信息更丰富的响应。这种组合允许 RAG 模型有效地利用外部知识,提高生成文本的质量和相关性。

LlamaIndex 如何实现 RAG?

要使用 LlamaIndex 实现 RAG 系统,请遵循以下一般步骤:

数据摄取:

  • 使用 SimpleDirectoryReader 等文档加载器将文档加载到 LlamaIndex.ts 中,这有助于从 PDF、API 或 SQL 数据库等各种来源导入数据。
  • 使用 SentenceSplitter 将大型文档分解为更小的、可管理的块。

索引创建:

  • 使用 VectorStoreIndex 创建这些文档块的向量索引,从而允许基于嵌入进行高效的相似性搜索。
  • 对于复杂的数据集,可以选择使用递归检索技术来管理分层结构化数据并根据用户查询检索相关部分。

查询引擎设置:

  • 使用asQueryEngine将向量索引转换为查询引擎,并使用similarityTopK等参数来定义应检索多少个顶级文档。
  • 对于更高级的设置,创建一个多代理系统,其中每个代理负责特定文档,并且顶级代理协调整个检索过程。

检索和生成:

  • 通过定义根据用户查询检索相关文档块的目标函数来实现 RAG 管道。
  • 使用 RetrieverQueryEngine 执行实际的检索和查询处理,以及可选的后处理步骤,例如使用 CohereRerank 等工具对检索到的文档重新排名。

作为实际示例,我们提供了一个示例应用程序来演示使用 Azure OpenAI 的完整 RAG 实现。

实用 RAG 示例应用程序

我们现在将重点使用 LlamaIndex.ts(LlamaIndex 的 TypeScipt 实现)和 Azure OpenAI 构建 RAG 应用程序,并将其部署为 Azure 容器应用程序上的无服务器 Web 应用程序。

运行示例的要求

  • Azure Developer CLI (azd):一个命令行工具,可轻松部署整个应用程序,包括后端、前端和数据库。
  • Azure 帐户:您需要一个 Azure 帐户来部署应用程序。获取一个带有一些积分的免费 Azure 帐户即可开始使用。

您将在 GitHub 上找到入门项目。我们建议您分叉此模板,以便您可以在需要时自由编辑它:

Building a RAG app with LlamaIndex.ts and Azure OpenAI: Getting started!

高层架构

入门项目应用程序基于以下架构构建:

  • Azure OpenAI:处理用户查询的 AI 提供程序。
  • LlamaIndex.ts:帮助提取、转换和矢量化内容 (PDF) 以及创建搜索索引的框架。
  • Azure Container Apps:托管无服务器应用程序的容器环境。
  • Azure 托管身份:确保一流的安全性并消除处理凭据和 API 密钥的需要。

Building a RAG app with LlamaIndex.ts and Azure OpenAI: Getting started!

有关部署哪些资源的更多详细信息,请检查我们所有示例中提供的 infra 文件夹。

用户工作流程示例

示例应用程序包含两个工作流程的逻辑:

  1. 数据摄取:获取数据、向量化并创建搜索索引。如果您想添加更多文件,例如 PDF 或 Word 文件,您应该在此处添加它们。

      npm run generate
    
  2. 服务提示请求:应用程序接收用户提示,将其发送到 Azure OpenAI,并使用向量索引作为检索器来增强这些提示。

运行示例

运行示例之前,请确保您已预配必要的 Azure 资源。

要在 GitHub Codespace 中运行 GitHub 模板,只需单击
Building a RAG app with LlamaIndex.ts and Azure OpenAI: Getting started!

在您的 Codespaces 实例中,从终端登录您的 Azure 帐户:

azd auth login

使用单个命令配置、打包示例应用程序并将其部署到 Azure:

azd up

要在本地运行并尝试应用程序,请安装 npm 依赖项并运行应用程序:

npm install
npm run dev

应用程序将在您的 Codespaces 实例中的端口 3000 或浏览器中的 http://localhost:3000 上运行。

结论

本指南演示了如何使用 LlamaIndex.ts 和 Azure OpenAI 构建部署在 Microsoft Azure 上的无服务器 RAG(检索增强生成)应用程序。通过遵循本指南,您可以利用 Azure 的基础架构和 LlamaIndex 的功能来创建强大的 AI 应用程序,这些应用程序可根据您的数据提供上下文丰富的响应。

我们很高兴看到您使用这个入门应用程序构建的内容。请随意 fork 它并喜欢 GitHub 存储库以接收最新的更新和功能。

版本声明 本文转载于:https://dev.to/azure/building-a-rag-app-with-llamaindexts-and-azure-openai-getting-started-3pgb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-03-07
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-03-07
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-03-07
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-03-07
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-03-07
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-03-07
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-03-07
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-03-07
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-03-07
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-03-07
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-03-07
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-07
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-03-07
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-03-07
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-03-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3