SuperAPI AI 工具集

dspy-ruby

编程与开发

查看项目

更新于 10-15 15:12

技能介绍

DSPy.rb 是一个用于构建语言模型应用的 Ruby 框架,采用编程式提示(programmatic prompts)的方式,强调类型安全、模块化与可测试性。它的核心理念是:像构建软件一样构建 LLM 应用,用 Ruby 类型定义你想要的输出,而不是反复微调提示词。

一、用途 DSPy.rb 面向需要以工程化方式开发 LLM 应用的 Ruby 开发者。它把软件工程的最佳实践引入 LLM 开发,适合构建需要类型约束、可复用组件、可评估与可优化的语言模型应用。

二、主要能力

  1. 类型安全的签名(Signatures):使用 Sorbet 类型定义应用与 LLM 之间的输入输出接口,支持枚举(T::Enum)、结构体(T::Struct)等类型。
  2. 模块化组件(Modules):提供 Predict(基础 LLM 调用)、ChainOfThought(逐步推理)、ReAct(使用工具的智能体)、CodeAct(动态代码生成智能体,需安装 dspy-code_act gem)等构建块,可组合复用。
  3. 工具与工具集(Tools & Toolsets):创建类型安全的工具,支持基于枚举的自动类型转换,以及包含多个工具的工具集。
  4. 类型系统与判别器(Discriminators):自动注入 _type 字段以支持联合类型(T.any)的判别,反序列化时递归过滤 _type 字段;_type 为保留字段名,不应自行定义。
  5. 优化(Optimization):提供 MIPROv2(多提示优化,含 bootstrap 采样与贝叶斯优化)和 GEPA(Genetic-Pareto Reflective Prompt Evolution,含反馈映射、实验跟踪与遥测)。
  6. 评估框架(Evaluation):DSPy::Evals 支持内置指标(exact_match、contains、numeric_difference、composite_and)与自定义指标,支持错误处理与批处理。
  7. 事件系统(Events):结构化事件总线,支持模块作用域订阅(scope: :descendants)与全局订阅,支持通配符(如 llm.*),事件名使用点分隔命名空间。
  8. 生命周期回调(Lifecycle Callbacks):每个 DSPy::Module 提供 before、around、after 钩子,执行顺序为 before → around(yield 前)→ forward → around(yield 后)→ after,回调可被继承。
  9. Fiber 本地 LM 上下文:通过 DSPy.with_lm 临时覆盖语言模型;LM 解析优先级为实例级 → Fiber 本地 → 全局。
  10. 存储系统(Storage):DSPy::Storage::ProgramStorage 可持久化与重新加载优化后的程序,支持检查点管理、优化历史跟踪与环境间导入导出。
  11. Schema 格式:支持 JSON Schema(默认)、BAML(schema_format: :baml,需 sorbet-baml gem)、TOON(schema_format: :toon, data_format: :toon)。BAML 与 TOON 仅在 structured_outputs: false 时生效。
  12. Rails 集成:提供目录结构约定(app/entities、app/signatures、app/tools、app/modules、app/services 等)、初始化配置、按角色选择模型(feature flags)等实践。

三、使用方式 安装:在 Gemfile 中加入 gem 'dspy'。 配置:通过 DSPy.configure 设置语言模型,例如 c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY'])。 定义任务:继承 DSPy::Signature,用 input 与 output 块声明字段类型。 调用:使用 DSPy::Predict.new(签名类) 创建预测器,调用 .call 并读取结果字段。 提供商适配器有两种策略:

  • 按提供商适配器(直接 SDK):dspy-openai(OpenAI、OpenRouter、Ollama)、dspy-anthropic(Claude)、dspy-gemini(Gemini),各自引入官方 SDK。
  • 通过 RubyLLM 的统一适配器(多提供商推荐):dspy-ruby_llm 与 ruby_llm,使用 ruby_llm/ 前缀按模型名路由,例如 DSPy::LM.new('ruby_llm/gemini-2.5-flash', structured_outputs: true)。

四、适用场景

  • 需要对 LLM 输出做类型约束与结构化解析的应用。
  • 需要组合、复用 LLM 逻辑的复杂工作流。
  • 需要基于真实数据评估与优化提示的团队。
  • 使用 Rails 并希望按约定组织 LLM 组件的项目。
  • 需要多提供商路由、可观测性(如 Langfuse)与测试(如 VCR)的生产环境。

五、限制与注意事项

  • 部分能力需要额外 gem:CodeAct 需 dspy-code_act,GEPA 需 dspy-gepa,BAML 需 sorbet-baml。
  • BAML 与 TOON 仅在 structured_outputs: false 时生效;structured_outputs: true 时提供商直接接收 JSON Schema。
  • _type 为保留字段名,不应在结构体中自行定义。
  • 文档中未提供具体收费、价格与平台支持范围的完整信息,暂未提供。