본관은 안동(安東). 자는 백안(伯安), 호는 용암(庸庵). 영의정 김창집(金昌集)의 증손으로, 할아버지는 승지 김제겸(金濟謙)이고, 아버지는 부사 김탄행(金坦行)이며, 어머니는 한백증(韓百增)의 딸이다.
1764년(영조 40) 병자호란 때의 충신 후손들만을 위해 시행된 정시 문과에 병과로 급제하였다. 1770년부터 교리(校理)·헌납(獻納) 등을 지내고, 1776년에 대사간·강원도관찰사가 되었다. 이 때 북쪽에 흉년이 들어 영남의 곡식을 수송했는데, 조운(漕運) 감독을 잘못해 파면되었다.
1778년부터 승지·도승지·부제학(副提學)·대사성을 역임하였다. 1780년에는 대사헌이 되어 홍국영(洪國榮)의 관작 삭탈을 주청했고, 1781년에는 『영조실록(英祖實錄)』 편찬청 교수당상(校讐堂上)을 지냈다.
이듬해 (同知經筵事)·비변사도제조(備邊司都提調)·한성부판윤을 거쳐, 1783년 예조판서로 있을 때 채제공(蔡濟恭)을 탄핵하다가 잠시 파면되었다. 이 해에 책봉부사(冊封副使)로 청나라에 다녀와 이조판서에 임명되었으나, 대향(大享: 큰 제사) 준비를 소홀히 하여 다시 파면되었다.
1784년부터 세자좌부빈객(世子左副賓客)·형조판서·병조판서·선혜청도제조·평안도관찰사를 역임하였다. 1788년 호조판서를 지냈고, 1791년에는 동지사(冬至使)로 청나라에 다녀와서 우의정에 올랐다.
1793년 사옹원도제조를 거쳐 좌의정에 승진했고, 진하사(進賀使)의 정사로 청나라에 다녀왔다. 이듬해 영돈녕부사가 되었다. 1796년 사역원도제조를 역임하고 동지 겸 사은사(冬至兼謝恩使)의 정사로 청나라에 다녀왔고, 이듬해 다시 동지사로 다녀왔다.
지조가 있어 옳은 일은 끝까지 추진해 정조의 신임이 두터웠다. 외교에 뛰어나 청나라에 다섯 번이나 다녀왔고, 문학과 재주가 비상했으나 잘 드러내지 않았다. 시호는 익헌(翼憲)이다.