Puchkova, born in Moscow and now a resident of Florida, had lost six of her 10 matches on the WTA Tour this year before defeating Williams 4-6, 6-4, 7-5. The match lasted 2 hours, 31 minutes.
The unseeded Puchkova will meet Monica Niculescu in the title match after Niculescu defeated Kristina Mladenovic 6-0, 6-2.
Neither of the finalists has won a tour championship, and they will be meeting for the first time.
Exploding whale video goes viral on Internet
Puzzle-maker slips 'Murdoch Is Evil' into Rupert Murdoch's Sunday Telegraph