公孙衍,战国时魏国阴晋(今陕西华阴市东北)人。曾仕魏,任犀首,人因以“犀首”称之,《史记集解》引司马彪曰:“犀首,魏官名,今虎牙将军。”犀首当是武职。公孙衍和张仪齐名,在秦国为官,是张仪连横策略的主要对手,但传下来的事迹不多,《史记》有公孙衍传,系附于张仪传,《战国策》也只有零星记载。
公孙衍早年生平不详,于秦惠文王五年(前333年)在秦为大良造。大良造在战国初期时,是秦国的最高官职,掌握军政大权。公孙衍不负重托,次年,受秦王之命,赴齐国和魏国,劝两国联合攻赵而大败赵国,使诸侯不至于合纵而抗秦。两年之后,又亲率秦军攻魏于雕阴(今陕西甘泉县南),大败魏将魏军,魏将龙贾被俘,此后,魏不得不尽割河西之地于秦。
公孙衍在秦四年后,张仪由赵国西入秦国,凭借出众的才智不久被秦惠王任为客卿,筹划谋略攻伐之事。次年,秦国仿效三晋的官僚机构开始设置相位,称相邦或相国,张仪出任此职。公孙衍受到冷落,就离开秦国投向魏国。魏惠王任用公孙衍为犀首。这时恰逢楚国攻打魏国,魏惠王派公孙衍领兵迎战。公孙衍率兵迎战楚军,虽然打败了楚威王的军队,但魏军也伤亡惨重,疲惫不堪。秦国趁势又迫使魏国将西河之外上郡十五县割让给秦国。因魏国国力衰退,公孙衍就图谋拉拢其他国,联合出击取胜,在公元前325年与齐国大将田朌合手打败赵国大将韩举、赵护于平邑(今河南省南乐县西北)、新城。
公元前325年,秦惠文王在张仪的怂恿下正式称王。秦王还派张仪游说齐国和楚国,并于两年后约齐、楚大臣会于啮桑(今江苏沛县西南)。公孙衍看清了张仪的连横策略,就游说魏、韩、赵、燕、中山五国,鼓动“五国相王”,行合纵之策以联合抗秦,后赵、燕、中山相继称王。秦连横之策未能奏效,张仪也被免去相国。但不久,楚国就派兵伐魏,公孙衍的策略受到挫折,魏相惠施因联合齐、楚失败而被驱逐。
公元前322年,张仪相魏。公孙衍设法取得韩国当权者的支持,破坏了张仪联合秦魏的政策。公元前319年,魏国驱逐张仪回秦,并争取各国合纵对付秦国,公孙衍由魏将升任魏相邦,同时惠施也回国,合纵形势又形成。公元前318年,魏、赵、韩、燕、楚合纵攻秦,公孙衍佩五国相印,为约长。西戎义渠君曾朝魏,公孙衍就趁机劝告义渠君加强对秦的警惕。他说,如中原无事,秦就要对你们烧杀掠夺;如果中原有事,秦将使重币去同你们交好。恰巧这个时候,秦以文绣千纯、美女百人,遗义渠君。义渠君集合群臣议论这件事。义渠君说,这就是公孙衍当年所说的那话了。于是也起兵袭秦,大败秦人。五国联军进军顺利,但在函谷关一战受挫,五国纷纷退兵。虽然失败,但声势烜赫一时。司马光引用《孟子·滕文公》说:“公孙衍、张仪岂不大丈夫哉,一怒而诸侯惧,安居而天下熄。”可见公孙衍在当时的影响之大。