作者 | Simon Bisson
策划 | Ethan
Microsoft 的认知搜索 API 现在提供矢量搜索即服务,可与 Azure OpenAI 等中的大型语言模型一起使用。
语义核心、TypeChat和LangChain等工具使得围绕Azure OpenAI等生成式AI技术构建应用程序成为可能。这是因为它们允许对底层大语言模型(LLM)施加约束,将其用作构建和运行自然语言界面的工具
从本质上讲,LLM 是一种用于导航语义空间的工具,其中深度神经网络可以预测从初始提示开始的标记链中的下一个音节。如果提示是开放式的,LLM 可能会超出其输入范围,产生看似合理但实际上完全是无稽之谈的内容。
正如大家倾向于信任搜索引擎的输出一样,我们也倾向于信任LLM的输出,因为我们将它们视为熟悉技术的另一个方面。但是,使用来自维基百科、Stack Overflow 和 Reddit 等网站的可信数据来训练大型语言模型并不能传达对内容的理解;它只是赋予生成文本的能力,该文本遵循与这些来源中的文本相同的模式。有时输出可能是正确的,但有时却是错误的。
我们如何避免大型语言模型的错误和无意义的输出,并确保我们的用户获得准确且合理的查询答案?
我们需要做的是限制LLM,确保它只从更小的数据集生成文本。这是Microsoft基于LLM的新开发堆栈的用武之地。它提供了必要的工具来控制模型并防止其产生错误
你可以通过使用 TypeChat 之类的工具来强制使用特定的输出格式,或者使用 Semantic Kernel 之类的编排管道来处理其他可信信息源,从而有效地将模型“root”在已知的语义空间中,从而约束 LLM。在这里,LLM 可以做它擅长的事情,总结构建的提示并根据该提示生成文本,而不会超限(或至少显着减少发生超限的可能性)。
微软所说的“语义记忆”是最后一种方法的基础。语义记忆使用向量搜索来提供提示,可用于提供 LLM 的事实输出。矢量数据库管理初始提示的上下文,矢量搜索查找与初始用户查询匹配的存储数据,LLM 根据该数据生成文本。在Bing Chat中看到这种方法的实际应用,它使用Bing的本机矢量搜索工具来构建从其搜索数据库中获取的答案
语义记忆使得矢量数据库和矢量搜索成为提供基于LLM的应用程序的手段。您可以选择使用数量不断增加的开源矢量数据库之一,或者将矢量索引添加到您熟悉的SQL和NoSQL数据库中。一款看起来特别有用的新产品扩展了Azure认知搜索,为数据添加了向量索引,并提供了用于查询该索引的新API
Azure 认知搜索是建立在Microsoft自己的搜索工具基础上的。它提供了熟悉的Lucene查询和自己的自然语言查询工具的组合。Azure 认知搜索是一个软件即服务平台,可以托管私有数据,并使用认知服务API来访问内容。最近,Microsoft还添加了对构建和使用向量索引的支持,这使得你可以使用相似性搜索对数据中的相关结果进行排名,并在基于AI的应用程序中使用它们。这使得Azure 认知搜索成为使用Semantic Kernel和Azure OpenAI构建的Azure托管LLM应用程序的理想工具,并且还提供了用于C#和Python的认知搜索的语义内核插件
与其他 Azure 服务一样,Azure 认知搜索是一项托管服务,可与其他 Azure 服务配合使用。它允许你在各种 Azure 存储服务中进行索引和搜索,托管文本、图像、音频和视频。数据存储在多个区域,提供高可用性并减少延迟和响应时间。此外,对于企业应用程序,你可以使用 Microsoft Entra ID(Azure Active Directory 的新名称)来控制对私有数据的访问
需要注意的是,Azure 认知搜索是一项“自带嵌入向量”服务。认知搜索不会为您生成所需的矢量嵌入,因此您需要使用 Azure OpenAI 或 OpenAI embedding API 来为内容创建嵌入。这可能需要将大文件分块处理,以确保您在服务的令牌限制内。在需要时,请准备创建新表来索引向量数据
在 Azure 认知搜索中,矢量搜索使用最近邻模型返回与原始查询相似的文档,数量由用户选择。这个过程通过使用原始查询的向量嵌入来调用向量索引,并从数据库中返回相似的向量和索引内容,以供 LLM 提示准备使用
微软使用这种矢量存储作为Azure机器学习的检索增强生成(RAG)设计模式的一部分,并与其提示流工具配合使用。RAG利用认知搜索中的向量索引来构建构成LLM提示基础的上下文。这为您提供了一种构建和使用向量索引的低代码方法,例如设置查询返回的相似文档的数量
使用 Azure 认知搜索进行矢量查询非常简单。首先在同一区域中为 Azure OpenAI 和认知搜索创建资源。这将允许你以最小的延迟加载带有嵌入的搜索索引。你需要调用 Azure OpenAI API 和认知搜索 API 来加载索引,因此最好通过添加管理重试的代码来确保代码可以响应服务中任何可能的速率限制为你。当你使用服务 API 时,你应该使用异步调用来生成嵌入和加载索引。
向量作为向量字段存储在搜索索引中,其中向量是具有维度的浮点数。这些向量通过分层可导航小世界邻近图进行映射,该图将向量分类到相似向量的邻域中,从而加快了搜索向量索引的实际过程。
在定义了矢量搜索的索引架构之后,你可以将数据加载到认知搜索的索引中。需要注意的是,数据可能与多个向量相关联。举个例子,如果你使用认知搜索来托管公司文档,你可能会有一个用于关键文档元数据术语和文档内容的单独向量。数据集必须以JSON文档的形式存储,这样可以简化使用结果来组合提示上下文的过程。索引不需要包含源文档,因为它支持使用最常见的Azure存储选项
在运行查询之前,你需要首先使用查询正文调用你选择的嵌入模型。这样会返回一个多维向量,你可以用它来搜索你选择的索引。当调用矢量搜索API时,请指定目标矢量索引、所需的匹配项数量以及索引中相关的文本字段。选择适当的相似性度量对查询非常有帮助,其中最常用的是余弦度量
Azure 认知搜索的矢量功能不仅仅是匹配文本。认知搜索能够与多语言嵌入配合使用,以支持跨多种语言的文档搜索。你也可以使用更复杂的 API。例如,你可以在混合搜索中混合使用 Bing 语义搜索工具,以提供更准确的结果,从而提高 LLM 支持的应用程序的输出质量。
微软正在迅速将其用于构建自己的基于GPT-4的Bing搜索引擎以及各种Copilot的工具和技术产品化。Semantic Kernel和Azure AI Studio的提示流等编排引擎是Microsoft使用大型语言模型的核心方法。现在这些基础已经奠定,我们看到该公司推出了更多必要的支持技术。矢量搜索和矢量索引是提供准确响应的关键。通过构建熟悉的工具来提供这些服务,微软将帮助我们将成本和学习曲线降至最低
以上是构建 LLM 应用程序:利用 Azure 认知服务的矢量搜索功能的详细内容。更多信息请关注PHP中文网其他相关文章!