Melt the butter in a large soup pot over medium heat. Add the finely chopped onion and celery and cook for 5–7 minutes, stirring occasionally, until softened but not browned. Add the minced garlic and cook for 30 seconds, just until fragrant.
Sprinkle the flour evenly over the vegetables and stir well to coat.
Slowly pour in the chicken broth while stirring continuously to prevent lumps. Bring the mixture to a gentle simmer and cook for 3–4 minutes, until slightly thickened.
Reduce the heat to low and stir in the milk and heavy cream. Heat gently until warmed through, but do not boil.
Add the salt and pepper and stir to combine. Taste and adjust seasoning as needed. Serve warm.
Chop the celery very finely: Smaller pieces soften faster and break down better in the soup, creating a smoother, more cohesive texture without blending.
Cook the flour briefly: After adding the flour, cook it for 1–2 minutes before adding liquid.
Add broth slowly: Pouring the broth in gradually while stirring helps avoid lumps and ensures an even, creamy consistency.
Keep the heat gentle after adding dairy: Once the milk and cream are added, avoid boiling to prevent curdling and maintain a smooth texture.
Adjust thickness as needed: If the soup is too thick, add a splash of broth or milk. If it’s too thin, let it simmer gently for a few extra minutes to reduce.