DSPy编程
DSPy 是一种 编写代码而非字符串 的尝试。换句话说,构建正确的控制流至关重要。首先 定义你的任务。系统的输入是什么?系统应该产生什么输出?它是基于你的数据的聊天机器人,还是代码助手?或者是一个翻译系统、用于高亮搜索结果片段,或是生成带引用的报告?
接下来,定义你的初始流水线。你的DSPy程序可以只是一个单一模块,还是需要将其分解为几个步骤?你需要检索或其他工具吗,比如计算器或日历API?解决你的问题是否有一个典型的多步骤工作流程,或者你希望为你的任务使用更开放式的工具与智能体?思考这些问题,但先从简单的开始,也许只用一个dspy.ChainOfThought
模块,然后根据观察逐步增加复杂性。
当你这样做时,精心设计并尝试一些输入示例给你的程序。此时可以考虑使用一个强大的语言模型,或者几个不同的语言模型,以便了解可能的情况。记录你尝试的有趣示例(既包括简单的也包括困难的)。这在之后进行评估和优化时会很有用。
除了鼓励良好的设计模式,DSPy在这里如何提供帮助?
传统提示将基础系统架构与不可移植到新语言模型、目标或流程的偶然选择相耦合。传统提示要求语言模型接收某些输入并生成特定类型的输出(一个签名),以特定方式格式化输入并请求可准确解析的输出形式(一个适配器),要求语言模型应用某些策略,如“逐步思考”或使用工具(一个模块的逻辑),并依赖大量试错来找到正确的方式让每个语言模型执行此操作(一种手动优化形式)。
DSPy 分离了这些关注点,并自动化处理较低层级的问题,直到你需要考虑它们。这让你能够编写更短的代码,同时具备更高的可移植性。例如,如果你使用 DSPy 模块编写程序,你可以更换语言模型或其适配器,而无需更改其余逻辑。或者你可以交换一个模块,比如 dspy.ChainOfThought
,换成另一个,比如 dspy.ProgramOfThought
,而无需修改你的签名。当你准备使用优化器时,同一个程序可以优化其提示或微调其语言模型权重。