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