Serbian midfielder Sergej Milinkovic-Savic struck after 29 minutes of a tightly contested derby and Ciro Immobile scored his fourth goal in five games to ensure Lazio upset the odds by beating Serie A's second-placed team.
Roma went into the game in fine form, having won 11 of their previous 13 games, and with local bragging rights firmly in their hands after seven games against Lazio without defeat.
The result was a repeat of the Coppa Italia final in 2012-13 – Lazio's most recent victory over their arch-rivals – and Simone Inzaghi's side worked hard to keep Roma's star striker Edin Dzeko at bay.
Roma lacked the fluency that has taken them to within seven points of Serie A leaders Juventus in recent weeks, but there is little danger of coach Luciano Spalletti writing off the second leg of the semi-final as the club seek a first trophy since winning the Coppa crown in 2008.
As early as the second minute, Dzeko volleyed over the crossbar as Roma settled quickly into their stride.
It took Lazio 20 minutes to muster a meaningful attack and Milinkovic-Savic's headed attempt drew a good save from Alisson, but the designated hosts struggled to retain enough possession in midfield to apply any sustained pressure early on.
When Inzaghi's men did get the ball to target man Immobile, the Italy international unleashed a fierce drive that Alisson could only parry, and the attempt seemed to embolden Lazio.
Moments later they were ahead, when Felipe Anderson's run took him all the way to the by-line and he cut the ball back to Milinkovic-Savic, who slid in and lifted a finish high into the net.
10 - Felipe Anderson has delivered 10 assists so far in all comps: a joint-record among Serie A players this term. Precious. #LazioRoma— OptaPaolo (@OptaPaolo) March 1, 2017
Dzeko headed over the crossbar as Roma quickly sought to level matters, but the first half ended with Lazio deservedly ahead having grown in confidence throughout the game.
Anderson and Immobile were more involved in the second half and they linked up well to create a chance for Marco Parolo, whose thunderous 20-yard shot whistled just wide of Alisson's goal.
The game swung from end to end and Mohamed Salah lashed a shot over the target from an angle after he was put through by Radja Nainggolan, before Immobile had a well-taken goal ruled out for offside.
Inzaghi's side continued to probe for a second goal and Immobile was tantalisingly close to reaching Jordan Lukaku's cross after he was released down the wing by Milinkovic-Savic.
With 12 minutes left on the clock, substitute Keita beat Kostas Manolas for pace and his cross evaded Antonio Rudiger before Immobile made no mistake from close range, putting Lazio firmly in the driving seat.
The late introduction of Roma veteran Francesco Totti, eyeing one last shot at silverware, had little effect and Spalletti's charges have it all to do in the second leg.