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.
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:
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.