{"id":19723,"date":"2025-12-08T20:14:54","date_gmt":"2025-12-08T12:14:54","guid":{"rendered":"https:\/\/92it.top\/?p=19723"},"modified":"2025-12-08T20:14:54","modified_gmt":"2025-12-08T12:14:54","slug":"langchain%e5%ae%9e%e6%93%8d%e6%95%99%e7%a8%8b%ef%bc%8c7%e6%ad%a5%e6%8e%8c%e6%8f%a1%e6%89%80%e6%9c%89%e6%a0%b8%e5%bf%83%e6%8a%80%e6%9c%af%ef%bc%9achain%e3%80%81memory%e3%80%81rag%e3%80%81agent%e4%bb%a5","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=19723","title":{"rendered":"LangChain\u5b9e\u64cd\u6559\u7a0b\uff0c7\u6b65\u638c\u63e1\u6240\u6709\u6838\u5fc3\u6280\u672f\uff1aChain\u3001Memory\u3001RAG\u3001Agent\u4ee5\u53ca LangGraph"},"content":{"rendered":"\n<p>\u8f6c\u8f7d\uff1a<a href=\"https:\/\/mp.weixin.qq.com\/s?__biz=MzkyNDg2OTMzMA==&amp;mid=2247485538&amp;idx=1&amp;sn=8085d7f82b6bae25222433200f3448fe&amp;chksm=c07b98bfd8a0c2822d35eb70294cfd99a66824c56d5a511d3090ebd3f568d430db8852afea93&amp;mpshare=1&amp;scene=1&amp;srcid=120783PGrWTwHZUjseFf24qC&amp;sharer_shareinfo=177740c11adffcd939d6dce5e32ee068&amp;sharer_shareinfo_first=4b380f52ccf52dbd8cfdd347e2c23c02&amp;exportkey=n_ChQIAhIQOw6CPv7xjReoy8bvyv9R4hL0AQIE97dBBAEAAAAAAIbfCXP%2Fma4AAAAOpnltbLcz9gKNyK89dVj0OHAVyNyABoGCSmjBK02gHEgFuROIQfPkyrBX3RtMiyCuQabAZPlGcoL1lO0sonGNbai5vjKZN%2B3l4naXM1H5G17lZ%2B6ohvxz2Hgst2L%2F2n2ZMKLzPNArz8Gbr%2B8MfKB2a3RBH4Kcy5iwge8rWlwX%2F110nKSAJ1dUN2Z1ut6nBNgvz9C6rxWYPv8a5Ojc%2FT%2FOhqed%2B1TdzYczAx5%2BtjEVYXMYz%2BGGrCWVa1i2h7%2FI4mEnZVeWw9UIV8708q6wasTDFiNNEA%2B0cRM3qqfNimI%3D&amp;acctmode=0&amp;pass_ticket=HQRX79WpypQdR8p1kKVKYU5gasdxcbxPjMWp%2Bmvln7Uaby1hm5V9bxk4ySVjLfj6&amp;wx_header=0#rdhttps:\/\/mp.weixin.qq.com\/s?__biz=MzkyNDg2OTMzMA==&amp;mid=2247485538&amp;idx=1&amp;sn=8085d7f82b6bae25222433200f3448fe&amp;chksm=c07b98bfd8a0c2822d35eb70294cfd99a66824c56d5a511d3090ebd3f568d430db8852afea93&amp;mpshare=1&amp;scene=1&amp;srcid=120783PGrWTwHZUjseFf24qC&amp;sharer_shareinfo=177740c11adffcd939d6dce5e32ee068&amp;sharer_shareinfo_first=4b380f52ccf52dbd8cfdd347e2c23c02&amp;exportkey=n_ChQIAhIQOw6CPv7xjReoy8bvyv9R4hL0AQIE97dBBAEAAAAAAIbfCXP%2Fma4AAAAOpnltbLcz9gKNyK89dVj0OHAVyNyABoGCSmjBK02gHEgFuROIQfPkyrBX3RtMiyCuQabAZPlGcoL1lO0sonGNbai5vjKZN%2B3l4naXM1H5G17lZ%2B6ohvxz2Hgst2L%2F2n2ZMKLzPNArz8Gbr%2B8MfKB2a3RBH4Kcy5iwge8rWlwX%2F110nKSAJ1dUN2Z1ut6nBNgvz9C6rxWYPv8a5Ojc%2FT%2FOhqed%2B1TdzYczAx5%2BtjEVYXMYz%2BGGrCWVa1i2h7%2FI4mEnZVeWw9UIV8708q6wasTDFiNNEA%2B0cRM3qqfNimI%3D&amp;acctmode=0&amp;pass_ticket=HQRX79WpypQdR8p1kKVKYU5gasdxcbxPjMWp%2Bmvln7Uaby1hm5V9bxk4ySVjLfj6&amp;wx_header=0#rd\">LangChain\u5b9e\u64cd\u6559\u7a0b\uff0c7\u6b65\u638c\u63e1\u6240\u6709\u6838\u5fc3\u6280\u672f\uff1aChain\u3001Memory\u3001RAG\u3001Agent\u4ee5\u53ca LangGraph<\/a><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"596\" src=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-1024x596.png\" alt=\"\" class=\"wp-image-19724\" style=\"width:460px;height:auto\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-1024x596.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-300x175.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-768x447.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-830x483.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-230x134.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-350x204.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-480x279.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image.png 1310w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>\u5728\u505aAI\u5e94\u7528\u5f00\u53d1\u7684\u65f6\u5019\uff0c\u5927\u6a21\u578b\u90fd\u6709\u4e00\u4e2a\u901a\u75c5\uff0c\u867d\u7136\u5f3a\u5927\uff0c\u4f46\u5b83\u4e0d\u77e5\u9053\u4f60\u516c\u53f8\u7684\u79c1\u6709\u6587\u6863\uff0c\u8bb0\u4e0d\u4f4f\u4e4b\u524d\u7684\u5bf9\u8bdd\uff0c\u66f4\u4e0d\u4f1a\u4e3b\u52a8\u4e0a\u7f51\u641c\u7d22\u6700\u65b0\u4fe1\u606f\u3002\u5927\u6a21\u578b\u5c31\u50cf\u4e00\u4e2a\u535a\u5b66\u4f46&#8221;\u4e0e\u4e16\u9694\u7edd&#8221;\u7684\u5b66\u8005\u2014\u2014\u77e5\u8bc6\u4e30\u5bcc\uff0c\u5374\u65e0\u6cd5\u8fde\u63a5\u73b0\u5b9e\u4e16\u754c\u3002<\/p>\n\n\n\n<p><strong>LangChain \u6b63\u662f\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u800c\u751f<\/strong>\u3002\u5b83\u662f\u7531 Harrison Chase \u5f00\u53d1\u7684\u5f00\u6e90\u6846\u67b6\uff0c\u4e13\u95e8\u7528\u6765\u6784\u5efa\u57fa\u4e8e\u5927\u8bed\u8a00\u6a21\u578b(LLM)\u7684\u5e94\u7528\u7a0b\u5e8f\u3002\u7b80\u5355\u6765\u8bf4\uff0cLangChain \u5c31\u662f<strong>\u8fde\u63a5&#8221;\u5927\u8111&#8221;(LLM)\u548c&#8221;\u73b0\u5b9e\u4e16\u754c&#8221;(\u6570\u636e\u5e93\u3001\u641c\u7d22\u5f15\u64ce\u3001\u79c1\u6709\u6587\u6863)\u7684\u6865\u6881<\/strong>\u3002<\/p>\n\n\n\n<p>\u8fd9\u7bc7\u6587\u7ae0\u5c06\u624b\u628a\u624b\u5e26\u4f60\u4ece\u96f6\u5f00\u59cb\u638c\u63e1 LangChain\uff0c\u6bcf\u4e2a\u6b65\u9aa4\u90fd\u63d0\u4f9b\u5b8c\u6574\u7684\u53ef\u8fd0\u884c\u4ee3\u7801\u3002\u4f60\u4e0d\u9700\u8981\u6709 Python \u57fa\u7840\uff0c\u53ea\u8981\u8ddf\u7740\u64cd\u4f5c\uff0c\u5c31\u80fd\u6784\u5efa\u51fa\u81ea\u5df1\u7684 AI \u5e94\u7528\u3002\u5e0c\u671b\u5bf9\u4f60\u6709\u6240\u542f\u53d1\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 01 &#8211; \u6280\u672f\u80cc\u666f\u4e0e\u6311\u6218\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u5927\u6a21\u578b\u7684\u4e09\u5927\u5c40\u9650\u6027<\/strong><\/p>\n\n\n\n<p>\u5f53\u6211\u4eec\u76f4\u63a5\u8c03\u7528 GPT \u6216\u5176\u4ed6\u5927\u6a21\u578b\u7684 API \u65f6\uff0c\u4f1a\u9047\u5230\u4e09\u4e2a\u6839\u672c\u6027\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul>\n<li><strong>\u77e5\u8bc6\u8fc7\u671f<\/strong>\u00a0&#8211; \u6a21\u578b\u53ea\u77e5\u9053\u8bad\u7ec3\u65f6\u7684\u6570\u636e\uff0c\u4e0d\u77e5\u9053\u6628\u5929\u521a\u53d1\u751f\u7684\u65b0\u95fb\uff0c\u4e5f\u4e0d\u77e5\u9053\u4f60\u516c\u53f8\u7684\u5185\u90e8\u6587\u6863\u3002\u5c31\u50cf\u4e00\u4e2a 2023 \u5e74\u5c31&#8221;\u51ac\u7720&#8221;\u7684\u4eba\uff0c\u9192\u6765\u540e\u5bf9 2024 \u5e74\u7684\u4e16\u754c\u4e00\u65e0\u6240\u77e5\u3002\u00a0<\/li>\n\n\n\n<li><strong>\u65e0\u8bb0\u5fc6\u80fd\u529b<\/strong>\u00a0&#8211; \u6bcf\u6b21 API \u8c03\u7528\u90fd\u662f\u5168\u65b0\u7684\u5f00\u59cb\u3002\u4f60\u95ee\u5b83&#8221;\u6211\u53eb\u4ec0\u4e48&#8221;\uff0c\u5b83\u56de\u7b54\u4e86\uff1b\u4e0b\u6b21\u518d\u95ee\uff0c\u5b83\u5b8c\u5168\u5fd8\u8bb0\u4e86\u3002\u8fd9\u4e0d\u662f\u6a21\u578b\u7b28\uff0c\u800c\u662f API \u7684\u8c03\u7528\u673a\u5236\u51b3\u5b9a\u7684\u2014\u2014\u6bcf\u6b21\u8bf7\u6c42\u90fd\u662f\u72ec\u7acb\u7684\uff0c\u6ca1\u6709\u72b6\u6001\u4fdd\u6301\u3002\u00a0<\/li>\n\n\n\n<li><strong>\u7f3a\u4e4f\u5de5\u5177\u4f7f\u7528\u80fd\u529b<\/strong>\u00a0&#8211; \u95ee\u5b83&#8221;\u73b0\u5728\u6bd4\u7279\u5e01\u591a\u5c11\u94b1&#8221;\uff0c\u5b83\u53ea\u80fd\u80e1\u4e71\u731c\u6d4b\uff1b\u8ba9\u5b83&#8221;\u5e2e\u6211\u7b97\u4e00\u4e0b 23423 \u00d7 82342&#8243;\uff0c\u5927\u6982\u7387\u7b97\u9519\u3002\u5927\u6a21\u578b\u5929\u751f\u4e0d\u64c5\u957f\u7cbe\u786e\u8ba1\u7b97\u548c\u5b9e\u65f6\u6570\u636e\u83b7\u53d6\u3002<\/li>\n<\/ul>\n\n\n\n<p> \u3000\u3000<\/p>\n\n\n\n<p><strong><strong>\ud83d\udd39<\/strong>LangChain \u7684\u89e3\u51b3\u65b9\u6848\uff1a\u7ec4\u4ef6\u5316\u4e0e\u94fe\u5f0f\u8c03\u7528<\/strong><\/p>\n\n\n\n<p>LangChain \u7684\u6838\u5fc3\u54f2\u5b66\u662f<strong>\u7ec4\u5408\u4f18\u4e8e\u7ee7\u627f<\/strong>\u3002\u5b83\u628a AI \u5e94\u7528\u5f00\u53d1\u62c6\u89e3\u6210\u4e00\u4e2a\u4e2a\u72ec\u7acb\u7684&#8221;\u79ef\u6728&#8221;\uff1a<\/p>\n\n\n\n<ul>\n<li><strong>Models<\/strong>\u00a0&#8211; \u7edf\u4e00\u7684\u6a21\u578b\u63a5\u53e3\uff0c\u517c\u5bb9 100+ \u79cd LLM \u63d0\u4f9b\u5546<\/li>\n\n\n\n<li><strong>Prompts<\/strong>\u00a0&#8211; \u53ef\u590d\u7528\u7684\u63d0\u793a\u8bcd\u6a21\u677f<\/li>\n\n\n\n<li><strong>Memory<\/strong>\u00a0&#8211; \u5f00\u7bb1\u5373\u7528\u7684\u8bb0\u5fc6\u7ba1\u7406\u7ec4\u4ef6<\/li>\n\n\n\n<li><strong>Chains<\/strong>\u00a0&#8211; \u5c06\u591a\u4e2a\u7ec4\u4ef6\u4e32\u8054\u6210\u5de5\u4f5c\u6d41<\/li>\n\n\n\n<li><strong>Agents<\/strong>\u00a0&#8211; \u80fd\u81ea\u4e3b\u51b3\u7b56\u3001\u4f7f\u7528\u5de5\u5177\u7684\u667a\u80fd\u4f53<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u7684\u7cbe\u5999\u4e4b\u5904\u5728\u4e8e\uff1a<strong>\u6570\u636e\u6d41\u5411\u6e05\u6670\uff0c\u7ec4\u4ef6\u804c\u8d23\u5355\u4e00<\/strong>\u3002\u6bcf\u4e2a\u7ec4\u4ef6\u53ea\u505a\u4e00\u4ef6\u4e8b\uff0c\u5e76\u4e14\u505a\u597d\u2014\u2014\u8fd9\u6b63\u662f\u4f18\u79c0\u67b6\u6784\u7684\u6807\u5fd7\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 02 &#8211; \u6838\u5fc3\u67b6\u6784\u89e3\u6790\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4ece\u4f01\u4e1a\u67b6\u6784\u7684\u89d2\u5ea6\u770b\uff0cLangChain \u7684\u8bbe\u8ba1\u5b8c\u7f8e\u7b26\u5408 TOGAF \u6846\u67b6\u7684\u56db\u5c42\u6a21\u578b\uff1a<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"780\" src=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-1024x780.png\" alt=\"\" class=\"wp-image-19726\" style=\"width:536px;height:auto\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-1024x780.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-300x229.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-768x585.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-830x633.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-230x175.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-350x267.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2-480x366.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-2.png 1333w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<ul>\n<li><strong>\u4e1a\u52a1\u67b6\u6784\u5c42<\/strong>\u00a0&#8211; LangChain \u80fd\u6784\u5efa\u54ea\u4e9b AI \u5e94\u7528\uff1f\u7b54\u6848\u662f\uff1aAI \u5bf9\u8bdd\u7cfb\u7edf\u3001\u77e5\u8bc6\u5e93\u95ee\u7b54\u3001\u667a\u80fd\u5ba2\u670d\u3001\u4ee3\u7801\u52a9\u624b\u7b49\u3002\u5173\u952e\u662f\u5b83\u964d\u4f4e\u4e86\u95e8\u69db\u2014\u2014\u4ee5\u524d\u9700\u8981 AI \u56e2\u961f\u624d\u80fd\u505a\u7684\u4e8b\uff0c\u73b0\u5728\u51e0\u5341\u884c\u4ee3\u7801\u5c31\u80fd\u5b9e\u73b0\u3002\u00a0<\/li>\n\n\n\n<li><strong>\u5e94\u7528\u67b6\u6784\u5c42<\/strong>\u00a0&#8211; \u6838\u5fc3\u7ec4\u4ef6\u5305\u62ec Models(\u6a21\u578b\u62bd\u8c61)\u3001Chains(\u94fe\u5f0f\u8c03\u7528)\u3001Agents(\u667a\u80fd\u4f53)\u3001Toolkits(\u5de5\u5177\u96c6)\u3002\u8fd9\u4e00\u5c42\u7684\u8bbe\u8ba1\u54f2\u5b66\u662f<strong>\u53ef\u7ec4\u5408\u6027<\/strong>\uff1a\u4f60\u53ef\u4ee5\u50cf\u642d\u4e50\u9ad8\u4e00\u6837\u7ec4\u5408\u8fd9\u4e9b\u7ec4\u4ef6\uff0c\u800c\u4e0d\u662f\u4ece\u96f6\u5f00\u59cb\u5199\u4ee3\u7801\u3002\u00a0<\/li>\n\n\n\n<li><strong>\u6570\u636e\u67b6\u6784\u5c42<\/strong>\u00a0&#8211; \u5305\u542b Memory(\u8bb0\u5fc6\u7ba1\u7406)\u3001Vector Stores(\u5411\u91cf\u6570\u636e\u5e93)\u3001Document Loaders(\u6587\u6863\u52a0\u8f7d\u5668)\u3001Text Splitters(\u6587\u672c\u5207\u5272\u5668)\u3002\u91cd\u70b9\u662f<strong>\u6570\u636e\u7684\u6d41\u8f6c\u548c\u8f6c\u6362<\/strong>\uff1a\u539f\u59cb\u6587\u6863\u5982\u4f55\u53d8\u6210 AI \u80fd\u7406\u89e3\u7684\u5411\u91cf\uff1f\u5bf9\u8bdd\u5386\u53f2\u5982\u4f55\u9ad8\u6548\u5b58\u50a8\u548c\u68c0\u7d22\uff1f\u00a0<\/li>\n\n\n\n<li><strong>\u6280\u672f\u67b6\u6784\u5c42<\/strong>\u00a0&#8211; \u5e95\u5c42\u6d89\u53ca API Integration(\u591a\u6a21\u578b\u517c\u5bb9)\u3001Prompt Engineering(\u63d0\u793a\u8bcd\u5de5\u7a0b)\u3001Embeddings(\u5411\u91cf\u5316)\u3001LLM Provider(\u6a21\u578b\u63d0\u4f9b\u5546\u96c6\u6210)\u3002\u8fd9\u4e00\u5c42\u89e3\u51b3\u7684\u662f<strong>\u5982\u4f55\u8ba9\u4e0d\u540c\u6280\u672f\u6808\u65e0\u7f1d\u534f\u4f5c<\/strong>\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>\u6838\u5fc3\u8bbe\u8ba1\uff1aState\u3001Node\u3001Edge<\/strong><\/p>\n\n\n\n<p>\u4ece LangGraph(LangChain \u7684\u8fdb\u9636\u7248)\u53ef\u4ee5\u770b\u51fa\u67b6\u6784\u8bbe\u8ba1\u7684\u7cbe\u9ad3\uff1a<\/p>\n\n\n\n<ul>\n<li><strong>State<\/strong>(\u72b6\u6001) &#8211; \u5c31\u50cf\u4e00\u4e2a&#8221;\u8d27\u7bb1&#8221;\uff0c\u5728\u5404\u4e2a\u5904\u7406\u8282\u70b9\u95f4\u4f20\u9012\u6570\u636e\u3002\u5b83\u4e0d\u662f\u7b80\u5355\u7684\u53d8\u91cf\uff0c\u800c\u662f<strong>\u7ed3\u6784\u5316\u7684\u6570\u636e\u5bb9\u5668<\/strong>\uff0c\u6e05\u6670\u5b9a\u4e49\u4e86&#8221;\u8fd9\u4e00\u6b65\u9700\u8981\u4ec0\u4e48\u6570\u636e\uff0c\u8f93\u51fa\u4ec0\u4e48\u6570\u636e&#8221;\u3002<\/li>\n\n\n\n<li><strong>Node<\/strong>(\u8282\u70b9) &#8211; \u6bcf\u4e2a\u8282\u70b9\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\u5904\u7406\u5355\u5143\uff0c\u6bd4\u5982&#8221;\u5206\u7c7b\u5668&#8221;\u3001&#8221;\u6570\u5b66\u4e13\u5bb6&#8221;\u3001&#8221;\u7f16\u8f91\u5ba1\u6838&#8221;\u3002<strong>\u8282\u70b9\u7684\u804c\u8d23\u5355\u4e00\uff0c\u8fb9\u754c\u6e05\u6670<\/strong>\uff0c\u8fd9\u6837\u624d\u80fd\u7ec4\u5408\u51fa\u590d\u6742\u7684\u6d41\u7a0b\u800c\u4e0d\u5931\u63a7\u3002<\/li>\n\n\n\n<li><strong>Edge<\/strong>(\u8fb9) &#8211; \u5b9a\u4e49\u6570\u636e\u6d41\u5411\u3002\u666e\u901a\u8fb9\u662f\u56fa\u5b9a\u8def\u5f84\uff0c\u6761\u4ef6\u8fb9\u53ef\u4ee5\u6839\u636e\u72b6\u6001\u52a8\u6001\u51b3\u5b9a\u4e0b\u4e00\u6b65\u53bb\u54ea\u91cc(\u5c31\u50cf\u4ea4\u901a\u8def\u53e3\u7684\u7ea2\u7eff\u706f)\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u7684\u5929\u624d\u4e4b\u5904\u5728\u4e8e\uff1a<strong>\u628a\u6d41\u7a0b\u63a7\u5236\u4ece\u4ee3\u7801\u903b\u8f91\u4e2d\u62bd\u79bb\u51fa\u6765\uff0c\u53d8\u6210\u53ef\u89c6\u5316\u7684\u56fe\u7ed3\u6784<\/strong>\u3002\u4f60\u753b\u4e00\u4e2a\u6d41\u7a0b\u56fe\uff0c\u5c31\u80fd\u76f4\u63a5\u7ffb\u8bd1\u6210\u4ee3\u7801\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"221\" src=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-1024x221.png\" alt=\"\" class=\"wp-image-19728\" style=\"width:490px;height:auto\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-1024x221.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-300x65.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-768x166.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-830x179.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-230x50.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-350x76.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3-480x104.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-3.png 1268w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 03 &#8211; \u73af\u5883\u51c6\u5907\u4e0e\u5b89\u88c5\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u5728\u5f00\u59cb\u5b9e\u6218\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u642d\u5efa\u5f00\u53d1\u73af\u5883\u3002\u4ee5\u4e0b\u6b65\u9aa4\u9002\u7528\u4e8e macOS\u3001Linux \u548c Windows \u7cfb\u7edf\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u6b65\u9aa4 1\uff1a\u5b89\u88c5 Python<\/strong><\/p>\n\n\n\n<p>\u786e\u4fdd\u4f60\u7684\u7535\u8111\u5df2\u5b89\u88c5 Python 3.8 \u6216\u66f4\u9ad8\u7248\u672c\u3002\u6253\u5f00\u7ec8\u7aef(Terminal \u6216 CMD)\uff0c\u8f93\u5165\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 --version\n<\/pre>\n\n\n\n<p>\u5982\u679c\u663e\u793a\u7248\u672c\u53f7\uff08\u5982\u00a0<code>Python 3.12.11<\/code>\uff09\uff0c\u8bf4\u660e\u5df2\u5b89\u88c5\u3002\u5426\u5219\u8bf7\u8bbf\u95ee https:\/\/www.python.org \u4e0b\u8f7d\u5b89\u88c5\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u6b65\u9aa4 2\uff1a\u5b89\u88c5 LangChain \u6838\u5fc3\u5e93<\/strong><\/p>\n\n\n\n<p>\u5728\u7ec8\u7aef\u4e2d\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langchain langchain-openai\n<\/pre>\n\n\n\n<p>\u5982\u679c\u4e0b\u8f7d\u901f\u5ea6\u6162\uff0c\u53ef\u4ee5\u4f7f\u7528\u56fd\u5185\u955c\u50cf\u6e90\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langchain langchain-openai -i https:\/\/pypi.tuna.tsinghua.edu.cn\/simple\n<\/pre>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u6b65\u9aa4 3\uff1a\u83b7\u53d6 API Key<\/strong><\/p>\n\n\n\n<p>\u672c\u6559\u7a0b\u4f7f\u7528<strong>\u667a\u8c31 AI(ChatGLM)<\/strong>\u4f5c\u4e3a\u793a\u4f8b\uff0c\u56e0\u4e3a\u5b83\uff1a<\/p>\n\n\n\n<ul>\n<li>\u5b8c\u7f8e\u517c\u5bb9 OpenAI API \u683c\u5f0f<\/li>\n\n\n\n<li>\u4e2d\u6587\u80fd\u529b\u5f3a<\/li>\n\n\n\n<li>\u4ef7\u683c\u5b9e\u60e0\uff08\u7ea6\u4e3a GPT-4 \u7684 1\/3\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u8bbf\u95ee https:\/\/open.bigmodel.cn \u6ce8\u518c\u8d26\u53f7\u5e76\u83b7\u53d6 API Key\uff08\u901a\u5e38\u662f\u4e00\u4e32\u4ee5\u00a0<code>.<\/code>\u00a0\u5206\u9694\u7684\u5b57\u7b26\uff09\u3002<\/p>\n\n\n\n<p><strong>\u91cd\u8981\u63d0\u793a<\/strong>\uff1a\u4ee3\u7801\u4e2d\u6240\u6709\u00a0<code>\"\u4f60\u7684_API_KEY\"<\/code>\u00a0\u90fd\u9700\u8981\u66ff\u6362\u6210\u4f60\u7684\u771f\u5b9e API Key\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 04 &#8211; \u56db\u9636\u6bb5\u5b9e\u6218\u8def\u7ebf\u56fe\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7b2c\u4e00\u6b65\uff1aHello World &#8211; \u6253\u901a\u5f15\u64ce<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u8ba9 AI \u5f00\u53e3\u8bf4\u8bdd\uff0c\u9a8c\u8bc1\u73af\u5883\u914d\u7f6e\u6b63\u786e\u3002\u00a0<strong><br><\/strong>\u6838\u5fc3\u6d1e\u5bdf\uff1aLangChain \u7684\u6a21\u578b\u63a5\u53e3\u62bd\u8c61\u5f97\u975e\u5e38\u5de7\u5999\u3002\u5b83\u517c\u5bb9 OpenAI \u683c\u5f0f\u7684 API\uff0c\u8fd9\u610f\u5473\u7740\u4f60\u5199\u7684\u4ee3\u7801\u53ef\u4ee5\u65e0\u7f1d\u5207\u6362\u5230 DeepSeek\u3001Moonshot \u7b49\u5176\u4ed6\u6a21\u578b\u2014\u2014\u53ea\u9700\u8981\u6539\u4e24\u884c\u914d\u7f6e\u3002<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson1.py<\/code>\uff0c\u590d\u5236\u4ee5\u4e0b\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># 1. \u5bfc\u5165\u5fc5\u8981\u7684\u5de5\u5177\u5305\n# ChatOpenAI \u662f LangChain \u7528\u6765\u8fde\u63a5\u7b26\u5408 OpenAI \u6807\u51c6\u63a5\u53e3\u7684\u6a21\u578b\uff08\u667a\u8c31\u5c31\u662f\u5176\u4e2d\u4e4b\u4e00\uff09\nfrom langchain_openai import ChatOpenAI\n\n# 2. \u521d\u59cb\u5316\u6a21\u578b (\u914d\u7f6e\"\u5927\u8111\")\n# \u8fd9\u91cc\u6211\u4eec\u914d\u7f6e\u4e86\u4e09\u4e2a\u5173\u952e\u53c2\u6570\uff1a\n# - model: \u6211\u4eec\u7528\u7684\u662f\u667a\u8c31\u7684 GLM-4 \u6a21\u578b\n# - openai_api_key: \u4f60\u7684\u901a\u884c\u8bc1\n# - openai_api_base: \u544a\u8bc9 LangChain \u4e0d\u8981\u53bb\u8fde OpenAI \u7684\u670d\u52a1\u5668\uff0c\u800c\u662f\u8fde\u667a\u8c31\u7684\u670d\u52a1\u5668\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=\"\u4f60\u7684_API_KEY\",  # \ud83d\udd34 \u8bb0\u5f97\u5728\u8fd9\u91cc\u586b\u5165\u4f60\u7684 Key\n    openai_api_base=\"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n)\n\n# 3. \u76f4\u63a5\u8c03\u7528\u6a21\u578b\n# invoke \u5c31\u662f\"\u8c03\u7528\"\u7684\u610f\u601d\uff0c\u6211\u4eec\u53d1\u7ed9\u5b83\u4e00\u53e5\u8bdd\nprint(\"\u6b63\u5728\u601d\u8003\u4e2d...\")\nresponse = llm.invoke(\"\u4f60\u597d\uff01\u8bf7\u7528\u9c81\u8fc5\u7684\u8bed\u6c14\u5938\u6211\u4e00\u4e0b\u5b66\u7f16\u7a0b\u5f88\u5feb\u3002\")\n\n# 4. \u6253\u5370\u7ed3\u679c\n# response.content \u624d\u662f\u6a21\u578b\u771f\u6b63\u56de\u590d\u7684\u5185\u5bb9\nprint(\"--- \u56de\u590d\u5185\u5bb9 ---\")\nprint(response.content)<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson1.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u8f93\u51fa\uff1a\u4f60\u4f1a\u770b\u5230\u667a\u8c31 AI \u7528\u9c81\u8fc5\u7684\u8bed\u6c14\u5938\u5956\u4f60\uff0c\u7c7b\u4f3c\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u6b63\u5728\u601d\u8003\u4e2d...\n--- \u56de\u590d\u5185\u5bb9 ---\n\u54e6\uff0c\u4f60\u8fd9\u4f4d\u541b\u5b50\uff0c\u7f16\u7a0b\u4e4b\u9053\uff0c\u7adf\u4e5f\u80fd\u6e38\u5203\u6709\u4f59...<\/pre>\n\n\n\n<p>\u67b6\u6784\u6d1e\u5bdf\uff1a\u8fd9\u770b\u4f3c\u7b80\u5355\uff0c\u5b9e\u5219\u8574\u542b\u6df1\u610f\u2014\u2014<strong>\u63a5\u53e3\u6807\u51c6\u5316\u662f\u53ef\u79fb\u690d\u6027\u7684\u524d\u63d0<\/strong>\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u6ca1\u6709\u7edf\u4e00\u7684\u63d2\u5ea7\u6807\u51c6\uff0c\u6bcf\u6362\u4e00\u4e2a\u7535\u5668\u5c31\u8981\u91cd\u65b0\u5e03\u7ebf\uff0c\u90a3\u5c06\u662f\u707e\u96be\u3002LangChain \u901a\u8fc7\u7edf\u4e00\u63a5\u53e3\uff0c\u8ba9\u4f60\u7684\u4ee3\u7801\u53ef\u4ee5\u5728\u4e0d\u540c\u6a21\u578b\u95f4\u81ea\u7531\u8fc1\u79fb\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7b2c\u4e8c\u6b65\uff1a\u7ed9 AI \u52a0\u4e0a\u8bb0\u5fc6 &#8211; Memory<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u8ba9 AI \u8bb0\u4f4f\u4e0a\u4e0b\u6587\uff0c\u5b9e\u73b0\u591a\u8f6e\u5bf9\u8bdd\u3002\u00a0<strong><br><\/strong>\u95ee\u9898\u5206\u6790\uff1a\u73b0\u5728\u7684 AI \u50cf\u4e00\u6761\u91d1\u9c7c\uff0c\u8bb0\u5fc6\u53ea\u6709 7 \u79d2\u3002\u5982\u679c\u4f60\u544a\u8bc9\u5b83&#8221;\u6211\u53eb\u5c0f\u660e&#8221;\uff0c\u7136\u540e\u518d\u95ee&#8221;\u6211\u53eb\u4ec0\u4e48&#8221;\uff0c\u5b83\u4f1a\u4e00\u8138\u832b\u7136\u3002\u56e0\u4e3a\u6bcf\u6b21\u8fd0\u884c\u90fd\u662f\u4e00\u6b21\u5168\u65b0\u7684\u5f00\u59cb\u3002<\/p>\n\n\n\n<p>\u00a0\u89e3\u51b3\u65b9\u6848\uff1aLangChain \u7684\u601d\u8def\u5f88\u7b80\u5355\u2014\u2014<strong>\u628a\u4e4b\u524d\u7684\u804a\u5929\u8bb0\u5f55\uff0c\u6253\u5305\u4e00\u8d77\u53d1\u7ed9\u5b83<\/strong>\u3002<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson2.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain_openai import ChatOpenAI\n# 1. \u5bfc\u5165\u4e09\u79cd\u6d88\u606f\u7c7b\u578b\n# SystemMessage: \u7cfb\u7edf\u6307\u4ee4 (\u6bd4\u5982\uff1a\u4f60\u662f\u4e00\u4e2a\u732b\u5a18...)\n# HumanMessage: \u7528\u6237\u8bf4\u7684\u8bdd\n# AIMessage: AI \u56de\u590d\u7684\u8bdd\nfrom langchain_core.messages import HumanMessage, AIMessage, SystemMessage\n\n# 2. \u521d\u59cb\u5316\u6a21\u578b (\u914d\u7f6e\u548c\u4e4b\u524d\u4e00\u6837)\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=\"\u4f60\u7684_API_KEY\",  # \ud83d\udd34 \u522b\u5fd8\u4e86\u66ff\u6362 Key\n    openai_api_base=\"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n)\n\n# 3. \u521d\u59cb\u5316\"\u8bb0\u5fc6\u6761\"\n# \u6211\u4eec\u7528\u4e00\u4e2a\u5217\u8868\u6765\u4fdd\u5b58\u6240\u6709\u7684\u5bf9\u8bdd\u5386\u53f2\n# \u5148\u7ed9\u5b83\u5b9a\u4e2a\u8c03\u5b50\uff1a\u4f60\u662f\u4e00\u4e2a\u8d44\u6df1\u7684 Python \u52a9\u6559\nmessages = [\n    SystemMessage(content=\"\u4f60\u662f\u4e00\u4e2a\u5e7d\u9ed8\u7684 Python \u52a9\u6559\uff0c\u8bf4\u8bdd\u559c\u6b22\u5e26\u70b9 emoji\u3002\")\n]\n\nprint(\"\ud83e\udd16 \u52a9\u6559\u5df2\u4e0a\u7ebf\uff01(\u8f93\u5165 'exit' \u9000\u51fa)\")\n\n# 4. \u5f00\u542f\u5faa\u73af\u5bf9\u8bdd\nwhile True:\n    # \u83b7\u53d6\u7528\u6237\u8f93\u5165\n    user_input = input(\"\\n\ud83d\udc64 \u4f60: \")\n\n    # \u5982\u679c\u8f93\u5165 exit \u5c31\u7ed3\u675f\n    if user_input.lower() == \"exit\":\n        print(\"\u518d\u89c1\uff01\")\n        break\n\n    # A. \u628a\u7528\u6237\u8bf4\u7684\u8bdd\uff0c\u5305\u88c5\u6210 HumanMessage\uff0c\u5b58\u5165\u8bb0\u5fc6\u5217\u8868\n    messages.append(HumanMessage(content=user_input))\n\n    # B. \u628a\u6574\u4e2a\u8bb0\u5fc6\u5217\u8868 (\u5305\u542b\u4e4b\u524d\u7684\u5bf9\u8bdd) \u53d1\u7ed9 AI\n    print(\"Thinking...\")\n    response = llm.invoke(messages)\n\n    # C. \u6253\u5370 AI \u7684\u56de\u590d\n    ai_reply = response.content\n    print(f\"\ud83e\udd16 \u52a9\u6559: {ai_reply}\")\n\n    # D. \u5173\u952e\u4e00\u6b65\uff1a\u628a AI \u7684\u56de\u590d\u4e5f\u5b58\u5165\u8bb0\u5fc6\u5217\u8868\n    messages.append(AIMessage(content=ai_reply))<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson2.py\n<\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u8bb0\u5fc6\u529b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u4f60: \u4f60\u597d\uff0c\u6211\u53eb\u5f20\u4e09\n\u52a9\u6559: \u4f60\u597d\u5f20\u4e09\uff01\ud83d\udc4b \u5f88\u9ad8\u5174\u8ba4\u8bc6\u4f60...\n\u4f60: \u4f60\u77e5\u9053\u6211\u53eb\u4ec0\u4e48\u540d\u5b57\u5417\uff1f\n\u52a9\u6559: \u5f53\u7136\u77e5\u9053\uff01\u4f60\u53eb\u5f20\u4e09 \ud83d\ude0a<\/pre>\n\n\n\n<p>\u67b6\u6784\u6d1e\u5bdf\uff1a\u8bb0\u5fc6\u7684\u672c\u8d28\u662f\u4ec0\u4e48\uff1f\u4e0d\u662f\u4ec0\u4e48\u9ed1\u79d1\u6280\uff0c\u800c\u662f<strong>\u628a\u4e4b\u524d\u7684\u5bf9\u8bdd\u8bb0\u5f55\u6253\u5305\u4e00\u8d77\u53d1\u7ed9\u6a21\u578b<\/strong>\u3002\u5c31\u50cf\u5f00\u4f1a\u65f6\uff0c\u4f60\u4e0d\u80fd\u53ea\u544a\u8bc9\u8001\u677f&#8221;\u6211\u540c\u610f&#8221;\uff0c\u4f60\u5f97\u5148\u590d\u8ff0\u4e00\u904d\u524d\u9762\u8ba8\u8bba\u4e86\u4ec0\u4e48\uff0c\u8001\u677f\u624d\u77e5\u9053\u4f60\u540c\u610f\u7684\u662f\u4ec0\u4e48\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u53bb\u6389\u4ee3\u7801\u4e2d\u7684 A \u548c D \u6b65\u9aa4\uff0c<code>messages<\/code>\u00a0\u5217\u8868\u91cc\u5c31\u6c38\u8fdc\u53ea\u6709\u90a3\u53e5\u7cfb\u7edf\u6307\u4ee4\uff0cAI \u6bcf\u6b21\u90fd\u770b\u4e0d\u5230\u4e4b\u524d\u7684\u5bf9\u8bdd\u3002<strong>\u8bb0\u5fc6\u7684\u672c\u8d28\uff0c\u5c31\u662f\u4e0d\u65ad\u628a\u65b0\u7684\u804a\u5929\u8bb0\u5f55&#8221;\u8ffd\u52a0&#8221;\u5230\u6e05\u5355\u91cc\uff0c\u518d\u91cd\u65b0\u53d1\u7ed9\u6a21\u578b\u3002<\/strong><\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7b2c\u4e09\u6b65\uff1a\u4e0e\u4f60\u7684\u6570\u636e\u5bf9\u8bdd &#8211; RAG\uff08\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff09<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u8ba9 AI \u57fa\u4e8e\u4f60\u63d0\u4f9b\u7684\u6587\u6863\u56de\u7b54\u95ee\u9898\uff08\u8fd9\u662f\u76ee\u524d\u6700\u706b\u7684\u5e94\u7528\u573a\u666f\uff09\u3002\u00a0<strong><br><\/strong>\u95ee\u9898\u5206\u6790\uff1a\u73b0\u5728\u7684 AI \u867d\u7136\u535a\u5b66\uff0c\u4f46\u5b83\u6709\u4e24\u4e2a\u5927\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul>\n<li>\u77e5\u8bc6\u8fc7\u671f\uff1a\u5b83\u4e0d\u77e5\u9053\u6628\u5929\u521a\u53d1\u751f\u7684\u65b0\u95fb<\/li>\n\n\n\n<li>\u79c1\u6709\u6570\u636e\u76f2\u533a\uff1a\u5b83\u4e0d\u77e5\u9053\u4f60\u4eec\u516c\u53f8\u7684\u5185\u90e8\u6587\u6863<\/li>\n<\/ul>\n\n\n\n<p>\u89e3\u51b3\u65b9\u6848\uff1aRAG (\u68c0\u7d22\u589e\u5f3a\u751f\u6210) \u5c31\u662f\u7ed9 AI \u641e\u4e00\u573a&#8221;\u5f00\u5377\u8003\u8bd5&#8221;\u3002\u6211\u4eec\u5148\u628a\u8d44\u6599\u7ed9\u5b83\uff0c\u5f53\u4f60\u95ee\u95ee\u9898\u65f6\uff0c\u5b83\u5148\u53bb\u8d44\u6599\u91cc\u7ffb\u4e66\uff08\u68c0\u7d22\uff09\uff0c\u627e\u5230\u7b54\u6848\u540e\u518d\u603b\u7ed3\u7ed9\u4f60\uff08\u751f\u6210\uff09\u3002\u00a0<strong><br><\/strong>\u6bd4\u55bb\uff1aRAG \u5c31\u50cf<strong>\u7ed9 AI \u914d\u4e86\u4e00\u4e2a\u5916\u63a5\u79fb\u52a8\u786c\u76d8<\/strong>\u3002\u6a21\u578b\u672c\u8eab\u7684\u53c2\u6570\u662f&#8221;\u5185\u5b58&#8221;\uff0cRAG \u662f&#8221;\u786c\u76d8&#8221;\u2014\u2014\u5185\u5b58\u6709\u9650\u4f46\u901f\u5ea6\u5feb\uff0c\u786c\u76d8\u5bb9\u91cf\u5927\u4f46\u9700\u8981\u68c0\u7d22\u3002<\/p>\n\n\n\n<p>\u6b65\u9aa4 1\uff1a\u5b89\u88c5\u989d\u5916\u4f9d\u8d56<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langchain-community faiss-cpu\n<\/pre>\n\n\n\n<p>\u6b65\u9aa4 2\uff1a\u51c6\u5907\u77e5\u8bc6\u6587\u6863<\/p>\n\n\n\n<p>\u5728\u4f60\u7684\u4ee3\u7801\u6587\u4ef6\u5939\u91cc\u65b0\u5efa\u4e00\u4e2a\u6587\u672c\u6587\u4ef6&nbsp;<code>knowledge.txt<\/code>\uff0c\u5199\u5165\u4e00\u4e9b\u53ea\u6709\u4f60\u77e5\u9053\u7684\u79d8\u5bc6\u77e5\u8bc6\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LangChain\u79d8\u5bc6\u6863\u6848\uff1a\n1. \u8fd9\u91cc\u7684\u7a0b\u5e8f\u5458\u5176\u5b9e\u90fd\u662f\u732b\u53d8\u7684\uff0c\u4ed6\u4eec\u6700\u7231\u5403\u7684\u4e0d\u662fbug\uff0c\u662f\u732b\u6761\u3002\n2. \u5b66\u4e60LangChain\u7684\u79d8\u8bc0\u662f\u6bcf\u5929\u5bf9\u7740\u7535\u8111\u5927\u558a\u4e09\u58f0\"\u5965\u529b\u7ed9\"\u3002\n3. 2025\u5e74\u7684\u6700\u4f73\u7f16\u7a0b\u8bed\u8a00\u662f\"\u55b5\u55b5\u8bed\"\u3002<\/pre>\n\n\n\n<p>\u6b65\u9aa4 3\uff1a\u521b\u5efa RAG \u7a0b\u5e8f<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson3.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom langchain_community.document_loaders import TextLoader\nfrom langchain_text_splitters import CharacterTextSplitter\nfrom langchain_community.vectorstores import FAISS\nfrom langchain_core.prompts import ChatPromptTemplate\n\n# --- \u914d\u7f6e ---\nAPI_KEY = \"\u4f60\u7684_API_KEY\"  # \ud83d\udd34 \u8bb0\u5f97\u586b Key\nBASE_URL = \"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n\n# 1. \u914d\u7f6e\"\u5927\u8111\" (\u8d1f\u8d23\u56de\u7b54)\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=API_KEY,\n    openai_api_base=BASE_URL\n)\n\n# 2. \u914d\u7f6e\"\u773c\u775b\" (Embeddings - \u8d1f\u8d23\u628a\u6587\u5b57\u53d8\u6210\u6570\u5b57\uff0c\u65b9\u4fbf\u641c\u7d22)\n# \u667a\u8c31\u4e5f\u63d0\u4f9b\u4e86 embedding \u6a21\u578b\uff0c\u6211\u4eec\u8fd9\u91cc\u7528 embedding-2\nembeddings = OpenAIEmbeddings(\n    model=\"embedding-2\",\n    openai_api_key=API_KEY,\n    openai_api_base=BASE_URL\n)\n\nprint(\"\ud83d\udcda \u6b63\u5728\u52a0\u8f7d\u5e76\u5904\u7406\u6587\u6863...\")\n\n# --- \u7b2c\u4e00\u6b65\uff1a\u52a0\u8f7d\u6587\u6863 ---\nloader = TextLoader(\"knowledge.txt\", encoding=\"utf-8\")\ndocuments = loader.load()\n\n# --- \u7b2c\u4e8c\u6b65\uff1a\u5207\u5272\u6587\u6863 ---\n# \u5982\u679c\u6587\u6863\u592a\u957f\uff0c\u6a21\u578b\u5403\u4e0d\u6d88\uff0c\u6240\u4ee5\u8981\u5207\u6210\u5c0f\u5757\ntext_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=0)\ndocs = text_splitter.split_documents(documents)\n\n# --- \u7b2c\u4e09\u6b65\uff1a\u5b58\u5165\u5411\u91cf\u6570\u636e\u5e93 (\u5efa\u7acb\u4e66\u67b6) ---\n# \u8fd9\u4e00\u6b65\u4f1a\u628a\u6587\u5b57\u53d8\u6210\u5411\u91cf\u5b58\u8d77\u6765\uff0c\u8fd9\u6837\u624d\u80fd\u8fdb\u884c\u8bed\u4e49\u641c\u7d22\nvectorstore = FAISS.from_documents(docs, embeddings)\nprint(\"\u2705 \u77e5\u8bc6\u5e93\u5efa\u7acb\u5b8c\u6210\uff01\")\n\n# --- \u7b2c\u56db\u6b65\uff1a\u68c0\u7d22\u4e0e\u95ee\u7b54 ---\n# \u8fd9\u662f\u4e00\u4e2a\u7279\u6b8a\u7684 Chain\uff0c\u4e13\u95e8\u7528\u6765\u505a RAG\nfrom langchain.chains.combine_documents import create_stuff_documents_chain\nfrom langchain.chains import create_retrieval_chain\n\n# \u8fd9\u662f\u4e00\u4e2a\u63d0\u793a\u8bcd\u6a21\u677f\uff0c\u544a\u8bc9 AI\uff1a\u8bf7\u6839\u636e\u4e0b\u9762\u7684 context (\u4e0a\u4e0b\u6587) \u6765\u56de\u7b54\u95ee\u9898\nprompt = ChatPromptTemplate.from_template(\"\"\"\n\u8bf7\u6839\u636e\u4e0b\u9762\u7684\u5185\u5bb9\u56de\u7b54\u7528\u6237\u7684\u95ee\u9898\uff1a\n&lt;context>\n{context}\n&lt;\/context>\n\n\u7528\u6237\u95ee\u9898\uff1a{input}\n\"\"\")\n\n# \u521b\u5efa\"\u6587\u6863\u5904\u7406\u94fe\" (\u8d1f\u8d23\u628a\u627e\u51fa\u6765\u7684\u6587\u6863\u585e\u7ed9 LLM)\ndocument_chain = create_stuff_documents_chain(llm, prompt)\n\n# \u521b\u5efa\"\u68c0\u7d22\u94fe\" (\u8d1f\u8d23\u5148\u53bb\u4e66\u67b6\u627e\u4e66\uff0c\u518d\u4ea4\u7ed9\u4e0a\u9762\u7684\u94fe)\nretriever = vectorstore.as_retriever()\nretrieval_chain = create_retrieval_chain(retriever, document_chain)\n\n# --- \u5f00\u59cb\u63d0\u95ee ---\nquery = \"\u5b66\u4e60 LangChain \u7684\u79d8\u8bc0\u662f\u4ec0\u4e48\uff1f\"\nprint(f\"\\n\u2753 \u63d0\u95ee: {query}\")\n\nresponse = retrieval_chain.invoke({\"input\": query})\n\nprint(f\"\ud83d\udca1 \u56de\u7b54: {response['answer']}\")<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson3.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u8f93\u51fa\uff1aAI \u4f1a\u57fa\u4e8e\u00a0<code>knowledge.txt<\/code>\u00a0\u91cc\u7684\u5185\u5bb9\u56de\u7b54\uff0c\u6bd4\u5982\uff1a&#8221;\u5b66\u4e60 LangChain \u7684\u79d8\u8bc0\u662f\u6bcf\u5929\u5bf9\u7740\u7535\u8111\u5927\u558a\u4e09\u58f0&#8217;\u5965\u529b\u7ed9&#8217;\u3002&#8221;\u00a0<strong><br><\/strong>\u67b6\u6784\u6d1e\u5bdf\uff1aRAG \u7684\u6570\u636e\u6d41\u8f6c<\/p>\n\n\n\n<ol>\n<li>\u6587\u6863\u52a0\u8f7d\u00a0&#8211; \u628a PDF\u3001Word \u7b49\u6587\u4ef6\u8bfb\u6210\u6587\u672c<\/li>\n\n\n\n<li>\u667a\u80fd\u5206\u5757\u00a0&#8211; \u6bcf 500 \u5b57\u5207\u4e00\u5757\uff0c\u5173\u952e\u662f<strong>\u76f8\u90bb\u5757\u91cd\u53e0 50 \u5b57<\/strong>\u2014\u2014\u4e3a\u4ec0\u4e48\uff1f\u56e0\u4e3a\u5982\u679c\u4ece\u6bb5\u843d\u4e2d\u95f4\u786c\u5207\uff0c\u4e0a\u4e0b\u6587\u5c31\u65ad\u4e86<\/li>\n\n\n\n<li>\u5411\u91cf\u5316\u00a0&#8211; \u628a\u6587\u672c\u8f6c\u6210 384 \u7ef4\u5411\u91cf\uff08\u8fd9\u4e0d\u662f\u968f\u673a\u6570\u5b57\uff0c\u800c\u662f&#8221;\u8bed\u4e49\u5750\u6807&#8221;\uff09<\/li>\n\n\n\n<li>\u8bed\u4e49\u68c0\u7d22\u00a0&#8211; \u7528\u6237\u63d0\u95ee\u65f6\uff0c\u5148\u5728\u5411\u91cf\u5e93\u91cc\u627e\u6700\u76f8\u5173\u7684\u6587\u672c\u5757\uff0c\u518d\u8ba9 LLM \u57fa\u4e8e\u8fd9\u4e9b\u6587\u672c\u56de\u7b54<\/li>\n<\/ol>\n\n\n\n<p>\u6838\u5fc3\u521b\u65b0\uff1a\u7528\u7a7a\u95f4\u8ddd\u79bb\u8868\u8fbe\u8bed\u4e49\u76f8\u4f3c\u5ea6\uff0c\u628a NLP \u95ee\u9898\u8f6c\u5316\u4e3a\u51e0\u4f55\u95ee\u9898\u3002\u610f\u601d\u76f8\u8fd1\u7684\u6587\u672c\uff0c\u5411\u91cf\u8ddd\u79bb\u4f1a\u5f88\u8fd1\u2014\u2014\u8fd9\u79cd&#8221;\u964d\u7ef4\u6253\u51fb&#8221;\u7684\u601d\u60f3\u6781\u5176\u4f18\u96c5\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7b2c\u56db\u6b65\uff1a\u7ed9 AI \u88c5\u4e0a&#8221;\u53cc\u624b&#8221; &#8211; Agents<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u8ba9 AI \u5b66\u4f1a\u4f7f\u7528\u5de5\u5177\uff08\u5982\u641c\u7d22\u7f51\u7edc\u3001\u67e5\u5929\u6c14\u3001\u7b97\u6570\u5b66\uff09\u3002\u00a0<br>\u95ee\u9898\u5206\u6790\uff1a\u95ee AI &#8220;\u73b0\u5728\u6bd4\u7279\u5e01\u591a\u5c11\u94b1&#8221;\uff0c\u5b83\u53ea\u80fd\u80e1\u4e71\u731c\u6d4b\uff1b\u8ba9\u5b83\u7b97 23423 \u00d7 82342\uff0c\u5927\u6982\u7387\u7b97\u9519\u3002\u5927\u6a21\u578b\u5929\u751f\u4e0d\u64c5\u957f\u7cbe\u786e\u8ba1\u7b97\u548c\u5b9e\u65f6\u6570\u636e\u83b7\u53d6\u3002\u00a0<br>\u89e3\u51b3\u65b9\u6848\uff1aAgent (\u4ee3\u7406) \u7684\u6838\u5fc3\u6982\u5ff5\u2014\u2014\u5f53 AI \u9047\u5230\u81ea\u5df1\u4e0d\u4f1a\u7684\u95ee\u9898\u65f6\uff0c\u5b83\u77e5\u9053\u53bb\u4f7f\u7528&#8221;\u5de5\u5177&#8221;\u3002<\/p>\n\n\n\n<p>\u6b65\u9aa4 1\uff1a\u5b89\u88c5\u641c\u7d22\u5de5\u5177<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install duckduckgo-search\npip install -U ddgs\n<\/pre>\n\n\n\n<p>\u6b65\u9aa4 2\uff1a\u521b\u5efa Agent \u7a0b\u5e8f<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson4.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from langchain_openai import ChatOpenAI\n# 1. \u5bfc\u5165\u641c\u7d22\u5de5\u5177\nfrom langchain_community.tools import DuckDuckGoSearchRun\n# 2. \u5bfc\u5165\u521b\u5efa Agent \u7684\u8f85\u52a9\u51fd\u6570\nfrom langchain.agents import create_tool_calling_agent, AgentExecutor\nfrom langchain_core.prompts import ChatPromptTemplate\n\n# --- \u914d\u7f6e ---\nAPI_KEY = \"\u4f60\u7684_API_KEY\"  # \ud83d\udd34 \u8bb0\u5f97\u586b Key\nBASE_URL = \"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n\n# 1. \u521d\u59cb\u5316\u6a21\u578b (\u5927\u8111)\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=API_KEY,\n    openai_api_base=BASE_URL\n)\n\n# 2. \u51c6\u5907\u5de5\u5177 (\u53cc\u624b)\n# \u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u641c\u7d22\u5de5\u5177\u5b9e\u4f8b\nsearch = DuckDuckGoSearchRun()\n# \u628a\u5de5\u5177\u653e\u5728\u4e00\u4e2a\u5217\u8868\u91cc (\u4ee5\u540e\u4f60\u53ef\u4ee5\u5f80\u91cc\u9762\u52a0\u65e5\u5386\u5de5\u5177\u3001\u8ba1\u7b97\u5668\u5de5\u5177\u7b49)\ntools = [search]\n\n# 3. \u521b\u5efa Prompt (\u4efb\u52a1\u4e66)\n# \u6211\u4eec\u9700\u8981\u544a\u8bc9 AI\uff1a\u4f60\u662f\u4e00\u4e2a\u53ef\u4ee5\u8c03\u7528\u5de5\u5177\u7684\u52a9\u624b\nprompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"\u4f60\u662f\u4e00\u4e2a\u5f3a\u5927\u7684\u52a9\u624b\u3002\u4f60\u53ef\u4ee5\u4f7f\u7528\u5de5\u5177\u6765\u67e5\u627e\u6700\u65b0\u7684\u4fe1\u606f\u3002\u5982\u679c\u7528\u6237\u95ee\u7684\u95ee\u9898\u9700\u8981\u8054\u7f51\uff0c\u8bf7\u52a1\u5fc5\u4f7f\u7528\u641c\u7d22\u5de5\u5177\u3002\"),\n    (\"user\", \"{input}\"),\n    (\"placeholder\", \"{agent_scratchpad}\"),  # \ud83d\udd34 \u8fd9\u662f\u4e00\u4e2a\u9884\u7559\u4f4d\u7f6e\uff0c\u7528\u6765\u5b58\u653e AI \u7684\u601d\u8003\u8fc7\u7a0b\n])\n\n# 4. \u7ec4\u88c5 Agent (\u5927\u8111 + \u624b + \u4efb\u52a1\u4e66)\nagent = create_tool_calling_agent(llm, tools, prompt)\n\n# 5. \u521b\u5efa\u6267\u884c\u5668 (\u76d1\u5de5)\n# verbose=True \u4f1a\u6253\u5370\u51fa AI \u601d\u8003\u548c\u8c03\u7528\u5de5\u5177\u7684\u8be6\u7ec6\u8fc7\u7a0b\uff0c\u975e\u5e38\u6709\u8da3\uff01\nagent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)\n\n# --- \u5f00\u59cb\u8fd0\u884c ---\n# \u95ee\u4e00\u4e2a\u5b83\u8bad\u7ec3\u6570\u636e\u91cc\u80af\u5b9a\u6ca1\u6709\u7684\u95ee\u9898 (\u6bd4\u5982\u6700\u65b0\u7684\u65b0\u95fb)\nquery = \"2024\u5e74\u5965\u8fd0\u4f1a\u662f\u5728\u54ea\u91cc\u4e3e\u529e\u7684\uff1f\u7ed3\u679c\u5982\u4f55\uff1f\"\n\nprint(f\"\ud83d\udd0d \u7528\u6237\u63d0\u95ee: {query}\\n\")\nprint(\"--- Agent \u5f00\u59cb\u5de5\u4f5c ---\")\n\nresponse = agent_executor.invoke({\"input\": query})\n\nprint(\"\\n--- \u6700\u7ec8\u56de\u7b54 ---\")\nprint(response[\"output\"])\n<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson4.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u8f93\u51fa\uff1a\u4f60\u4f1a\u770b\u5230 AI \u7684\u601d\u8003\u8fc7\u7a0b\uff08\u7eff\u8272\/\u9ec4\u8272\u6587\u5b57\uff09\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\ud83d\udd0d \u7528\u6237\u63d0\u95ee: 2024\u5e74\u5965\u8fd0\u4f1a\u662f\u5728\u54ea\u91cc\u4e3e\u529e\u7684\uff1f\u7ed3\u679c\u5982\u4f55\uff1f\n\n--- Agent \u5f00\u59cb\u5de5\u4f5c ---\n> Entering new AgentExecutor chain...\n\u9700\u8981\u4f7f\u7528\u641c\u7d22\u5de5\u5177...\n\u8c03\u7528\u5de5\u5177: duckduckgo_search\nTitle: Paris 2024 Olympics...\n...\u6700\u7ec8\u56de\u7b54 ---\n2024\u5e74\u5965\u8fd0\u4f1a\u5728\u6cd5\u56fd\u5df4\u9ece\u4e3e\u529e...<\/pre>\n\n\n\n<p>\u67b6\u6784\u6d1e\u5bdf\uff1aAgent \u7684\u8bbe\u8ba1\u54f2\u5b66\u662f\u5c06&#8221;\u51b3\u7b56&#8221;\u548c&#8221;\u6267\u884c&#8221;\u5206\u79bb\u3002\u6a21\u578b\u4e0d\u76f4\u63a5\u8f93\u51fa\u7b54\u6848\uff0c\u800c\u662f\u8f93\u51fa\u4e00\u4e2a&#8221;\u8c03\u7528\u5de5\u5177&#8221;\u7684\u6307\u4ee4\uff0c\u6846\u67b6\u8d1f\u8d23\u6267\u884c\u5de5\u5177\u5e76\u628a\u7ed3\u679c\u5582\u56de\u7ed9\u6a21\u578b\uff0c\u6a21\u578b\u518d\u57fa\u4e8e\u7ed3\u679c\u751f\u6210\u6700\u7ec8\u7b54\u6848\u3002\u8fd9\u4e2a\u5faa\u73af\u53ef\u4ee5\u91cd\u590d\u591a\u6b21\uff0c\u76f4\u5230\u95ee\u9898\u89e3\u51b3\u3002\u00a0AI \u4ece&#8221;\u53ea\u4f1a\u8bf4&#8221;\u8fdb\u5316\u5230\u4e86&#8221;\u65e2\u4f1a\u60f3\u53c8\u4f1a\u505a&#8221;\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7b2c\u4e94\u6b65\uff1a\u7ed9\u4ee3\u7801\u7a7f\u4e0a&#8221;\u5916\u8863&#8221; &#8211; Streamlit \u7f51\u9875\u754c\u9762<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u628a\u9ed1\u4e4e\u4e4e\u7684\u7ec8\u7aef\u7a0b\u5e8f\u53d8\u6210\u6f02\u4eae\u7684\u7f51\u9875\u5e94\u7528\u3002\u00a0<br>\u95ee\u9898\u5206\u6790\uff1a\u76ee\u524d\u7684\u7a0b\u5e8f\u90fd\u5728\u7ec8\u7aef\u91cc\u8fd0\u884c\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u65b9\u4fbf\u5206\u4eab\u7ed9\u670b\u53cb\u4f7f\u7528\u3002\u5982\u679c\u80fd\u6709\u4e00\u4e2a\u7f51\u9875\u754c\u9762\uff0c\u5c31\u80fd\u50cf ChatGPT \u4e00\u6837\u968f\u65f6\u6253\u5f00\u4f7f\u7528\u3002\u00a0<\/p>\n\n\n\n<p>\u89e3\u51b3\u65b9\u6848\uff1aStreamlit \u662f\u4e00\u4e2a Python \u5e93\uff0c\u4e13\u95e8\u7528\u6765\u5feb\u901f\u6784\u5efa\u6570\u636e\u5e94\u7528\u7684 Web \u754c\u9762\u3002\u6700\u795e\u5947\u7684\u662f\uff1a\u4f60\u4e0d\u9700\u8981\u61c2 HTML\u3001CSS\u3001JavaScript\uff0c\u5b8c\u5168\u7528 Python \u5c31\u80fd\u5199\u51fa\u6f02\u4eae\u7684\u7f51\u9875\u3002\u00a0<\/p>\n\n\n\n<p>\u6bd4\u55bb\uff1aStreamlit \u5c31\u50cf\u7ed9\u4f60\u7684 Python \u7a0b\u5e8f\u5957\u4e0a\u4e00\u4e2a\u7cbe\u7f8e\u7684\u5916\u58f3\uff0c\u8ba9\u5b83\u4ece&#8221;\u547d\u4ee4\u884c\u5de5\u5177&#8221;\u53d8\u6210&#8221;Web \u5e94\u7528&#8221;\u3002<\/p>\n\n\n\n<p>\u6b65\u9aa4 1\uff1a\u5b89\u88c5 Streamlit<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install streamlit\n<\/pre>\n\n\n\n<p>\u6b65\u9aa4 2\uff1a\u521b\u5efa\u7f51\u9875\u7248\u804a\u5929\u673a\u5668\u4eba<\/p>\n\n\n\n<p>\u6211\u4eec\u8981\u628a Lesson 2 \u7684\u5e26\u8bb0\u5fc6\u804a\u5929\u673a\u5668\u4eba\u642c\u5230\u7f51\u9875\u4e0a\u3002\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson5_streamlit.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\nimport streamlit as st\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.messages import HumanMessage, AIMessage, SystemMessage\n# --- 1. \u9875\u9762\u914d\u7f6e ---\nst.set_page_config(page_title=\"\u6211\u7684 AI \u52a9\u624b\", page_icon=\"\ud83e\udd16\")\nst.title(\"\ud83e\udd16 \u6211\u7684\u4e13\u5c5e AI \u804a\u5929\u5ba4\")\n# --- 2. \u521d\u59cb\u5316\u6a21\u578b ---\n# \u4e3a\u4e86\u9632\u6b62\u6bcf\u6b21\u9875\u9762\u5237\u65b0\u90fd\u91cd\u65b0\u8fde\u63a5\u6a21\u578b\uff0c\u6211\u4eec\u52a0\u4e2a\u7f13\u5b58\u88c5\u9970\u5668 (\u53ef\u9009\uff0c\u4f46\u63a8\u8350)\n@st.cache_resource\ndef get_llm():\n    return ChatOpenAI(\n        model=\"glm-4\",\n        openai_api_key=\"\u4f60\u7684_API_KEY\",  # \ud83d\udd34 \u8bb0\u5f97\u586b Key\n        openai_api_base=\"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n    )\nllm = get_llm()\n# --- 3. \u521d\u59cb\u5316\"\u8bb0\u5fc6\" (Session State) ---\n# \u5982\u679c\"\u6682\u5b58\u7bb1\"\u91cc\u6ca1\u6709\u6d88\u606f\u8bb0\u5f55\uff0c\u6211\u4eec\u5c31\u521b\u5efa\u4e00\u4e2a\u7a7a\u7684\uff0c\u5e76\u653e\u5165\u7cfb\u7edf\u6307\u4ee4\nif \"messages\" not in st.session_state:\n    st.session_state.messages = [\n        SystemMessage(content=\"\u4f60\u662f\u4e00\u4e2a\u4e50\u4e8e\u52a9\u4eba\u7684 AI \u52a9\u624b\uff0c\u56de\u7b54\u8bf7\u7b80\u6d01\u660e\u4e86\u3002\")\n    ]\n# --- 4. \u6e32\u67d3\u804a\u5929\u8bb0\u5f55 ---\n# \u6bcf\u6b21\u5237\u65b0\u9875\u9762\uff0c\u90fd\u628a\u6682\u5b58\u7bb1\u91cc\u7684\u5386\u53f2\u6d88\u606f\u753b\u5728\u5c4f\u5e55\u4e0a\nfor msg in st.session_state.messages:\n    if isinstance(msg, HumanMessage):\n        with st.chat_message(\"user\"):  # \u6e32\u67d3\u7528\u6237\u7684\u6c14\u6ce1\n            st.write(msg.content)\n    elif isinstance(msg, AIMessage):\n        with st.chat_message(\"assistant\"):  # \u6e32\u67d3 AI \u7684\u6c14\u6ce1\n            st.write(msg.content)\n# --- 5. \u5904\u7406\u7528\u6237\u8f93\u5165 ---\n# st.chat_input \u4f1a\u5728\u9875\u9762\u5e95\u90e8\u521b\u5efa\u4e00\u4e2a\u8f93\u5165\u6846\nuser_input = st.chat_input(\"\u8bf4\u70b9\u4ec0\u4e48\u5427...\")\nif user_input:\n    # A. \u663e\u793a\u7528\u6237\u8f93\u5165\n    with st.chat_message(\"user\"):\n        st.write(user_input)\n    # B. \u5b58\u5165\u8bb0\u5fc6\n    st.session_state.messages.append(HumanMessage(content=user_input))\n    # C. \u8c03\u7528\u6a21\u578b (\u5e26\u7740\u4e4b\u524d\u7684\u8bb0\u5fc6)\n    with st.chat_message(\"assistant\"):\n        with st.spinner(\"AI \u6b63\u5728\u601d\u8003...\"):  # \u663e\u793a\u4e00\u4e2a\u52a0\u8f7d\u8f6c\u5708\u5708\n            response = llm.invoke(st.session_state.messages)\n            st.write(response.content)\n    # D. \u628a AI \u7684\u56de\u590d\u5b58\u5165\u8bb0\u5fc6\n    st.session_state.messages.append(AIMessage(content=response.content))<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<p>Streamlit \u7684\u8fd0\u884c\u65b9\u5f0f\u548c\u666e\u901a Python \u811a\u672c\u4e0d\u4e00\u6837\u3002\u8bf7\u5728\u7ec8\u7aef\u8f93\u5165\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">streamlit run lesson5_streamlit.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u6548\u679c\uff1a<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"659\" src=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4.png\" alt=\"\" class=\"wp-image-19735\" style=\"width:441px;height:auto\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4.png 783w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4-300x252.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4-768x646.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4-230x194.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4-350x295.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-4-480x404.png 480w\" sizes=\"(max-width: 783px) 100vw, 783px\" \/><\/figure><\/div>\n\n\n<p>\u7ec8\u7aef\u4f1a\u81ea\u52a8\u6253\u5f00\u4f60\u7684\u9ed8\u8ba4\u6d4f\u89c8\u5668\uff08\u901a\u5e38\u5730\u5740\u662f&nbsp;<code>http:\/\/localhost:8501<\/code>\uff09\uff0c\u4f60\u4f1a\u770b\u5230\uff1a<\/p>\n\n\n\n<ul>\n<li>\u4e00\u4e2a\u6f02\u4eae\u7684\u804a\u5929\u754c\u9762\uff08\u7c7b\u4f3c ChatGPT\uff09<\/li>\n\n\n\n<li>\u5bf9\u8bdd\u5386\u53f2\u4f1a\u4fdd\u7559\u5728\u9875\u9762\u4e0a<\/li>\n\n\n\n<li>\u5e95\u90e8\u6709\u8f93\u5165\u6846\uff0c\u53ef\u4ee5\u8fde\u7eed\u5bf9\u8bdd<\/li>\n\n\n\n<li>\u6bcf\u6b21\u5237\u65b0\u9875\u9762\uff0c\u5386\u53f2\u8bb0\u5f55\u90fd\u8fd8\u5728<\/li>\n<\/ul>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u67b6\u6784\u6d1e\u5bdf\uff1aSession State \u7684\u5173\u952e\u8bbe\u8ba1<\/strong><\/p>\n\n\n\n<p>Streamlit \u6709\u4e00\u4e2a\u91cd\u8981\u673a\u5236\uff1a<strong>\u6bcf\u6b21\u4f60\u70b9\u51fb\u6309\u94ae\u6216\u8f93\u5165\u5185\u5bb9\uff0c\u6574\u4e2a Python \u811a\u672c\u4f1a\u4ece\u5934\u5230\u5c3e\u91cd\u65b0\u8fd0\u884c\u4e00\u904d<\/strong>\u3002<\/p>\n\n\n\n<p>\u8fd9\u610f\u5473\u7740\u4ec0\u4e48\uff1f\u5982\u679c\u6ca1\u6709&nbsp;<code>st.session_state<\/code>\uff0c\u6bcf\u6b21\u8f93\u5165\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7a7a&nbsp;<code>messages<\/code>&nbsp;\u5217\u8868\uff0cAI \u5c31\u4f1a\u5931\u5fc6\u3002<\/p>\n\n\n\n<p><code>st.session_state<\/code>&nbsp;\u7684\u4f5c\u7528\u5c31\u662f<strong>\u5728\u9875\u9762\u5237\u65b0\u65f6\u4fdd\u6301\u6570\u636e\u4e0d\u4e22\u5931<\/strong>\u3002\u4f60\u53ef\u4ee5\u628a\u5b83\u7406\u89e3\u4e3a&#8221;\u7f51\u9875\u7684\u6682\u5b58\u7bb1&#8221;\uff1a<\/p>\n\n\n\n<ul>\n<li>\u7b2c\u4e00\u6b21\u8bbf\u95ee\u9875\u9762\uff1a\u521b\u5efa\u7a7a\u7684\u00a0<code>messages<\/code>\u00a0\u5217\u8868<\/li>\n\n\n\n<li>\u7528\u6237\u8f93\u5165 &#8220;\u4f60\u597d&#8221;\uff1a\u8ffd\u52a0\u5230\u5217\u8868\uff0c\u5237\u65b0\u9875\u9762\uff0c\u4ece\u6682\u5b58\u7bb1\u8bfb\u53d6\u5b8c\u6574\u5217\u8868<\/li>\n\n\n\n<li>AI \u56de\u590d\uff1a\u8ffd\u52a0\u5230\u5217\u8868\uff0c\u5237\u65b0\u9875\u9762\uff0c\u4ece\u6682\u5b58\u7bb1\u8bfb\u53d6\u5b8c\u6574\u5217\u8868<\/li>\n\n\n\n<li>\u7528\u6237\u518d\u6b21\u8f93\u5165\uff1a\u7ee7\u7eed\u8ffd\u52a0&#8230;<\/li>\n<\/ul>\n\n\n\n<p>\u5b9e\u7528\u6280\u5de7\uff1a\u4f60\u53ef\u4ee5\u5728\u4fa7\u8fb9\u680f\u6dfb\u52a0\u63a7\u5236\u9009\u9879\uff0c\u6bd4\u5982\u8c03\u8282 AI \u7684&#8221;\u521b\u9020\u529b&#8221;\uff08temperature \u53c2\u6570\uff09\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n# \u5728\u6587\u4ef6\u5f00\u5934\u6dfb\u52a0\u4fa7\u8fb9\u680f\u914d\u7f6e\nwith st.sidebar:\n    st.header(\"\u2699\ufe0f \u8bbe\u7f6e\")\n    temperature = st.slider(\"\u521b\u9020\u529b\", 0.0, 1.0, 0.7, 0.1)\n    # \u66f4\u65b0 llm \u914d\u7f6e\n    llm = ChatOpenAI(\n        model=\"glm-4\",\n        openai_api_key=\"\u4f60\u7684_API_KEY\",\n        openai_api_base=\"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\",\n        temperature=temperature\n    )<\/pre>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 05 &#8211; LangGraph \u8fdb\u9636\uff1a\u6d41\u7a0b\u7f16\u6392\u7684\u827a\u672f\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4e3a\u4ec0\u4e48\u9700\u8981 LangGraph\uff1f<\/p>\n\n\n\n<p>LangChain \u7684 Chain(\u94fe)\u662f\u5355\u5411\u6d41\u52a8\u7684\uff1aA \u2192 B \u2192 C \u2192 \u7ed3\u675f\u3002\u4f46\u73b0\u5b9e\u573a\u666f\u5f80\u5f80\u9700\u8981\uff1a<\/p>\n\n\n\n<ul>\n<li><strong>\u6761\u4ef6\u5206\u652f<\/strong>\u00a0&#8211; \u5982\u679c\u662f\u6570\u5b66\u9898\u8d70 A \u8def\u5f84\uff0c\u95f2\u804a\u8d70 B \u8def\u5f84<\/li>\n\n\n\n<li><strong>\u5faa\u73af\u8fed\u4ee3<\/strong>\u00a0&#8211; \u5199\u6587\u7ae0 \u2192 \u5ba1\u6838 \u2192 \u4e0d\u6ee1\u610f\u5c31\u91cd\u5199 \u2192 \u518d\u5ba1\u6838 \u2192 \u76f4\u5230\u6ee1\u610f<\/li>\n\n\n\n<li><strong>\u5e76\u884c\u5904\u7406<\/strong>\u00a0&#8211; \u540c\u65f6\u8c03\u7528\u591a\u4e2a\u5de5\u5177\uff0c\u518d\u6c47\u603b\u7ed3\u679c<\/li>\n<\/ul>\n\n\n\n<p>LangGraph \u5f15\u5165\u4e86<strong>\u56fe\u7ed3\u6784<\/strong>(Graph)\uff0c\u53ef\u4ee5\u8868\u8fbe\u4efb\u610f\u590d\u6742\u7684\u6d41\u7a0b\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u5b9e\u6218\uff1a\u6761\u4ef6\u8def\u7531 &#8211; \u7ea2\u7eff\u706f\u5f0f\u7684\u667a\u80fd\u5206\u6d41<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u505a\u4e00\u4e2a\u667a\u80fd\u5206\u6d41\u7cfb\u7edf\u3002\u7528\u6237\u8f93\u5165 \u2192 AI \u5224\u65ad\u610f\u56fe \u2192 \u5982\u679c\u662f&#8221;\u6570\u5b66\u9898&#8221;\u8d70 A \u8def\uff0c\u5982\u679c\u662f&#8221;\u95f2\u804a&#8221;\u8d70 B \u8def\u3002<\/p>\n\n\n\n<p>\u6b65\u9aa4 1\uff1a\u5b89\u88c5 LangGraph<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pip install langgraph\n<\/pre>\n\n\n\n<p>\u6b65\u9aa4 2\uff1a\u521b\u5efa\u6761\u4ef6\u8def\u7531\u7a0b\u5e8f<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson6_router.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nfrom typing import TypedDict, Literal\nfrom langgraph.graph import StateGraph, END\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.messages import SystemMessage, HumanMessage\n\n# --- \u914d\u7f6e ---\nAPI_KEY = \"\u4f60\u7684_API_KEY\"  # \ud83d\udd34 \u522b\u5fd8\u4e86\u66ff\u6362 Key\nBASE_URL = \"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=API_KEY,\n    openai_api_base=BASE_URL\n)\n\n# --- 1. \u5b9a\u4e49 State (\u6570\u636e\u7684\u8d27\u7bb1) ---\n# \u6211\u4eec\u89c4\u5b9a\u8fd9\u4e2a\u7bb1\u5b50\u91cc\u53ea\u80fd\u88c5\u8fd9\u4e09\u6837\u4e1c\u897f\nclass AgentState(TypedDict):\n    question: str       # \u7528\u6237\u7684\u539f\u59cb\u95ee\u9898\n    classification: str # \u5206\u7c7b\u7ed3\u679c (\u6bd4\u5982 \"math\" \u6216 \"general\")\n    answer: str         # \u6700\u7ec8\u751f\u6210\u7684\u56de\u7b54\n\nprint(\"\u2705 \u72b6\u6001\u5b9a\u4e49\u5b8c\u6210\uff01\u51c6\u5907\u5f00\u59cb\u6784\u5efa\u8282\u70b9...\")\n\n# --- 2. \u5b9a\u4e49\u8282\u70b9 (\u5e72\u6d3b\u7684\u51fd\u6570) ---\n\n# \u8282\u70b9 A: \u5206\u7c7b\u5458\ndef classify_input(state: AgentState):\n    # \u62ff\u5230\u7528\u6237\u7684\u95ee\u9898\n    question = state[\"question\"]\n\n    # \u8ba9 AI \u505a\u9009\u62e9\u9898\n    response = llm.invoke(\n        [SystemMessage(content=\"\u4f60\u662f\u4e00\u4e2a\u5206\u7c7b\u5668\u3002\u5982\u679c\u7528\u6237\u7684\u95ee\u9898\u662f\u6570\u5b66\u8ba1\u7b97\uff0c\u8bf7\u53ea\u56de\u590d 'math'\u3002\u5982\u679c\u662f\u5176\u4ed6\u95ee\u9898\uff0c\u8bf7\u53ea\u56de\u590d 'general'\u3002\u4e0d\u8981\u6709\u591a\u4f59\u7684\u5e9f\u8bdd\u3002\"),\n         HumanMessage(content=question)]\n    )\n\n    # \u6838\u5fc3\u6b65\u9aa4\uff1a\u66f4\u65b0 State \u4e2d\u7684 classification \u5b57\u6bb5\n    return {\"classification\": response.content.strip()}\n\n# \u8282\u70b9 B: \u6570\u5b66\u5bb6\ndef handle_math(state: AgentState):\n    question = state[\"question\"]\n    print(\"\ud83e\uddee \u6b63\u5728\u8c03\u7528\u6570\u5b66\u4e13\u5bb6...\")\n    response = llm.invoke(\n        [SystemMessage(content=\"\u4f60\u662f\u4e00\u4e2a\u6570\u5b66\u4e13\u5bb6\u3002\u8bf7\u4e25\u8c28\u5730\u8ba1\u7b97\u5e76\u7ed9\u51fa\u7b54\u6848\u3002\"),\n         HumanMessage(content=question)]\n    )\n    return {\"answer\": response.content}\n\n# \u8282\u70b9 C: \u804a\u5929\u5458\ndef handle_general(state: AgentState):\n    question = state[\"question\"]\n    print(\"\ud83d\udcac \u6b63\u5728\u8c03\u7528\u95f2\u804a\u52a9\u624b...\")\n    response = llm.invoke(\n        [SystemMessage(content=\"\u4f60\u662f\u4e00\u4e2a\u5e7d\u9ed8\u7684\u804a\u5929\u52a9\u624b\u3002\"),\n         HumanMessage(content=question)]\n    )\n    return {\"answer\": response.content}\n\n# --- 3. \u5b9a\u4e49\u53d8\u8f68\u903b\u8f91 (\u6761\u4ef6\u8fb9) ---\ndef route_logic(state: AgentState):\n    # \u770b\u4e00\u773c\u5206\u7c7b\u5458\u7684\u7ed3\u679c\n    classification = state[\"classification\"]\n\n    # \u51b3\u5b9a\u4e0b\u4e00\u6b65\u53bb\u54ea\u91cc\n    if \"math\" in classification:\n        return \"math_expert\"\n    else:\n        return \"general_assistant\"\n\n# --- 4. \u7ec4\u88c5\u56fe\u8868 (The Graph) ---\nworkflow = StateGraph(AgentState)\n\n# A. \u6dfb\u52a0\u8282\u70b9 (\u7ed9\u5de5\u4eba\u6302\u724c)\nworkflow.add_node(\"classifier\", classify_input)\nworkflow.add_node(\"math_expert\", handle_math)\nworkflow.add_node(\"general_assistant\", handle_general)\n\n# B. \u8bbe\u7f6e\u8d77\u70b9\nworkflow.set_entry_point(\"classifier\")\n\n# C. \u8bbe\u7f6e\u6761\u4ef6\u8fb9 (\u5173\u952e\u6b65\u9aa4\uff01)\n# \u610f\u601d\u5c31\u662f\uff1a\u4ece classifier \u51fa\u6765\u540e\uff0c\u6267\u884c route_logic \u51fd\u6570\n# \u5982\u679c\u51fd\u6570\u8fd4\u56de \"math_expert\"\uff0c\u5c31\u53bb math_expert \u8282\u70b9\n# \u5982\u679c\u51fd\u6570\u8fd4\u56de \"general_assistant\"\uff0c\u5c31\u53bb general_assistant \u8282\u70b9\nworkflow.add_conditional_edges(\n    \"classifier\",\n    route_logic,\n    {\n        \"math_expert\": \"math_expert\",\n        \"general_assistant\": \"general_assistant\"\n    }\n)\n\n# D. \u8bbe\u7f6e\u7ec8\u70b9\n# \u6570\u5b66\u5bb6\u548c\u804a\u5929\u5458\u5e72\u5b8c\u6d3b\uff0c\u5c31\u76f4\u63a5\u7ed3\u675f\nworkflow.add_edge(\"math_expert\", END)\nworkflow.add_edge(\"general_assistant\", END)\n\n# E. \u7f16\u8bd1\u56fe\u8868\napp = workflow.compile()\n\nprint(\"\u2705 \u8def\u7531\u7cfb\u7edf\u5df2\u542f\u52a8\uff01\")\n\n# --- 5. \u6d4b\u8bd5\u8fd0\u884c ---\n\n# \u6d4b\u8bd5 1: \u6570\u5b66\u9898\nprint(\"\\n\ud83e\uddea \u6d4b\u8bd5 1: \u8f93\u5165 '123 * 456 \u7b49\u4e8e\u51e0?'\")\ninputs = {\"question\": \"123 * 456 \u7b49\u4e8e\u51e0?\"}\nfor output in app.stream(inputs):\n    # \u6253\u5370\u6bcf\u4e00\u6b65\u7684\u8282\u70b9\u540d\u79f0\u548c\u8f93\u51fa\uff0c\u65b9\u4fbf\u89c2\u5bdf\n    for key, value in output.items():\n        print(f\"  -> \u7ecf\u8fc7\u8282\u70b9: {key}\")\n        print(f\"     \u7ed3\u679c: {value}\")\n\n# \u6d4b\u8bd5 2: \u95f2\u804a\nprint(\"\\n\ud83e\uddea \u6d4b\u8bd5 2: \u8f93\u5165 '\u7ed9\u6211\u8bb2\u4e2a\u7b11\u8bdd'\")\ninputs = {\"question\": \"\u7ed9\u6211\u8bb2\u4e2a\u7b11\u8bdd\"}\nfor output in app.stream(inputs):\n    for key, value in output.items():\n        print(f\"  -> \u7ecf\u8fc7\u8282\u70b9: {key}\")\n        print(f\"     \u7ed3\u679c: {value}\")<\/pre>\n\n\n\n<p>\u8fd0\u884c\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson6_router.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u8f93\u51fa\uff1a\u4f60\u4f1a\u770b\u5230\u4e0d\u540c\u7684\u95ee\u9898\u8d70\u4e0d\u540c\u7684\u8def\u5f84\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u6d4b\u8bd5 1: \u6570\u5b66\u9898\n  -> \u7ecf\u8fc7\u8282\u70b9: classifier\n  -> \u7ecf\u8fc7\u8282\u70b9: math_expert\n     \u7ed3\u679c: 123 * 456 = 56088\n\n\u6d4b\u8bd5 2: \u95f2\u804a\n  -> \u7ecf\u8fc7\u8282\u70b9: classifier\n  -> \u7ecf\u8fc7\u8282\u70b9: general_assistant\n     \u7ed3\u679c: \u4e3a\u4ec0\u4e48\u7a0b\u5e8f\u5458\u559c\u6b22\u7528\u6697\u8272\u4e3b\u9898\uff1f\u56e0\u4e3a\u5149\u592a\u4eae\u4f1a\u5438\u5f15bug\uff01<\/pre>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"521\" src=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-1024x521.png\" alt=\"\" class=\"wp-image-19737\" style=\"width:438px;height:auto\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-1024x521.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-300x153.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-768x391.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-830x423.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-230x117.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-350x178.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5-480x244.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2025\/12\/image-5.png 1082w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>\u67b6\u6784\u6d1e\u5bdf\uff1a\u8fd9\u79cd\u8bbe\u8ba1\u7684\u597d\u5904\u662f<strong>\u6d41\u7a0b\u63a7\u5236\u903b\u8f91\u4ece\u4e1a\u52a1\u4ee3\u7801\u4e2d\u5265\u79bb<\/strong>\u3002\u4fee\u6539\u8def\u7531\u89c4\u5219\u4e0d\u9700\u8981\u52a8\u6838\u5fc3\u4ee3\u7801\uff0c\u7b26\u5408&#8221;\u5f00\u95ed\u539f\u5219&#8221;\u3002\u4f60\u53ef\u4ee5\u8f7b\u677e\u6dfb\u52a0\u66f4\u591a\u5206\u652f\uff0c\u6bd4\u5982&#8221;\u7ffb\u8bd1&#8221;\u3001&#8221;\u4ee3\u7801\u751f\u6210&#8221;\u7b49\uff0c\u800c\u4e0d\u4f1a\u8ba9\u4ee3\u7801\u53d8\u6210&#8221;\u610f\u5927\u5229\u9762\u6761&#8221;\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u5b9e\u6218\uff1a\u5faa\u73af\u6d41\u7a0b &#8211; \u81ea\u6211\u4fee\u6b63\u7684 AI \u4f5c\u5bb6<\/strong><\/p>\n\n\n\n<p>\u76ee\u6807\uff1a\u6784\u5efa\u4e00\u4e2a&#8221;\u8ffd\u6c42\u5b8c\u7f8e&#8221;\u7684\u4f5c\u5bb6 Agent\u3002\u5199\u521d\u7a3f \u2192 \u68c0\u67e5\u8d28\u91cf \u2192 \u5982\u679c\u4e0d\u8fbe\u6807\uff0c\u8fd4\u56de\u91cd\u5199 \u2192 \u518d\u68c0\u67e5 \u2192 \u76f4\u5230\u6ee1\u610f\u3002<\/p>\n\n\n\n<p>\u521b\u5efa\u6587\u4ef6&nbsp;<code>lesson7_loop.py<\/code>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nfrom typing import TypedDict\nfrom langgraph.graph import StateGraph, END\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.messages import SystemMessage, HumanMessage\n\n# --- \u914d\u7f6e ---\nAPI_KEY = \"\u4f60\u7684_API_KEY\"  # \ud83d\udd34 \u8bb0\u5f97\u586b Key\nBASE_URL = \"https:\/\/open.bigmodel.cn\/api\/paas\/v4\/\"\n\nllm = ChatOpenAI(\n    model=\"glm-4\",\n    openai_api_key=API_KEY,\n    openai_api_base=BASE_URL\n)\n\n# --- 1. \u5b9a\u4e49 State (\u65b0\u7684\u6570\u636e\u7ed3\u6784) ---\nclass RevisionState(TypedDict):\n    topic: str         # \u5199\u4f5c\u7684\u4e3b\u9898 (\u4f8b\u5982: \"\u5173\u4e8eAI\u7684\u79d1\u666e\u6587\u7ae0\")\n    draft: str         # \u5f53\u524d\u7684\u8349\u7a3f\u5185\u5bb9\n    critique: str      # \u7f16\u8f91\u7684\u53cd\u9988\u610f\u89c1\n    iterations: int    # \u5df2\u7ecf\u4fee\u6539\u7684\u6b21\u6570\n\nprint(\"\u2705 \u5faa\u73af\u72b6\u6001\u5b9a\u4e49\u5b8c\u6210\uff01\")\n\n# --- 2. \u5b9a\u4e49\u8282\u70b9 (\u5e72\u6d3b\u7684\u51fd\u6570) ---\n\n# \u8282\u70b9 A: \u521d\u7a3f\u64b0\u5199\u5458\/\u4fee\u6539\u5458\ndef draft_writer(state: RevisionState):\n    topic = state[\"topic\"]\n    draft = state.get(\"draft\")\n    critique = state.get(\"critique\")\n\n    # \u7b2c\u4e00\u6b21\u5199\u4f5c\u548c\u540e\u7eed\u4fee\u6539\u4f7f\u7528\u4e0d\u540c\u7684 Prompt\n    if draft is None:\n        print(\"\u270d\ufe0f \u9996\u6b21\u64b0\u5199\u521d\u7a3f...\")\n        prompt_text = f\"\u4f60\u662f\u4e00\u4f4d\u4f18\u79c0\u7684\u4f5c\u5bb6\u3002\u8bf7\u5c31\u4ee5\u4e0b\u4e3b\u9898\u64b0\u5199\u4e00\u7bc7 500 \u5b57\u7684\u7b80\u77ed\u6587\u7ae0\uff1a{topic}\"\n    else:\n        print(f\"\ud83d\udd04 \u6536\u5230\u7f16\u8f91\u610f\u89c1\uff0c\u8fdb\u884c\u7b2c {state['iterations'] + 1} \u6b21\u4fee\u6539...\")\n        prompt_text = f\"\u4f60\u6b63\u5728\u4fee\u6539\u4e00\u7bc7\u5173\u4e8e '{topic}' \u7684\u6587\u7ae0\u3002\u8fd9\u662f\u7f16\u8f91\u7684\u610f\u89c1\uff1a'{critique}'\u3002\u8bf7\u6839\u636e\u610f\u89c1\u4fee\u6539\u6587\u7ae0\uff0c\u5e76\u91cd\u65b0\u8f93\u51fa\u5b8c\u6574\u7684\u6587\u7ae0\u3002\"\n\n    response = llm.invoke(\n        [SystemMessage(content=\"\u4f60\u662f\u4e00\u4f4d\u4e13\u4e1a\u4f5c\u5bb6\uff0c\u8bf7\u4e13\u6ce8\u4e8e\u5185\u5bb9\u548c\u903b\u8f91\u7684\u6539\u8fdb\u3002\"),\n         HumanMessage(content=prompt_text)]\n    )\n\n    # \u6838\u5fc3\u6b65\u9aa4\uff1a\u66f4\u65b0 State \u4e2d\u7684 draft \u5b57\u6bb5\n    return {\"draft\": response.content}\n\n# \u8282\u70b9 B: \u4e13\u4e1a\u7f16\u8f91\ndef editor_critique(state: RevisionState):\n    draft = state[\"draft\"]\n    print(\"\ud83e\uddd0 \u7f16\u8f91\u6b63\u5728\u5ba1\u9605\u8349\u7a3f...\")\n\n    # \ud83d\udd34 \u52a0\u5165\u4e86\u4e25\u683c\u7684\u8d1f\u9762\u7ea6\u675f\n    response = llm.invoke(\n        [SystemMessage(content=\"\"\"\n        \u4f60\u662f\u4e00\u4f4d\u82db\u523b\u7684\u7f16\u8f91\u3002\u8bf7\u9605\u8bfb\u8349\u7a3f\u5e76\u63d0\u51fa\u6539\u8fdb\u610f\u89c1\u3002\n        \u5982\u679c\u6587\u7ae0\u5df2\u7ecf\u975e\u5e38\u597d\uff08\u5b57\u6570\u5408\u7406\uff0c\u903b\u8f91\u6e05\u6670\uff09\uff0c\u8bf7**\u53ea\u56de\u590d 'PASS'**\u3002\n        \u5982\u679c\u9700\u8981\u4fee\u6539\uff0c\u8bf7\u7ed9\u51fa\u4e0d\u8d85\u8fc7\u4e09\u70b9\u7684\u5177\u4f53\u4fee\u6539\u610f\u89c1\u3002\n        **\u3010\u4e25\u7981\u683c\u5f0f\u8981\u6c42\u3011**\uff1a\u5728\u4f60\u7684\u56de\u590d\u4e2d\uff0c**\u4e25\u7981\u5305\u542b**\u4efb\u4f55 Markdown \u683c\u5f0f\u3001\u4ee3\u7801\u5757\u3001\u7279\u6b8a\u5b57\u7b26\u6216\u5de5\u5177\u8c03\u7528\u3002\u4f60\u7684\u56de\u590d\u5fc5\u987b\u662f\u7eaf\u6587\u672c\u7684\u5efa\u8bae\u6216 'PASS'\u3002\n        \"\"\"),\n         HumanMessage(content=draft)]\n    )\n\n    critique = response.content.strip()\n    print(f\"   -> \u7f16\u8f91\u53cd\u9988: {critique}\")\n\n    # \u6838\u5fc3\u6b65\u9aa4\uff1a\u66f4\u65b0 State \u4e2d\u7684 critique \u5b57\u6bb5\n    return {\"critique\": critique}\n\n# \u8282\u70b9 C: \u8ba1\u6570\u5458\ndef increment_iteration(state: RevisionState):\n    current_iter = state[\"iterations\"]\n    new_iter = current_iter + 1\n    return {\"iterations\": new_iter}\n\n# --- 3. \u5b9a\u4e49\u5faa\u73af\u7684\"\u7ea2\u7eff\u706f\" ---\ndef should_continue(state: RevisionState):\n    critique = state[\"critique\"]\n\n    # \u5224\u65ad\u6761\u4ef6\uff1a\u5982\u679c critique \u5305\u542b\u4e86 \"PASS\" \u5b57\u7b26\u4e32\n    if \"PASS\" in critique:\n        return \"end\"  # \u6279\u51c6\u901a\u8fc7\uff0c\u7ed3\u675f\u5faa\u73af\n    else:\n        return \"continue\"  # \u9700\u8981\u4fee\u6539\uff0c\u7ee7\u7eed\u5faa\u73af\n\n# --- 4. \u7ec4\u88c5\u5faa\u73af\u56fe\u8868 (The Graph) ---\nworkflow = StateGraph(RevisionState)\n\n# A. \u6dfb\u52a0\u6240\u6709\u8282\u70b9 (\u5de5\u4eba)\nworkflow.add_node(\"draft_writer\", draft_writer)\nworkflow.add_node(\"editor_critique\", editor_critique)\nworkflow.add_node(\"increment_iteration\", increment_iteration)\n\n# B. \u8bbe\u7f6e\u8d77\u70b9\nworkflow.set_entry_point(\"draft_writer\")\n\n# C. \u8bbe\u7f6e\u666e\u901a\u8fb9 (\u5199\u4f5c -> \u5ba1\u9605)\nworkflow.add_edge(\"draft_writer\", \"editor_critique\")\n\n# D. \u8bbe\u7f6e\u6761\u4ef6\u8fb9 (\u5faa\u73af\u7684\u5173\u952e!)\n# \u4ece\u5ba1\u9605\u51fa\u6765\u540e\uff0c\u6267\u884c should_continue \u51fd\u6570\n# \u5982\u679c\u8fd4\u56de \"end\"\uff0c\u6d41\u7a0b\u7ed3\u675f\n# \u5982\u679c\u8fd4\u56de \"continue\"\uff0c\u6d41\u7a0b\u8f6c\u5230\u8ba1\u6570\u5458\nworkflow.add_conditional_edges(\n    \"editor_critique\",\n    should_continue,\n    {\n        \"end\": END,\n        \"continue\": \"increment_iteration\",\n    }\n)\n\n# E. \u8bbe\u7f6e\u5faa\u73af\u8fb9 (\u8ba1\u6570\u5458 -> \u518d\u6b21\u64b0\u5199)\n# \u8ba1\u6570\u5458\u5b8c\u6210\u540e\uff0c\u8df3\u56de\u5230\u64b0\u5199\u8282\u70b9\uff0c\u5f00\u59cb\u4e0b\u4e00\u8f6e\u4fee\u6539\uff01\nworkflow.add_edge(\"increment_iteration\", \"draft_writer\")\n\n# F. \u7f16\u8bd1\u56fe\u8868\napp = workflow.compile()\n\nprint(\"\u2705 \u5b8c\u7f8e\u5faa\u73af\u7cfb\u7edf\u5df2\u542f\u52a8\uff01\")\n\n# --- 5. \u6d4b\u8bd5\u8fd0\u884c ---\n\n# \u8bbe\u5b9a\u4e00\u4e2a\u4e3b\u9898\uff0c\u5e76\u521d\u59cb\u5316\u72b6\u6001 (iterations \u4ece 0 \u5f00\u59cb)\ntopic_to_write = \"\u5173\u4e8e\u667a\u80fd\u624b\u673a\u5bf9\u9752\u5c11\u5e74\u5f71\u54cd\u7684\u5229\u5f0a\u5206\u6790\"\n\nprint(f\"\\n\ud83e\uddea \u5f00\u59cb\u64b0\u5199\u4e3b\u9898: {topic_to_write}\")\ninputs = {\n    \"topic\": topic_to_write,\n    \"iterations\": 0\n}\n\n# \u8fd0\u884c\u5faa\u73af (\u4f7f\u7528 invoke\uff0c\u5b83\u4f1a\u4e00\u6b21\u6027\u8dd1\u5b8c\u6240\u6709\u5faa\u73af\uff0c\u76f4\u5230 END)\nfinal_state = app.invoke(inputs)\n\nprint(\"\\n--- \u4efb\u52a1\u5b8c\u6210 ---\")\nprint(f\"\u6700\u7ec8\u4fee\u6539\u6b21\u6570: {final_state['iterations']} \u6b21\")\nprint(f\"\u6700\u7ec8\u7f16\u8f91\u53cd\u9988: {final_state['critique']}\")\nprint(f\"\\n\u6700\u7ec8\u6587\u7ae0:\\n{final_state['draft']}\")<\/pre>\n\n\n\n<p><strong>\u8fd0\u884c\u65b9\u6cd5<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">python3 lesson7_loop.py\n<\/pre>\n\n\n\n<p>\u9884\u671f\u8f93\u51fa\uff1a\u4f60\u4f1a\u770b\u5230 AI \u53cd\u590d\u4fee\u6539\u6587\u7ae0\uff0c\u76f4\u5230\u7f16\u8f91\u6ee1\u610f\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u270d\ufe0f \u9996\u6b21\u64b0\u5199\u521d\u7a3f...\n\ud83e\uddd0 \u7f16\u8f91\u6b63\u5728\u5ba1\u9605\u8349\u7a3f...\n   -> \u7f16\u8f91\u53cd\u9988: 1. \u9700\u8981\u589e\u52a0\u5177\u4f53\u6570\u636e\u652f\u6301... 2. \u6bb5\u843d\u903b\u8f91\u9700\u8981\u4f18\u5316...\n\ud83d\udd04 \u6536\u5230\u7f16\u8f91\u610f\u89c1\uff0c\u8fdb\u884c\u7b2c 1 \u6b21\u4fee\u6539...\n\ud83e\uddd0 \u7f16\u8f91\u6b63\u5728\u5ba1\u9605\u8349\u7a3f...\n   -> \u7f16\u8f91\u53cd\u9988: \u6587\u7ae0\u5df2\u7ecf\u5f88\u597d\uff0c\u7ed3\u6784\u6e05\u6670\u3002PASS\n--- \u4efb\u52a1\u5b8c\u6210 ---\n\u6700\u7ec8\u4fee\u6539\u6b21\u6570: 1 \u6b21<\/pre>\n\n\n\n<p>\u67b6\u6784\u6d1e\u5bdf\uff1a\u5faa\u73af\u4e0d\u662f\u76f2\u76ee\u91cd\u590d\uff0c\u800c\u662f<strong>\u5e26\u7740\u53cd\u9988\u7684\u8fed\u4ee3<\/strong>\u3002\u6bcf\u6b21\u5faa\u73af\u90fd\u628a\u4e0a\u4e00\u6b21\u7684&#8221;\u7f16\u8f91\u610f\u89c1&#8221;\u4f20\u7ed9\u64b0\u5199\u8282\u70b9\uff0c\u8fd9\u6837 AI \u77e5\u9053\u54ea\u91cc\u9700\u8981\u6539\u8fdb\u3002\u00a0<\/p>\n\n\n\n<p>Prompt \u5de5\u7a0b\u7684\u5173\u952e\uff1a\u6211\u4eec\u5728\u7f16\u8f91\u8282\u70b9\u5f3a\u8c03&#8221;\u4e25\u7981\u5305\u542b Markdown\u3001\u4ee3\u7801\u5757&#8221;\uff0c\u4e3a\u4ec0\u4e48\uff1f\u56e0\u4e3a LLM \u5f88&#8221;\u793c\u8c8c&#8221;\uff0c\u5982\u679c\u4e0d\u7ba1\u6559\uff0c\u5b83\u53ef\u80fd\u56de\u590d\uff1a&#8221;\u662f\u7684\uff0c\u8fd9\u662f\u4e00\u4e2a\u597d\u6587\u7ae0\u3002&#8221; \u800c\u4e0d\u662f\u5355\u72ec\u7684 &#8220;PASS&#8221;\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u65e0\u6cd5\u8bc6\u522b\u7ec8\u6b62\u6761\u4ef6\uff0c\u9677\u5165\u65e0\u9650\u5faa\u73af\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>PART 07 -\u4e0b\u4e00\u6b65\u5b66\u4e60\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u901a\u8fc7\u4ee5\u4e0a7\u6b65\uff0c\u6211\u4eec\u73b0\u5728\u5df2\u7ecf\u638c\u63e1\u4e86\u6240\u6709\u6838\u5fc3\u79ef\u6728\uff1a<strong>\u94fe\u6761\u3001\u8bb0\u5fc6\u3001RAG\u3001Agent\uff0c\u4ee5\u53ca\u8ba9\u5b83\u4eec\u53d8\u5f97\u667a\u80fd\u7684 LangGraph\u3002<\/strong><\/p>\n\n\n\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4ece\u6838\u5fc3\u67b6\u6784\u8f6c\u5411\u5e94\u7528\u6df1\u5ea6\u3002\u5c06\u4f1a\u9646\u7eed\u5f00\u5c55\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\u7684\u5b9e\u64cd\u6559\u7a0b\uff1a<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u591a\u667a\u80fd\u4f53\u534f\u4f5c (Multi-Agent Systems)\uff1a<\/strong><\/p>\n\n\n\n<p>\u63a2\u7d22 LangGraph \u7684\u7ec8\u6781\u5f62\u6001\uff1a\u8ba9\u591a\u4e2a Agent \u50cf\u4e00\u4e2a\u56e2\u961f\u4e00\u6837\u5de5\u4f5c\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u56e2\u961f\uff0c\u5305\u62ec\u4e00\u4e2a\u201c\u7814\u7a76\u5458\u201d\u3001\u4e00\u4e2a\u201c\u603b\u7ed3\u5458\u201d\u548c\u4e00\u4e2a\u201c\u5ba1\u6279\u5458\u201d\uff0c\u5b83\u4eec\u5728 LangGraph \u4e2d\u76f8\u4e92\u534f\u4f5c\u3001\u4f20\u9012\u4fe1\u606f\uff0c\u5171\u540c\u5b8c\u6210\u4e00\u4e2a\u590d\u6742\u7684\u4efb\u52a1\u3002<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>RAG \u751f\u4ea7\u7ea7\u4f18\u5316 (Advanced Retrieval)<\/strong><\/p>\n\n\n\n<p>\u6df1\u5165 RAG\uff08\u77e5\u8bc6\u68c0\u7d22\uff09\u7684\u96be\u70b9\u3002\u5982\u4f55\u5904\u7406\u590d\u6742\u7684 PDF\u3001\u8868\u683c\u3001\u4ee5\u53ca\u7d22\u5f15\u4f18\u5316\u7b56\u7565\uff08\u5982 RAG-Fusion, Small-to-Large Chunking\uff09\uff0c\u8ba9\u4f60\u7684\u77e5\u8bc6\u5e93\u5e94\u7528\u5728\u771f\u5b9e\u573a\u666f\u4e2d\u66f4\u806a\u660e\u3001\u66f4\u7cbe\u786e\u3002<\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; font-weight: 600; color: rgb(71, 66, 93); font-family: Dosis; font-size: 16px; white-space-collapse: collapse;\">\ud83d\udd39<\/span><strong>\u7ed3\u6784\u5316\u6570\u636e\u4e0e\u5de5\u5177\u6574\u5408 (Structured Output &amp; Tools)<\/strong><\/p>\n\n\n\n<p>\u4e13\u6ce8\u4e8e\u6570\u636e\u7684\u7a33\u5b9a\u6027\u548c\u53ef\u9760\u6027\u3002\u5982\u4f55\u5f3a\u5236 LLM \u4e25\u683c\u8f93\u51fa JSON \u6216 Pydantic \u683c\u5f0f\u7684\u6570\u636e\uff08\u8fd9\u662f\u81ea\u52a8\u5316\u6d41\u7a0b\u7684\u5173\u952e\uff09\uff0c\u4ee5\u53ca\u5982\u4f55\u5c06\u66f4\u591a\u7684\u5916\u90e8\u5de5\u5177\uff08\u5982\u8ba1\u7b97\u5668\u3001\u6570\u636e\u5e93\u67e5\u8be2\uff09\u5b89\u5168\u53ef\u9760\u5730\u96c6\u6210\u5230 Agent \u4e2d\u3002<\/p>\n\n\n\n<p>\u8bb0\u4f4f\uff0c<strong>\u6846\u67b6\u662f\u624b\u6bb5\uff0c\u89e3\u51b3\u95ee\u9898\u624d\u662f\u76ee\u7684<\/strong>\u3002\u5f53\u4f60\u7684\u4e1a\u52a1\u9700\u6c42\u8d85\u51fa\u6846\u67b6\u80fd\u529b\u65f6\uff0c\u4e0d\u8981\u72b9\u8c6b\u2014\u2014\u57fa\u4e8e\u4f60\u5b66\u5230\u7684\u67b6\u6784\u601d\u60f3\uff0c\u81ea\u5df1\u5b9e\u73b0\u5b9a\u5236\u7248\u672c\u3002<\/p>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>\u9879\u76ee\u4fe1\u606f\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>LangChain \u5b98\u65b9\u8d44\u6e90<\/strong><\/p>\n\n\n\n<ul>\n<li>GitHub: https:\/\/github.com\/langchain-ai\/langchain<\/li>\n\n\n\n<li>\u6587\u6863: https:\/\/python.langchain.com<\/li>\n\n\n\n<li>LangGraph: https:\/\/langchain-ai.github.io\/langgraph\/<\/li>\n<\/ul>\n\n\n\n<p><strong>\u667a\u8c31 AI<\/strong><\/p>\n\n\n\n<ul>\n<li>\u5b98\u7f51: https:\/\/open.bigmodel.cn<\/li>\n\n\n\n<li>API \u6587\u6863: https:\/\/open.bigmodel.cn\/dev\/api<\/li>\n<\/ul>\n\n\n\n<p>\u3000\u3000<\/p>\n\n\n\n<p><strong>\u53c2\u8003\u8d44\u6599\ud83d\udd16<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<ol>\n<li>LangChain \u5b98\u65b9\u6587\u6863 &#8211; Python \u7248\u672c\u4f7f\u7528\u6307\u5357<\/li>\n\n\n\n<li>LangGraph \u6982\u5ff5\u6587\u6863 &#8211; \u72b6\u6001\u56fe\u4e0e\u6761\u4ef6\u8fb9<\/li>\n\n\n\n<li>OpenAI API \u517c\u5bb9\u683c\u5f0f\u89c4\u8303<\/li>\n\n\n\n<li>FAISS \u5411\u91cf\u68c0\u7d22\u5e93\u6587\u6863 &#8211; Meta AI Research<\/li>\n\n\n\n<li>Streamlit \u5feb\u901f\u642d\u5efa Web \u5e94\u7528\u6559\u7a0b<\/li>\n\n\n\n<li>RAG \u6280\u672f\u8be6\u89e3 &#8211; \u68c0\u7d22\u589e\u5f3a\u751f\u6210\u539f\u7406<\/li>\n\n\n\n<li>Prompt Engineering \u6700\u4f73\u5b9e\u8df5 &#8211; Anthropic \u6307\u5357<\/li>\n\n\n\n<li>\u56fd\u4ea7\u5927\u6a21\u578b API \u5bf9\u6bd4\u5206\u6790 &#8211; \u667a\u8c31\u3001DeepSeek\u3001\u6708\u4e4b\u6697\u9762<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u8f6c\u8f7d\uff1aLangChain\u5b9e\u64cd\u6559\u7a0b\uff0c7\u6b65\u638c\u63e1\u6240\u6709\u6838\u5fc3\u6280\u672f\uff1aChain\u3001Memory\u3001RAG\u3001Agent\u4ee5\u53ca La [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/19723"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19723"}],"version-history":[{"count":13,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/19723\/revisions"}],"predecessor-version":[{"id":19742,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/19723\/revisions\/19742"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}