In a large pot or Dutch oven, melt the butter over medium heat. Add the onion and carrots and cook, stirring often, until softened, about 4-5 minutes.
Add the garlic, flour, Italian seasoning, paprika, cayenne (if using), salt and pepper. Cook, stirring, for 1 minute.
Stir in the milk.
Add the potatoes and broth. Stir to combine.
Bring to a simmer and then reduce heat to medium-low. Simmer, stirring occasionally, until potatoes are tender when pierced with a fork, 15-20 minutes.
Partially puree the soup. This can be done with an immersion blender or by transferring half of the soup to a countertop blender.
Serve warm with toppings as desired.