目录
乍一看,在代码中调用像 GPT-4 这样的大型语言模型 (LLM) 似乎很简单。API 是单个 REST 调用,接收文本并根据输入返回响应。但在实践中,事情变得比这复杂得多。API 可能最好被认为是一个域边界,您可以在其中提供提示,以定义模型用于交付其输出的格式。但这是一个关键点:LLM可以像你想要的那样简单或复杂。
当我们将AI模型集成到代码中时,我们正在跨越两种不同计算方式之间的界限,就像编程量子计算机的方式与设计硬件一样。在这里,我们将编写有关模型预期行为方式的描述,期望其输出采用提示定义的格式。Semantic Kernel在自然语言和机器语言之间架起了一座桥梁,我们需要Smantic Kernel来包装 LLM API,并提供管理输入和输出的方法,确保模型始终专注于我们定义的提示,并且输出保持相关,从而成为未来的通用操作系统。用户通过LLM可以直接通过自然语言给机器下达指令,不需要额外的训练实现自然语言的人机交互--- 就像是图形视窗改变了计算机的交互,浏览器的出现改变了互联网的交互,LLM 的推广必然改变人类与机器的交互方式。
这是需要强调的重要一点:我们如何与LLM互动与传统编程非常不同。需要的是 Q# 等效项,这是一种在不同域之间进行转换的更高级别的抽象,可帮助我们获取数据并使用它来制作提示,同时提供一种方法来管理调用之间的基本上下文,以避免耗尽对话中的可用令牌,同时仍将输出保留在源数据的基础上。
语义内核简介
微软的第一个LLM包装器,开源的Prompt Engine:https://github.com/microsoft/prompt-engine,目前这个项目的最后更新时间是在10个月前。微软在今年2月份发布了一个更大、更强大的C#工具,用于与Azure OpenAI(以及OpenAI自己的API)一起使用的开源项目,Semantic Kernel:https://github.com/microsoft/semantic-kernel。Semantic Kernel 目前支持C# 和Python, 他有一系列示例应用程序来帮助您入门。
Semantic Kernel名称的选择很有趣,因为它显示了对LLM用途的更好理解。虽然Prompt Engine是关于管理API的输入,但Semantic Kernel的职责范围更广,专注于自然语言输入和输出。Microsoft 将其方法描述为“目标导向的设计”,使用来自用户的初始请求(“询问”)来指导模型,编排传递与模型关联的资源以满足请求,并返回对请求的响应(“获取”)。
因此,将Semantic Kernel称为Kernel是有意义的。它就像是LLM API的操作系统,获取输入,通过使用模型来处理它们,然后返回输出。Kernel在这里的关键是作为业务流程协调器的角色,因为它不仅能够处理当前提示及其关联的令牌,还能够处理内存(键值对、本地存储和矢量或“语义”搜索),与其他信息服务的连接器,以及混合提示和传统代码的预定义技能 。
Semantic Kernel工具提供了更有效的方法来构建和使用围绕Prompt Engine所需的构造类型,从而简化了可能变得相当复杂的编程任务,尤其是在处理上下文和支持包括多次调用LLM API的操作时。
向量和语义记忆
处理用户问题的一个关键要素是记忆的概念。这就是Semantic Kernel管理上下文的方式,使用熟悉的文件和键值存储。但是,还有第三种选择,语义记忆。这种方法接近LLM处理数据的方式,将内容视为向量或嵌入,这是LLM用来表示文本含义的数字数组。类似的文本在与您的模型及其内容关联的整体空间中将具有相似的向量,就像搜索引擎生成排名结果的方式一样。
像 GPT 这样的 LLM 使用这些嵌入式向量来提取提示的上下文,帮助底层模型保持相关性和连贯性。嵌入越好,模型生成纯随机输出的可能性就越小。通过将大型提示分解为可由LLM汇总的文本块,我们可以为每个摘要生成一个嵌入向量,然后使用这些提示来创建复杂的提示,而不会耗尽请求的可用令牌(例如,GPT-4 每个输入限制为 8192 个Token)。
这些数据可以存储在矢量数据库中,以便快速检索。可以为专业知识创建特定的矢量数据库,使用摘要内容来帮助LLM不会迷路。因此,例如,使用 GPT-4 进行医疗病例笔记摘要的应用程序可以使用来自医学论文、合适的匿名笔记和其他相关文本的嵌入的矢量数据库,以确保其输出是连贯的和上下文中的。这种方法在某种程度上解释了为什么微软的第一个基于GPT的大型应用程序是其Bing搜索引擎,因为它已经准备好了适当的矢量数据库可供使用。
连接到外部数据源
Semantic Kernel的一个有趣功能是连接器,因为它们是将现有API与LLM集成的一种方式。例如,可以使用 Microsoft Graph 连接器在电子邮件中自动发送请求的输出,或在组织结构图中生成关系说明。Semantic Kernel应用程序中没有进行调用的设定点; 它可以是输入或输出的一部分,甚至可以是LLM之间调用序列的一部分。您可以从 API 调用生成提示,这些调用本身会生成进一步的 API 调用,也许可以使用基于 Codex 代码的模型将生成的输出注入运行时。
连接器的一个更有趣的功能是它将某种形式的基于角色的访问控制应用于LLM。例如,如果您使用 Microsoft Graph 查询来构造提示,则这些查询将在运行应用程序的用户的上下文中,使用其凭据提供数据。将凭据传递给连接器可确保根据用户自己的数据为用户定制输出。
构建混合提示模板和代码的技能
Semantic Kernel的第三个主要组成部分是技能,它们是混合LLM提示和传统代码的函数容器。这些函数在概念和操作上与 Azure Function类似,可用于将专用提示链接在一起。应用程序可以有一组使用 GPT 生成文本的函数,然后使用该文本作为 Codex 和 DALL-E 从描述转到原型 Web 应用程序的提示(类似于自然语言编程工具在 Microsoft 的低代码和无代码 Power Platform 中的工作方式)。
一旦你的技能、记忆和连接器到位,你就可以开始构建一个由LLM驱动的应用程序,使用技能将请求转换为传递给基础模型的提示。此方法允许您构建灵活的技能,您的代码可以根据需要进行选择和使用。Semantic Kernel区分语义函数,模板化提示和本机函数,即处理数据以用于LLM语义函数的本机计算机代码。一个函数的输出可以链接到另一个函数,从而允许您构建混合本机处理和 LLM 操作的函数管道。
从对Semantic Kernel的简要介绍来看,很明显这是一个强大的工具,但需要仔细思考和规划。可以使用Semantic Kernel来构建和管理复杂的提示以及与输入和输出链一起使用的管道,以提供有趣且有用的结果。当然,当您适当地使用每个元素时,您将获得最佳结果,使用本机代码来处理计算和模型以专注于定向目标。
使用像Semantic Kernel这样的工具来封送和编排输入和函数肯定会使LLM的使用比简单地将提示传递给输入更有效。它将允许您清理输入,指导LLM产生有用的输出。为了帮助您入门,Microsoft 提供了从其业务中构建 LLM 应用程序时学到的最佳实践指南列表(语义 AI 的 Shillace 定律)。它们是有关如何围绕 GPT 等 LLM 构建代码的有用入门,应该可以帮助您从这些新工具和技术中获得尽可能多的价值,同时避免不切实际的期望。