← Back to Docs

FullDspy

Documentation for fullDspy from the Dspex repository.

DSPex: Comprehensive DSPy Bridge for Elixir

Executive Summary

This document outlines the design for a comprehensive Elixir bridge to DSPy that goes far beyond the current signature-only implementation. Based on analysis of the DSPy codebase, this design covers the complete API surface needed for production ML pipelines in Elixir.

Current Implementation Status

✅ Currently Implemented (Signatures Only)

  • Basic signature definition and validation system
  • Python bridge with pooled workers (V3 architecture)
  • Simple program execution via Python port communication
  • Mock adapters for testing
  • 3-layer testing infrastructure

🚧 Proposed Comprehensive Bridge

The full DSPy bridge should expose all major DSPy functionality through idiomatic Elixir APIs while maintaining the performance advantages of the current pooling architecture.

Core Architecture Design

Layer 1: Elixir API Surface

# Top-level namespace organization
DSPex                    # Main configuration and lifecycle
DSPex.Signatures         # Type-safe signature system
DSPex.Modules           # Prediction and reasoning modules
DSPex.Optimizers        # Training and optimization algorithms
DSPex.Clients           # Language model and embedding clients
DSPex.Retrievers        # Information retrieval systems
DSPex.Evaluation        # Evaluation framework and metrics
DSPex.Streaming         # Real-time response handling
DSPex.Utils             # Caching, serialization, callbacks

Layer 2: Python Bridge Enhancement

DSPex.PythonBridge.Enhanced    # Enhanced bridge with full DSPy API support
DSPex.PythonBridge.StateManager # Persistent state management across workers
DSPex.PythonBridge.Serializer   # Advanced serialization for complex objects
DSPex.PythonBridge.Cache        # Distributed caching layer

Layer 3: Ash Framework Integration

DSPex.Ash.Domain         # Ash domain for ML entities
DSPex.Ash.Resources      # Resources for Programs, Datasets, Experiments
DSPex.Ash.DataLayer      # Custom data layer bridging DSPy state
DSPex.Ash.Actions        # Custom actions for ML operations

Detailed API Design

1. Enhanced Signature System

defmodule DSPex.Signatures do
  @moduledoc """
  Enhanced signature system supporting all DSPy signature features.
  """

  # Current basic signature
  signature question: :string -> answer: :string

  # Enhanced with field descriptions and constraints
  signature question: {:string, desc: "The user's question"} -> 
    answer: {:string, desc: "A comprehensive answer"},
    confidence: {:float, desc: "Confidence score 0-1", range: {0.0, 1.0}}

  # Complex types with validation
  signature document: :string,
           context: {:list, :string, min_items: 1} ->
           summary: {:string, max_length: 500},
           entities: {:list, :entity},
           reasoning: :reasoning_chain,
           metadata: {:map, optional: true}
end

2. Prediction Modules System

defmodule DSPex.Modules do
  @moduledoc """
  All DSPy prediction strategies as Elixir modules.
  """

  # Basic prediction
  defmodule Predict do
    use DSPex.Module
    
    def predict(signature, inputs, opts \\ []) do
      # Direct prediction without reasoning
    end
  end

  # Chain of thought reasoning
  defmodule ChainOfThought do
    use DSPex.Module
    
    def predict(signature, inputs, opts \\ []) do
      # Step-by-step reasoning
    end
  end

  # ReAct pattern (Reasoning + Acting)
  defmodule ReAct do
    use DSPex.Module
    
    def predict(signature, inputs, tools \\ [], opts \\ []) do
      # Reasoning with tool calling
    end
  end

  # Program of Thought (code-based reasoning)
  defmodule ProgramOfThought do
    use DSPex.Module
    
    def predict(signature, inputs, opts \\ []) do
      # Code generation and execution
    end
  end

  # Multiple chain comparison
  defmodule MultiChainComparison do
    use DSPex.Module
    
    def predict(signature, inputs, chains \\ 3, opts \\ []) do
      # Generate multiple reasoning chains and compare
    end
  end

  # Best of N selection
  defmodule BestOfN do
    use DSPex.Module
    
    def predict(signature, inputs, n \\ 5, evaluator \\ nil, opts \\ []) do
      # Generate N candidates and select best
    end
  end

  # Iterative refinement
  defmodule Refine do
    use DSPex.Module
    
    def predict(signature, inputs, max_iterations \\ 3, opts \\ []) do
      # Iterative improvement of answers
    end
  end

  # Parallel execution
  defmodule Parallel do
    use DSPex.Module
    
    def predict(signatures, inputs_list, opts \\ []) do
      # Parallel execution of multiple predictions
    end
  end
end

3. Optimization System

defmodule DSPex.Optimizers do
  @moduledoc """
  DSPy optimization algorithms for automatic prompt improvement.
  """

  defmodule BootstrapFewShot do
    use DSPex.Optimizer
    
    def optimize(program, trainset, valset \\ nil, opts \\ []) do
      # Automatic few-shot example generation
    end
  end

  defmodule MIPRO do
    use DSPex.Optimizer
    
    def optimize(program, trainset, valset, num_candidates \\ 10, opts \\ []) do
      # Multi-prompt optimization
    end
  end

  defmodule COPRO do
    use DSPex.Optimizer
    
    def optimize(program, trainset, depth \\ 3, breadth \\ 10, opts \\ []) do
      # Conditional prompt optimization
    end
  end

  defmodule Ensemble do
    use DSPex.Optimizer
    
    def create_ensemble(programs, weights \\ nil, opts \\ []) do
      # Ensemble multiple optimized programs
    end
  end

  defmodule BootstrapFinetune do
    use DSPex.Optimizer
    
    def optimize_and_finetune(program, trainset, model, opts \\ []) do
      # Bootstrap examples then finetune model
    end
  end
end

4. Client System

defmodule DSPex.Clients do
  @moduledoc """
  Language model and embedding clients with multi-provider support.
  """

  defmodule LM do
    @doc """
    Universal language model client supporting 30+ providers via LiteLLM.
    """
    
    def configure(model, opts \\ []) do
      # Configure language model with provider-specific options
    end

    def generate(prompt, opts \\ []) do
      # Generate completion
    end

    def chat(messages, opts \\ []) do
      # Chat-based completion
    end

    def embed(text, opts \\ []) do
      # Generate embeddings
    end
  end

  defmodule Provider do
    @doc """
    Training and fine-tuning job management.
    """
    
    def start_finetune_job(dataset, model, opts \\ []) do
      # Start fine-tuning job
    end

    def monitor_job(job_id) do
      # Monitor training progress
    end
  end

  defmodule Cache do
    @doc """
    Multi-layer caching system for LM responses.
    """
    
    def configure(strategy, opts \\ []) do
      # Configure caching strategy
    end

    def get(key) do
      # Retrieve cached response
    end

    def put(key, value, ttl \\ nil) do
      # Cache response
    end
  end
end

5. Retrieval System

defmodule DSPex.Retrievers do
  @moduledoc """
  Information retrieval with support for 25+ vector databases.
  """

  defmodule VectorDB do
    @doc """
    Unified interface for vector databases.
    """
    
    def configure(provider, opts \\ []) do
      # Configure vector database connection
    end

    def index(documents, metadata \\ [], opts \\ []) do
      # Index documents for retrieval
    end

    def search(query, k \\ 5, opts \\ []) do
      # Semantic search
    end
  end

  # Specific implementations
  defmodule ChromaDB do
    use DSPex.Retrievers.VectorDB
  end

  defmodule Pinecone do
    use DSPex.Retrievers.VectorDB
  end

  defmodule Weaviate do
    use DSPex.Retrievers.VectorDB
  end

  # ... 22 more vector database implementations

  defmodule ColBERTv2 do
    @doc """
    ColBERTv2 retrieval system for dense passage retrieval.
    """
    
    def configure(index_path, opts \\ []) do
      # Configure ColBERTv2 index
    end

    def search(query, k \\ 5, opts \\ []) do
      # Multi-vector search
    end
  end
end

6. Evaluation Framework

defmodule DSPex.Evaluation do
  @moduledoc """
  Comprehensive evaluation framework for ML programs.
  """

  defmodule Evaluate do
    @doc """
    Main evaluation runner with parallel processing.
    """
    
    def run(program, dataset, metrics, opts \\ []) do
      # Run evaluation with multiple metrics
    end

    def compare(programs, dataset, metrics, opts \\ []) do
      # Compare multiple programs
    end
  end

  defmodule Metrics do
    @doc """
    Built-in and custom metrics for evaluation.
    """
    
    def exact_match(prediction, ground_truth) do
      # Exact string matching
    end

    def semantic_f1(prediction, ground_truth, model \\ nil) do
      # Semantic similarity F1 score
    end

    def passage_match(prediction, passages) do
      # Passage-based grounding check
    end

    def custom_metric(evaluator_fn) do
      # Custom evaluation function
    end
  end

  defmodule Reports do
    @doc """
    Evaluation reporting and analysis.
    """
    
    def generate_report(results, format \\ :html) do
      # Generate evaluation report
    end

    def failure_analysis(results) do
      # Analyze failure cases
    end
  end
end

7. Streaming System

defmodule DSPex.Streaming do
  @moduledoc """
  Real-time streaming of LM responses and status updates.
  """

  defmodule StreamListener do
    @doc """
    Event-driven streaming interface.
    """
    
    def start_stream(program, inputs, callback, opts \\ []) do
      # Start streaming execution
    end

    def on_token(callback) do
      # Token-level streaming callback
    end

    def on_status(callback) do
      # Status update callback
    end
  end

  defmodule StatusMessage do
    @doc """
    Progress status reporting.
    """
    
    defstruct [:id, :status, :progress, :message, :timestamp]
  end
end

8. Advanced Features

defmodule DSPex.Experimental do
  @moduledoc """
  Experimental and advanced DSPy features.
  """

  defmodule Synthesizer do
    @doc """
    Automatic training data generation.
    """
    
    def synthesize_dataset(task_description, examples \\ [], size \\ 100, opts \\ []) do
      # Generate synthetic training data
    end
  end

  defmodule ModuleGraph do
    @doc """
    Module dependency visualization and analysis.
    """
    
    def analyze_dependencies(program) do
      # Analyze module composition
    end

    def visualize(program, format \\ :mermaid) do
      # Generate dependency graph
    end
  end

  defmodule MultiModal do
    @doc """
    Multi-modal input support (images, audio).
    """
    
    def process_image(image_path, signature, opts \\ []) do
      # Process image inputs
    end

    def process_audio(audio_path, signature, opts \\ []) do
      # Process audio inputs
    end
  end
end

Enhanced Python Bridge Design

State Management

defmodule DSPex.PythonBridge.StateManager do
  @moduledoc """
  Manages complex DSPy object state across worker processes.
  """

  def store_program(program_id, program_state) do
    # Serialize and store program state
  end

  def load_program(program_id) do
    # Deserialize and load program state
  end

  def migrate_state(from_worker, to_worker) do
    # Migrate state between workers
  end
end

Advanced Serialization

defmodule DSPex.PythonBridge.Serializer do
  @moduledoc """
  Handles serialization of complex DSPy objects.
  """

  def serialize_module(module) do
    # Serialize DSPy modules with parameters
  end

  def deserialize_module(data) do
    # Deserialize DSPy modules
  end

  def serialize_prediction(prediction) do
    # Serialize prediction objects with traces
  end
end

Ash Framework Integration

Domain Definition

defmodule DSPex.Ash.Domain do
  use Ash.Domain

  resources do
    resource DSPex.Ash.Program
    resource DSPex.Ash.Dataset
    resource DSPex.Ash.Experiment
    resource DSPex.Ash.Evaluation
    resource DSPex.Ash.Model
    resource DSPex.Ash.Signature
  end
end

Core Resources

defmodule DSPex.Ash.Program do
  use Ash.Resource, 
    domain: DSPex.Ash.Domain,
    data_layer: DSPex.Ash.DataLayer

  attributes do
    uuid_primary_key :id
    attribute :name, :string, allow_nil?: false
    attribute :signature_id, :uuid, allow_nil?: false
    attribute :module_type, :atom, allow_nil?: false
    attribute :parameters, :map, default: %{}
    attribute :optimization_history, {:array, :map}, default: []
    attribute :created_at, :utc_datetime_usec, default: &DateTime.utc_now/0
  end

  relationships do
    belongs_to :signature, DSPex.Ash.Signature
    has_many :evaluations, DSPex.Ash.Evaluation
    has_many :experiments, DSPex.Ash.Experiment
  end

  actions do
    defaults [:read, :create, :update, :destroy]

    action :execute, :map do
      argument :inputs, :map, allow_nil?: false
      argument :options, :map, default: %{}
    end

    action :optimize, :map do
      argument :trainset, {:array, :map}, allow_nil?: false
      argument :valset, {:array, :map}
      argument :optimizer, :atom, default: :bootstrap_few_shot
      argument :options, :map, default: %{}
    end
  end
end

Custom Data Layer

defmodule DSPex.Ash.DataLayer do
  @moduledoc """
  Custom Ash data layer that bridges to DSPy Python processes.
  """
  
  use Ash.DataLayer

  def can?(_, :create), do: true
  def can?(_, :read), do: true  
  def can?(_, :update), do: true
  def can?(_, :destroy), do: true
  def can?(_, :sort), do: true
  def can?(_, :filter), do: true

  def create(resource, changeset) do
    # Create DSPy object and store in Python bridge
  end

  def read(query) do
    # Read from Python bridge state
  end

  def update(resource, changeset) do
    # Update DSPy object state
  end

  def destroy(resource, %{data: record}) do
    # Clean up DSPy object
  end
end

Migration Strategy

Phase 1: Core Module System (Weeks 1-2)

  1. Implement enhanced signature system with field constraints
  2. Add basic prediction modules (Predict, ChainOfThought, ReAct)
  3. Enhance Python bridge for complex object serialization
  4. Update pooling system for stateful operations

Phase 2: Optimization & Evaluation (Weeks 3-4)

  1. Implement key optimizers (BootstrapFewShot, MIPRO)
  2. Add evaluation framework with built-in metrics
  3. Implement state persistence across worker restarts
  4. Add experiment tracking capabilities

Phase 3: Advanced Features (Weeks 5-6)

  1. Implement retrieval system with vector database support
  2. Add streaming response handling
  3. Implement multi-modal input support
  4. Add comprehensive caching layer

Phase 4: Ash Integration (Weeks 7-8)

  1. Complete Ash domain and resource definitions
  2. Implement custom data layer for DSPy bridge
  3. Add GraphQL/REST API generation
  4. Implement background job processing

Phase 5: Production Features (Weeks 9-10)

  1. Add comprehensive monitoring and telemetry
  2. Implement distributed caching with Redis
  3. Add automated deployment and scaling
  4. Complete documentation and examples

Testing Strategy

Enhanced 3-Layer Testing

  1. Layer 1 (Mock): Test all Elixir APIs with mock implementations
  2. Layer 2 (Bridge): Test Python bridge communication and serialization
  3. Layer 3 (Integration): Full end-to-end testing with real DSPy

Performance Targets

  • Signature Processing: < 5ms for complex signatures
  • Module Execution: < 100ms for basic predictions
  • Optimization Jobs: Complete within resource constraints
  • State Serialization: < 10ms for complex objects
  • Pool Throughput: Maintain 1000+ requests/second

Risk Mitigation

Technical Risks

  1. Complex State Management: Use ETS and persistent_term for high-performance state
  2. Serialization Overhead: Implement efficient binary protocols where needed
  3. Python Memory Leaks: Implement worker recycling and monitoring
  4. API Surface Complexity: Provide progressive disclosure with sensible defaults

Compatibility Risks

  1. DSPy Version Changes: Pin to specific DSPy versions with migration strategies
  2. Provider API Changes: Abstract provider differences behind unified interfaces
  3. Elixir/Python Mismatches: Comprehensive type validation and conversion

Success Metrics

Functionality Coverage

  • 90%+ of DSPy prediction modules implemented
  • 80%+ of DSPy optimizers available
  • 15+ vector database integrations
  • Complete evaluation framework
  • Production-ready monitoring

Performance Metrics

  • Sub-100ms prediction latency
  • 1000+ requests/second throughput
  • < 1% failure rate under load
  • < 5 second worker initialization
  • Zero memory leaks over 24 hours

Developer Experience

  • Complete API documentation
  • 50+ working examples
  • IDE autocomplete support
  • Comprehensive error messages
  • Easy deployment guide

This comprehensive design transforms DSPex from a signature-only bridge into a full-featured ML infrastructure platform that rivals Python DSPy while leveraging Elixir’s unique strengths in concurrency, fault tolerance, and real-time systems.