使用可组合、类型安全的模块,以地道的 Ruby 方式构建可靠的 LLM 应用程序。
DSPy.rb 是斯坦福大学 DSPy 的 Ruby 移植版。你无需再与脆弱的提示字符串作斗争,只需定义类型化的签名,剩下的交给框架处理。提示即函数,LLM 调用变得可预测。
require 'dspy'
DSPy.configure do |c|
c.lm = DSPy::LM.new('openai/gpt-4o-mini', api_key: ENV['OPENAI_API_KEY'])
end
class Summarize < DSPy::Signature
description "用一句话总结给定的文本。"
input do
const :text, String
end
output do
const :summary, String
end
end
summarizer = DSPy::Predict.new(Summarize)
result = summarizer.call(text: "DSPy.rb 将结构化的 LLM 编程带到了 Ruby...")
puts result.summary
就是这样。无需提示模板,无需 JSON 解析,无需祈祷式的错误处理。
# Gemfile
gem 'dspy'
gem 'dspy-openai' # 用于 OpenAI、OpenRouter 或 Ollama
# gem 'dspy-anthropic' # 用于 Claude
# gem 'dspy-gemini' # 用于 Gemini
# gem 'dspy-ruby_llm' # 用于通过 RubyLLM 支持 12+ 个提供商
bundle install
# OpenAI
DSPy.configure do |c|
c.lm = DSPy::LM.new('openai/gpt-4o-mini',
api_key: ENV['OPENAI_API_KEY'],
structured_outputs: true)
end
# Anthropic Claude
DSPy.configure do |c|
c.lm = DSPy::LM.new('anthropic/claude-sonnet-4-20250514',
api_key: ENV['ANTHROPIC_API_KEY'])
end
# Google Gemini
DSPy.configure do |c|
c.lm = DSPy::LM.new('gemini/gemini-2.5-flash',
api_key: ENV['GEMINI_API_KEY'])
end
# Ollama (本地,免费)
DSPy.configure do |c|
c.lm = DSPy::LM.new('ollama/llama3.2')
end
# OpenRouter (200+ 模型)
DSPy.configure do |c|
c.lm = DSPy::LM.new('openrouter/deepseek/deepseek-chat-v3.1:free',
api_key: ENV['OPENROUTER_API_KEY'])
end
签名是 LLM 操作的类型化契约。定义输入、输出,让 DSPy 处理提示:
class Classify < DSPy::Signature
description "对给定句子的情感进行分类。"
class Sentiment < T::Enum
enums do
Positive = new('positive')
Negative = new('negative')
Neutral = new('neutral')
end
end
input do
const :sentence, String, description: '要分析的句子'
end
output do
const :sentiment, Sentiment
const :confidence, Float
end
end
classifier = DSPy::Predict.new(Classify)
result = classifier.call(sentence: "这本书读起来超级有趣!")
result.sentiment # => #<Sentiment::Positive>
result.confidence # => 0.92
对于复杂的推理,使用 ChainOfThought 来获取分步解释:
solver = DSPy::ChainOfThought.new(MathProblem)
result = solver.call(problem: "如果一列火车在 2 小时内行驶 120 公里,它的速度是多少?")
result.reasoning # => "速度 = 距离 / 时间 = 120公里 / 2小时 = 60公里/小时"
result.answer # => "60 公里/小时"
构建使用工具来完成任务的智能体:
class SearchTool < DSPy::Tools::Base
tool_name "search"
tool_description "搜索信息"
sig { params(query: String).returns(String) }
def call(query:)
# 你的搜索实现
"结果 1, 结果 2"
end
end
agent = DSPy::ReAct.new(ResearchTask, tools: [SearchTool.new], max_iterations: 5)
result = agent.call(question: "关于 Ruby 3.4 的最新消息是什么?")
核心模块:Predict、ChainOfThought、ReAct 智能体以及可组合的管道。
类型安全:基于 Sorbet 的运行时验证。枚举、联合类型、嵌套结构体——全部支持。
多模态:使用 DSPy::Image 进行图像分析,适用于支持视觉的模型。
可观测性:通过 OpenTelemetry 实现零配置的 Langfuse 集成。非阻塞,生产就绪。
优化:MIPROv2(贝叶斯优化)和 GEPA(遗传进化)用于提示调优。
提供商支持:通过官方 SDK 支持 OpenAI、Anthropic、Gemini、Ollama 和 OpenRouter。
完整文档 — 快速入门、核心概念、高级模式。
llms.txt — 面向 AI 助手的 LLM 友好参考。
提供了一个 Claude 技能 来帮助你构建 DSPy.rb 应用程序:
# Claude Code — 从 vicentereig/engineering 市场安装
claude install-skill vicentereig/engineering --skill dspy-rb
对于 Claude.ai Pro/Max,下载 技能 ZIP 文件 并通过 设置 > 技能 上传。
examples/ 目录包含常见模式的可运行代码:
bundle exec ruby examples/basic_search_agent.rb
DSPy.rb 附带了一些具有较重依赖项的功能的兄弟 gem。按需添加:
| Gem | 功能 |
|---|---|
dspy-datasets |
数据集助手,Parquet/Polars 工具 |
dspy-evals |
带有指标和回调的评估工具 |
dspy-miprov2 |
用于提示调优的贝叶斯优化 |
dspy-gepa |
遗传-帕累托提示进化 |
dspy-o11y-langfuse |
自动配置 Langfuse 追踪 |
dspy-code_act |
思考-编码-观察智能体 |
dspy-deep_search |
生产级 DeepSearch 与 Exa |
请在文档中查看 完整列表。
反馈非常宝贵。如果你遇到问题,请 提交一个 issue。对于建议,请 发起一个讨论。
想贡献代码?请联系:hey at vicente.services
MIT 许可证。