Skip to content

Does a transpiler make sense? #1

@adsharma

Description

@adsharma

Excellent demonstration of differentiable programming with dspy. I wonder if the code will be more approachable to a larger audience if you wrote something like:

import datetime
import random

class SupportBot:
    def __init__(self):
        pass  # No need for explicit module initialization

    def _route_ticket(self, ticket: str) -> str:
        """Decides the best route for a customer ticket using match statement."""
        ticket = ticket.lower()
        match ticket:
            case t if any(word in t for word in ["late", "eta", "delayed"]):
                return "eta"
            case t if any(word in t for word in ["missing", "didn't get", "not delivered"]):
                return "missing"
            case t if any(word in t for word in ["driver", "courier"]):
                return "driver"
            case _:
                return "fallback"

    def _handle_eta(self, ticket: str) -> dict:
        """Handles late delivery tickets by estimating arrival time."""
        mins = random.randint(10, 20)
        eta = (datetime.datetime.now() + datetime.timedelta(minutes=mins)).strftime("%I:%M %p")
        return {"tag": "eta", "body": f"Courier is about {mins} min away — arriving ≈ {eta}."}

    def _handle_missing(self, ticket: str) -> dict:
        """Handles missing item tickets by issuing a refund message."""
        return {"tag": "missing", "body": "Item verified missing via photo. Refund has been issued."}

    def _handle_driver(self, ticket: str) -> dict:
        """Handles driver-related tickets by providing contact info."""
        return {"tag": "driver", "body": "Driver located, contact info sent."}

    def _handle_fallback(self, ticket: str) -> dict:
        """Handles all other tickets by directing to FAQ or support."""
        return {"tag": "fallback", "body": "Please see our FAQ or reach live support."}

    def process_ticket(self, ticket: str) -> dict:
        """Main method to process a customer ticket using match statement."""
        route = self._route_ticket(ticket)
        match route:
            case "eta":
                return self._handle_eta(ticket)
            case "missing":
                return self._handle_missing(ticket)
            case "driver":
                return self._handle_driver(ticket)
            case _:
                return self._handle_fallback(ticket)


# Example usage
bot = SupportBot()
result = bot.process_ticket("Order #8123 is 20 minutes late. Any ETA?")
print(result)

# Dataset for evaluation
train_data = [
    {"ticket": "Order #8123 is 20 minutes late. Any ETA?", "tag": "eta"},
    {"ticket": "Driver stuck in traffic for order #9041.", "tag": "driver"},
    {"ticket": "Burger arrived but fries missing in order #6677.", "tag": "missing"},
    {"ticket": "App shows delivered yet nothing here (#7001).", "tag": "missing"},
    {"ticket": "Order #5502 delayed, need update please.", "tag": "eta"},
    {"ticket": "I didn't get the soda in combo meal #5502.", "tag": "missing"},
    {"ticket": "Driver phone off — can you locate? Order #4321.", "tag": "driver"},
    {"ticket": "How do I cancel my late order #8890?", "tag": "fallback"},
    {"ticket": "Missing dipping sauce order #9988.", "tag": "missing"},
    {"ticket": "Order #7002 already 25 min late. Where is it?", "tag": "eta"},
]

dev_data = [
    {"ticket": "Order #1234 is late — where is it?", "tag": "eta"},
    {"ticket": "Missing fries in order #5678, need refund.", "tag": "missing"},
    {"ticket": "Driver got flat tire. What's new ETA for #2020?", "tag": "eta"},
    {"ticket": "Never got my drink with order #3003.", "tag": "missing"},
    {"ticket": "Order #4040 taking forever. Any update?", "tag": "eta"},
    {"ticket": "Is there a way to track courier? Order #5050.", "tag": "driver"},
    {"ticket": "Half my toppings missing on pizza #6060.", "tag": "missing"},
    {"ticket": "App shows delivered but nothing arrived (#7070).", "tag": "missing"},
    {"ticket": "FAQ didn't help. Cancel late order #8080.", "tag": "fallback"},
    {"ticket": "What's status of order #9090? It's 30 min late.", "tag": "eta"},
]

# Simple evaluation
def evaluate_tag_match(bot, dataset):
    correct = 0
    for item in dataset:
        prediction = bot.process_ticket(item["ticket"])
        if prediction["tag"] == item["tag"]:
            correct += 1
    return correct / len(dataset)

# Run evaluation
print("Baseline dev score:", evaluate_tag_match(bot, dev_data))

and have the dspy code auto generated. This way programmers have a more natural/familiar env to debug the code and also benefit from the extra intelligence.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions