跳到内容

在 DSPy 中编程

DSPy 致力于编写代码而非字符串。换句话说,构建正确的控制流至关重要。首先,定义你的任务。你的系统输入是什么?你的系统应该产生什么输出?是基于你的数据构建的聊天机器人,还是代码助手?或者是一个翻译系统、一个用于高亮搜索结果片段的系统,亦或是用于生成带引用的报告的系统?

接下来,定义你的初始流程(pipeline)。你的 DSPy 程序可以只是一个模块,还是需要将其分解为几个步骤?你需要检索或其他工具,例如计算器或日历 API 吗?你的问题是否有典型的多步骤解决方法,或者你希望使用 agents 实现更开放的工具使用?思考这些问题,但先从简单的开始,也许只使用一个 dspy.ChainOfThought 模块,然后根据观察逐步增加复杂性。

在此过程中,构建并尝试几个你的程序的输入示例。此时可以考虑使用一个强大的语言模型,或者几个不同的语言模型,只为了了解可能性。记录你尝试过的有趣的(包括简单和困难的)示例。这在你稍后进行评估和优化时会很有用。

除了鼓励良好的设计模式之外,DSPy 在这方面有何帮助?

传统的提示词将你的基本系统架构与一些偶然的选择耦合在一起,这些选择对新的语言模型、目标或流程不可移植。一个传统的提示词要求语言模型接收一些输入并产生特定类型的输出(一个签名),以特定方式格式化输入并请求可准确解析的输出形式(一个适配器),要求语言模型应用某些策略(如“逐步思考”)或使用工具(一个模块的逻辑),并依赖大量的反复试验来发现如何正确地要求每个语言模型执行此操作(一种手动优化形式)。

DSPy 将这些关注点分离,并在你需要考虑它们之前自动处理较低层面的问题。这使你能够编写更短的代码,并具有更高的可移植性。例如,如果你使用 DSPy 模块编写程序,可以在不改变其余逻辑的情况下更换语言模型或其适配器。或者你可以用另一个模块(如 dspy.ProgramOfThought)替换一个模块(如 dspy.ChainOfThought),而无需修改你的签名。当你准备好使用优化器时,同一个程序可以进行提示词优化或语言模型权重微调。