设计原则
当我们启动这个项目时,LangChain 已经变得非常流行,尤其是在 ChatGPT 发布之后。我们一直被问及 prompt flow与 LangChain 之间的区别是什么。这篇文章旨在阐明构建 prompt flow 的原因以及我们所做的深思熟虑的设计选择。简而言之,prompt flow 是一个用于构建 LLM 应用的开发工具套件,强调通过实验来提高质量,而不是一个框架 - 这正是 LangChain 所做的。
虽然 LLM 应用大多处于探索阶段,但微软在这个领域开始得稍早,我们有机会观察开发人员如何将LLMs集成到现有系统中或构建新应用程序。这些宝贵的见解塑造了 prompt flow 的基本设计原则。
曝露提示 vs. 隐藏提示
LLM 应用程序的核心本质在于提示本身,至少在今天是这样。当开发一个相当复杂的LLM应用程序时,大部分的开发工作应该是“调整”提示(请注意我们有意使用了术语“调整”,稍后我们将进一步探讨)。任何试图在这个领域提供帮助的框架或工具都应该专注于使提示调整更容易和更直观。另一方面,提示非常易变,不太可能编写一个可以跨不同模型或甚至相同模型的不同版本工作的单个提示。构建成功的基于 LLM 的应用程序,你必须理解每个提示,以便在需要时进行调整。LLM 根本不足够强大或确定性,以至于你可以像在传统编程语言中使用库一样使用他人编写的提示。
在这种情况下,任何试图通过将几个提示封装在库中的智能功能或代理的设计都不太可能在实际场景中产生良好的结果。而且将提示隐藏在库的代码库中只会使人们很难改进或调整提示以适应其特定需求。
作为一个工具,prompt flow 避免将任何提示包含在其核心代码库中。您将看到提示的唯一位置是我们的示例流,当然,这些示例可供采用和使用。每个提示都应由开发人员自己编写和控制,而不是依赖于我们。
一种新的工作方式
LLM 具有出色的能力,使开发人员能够在不深入研究机器学习复杂性的情况下增强其应用程序。同时,LLM 使这些应用程序更加随机,这为应用程序开发带来了新的挑战。仅仅断言 “没有异常” 或 “结果 == x” 在门控测试中已经不再足够。采用一种新的方法并使用新的工具成为确保 LLM 应用程序质量的基础要素。
在这种范式转变的中心是评估,这是在机器学习领域经常使用的术语,指的是评估训练模型的性能和质量的过程。它涉及测量模型在给定任务或数据集上的表现如何,这在了解模型的优势、劣势和整体效果方面起着关键作用。根据特定任务和问题领域,评估指标和技术各不相同。一些常见的度量标准包括准确性、精确度和召回率,你可能已经熟悉。现在LLM应用程序与机器学习模型相似,它需要一种集成到开发工作流程中的以评估为中心的方法,并提供一组强大的度量标准和评估,以确保LLM应用程序的质量。
prompt flow 提供了一系列工具,以简化新工作方式:
- 将评估程序开发为评估流,以计算应用程序/流的指标,从我们的示例评估流中学习。
- 对应用程序流进行迭代并通过 SDK/CLI 运行评估流,使您能够比较指标并选择发布的最佳候选者。这些迭代包括尝试不同的提示,不同的 LLM 参数,如温度等 - 这在前面被称为“调整”过程,有时被称为实验过程。
- 将评估集成到 CI/CD 管道中,将断言与所选度量标准保持一致。
prompt flow 引入了两个概念性组件来促进这个工作流程:
- 评估流:指示此流不用于部署或集成到您的应用程序中,而用于评估应用程序/流性能的流类型。
- 运行:每次运行流与数据,或运行对流输出的评估时,都会创建一个Run对象来管理历史记录并允许进行比较和附加分析。
尽管新概念引入了额外的认知负担,但我们
坚信它们比抽象不同的 LLM APIs 或矢量数据库 APIs 更为重要。
优化“可见性”
由于LLMs的出现,出现了一些有趣的应用程序模式,如 Retrieval Augmented Generation(RAG)、ReAct等。虽然 LLMs 的工作原理可能对许多开发人员来说仍然是神秘的,但 LLM 应用程序的工作方式并非如此 - 它们基本上涉及一系列对外部服务的调用,例如 LLMs、数据库和搜索引擎,所有这些服务都通过调用 API 紧密连接在一起。从架构上来说,并没有太多新颖之处,像 RAG 和 ReAct 这样的模式在理解了它们是什么之后都是非常简单的 - 纯粹的Python 程序,通过调用外部服务的API完全可以有效地实现目标。
通过观察许多内部用例,我们了解到深入了解执行细节是至关重要的。建立一种系统跟踪与外部系统交互的方法是设计的重点之一。因此,我们采用了一种非传统的方法 - prompt flow 有一个描述如何执行和连接函数调用(我们称之为工具)的 YAML 文件,形成一个有向无环图(DAG)。
这种方法提供了几个关键优势,主要集中在增强可见性方面:
- 在开发过程中,您的流可以以一种直观的方式进行可视化,清晰地识别任何故障组件。作为副产品,您获得了一个架构描述性的图表,可以与其他人共享。
流中的每个节点都以一种一致的方式将其内部详细信息可视化。
可以单独运行或调试单个节点,无需重新运行先前的节点。