{"id":120284,"date":"2026-10-31T10:18:14","date_gmt":"2026-10-31T02:18:14","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/120284.html"},"modified":"2026-10-31T10:18:14","modified_gmt":"2026-10-31T02:18:14","slug":"%e3%80%90%e5%88%9d%e5%ad%a6%e8%80%85agent-%e5%bc%80%e5%8f%91%e8%b8%a9%e5%9d%91%e6%89%8b%e5%86%8c%e3%80%91","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/120284.html","title":{"rendered":"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011"},"content":{"rendered":"<h2>Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c&#xff08;Week 1 &#8211; Week 9 \u5b9e\u6218\u8bb0\u5f55&#xff09;<\/h2>\n<p>\u5168\u90e8\u6765\u81ea\u5b9e\u9645\u4f5c\u4e1a\u5b9e\u6d4b&#xff0c;\u6bcf\u6761\u90fd\u5e26\u300c\u73b0\u8c61 \u2192 \u6839\u56e0 \u2192 \u4fee\u6cd5 \u2192 \u8bb0\u5fc6\u951a\u70b9\u300d\u3002<br \/>\n\u6309\u4e3b\u9898\u5206\u7c7b&#xff0c;\u4e0d\u6309\u65f6\u95f4\u6392\u5e8f&#xff1b;\u540c\u4e00\u5751\u5728\u4e0d\u540c\u5468\u53cd\u590d\u51fa\u73b0\u65f6\u5408\u5e76\u6210\u4e00\u6761\u3002<\/p>\n<hr \/>\n<h3>\u4e00\u3001Python \u8bed\u8a00\u5c42&#xff1a;\u6700\u5bb9\u6613&#034;\u9759\u9ed8\u51fa\u9519&#034;\u7684\u5751<\/h3>\n<h4>1.1 \u539f\u5730\u4fee\u6539\u65b9\u6cd5\u8fd4\u56de None<\/h4>\n<p>result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> real_run<span class=\"token punctuation\">(<\/span>msgs<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u274c append \u8fd4\u56de None<\/span><\/p>\n<p>\u73b0\u8c61&#xff1a;\u53c2\u6570\u77ac\u95f4\u53d8\u6210 None&#xff0c;\u51fd\u6570\u91cc\u4e00\u64cd\u4f5c\u5c31 TypeError&#xff0c;\u6216\u62a5\u5947\u602a\u7684\u7c7b\u578b\u9519\u8bef\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;list.append \/ sort \/ reverse \/ extend \u90fd\u662f\u539f\u5730\u4fee\u6539&#xff0c;\u8fd4\u56de None\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5206\u4e24\u884c\u5199\u3002<\/p>\n<p>msgs<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\nresult <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> real_run<span class=\"token punctuation\">(<\/span>msgs<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u539f\u5730\u4fee\u6539\u7684\u65b9\u6cd5\u4e0d\u5403\u8fd4\u56de\u503c\u201d\u3002\u540c\u7c7b\u5751&#xff1a;todos &#061; todos.sort()\u3002<\/p>\n<hr \/>\n<h4>1.2 logging.basicConfig \u987a\u5e8f\u9677\u9631<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u660e\u660e\u8bbe\u4e86 level&#061;INFO&#xff0c;INFO \u65e5\u5fd7\u4e00\u6761\u4e0d\u8f93\u51fa&#xff0c;\u6216\u65e5\u5fd7\u6587\u4ef6\u662f\u7a7a\u7684\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;basicConfig \u53ea\u5728 root logger \u5c1a\u65e0 handler \u65f6\u751f\u6548\u3002\u5982\u679c\u4f60\u5728\u5b83\u4e4b\u524d\u8c03\u8fc7\u4efb\u4f55 logging.warning() \/ \u7b2c\u4e09\u65b9\u5e93\u5148\u6253\u4e86\u65e5\u5fd7&#xff0c;root \u5df2\u88ab\u9690\u5f0f\u914d\u7f6e&#xff0c;\u4f60\u7684\u663e\u5f0f\u914d\u7f6e\u88ab\u9759\u9ed8\u5ffd\u7565\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;logging.basicConfig(&#8230;) \u5fc5\u987b\u653e\u5728\u6240\u6709\u65e5\u5fd7\u8c03\u7528\u4e4b\u524d&#xff0c;\u7d27\u8ddf import \u4e4b\u540e\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u914d\u7f6e\u65e5\u5fd7\u662f\u7b2c\u4e00\u884c\u4ee3\u7801\u201d\u3002<\/p>\n<hr \/>\n<h4>1.3 \u5c40\u90e8\u53d8\u91cf\u672a\u5b9a\u4e49 \/ \u7f29\u8fdb\u9519\u4f4d\u5bfc\u81f4 NameError<\/h4>\n<p>\u73b0\u8c61&#xff1a;print(result) \u6539\u6210 log.info(result) \u540e\u62a5 NameError&#xff0c;\u4f46 print \u4e4b\u524d\u660e\u660e\u6b63\u5e38\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;result \u5b9a\u4e49\u5728 for tc in &#8230; \u5faa\u73af\u4f53\u5185&#xff0c;\u8c03\u7528\u70b9\u5728\u5faa\u73af\u5916&#xff1b;\u6539\u7f29\u8fdb\u65f6\u628a\u5b9a\u4e49\u884c \u548c\u8c03\u7528\u884c \u7684\u5c42\u7ea7\u6539\u9519\u4e86\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6539\u5b8c\u7f29\u8fdb\u540e\u9010\u884c\u5bf9\u9f50\u5217\u4f4d\u7f6e\u68c0\u67e5&#xff1b;\u7528 python -m py_compile \u53ea\u80fd\u67e5\u8bed\u6cd5&#xff0c;\u67e5\u4e0d\u51fa\u4f5c\u7528\u57df\u95ee\u9898&#xff0c;\u9760\u8089\u773c\u770b\u5c42\u7ea7\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cNameError \u4e5d\u6210\u662f\u7f29\u8fdb\u6216\u4f5c\u7528\u57df\u201d\u3002<\/p>\n<hr \/>\n<h4>1.4 f-string \u62fc\u63a5\u9519\u8bef\u4ea7\u751f&#034;\u5b64\u7acb\u5b57\u7b26&#034;<\/h4>\n<p><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;\u4f60\u662f\u52a9\u7406&#xff0c;\u4e0d\u8981\u7f16\u9020&#034;<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4eca\u5929\u662f<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>today<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u3002&#034;<\/span><\/span><span class=\"token punctuation\">}<\/span>   <span class=\"token comment\"># \u274c<\/span><\/p>\n<p>\u73b0\u8c61&#xff1a;system \u63d0\u793a\u8bcd\u91cc\u591a\u51fa\u4e00\u4e2a\u83ab\u540d\u5176\u5999\u7684 f \u5b57\u7b26&#xff1b;{today} \u4e5f\u6ca1\u88ab\u66ff\u6362\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;f \u5fc5\u987b\u7d27\u8d34\u5f15\u53f7&#xff08;f&#034;&#8230;&#034;&#xff09;\u3002\u8fd9\u91cc f \u524d\u9762\u8fd8\u6709\u5b57\u7b26\u4e32&#xff0c;Python \u628a\u5b83\u89e3\u6790\u6210\u72ec\u7acb\u5b57\u7b26\u4e32\u5b57\u9762\u91cf &#034;f&#034; \u62fc\u4e86\u8fdb\u53bb&#xff0c;\u4e14\u540e\u534a\u6bb5\u662f\u666e\u901a\u5b57\u7b26\u4e32&#xff0c;\u4e0d\u505a\u63d2\u503c\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u62c6\u6210\u591a\u4e2a\u5b57\u7b26\u4e32&#xff0c;\u53ea\u6709\u9700\u8981\u63d2\u503c\u7684\u90a3\u6bb5\u52a0 f \u524d\u7f00&#xff1a;<\/p>\n<p><span class=\"token string\">&#034;\u4f60\u662f\u52a9\u7406&#xff0c;\u4e0d\u8981\u7f16\u9020\u3002&#034;<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u4eca\u5929\u662f<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>today<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\u3002&#034;<\/span><\/span><\/p>\n<p>\u6216\u7528\u6a21\u677f&#xff1a;&#034;\u4f60\u662f\u52a9\u7406&#8230;\u4eca\u5929\u662f{today}\u3002&#034;.format(today&#061;&#8230;)&#xff08;\u63a8\u8350&#xff0c;\u4fbf\u4e8e\u5916\u7f6e\u5230 prompts.py&#xff09;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cf \u53ea\u5728\u5f15\u53f7\u524d\u9762\u624d\u6709\u610f\u4e49\u201d\u3002<\/p>\n<hr \/>\n<h4>1.5 assert \u7684\u6d88\u606f\u662f\u60f0\u6027\u6c42\u503c &amp; -O \u4f1a\u5168\u5c40\u5173\u95ed<\/h4>\n<p>\u73b0\u8c61 1&#xff1a;\u4ee5\u4e3a assert x, f&#034;{obj.attr}&#034; \u91cc f-string \u4e00\u5b9a\u6267\u884c&#xff08;\u6709\u526f\u4f5c\u7528&#xff09;\u3002<br \/>\n\u73b0\u8c61 2&#xff1a;\u7ebf\u4e0a\u7528 python -O \u8dd1&#xff0c;\u6240\u6709 assert \u6821\u9a8c\u5168\u90e8\u5931\u6548\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u65ad\u8a00\u901a\u8fc7\u65f6\u6d88\u606f\u8868\u8fbe\u5f0f\u4e0d\u6c42\u503c&#xff1b;-O \u6a21\u5f0f\u4e0b assert \u88ab\u5b8c\u5168\u79fb\u9664\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u4e1a\u52a1\u6821\u9a8c\u7528 if not cond: raise ValueError(&#8230;)&#xff0c;assert \u53ea\u7528\u4e8e\u81ea\u6d4b\/\u65ad\u8a00\u4e0d\u53d8\u91cf\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cassert \u662f\u8c03\u8bd5\u5de5\u5177&#xff0c;\u4e0d\u662f\u4e1a\u52a1\u6821\u9a8c\u201d\u3002<\/p>\n<hr \/>\n<h3>\u4e8c\u3001\u914d\u7f6e\u4e0e\u5de5\u7a0b\u73af\u5883<\/h3>\n<h4>2.1 requires-python \u5199\u4f4e\u4e86\u5bfc\u81f4\u4f9d\u8d56\u65e0\u89e3<\/h4>\n<p>\u73b0\u8c61&#xff1a;uv add openai-agents \u62a5 \u201cno solution found\u201d&#xff0c;\u770b\u4e0d\u51fa\u539f\u56e0\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;pyproject.toml \u91cc requires-python &#061; &#034;&gt;&#061;3.8&#034;&#xff0c;\u7b49\u4e8e\u627f\u8bfa&#034;3.8 \u4e5f\u80fd\u88c5&#034;&#xff1b;\u800c openai-agents \u8981\u6c42 &gt;&#061;3.10\u3002uv \u6c42\u89e3\u65f6\u53d1\u73b0\u5ba3\u8a00\u4e0e\u4e8b\u5b9e\u77db\u76fe&#xff0c;\u76f4\u63a5\u65e0\u89e3\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6539\u6210\u4f60\u5b9e\u9645\u4f7f\u7528\/\u6d4b\u8bd5\u7684\u7248\u672c\u4e0b\u9650&#xff0c;\u5982 &#034;&gt;&#061;3.11&#034;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201crequires-python \u662f\u517c\u5bb9\u6027\u627f\u8bfa&#xff0c;\u5b81\u9ad8\u52ff\u4f4e\u201d\u3002<\/p>\n<hr \/>\n<h4>2.2 VIRTUAL_ENV \u4e0d\u5339\u914d\u8b66\u544a<\/h4>\n<p>\u73b0\u8c61&#xff1a;uv run \u65f6\u63d0\u793a VIRTUAL_ENV&#061;\/home\/xxx\/venv does not match the project environment path &#039;.venv&#039; and will be ignored\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;shell \u91cc\u8fd8\u6fc0\u6d3b\u7740\u4e00\u4e2a\u65e7\u7684 venv&#xff0c;\u800c uv \u7528\u9879\u76ee\u81ea\u5df1\u7684 .venv\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;deactivate \u9000\u51fa\u65e7\u73af\u5883&#xff1b;\u4e4b\u540e\u7edf\u4e00 uv run&#xff0c;\u4e0d\u624b\u52a8 activate\u3002<\/p>\n<hr \/>\n<h4>2.3 \u88c5\u5305\u540d \u2260 \u5bfc\u5165\u540d<\/h4>\n<p>pip install agents \u274c \u2014\u2014 \u5305\u540d\u662f openai-agents&#xff0c;\u5bfc\u5165\u540d\u624d\u662f agents\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u88c5\u5305\u770b PyPI \u540d&#xff0c;import \u770b\u4ee3\u7801\u540d&#xff0c;\u4e24\u8005\u7ecf\u5e38\u4e0d\u540c\u201d&#xff08;\u540c\u7c7b&#xff1a;pip install pillow \u2192 import PIL&#xff09;\u3002<\/p>\n<hr \/>\n<h3>\u4e09\u3001LLM \u591a\u8f6e\u5bf9\u8bdd\u4e0e\u4f1a\u8bdd\u72b6\u6001<\/h3>\n<h4>3.1 \u5047\u591a\u8f6e&#xff1a;\u6bcf\u8f6e\u91cd\u5efa messages<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u591a\u8f6e\u5bf9\u8bdd&#034;\u80fd\u8dd1&#034;&#xff0c;\u4f46\u6a21\u578b\u5b8c\u5168\u4e0d\u8bb0\u5f97\u4e0a\u4e00\u8f6e\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;messages \u5728\u6bcf\u8f6e\u51fd\u6570\u5185\u90e8\u91cd\u65b0\u521d\u59cb\u5316\u4e3a [system]&#xff0c;\u5386\u53f2\u88ab\u4e22\u5f03\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;messages \u5b9a\u4e49\u5728\u5faa\u73af\u5916&#xff0c;\u6bcf\u8f6e append user \u2192 \u8bf7\u6c42 \u2192 append assistant\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cLLM \u65e0\u72b6\u6001&#xff0c;\u8bb0\u5fc6 &#061; \u6bcf\u8f6e\u5168\u91cf\u91cd\u53d1 messages\u201d\u3002<\/p>\n<hr \/>\n<h4>3.2 system \u63d0\u793a\u8bcd\u5bf9\u8001\u4f1a\u8bdd\u4e0d\u751f\u6548<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u63d0\u793a\u8bcd\u5347\u7ea7\u5230\u4e94\u6bb5\u5f0f\u540e&#xff0c;\u884c\u4e3a\u6ca1\u53d8\u2014\u2014\u56e0\u4e3a\u6062\u590d\u7684\u5386\u53f2\u91cc messages[0] \u8fd8\u662f\u65e7 system\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;if not messages: \u624d\u5199\u5165 system&#xff0c;\u8001\u4f1a\u8bdd\u76f4\u63a5\u8df3\u8fc7\u4e86\u91cd\u5efa\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u52a0\u8f7d\u540e\u65e0\u6761\u4ef6\u66ff\u6362 system&#xff1a;<\/p>\n<p><span class=\"token keyword\">if<\/span> messages <span class=\"token keyword\">and<\/span> messages<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    messages<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> prompt<br \/>\n<span class=\"token keyword\">else<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    messages <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;content&#034;<\/span><span class=\"token punctuation\">:<\/span> prompt<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> messages<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201csystem \u662f\u914d\u7f6e&#xff0c;\u5bf9\u8bdd\u662f\u6570\u636e&#xff1b;\u6062\u590d\u4f1a\u8bdd\u65f6\u914d\u7f6e\u4ee5\u5f53\u524d\u4ee3\u7801\u4e3a\u51c6\u201d\u3002<\/p>\n<hr \/>\n<h4>3.3 \u5386\u53f2\u6c61\u67d3&#xff1a;\u65e7\u56de\u7b54\u53d8\u6210&#034;\u793a\u8303&#034;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u65b0\u4f1a\u8bdd\u7b2c\u4e00\u6b21\u67e5\u5929\u6c14\u6b63\u5e38\u89e6\u53d1\u5de5\u5177&#xff1b;\u540c\u4e00\u4f1a\u8bdd\u4e2d\u7b2c\u4e8c\u6b21\u95ee&#xff0c;\u6a21\u578b\u76f4\u63a5\u51ed\u5386\u53f2\u56de\u7b54&#xff0c;\u4e0d\u8c03\u5de5\u5177\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u4e0a\u4e0b\u6587\u91cc\u5df2\u6709&#034;\u6a21\u578b\u76f4\u63a5\u56de\u7b54&#034;\u7684\u8bb0\u5f55&#xff0c;\u6a21\u578b\u628a\u5b83\u5f53\u4f5c\u793a\u8303&#xff08;in-context few-shot \u7684\u8d1f\u9762\u6548\u5e94&#xff09;\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u2460 system \u786c\u89c4\u5219\u300c\u6bcf\u6b21\u67e5\u8be2\u5fc5\u987b\u91cd\u65b0\u8c03\u7528\u5de5\u5177&#xff0c;\u7981\u6b62\u5f15\u7528\u5386\u53f2\u7ed3\u679c\u300d&#xff1b;\u2461 \u63d0\u793a\u8bcd\u52a0 few-shot \u8fb9\u754c\u793a\u4f8b&#xff1b;\u2462 \/reset \u505a\u5bf9\u7167\u8bca\u65ad\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u574f\u793a\u8303\u4e5f\u662f\u793a\u8303\u201d\u2014\u2014\u4e0a\u4e0b\u6587\u91cc\u7684\u4e00\u5207\u90fd\u4f1a\u5f71\u54cd\u884c\u4e3a\u3002<\/p>\n<hr \/>\n<h4>3.4 \u4f1a\u8bdd\u6301\u4e45\u5316&#xff1a;\u539f\u5b50\u5199\u5165\u4e09\u4ef6\u5957<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u65ad\u7535\/\u5f3a\u6740\u8fdb\u7a0b\u540e sessions \u6587\u4ef6\u53d8\u6210\u534a\u622a JSON&#xff0c;\u4e0b\u6b21\u542f\u52a8\u76f4\u63a5\u5d29\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;<\/p>\n<p><span class=\"token keyword\">with<\/span> <span class=\"token builtin\">open<\/span><span class=\"token punctuation\">(<\/span>tmp<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;w&#034;<\/span><span class=\"token punctuation\">,<\/span> encoding<span class=\"token operator\">&#061;<\/span><span class=\"token string\">&#034;utf-8&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">as<\/span> f<span class=\"token punctuation\">:<\/span><br \/>\n    json<span class=\"token punctuation\">.<\/span>dump<span class=\"token punctuation\">(<\/span>payload<span class=\"token punctuation\">,<\/span> f<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">,<\/span> indent<span class=\"token operator\">&#061;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    f<span class=\"token punctuation\">.<\/span>flush<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    os<span class=\"token punctuation\">.<\/span>fsync<span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">.<\/span>fileno<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nos<span class=\"token punctuation\">.<\/span>replace<span class=\"token punctuation\">(<\/span>tmp<span class=\"token punctuation\">,<\/span> path<span class=\"token punctuation\">)<\/span>     <span class=\"token comment\"># \u539f\u5b50\u66ff\u6362<\/span><\/p>\n<p>\u518d\u914d&#xff1a;\u635f\u574f\u6587\u4ef6 os.replace \u5230 .corrupt-&lt;ts&gt;.bak&#xff08;\u4e0d\u5220\u9664&#xff09;\u3001\u8bfb\u5931\u8d25\u8fd4\u56de\u7a7a\u4f1a\u8bdd&#xff08;fail-open&#xff09;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u5199\u4e34\u65f6\u6587\u4ef6 \u2192 flush \u2192 fsync \u2192 \u539f\u5b50\u66ff\u6362\u201d&#xff0c;\u56db\u6b65\u7f3a\u4e00\u4e0d\u53ef\u3002<\/p>\n<hr \/>\n<h4>3.5 \u53ea\u6355\u83b7 JSONDecodeError \u4e0d\u591f<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u6587\u4ef6\u5185\u5bb9\u4e0d\u662f\u5408\u6cd5 UTF-8 \u65f6&#xff0c;UnicodeDecodeError \u76f4\u63a5\u5d29\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;except (json.JSONDecodeError, UnicodeDecodeError) \u6216\u6700\u540e\u52a0 except Exception \u515c\u5e95\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u8bfb\u5916\u90e8\u6587\u4ef6\u81f3\u5c11\u8981\u9632\u4e24\u79cd\u9519&#xff1a;\u7f16\u7801\u9519 &#043; \u683c\u5f0f\u9519\u201d\u3002<\/p>\n<hr \/>\n<h3>\u56db\u3001Token \u8ba1\u91cf\u4e0e\u88c1\u526a<\/h3>\n<h4>4.1 len\/1.5 \u4f30\u7b97\u4e25\u91cd\u5931\u771f<\/h4>\n<p>\u5b9e\u6d4b&#xff1a;\u4e2d\u6587\u573a\u666f\u4f4e\u4f30\u7ea6 44%&#xff08;\u5b9e\u9645 token \u8fdc\u591a\u4e8e\u4f30\u7b97&#xff09;&#xff0c;\u5bfc\u81f4\u88c1\u526a\u540e\u4ecd\u7136\u8d85\u9884\u7b97\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;tiktoken.get_encoding(&#034;cl100k_base&#034;) \u7cbe\u786e\u8ba1\u6570&#xff1b;\u4e0d\u53ef\u7528\u65f6\u964d\u7ea7\u4e3a cjk*1.2 &#043; other*0.3 \u5e76\u6253 warning\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u5b57\u7b26\u6570\u2260token \u6570&#xff0c;\u4e2d\u6587\u5c24\u5176\u5dee\u5f97\u591a\u201d\u3002<\/p>\n<hr \/>\n<h4>4.2 \u6d88\u606f\u5f62\u6001\u4e0d\u662f\u5b57\u7b26\u4e32&#xff08;SDK \u7248\u7279\u6709&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;count_tokens \u91cc\u62a5 TypeError: &#039;&lt;&#061;&#039; not supported between instances of &#039;str&#039; and &#039;dict&#039;\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;to_input_list() \u8fd4\u56de\u7684 SDK \u6d88\u606f&#xff0c;content \u53ef\u80fd\u662f None\u3001\u5217\u8868&#xff08;\u5982 [{&#034;type&#034;:&#034;text&#034;,&#034;text&#034;:&#034;&#8230;&#034;}]&#xff09;\u6216\u5b57\u7b26\u4e32\u3002\u5217\u8868\u88ab\u5f53\u4f5c\u5b57\u7b26\u4e32\u9010\u5b57\u7b26\u904d\u5386&#xff0c;\u5143\u7d20\u662f dict \u2192 \u5b57\u7b26\u4e32\u6bd4\u8f83\u7206\u70b8\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">count_tokens<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> text<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        text <span class=\"token operator\">&#061;<\/span> json<span class=\"token punctuation\">.<\/span>dumps<span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">,<\/span> ensure_ascii<span class=\"token operator\">&#061;<\/span><span class=\"token boolean\">False<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p>\u540c\u65f6\u8865 tool_calls[].function.arguments \u7684\u8ba1\u6570&#xff08;tool_calls \u6d88\u606f\u7684 content \u662f None&#xff0c;\u53c2\u6570\u5168\u5728 arguments \u91cc&#xff0c;\u5426\u5219\u4f4e\u4f30&#xff09;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u6d88\u606f\u4e0d\u518d\u7531\u4f60\u5168\u6743\u63a7\u5236\u65f6&#xff0c;\u6240\u6709\u5904\u7406\u51fd\u6570\u90fd\u8981\u9632\u5fa1\u5f62\u6001\u201d&#xff08;\u540c\u7c7b\u5751&#xff1a;ChatCompletionMessage \u5bf9\u8c61\u6ca1\u6709 .get&#xff0c;\u5fc5\u987b model_dump() \u8f6c dict&#xff09;\u3002<\/p>\n<hr \/>\n<h4>4.3 \u88c1\u526a\u7834\u574f\u6d88\u606f\u914d\u5bf9<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u88c1\u526a\u540e\u8bf7\u6c42 400&#xff0c;\u62a5 tool_call_id \u627e\u4e0d\u5230\u5bf9\u5e94\u6d88\u606f\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u4ece\u5934\u90e8\u7c97\u66b4\u5207\u7247&#xff0c;\u53ef\u80fd\u5207\u6389 assistant(tool_calls) \u4f46\u7559\u4e0b tool&#xff0c;\u6216\u7559\u4e0b\u5b64\u513f assistant\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u4ece\u540e\u5f80\u524d\u7d2f\u52a0\u4fdd\u7559&#xff0c;\u6700\u540e\u505a\u914d\u5bf9\u4fee\u6b63&#xff1a;while kept and kept[0][&#034;role&#034;] &#061;&#061; &#034;assistant&#034;: pop(0)\u3002<\/p>\n<p>\u5df2\u77e5\u8fb9\u754c&#xff1a;assistant(tool_calls) &#043; tool \u7ec4\u7684\u6210\u5bf9\u88c1\u526a\u5c1a\u672a\u5b8c\u5168\u5904\u7406&#xff0c;\u5de5\u5177\u5bc6\u96c6\u4f1a\u8bdd\u7ea6 20 \u8f6e\u540e\u53ef\u80fd\u89e6\u53d1\u3002<\/p>\n<hr \/>\n<h3>\u4e94\u3001\u7ed3\u6784\u5316\u8f93\u51fa\u4e0e Pydantic<\/h3>\n<h4>5.1 \u6821\u9a8c\u7ed3\u679c\u88ab\u4e22\u5f03<\/h4>\n<p>Weather<span class=\"token punctuation\">.<\/span>model_validate_json<span class=\"token punctuation\">(<\/span>raw<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span> raw            <span class=\"token comment\"># \u274c \u767d\u6821\u9a8c\u4e86<\/span><\/p>\n<p>\u4fee\u6cd5&#xff1a;return Weather.model_validate_json(raw)&#xff0c;\u6216\u63a5\u6536\u540e\u8fd4\u56de obj.model_dump()\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cvalidate \u7684\u8fd4\u56de\u503c\u624d\u662f\u9a8c\u8fc7\u8d27\u7684\u4e1c\u897f\u201d\u3002<\/p>\n<hr \/>\n<h4>5.2 Optional[str] &#061; None \u5bfc\u81f4\u5b57\u6bb5\u6d88\u5931<\/h4>\n<p>\u73b0\u8c61&#xff1a;L2 json_schema \u6a21\u5f0f\u4e0b&#xff0c;advice \u5b57\u6bb5\u65f6\u6709\u65f6\u65e0\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u6709 default \u7684\u5b57\u6bb5\u4e0d\u8fdb required&#xff0c;\u6a21\u578b\u53ef\u4ee5\u5408\u6cd5\u7701\u7565\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u9700\u8981\u6a21\u578b\u5fc5\u586b\u7684\u5b57\u6bb5&#xff0c;\u4e0d\u7ed9 default&#xff08;\u54ea\u6015\u662f Optional&#xff09;&#xff1a;advice: Optional[str] &#061; Field(description&#061;&#8230;)\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cdefault \u51b3\u5b9a\u5fc5\u586b\u6027&#xff0c;Optional \u53ea\u51b3\u5b9a\u53ef\u7a7a\u6027\u201d\u3002<\/p>\n<hr \/>\n<h4>5.3 city: str &#061; Field(default&#061;None) \u81ea\u76f8\u77db\u76fe<\/h4>\n<p>\u7c7b\u578b\u58f0\u660e str&#xff08;\u975e\u7a7a\u5b57\u7b26\u4e32&#xff09;&#xff0c;\u9ed8\u8ba4\u503c\u5374\u662f None\u2014\u2014\u81ea\u76f8\u77db\u76fe\u7684\u89c4\u683c\u4e66\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;Optional[str] &#061; Field(description&#061;&#8230;)&#xff08;\u53ef\u7a7a\u4e14\u5fc5\u586b&#xff09;\u6216 Optional[str] &#061; Field(default&#061;None, &#8230;)&#xff08;\u53ef\u7a7a\u4e14\u53ef\u9009&#xff09;\u3002<\/p>\n<hr \/>\n<h4>5.4 required \u4f46\u53ef\u7a7a\u7684\u4e24\u79cd\u89e3\u6cd5<\/h4>\n<table>\n<tr>\u65b9\u6848required\u8868\u8fbe\u65b9\u5f0f<\/tr>\n<tbody>\n<tr>\n<td>\u624b\u5199 Schema&#xff08;\u4f60 Week 3&#xff09;<\/td>\n<td>\u662f<\/td>\n<td>&#034;required&#034;: [&#034;advice&#034;]&#xff0c;\u7c7b\u578b\u5141\u8bb8 null<\/td>\n<\/tr>\n<tr>\n<td>SDK strict \u6a21\u5f0f&#xff08;Week 6&#xff09;<\/td>\n<td>\u662f<\/td>\n<td>\u6240\u6709\u5b57\u6bb5\u8fdb required&#xff0c;\u53ef\u7a7a\u7528 anyOf: [{&#034;type&#034;:&#034;string&#034;},{&#034;type&#034;:&#034;null&#034;}]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201crequired \u7ba1\u2019\u5fc5\u987b\u51fa\u73b0\u2019&#xff0c;nullable \u7ba1\u2019\u53ef\u4ee5\u662f\u7a7a\u2019&#xff0c;\u4e24\u8005\u6b63\u4ea4\u201d\u3002<\/p>\n<hr \/>\n<h4>5.5 \u52a0 error \u5b57\u6bb5\u540e\u6b63\u5e38\u67e5\u8be2\u62a5\u7f3a\u5b57\u6bb5<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u4e3a\u8ba9\u6a21\u578b\u80fd\u5408\u6cd5\u62d2\u7edd\u800c\u52a0 error \u5b57\u6bb5&#xff0c;\u7ed3\u679c\u6b63\u5e38\u67e5\u5929\u6c14\u4e5f\u62a5 \u201cmissing error\u201d\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;error \u65e0 default \u2192 \u8fdb required \u2192 \u6a21\u578b\u5fc5\u987b\u63d0\u4f9b\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u8bbe\u8ba1\u6210\u300c\u5168\u5b57\u6bb5 required &#043; \u5141\u8bb8 null\u300d&#xff0c;\u6216 error \u7ed9 default&#061;None&#xff08;\u4f46\u90a3\u6837\u6a21\u578b\u4f1a\u5077\u61d2\u4e0d\u586b&#xff09;\u3002<\/p>\n<p>\u6559\u8bad&#xff1a;\u5b57\u6bb5\u8bbe\u8ba1\u7684\u6bcf\u4e2a\u9009\u62e9\u90fd\u6709\u884c\u4e3a\u540e\u679c&#xff0c;Schema \u5c31\u662f\u4ea7\u54c1\u8bbe\u8ba1\u3002<\/p>\n<hr \/>\n<h3>\u516d\u3001\u5de5\u5177\u8c03\u7528&#xff08;Function Calling&#xff09;<\/h3>\n<h4>6.1 \u4e09\u5904\u6ce8\u518c\u7f3a\u4e00\u4e0d\u53ef<\/h4>\n<p>TOOLS&#xff08;\u6267\u884c\u4f53\u5b57\u5178&#xff09;&#043; TOOLS_SCHEMA&#xff08;\u7ed9\u6a21\u578b\u7684\u83dc\u5355&#xff09;&#043; \u51fd\u6570\u672c\u4f53\u3002\u5c11\u4e00\u5904&#xff1a;\u83dc\u5355\u91cc\u6709\u4f46\u6267\u884c\u4e0d\u4e86&#xff0c;\u6216\u80fd\u6267\u884c\u4f46\u6a21\u578b\u4e0d\u77e5\u9053\u3002<\/p>\n<p>SDK \u7248&#xff1a;&#064;function_tool \u4e00\u5904\u641e\u5b9a&#xff08;\u7b7e\u540d \u2192 Schema&#xff0c;docstring \u2192 description&#xff09;\u3002<\/p>\n<hr \/>\n<h4>6.2 tool_calls \u4f4d\u7f6e\u627e\u9519<\/h4>\n<p>\u73b0\u8c61&#xff1a;resp.tool_calls \u4e0d\u5b58\u5728\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;msg &#061; resp.choices[0].message; msg.tool_calls\u3002<\/p>\n<hr \/>\n<h4>6.3 response_format \u4e0e tools \u51b2\u7a81<\/h4>\n<p>\u540c\u4e00\u8bf7\u6c42\u91cc\u65e2\u7ed9 tools \u53c8\u7ed9 response_format&#xff0c;\u4e24\u4e2a\u7ed3\u6784\u7ea6\u675f\u6253\u67b6\u3002\u4fee\u6cd5&#xff1a;\u4e8c\u9009\u4e00\u3002<\/p>\n<hr \/>\n<h4>6.4 \u5de5\u5177\u6267\u884c\u5757\u7f29\u8fdb\u9519\u4f4d<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u5de5\u5177\u7ed3\u679c\u53ea\u56de\u586b\u4e86\u6700\u540e\u4e00\u4e2a&#xff0c;\u6216\u591a\u8f6e\u91cc\u7ed3\u679c\u4e32\u4f4d\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u6267\u884c\u5757\u5728 for tc \u5faa\u73af\u5916&#xff0c;\u53ea\u62ff\u5230\u6700\u540e\u4e00\u4e2a tc\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6574\u5757\u7f29\u8fdb\u5230 for tc in msg.tool_calls: \u5185\u90e8\u3002<\/p>\n<hr \/>\n<h4>6.5 \u5b57\u5178\u5199\u6210 set<\/h4>\n<p>result <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token string\">&#034;error&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;\u672a\u77e5\u5de5\u5177<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><span class=\"token punctuation\">}<\/span>   <span class=\"token comment\"># \u274c set&#xff0c;\u4e0d\u662f dict<\/span><\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5192\u53f7 {&#034;error&#034;: f&#034;&#8230;&#034;}\u3002\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cset \u7528\u9017\u53f7&#xff0c;dict \u7528\u5192\u53f7\u201d\u3002<\/p>\n<hr \/>\n<h4>6.6 \u62fc\u5199\u9519\u8bef\u88ab\u515c\u5e95\u541e\u6389<\/h4>\n<p>\u73b0\u8c61&#xff1a;loc[&#034;latitud&#034;]&#xff08;\u5c11\u4e00\u4e2a e&#xff09;\u2192 KeyError \u2192 \u88ab except Exception \u541e\u6389 \u2192 \u6240\u6709\u67e5\u8be2\u90fd\u8d70 error \u5206\u652f&#xff0c;\u4f46\u770b\u8d77\u6765&#034;\u7a0b\u5e8f\u6b63\u5e38&#034;\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u4fee\u62fc\u5199&#xff1b;\u540c\u65f6\u515c\u5e95 except \u91cc\u5fc5\u987b log \u539f\u59cb\u5f02\u5e38\u7c7b\u578b&#xff0c;\u5426\u5219\u9519\u8bef\u9759\u9ed8\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u6d4b\u8bd5\u901a\u8fc7 \u2260 \u529f\u80fd\u6b63\u786e\u201d\u2014\u2014\u8981\u4e48\u770b\u8fd4\u56de\u503c\u8bed\u4e49&#xff0c;\u8981\u4e48\u770b\u65e5\u5fd7\u3002<\/p>\n<hr \/>\n<h4>6.7 \u547d\u4ee4\u62fc\u9519\u88ab\u6a21\u578b&#034;\u78b0\u5de7&#034;\u54cd\u5e94<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u7528\u6237\u8f93 \/lsit&#xff08;list \u62fc\u9519&#xff09;&#xff0c;\u6ca1\u88ab\u547d\u4ee4\u5206\u652f\u62e6\u4e0b&#xff0c;\u6d41\u7ed9\u4e86\u6a21\u578b&#xff0c;\u6a21\u578b&#034;\u78b0\u5de7&#034;\u8f93\u51fa\u4e86\u4e00\u4efd\u5f85\u529e\u6e05\u5355\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6240\u6709 \/ \u5f00\u5934\u5148\u8d70\u5b88\u95e8\u5206\u652f&#xff1b;\u65e0\u6cd5\u8bc6\u522b\u65f6\u62a5&#034;\u672a\u77e5\u547d\u4ee4&#034;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u51d1\u5de7\u4e0d\u7b49\u4e8e\u771f\u5b9e\u529f\u80fd\u201d\u2014\u2014\u80fd\u51fa\u6b63\u786e\u7ed3\u679c\u4e0d\u4ee3\u8868\u4ee3\u7801\u8def\u5f84\u6b63\u786e\u3002<\/p>\n<hr \/>\n<h4>6.8 geocoding \u540c\u540d\u5730\u70b9\u9677\u9631<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u67e5&#034;\u4fdd\u5b9a&#034;\u8fd4\u56de 22\u00b0C&#xff08;\u5b9e\u9645\u6cb3\u5317\u4fdd\u5b9a 13\u00b0C&#xff09;\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;Open-Meteo \u4e2d\u6587 geocoding \u8fd4\u56de\u7684\u552f\u4e00&#034;\u4e2d\u56fd&#034;\u7ed3\u679c\u662f\u4e91\u5357\u897f\u53cc\u7248\u7eb3\u4fdd\u5b9a\u4e61&#xff0c;\u6cb3\u5317\u4fdd\u5b9a\u6839\u672c\u4e0d\u5728\u7ed3\u679c\u91cc\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5de5\u5177 description \u5199\u660e&#034;city \u7528\u82f1\u6587\u540d\u6216\u62fc\u97f3&#xff0c;\u9996\u5b57\u6bcd\u5927\u5199&#034;&#xff0c;\u9760\u6a21\u578b\u8f6c Baoding\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u4e2d\u6587\u5730\u540d geocoding \u4e0d\u53ef\u9760&#xff0c;\u8ba9 LLM \u505a\u62fc\u97f3\u8f6c\u6362\u201d\u2014\u2014\u628a\u8bed\u8a00\u80fd\u529b\u4ea4\u7ed9\u64c5\u957f\u7684\u7ec4\u4ef6\u3002<\/p>\n<hr \/>\n<h3>\u4e03\u3001\u63d0\u793a\u8bcd\u5de5\u7a0b&#xff08;Week 4&#xff09;<\/h3>\n<h4>7.1 \u5f31\u6a21\u578b\u5077\u61d2 vs \u5f3a\u6a21\u578b\u7a33\u5b9a<\/h4>\n<p>\u5b9e\u6d4b&#xff1a;\u540c\u4e00\u5957 Schema \u548c\u63d0\u793a\u8bcd&#xff0c;\u5f31\u6a21\u578b\u7b2c\u4e8c\u6b21\u95ee\u5929\u6c14\u4e0d\u8c03\u5de5\u5177&#xff1b;\u6362 Kimi \u540e\u6bcf\u6b21\u90fd\u8c03\u7528\u3002<\/p>\n<p>\u7ed3\u8bba&#xff1a;\u201c\u5de5\u5177\u8c03\u7528\u53ef\u9760\u6027 &#061; Schema \u8bbe\u8ba1 \u00d7 \u63d0\u793a\u8bcd\u7ea6\u675f \u00d7 \u6a21\u578b\u80fd\u529b&#xff0c;\u4e09\u8005\u53d6\u77ed\u677f\u201d\u3002<\/p>\n<hr \/>\n<h4>7.2 \u63d0\u793a\u8bcd\u4e0e Schema \u53e3\u5f84\u4e0d\u4e00\u81f4<\/h4>\n<p>system \u8bf4&#034;\u6ca1\u65f6\u95f4\u8981\u8be2\u95ee&#034;&#xff0c;Schema description \u8bf4&#034;\u672a\u77e5\u53ef\u4e0d\u586b&#034;\u2014\u2014\u6a21\u578b\u968f\u673a\u9009\u4e00\u79cd\u884c\u4e3a\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;system \/ Schema description \/ \u5de5\u5177 description \u4e09\u5904\u53e3\u5f84\u5fc5\u987b\u4e00\u81f4\u3002<\/p>\n<hr \/>\n<h4>7.3 \u63d0\u793a\u8bcd\u9519\u522b\u5b57\u4f1a\u88ab&#034;\u4f20\u67d3&#034;<\/h4>\n<p>docstring \u91cc due \u5199\u6210 deu&#xff0c;\u7ecf &#064;function_tool \u81ea\u52a8\u8f6c\u6210\u53c2\u6570 description \u539f\u6837\u53d1\u7ed9\u6a21\u578b\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cdocstring \u5c31\u662f\u4ee3\u7801&#xff0c;\u4e5f\u662f\u7ed9\u6a21\u578b\u7684\u63a5\u53e3\u5951\u7ea6\u201d\u3002<\/p>\n<hr \/>\n<h3>\u516b\u3001\u5f02\u6b65&#xff08;Week 6 \u65b0\u589e&#xff09;<\/h3>\n<h4>8.1 asyncio.run() \u53cd\u590d\u8c03\u7528 \u2192 Event loop is closed<\/h4>\n<p>\u73b0\u8c61&#xff1a;while True: asyncio.run(real_run(&#8230;))&#xff0c;\u7b2c\u4e00\u8f6e\u6b63\u5e38&#xff0c;\u7b2c\u4e8c\u8f6e\u5d29 RuntimeError: Event loop is closed\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;asyncio.run() \u6bcf\u6b21\u521b\u5efa\u4e00\u6b21\u6027\u5faa\u73af\u7528\u5b8c\u5173\u95ed\u3002\u5168\u5c40 AsyncOpenAI \u5ba2\u6237\u7aef\u5728\u5faa\u73af A \u91cc\u5efa\u4e86\u8fde\u63a5\u6c60&#xff0c;\u7b2c\u4e8c\u8f6e\u8fdb\u5faa\u73af B \u5374\u62ff\u5230 A \u7684\u65e7\u8fde\u63a5\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u4e00\u4e2a\u8fdb\u7a0b\u4e00\u4e2a\u4e8b\u4ef6\u5faa\u73af\u2014\u2014\u5165\u53e3\u53ea\u63a8\u4e00\u6b21\u95e8&#xff0c;\u5faa\u73af\u5185\u5168\u7528 await&#xff1a;<\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">real_run<\/span><span class=\"token punctuation\">(<\/span>messages<span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">list<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">await<\/span> Runner<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> messages<span class=\"token punctuation\">,<\/span> max_turns<span class=\"token operator\">&#061;<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">chat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        user_text <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">input<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u4f60&gt; &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> user_text<span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/exit&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><br \/>\n        result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> real_run<span class=\"token punctuation\">(<\/span>history<span class=\"token punctuation\">)<\/span>      <span class=\"token comment\"># \u2190 \u5faa\u73af\u5185 await&#xff0c;\u4e0d\u518d asyncio.run<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>result<span class=\"token punctuation\">.<\/span>final_output<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>chat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>                       <span class=\"token comment\"># \u2190 \u5168\u8fdb\u7a0b\u552f\u4e00\u4e00\u6b21<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201casyncio.run \u662f\u95e8&#xff0c;\u4e00\u4e2a\u8fdb\u7a0b\u63a8\u4e00\u6b21&#xff1b;\u5168\u5c40\u5f02\u6b65\u8d44\u6e90\u7684\u5bff\u547d\u5fc5\u987b \u2264 \u8fd9\u4e2a\u5faa\u73af\u201d\u3002<\/p>\n<p>\u8fb9\u754c&#xff1a;\u5faa\u73af\u5185\u53cd\u590d asyncio.run() \u82e5\u534f\u7a0b\u4e0d\u89e6\u78b0\u4efb\u4f55\u8de8\u8c03\u7528\u5b58\u6d3b\u7684\u5f02\u6b65\u8d44\u6e90&#xff08;\u7eaf\u8ba1\u7b97\u534f\u7a0b&#xff09;&#xff0c;\u5e76\u4e0d\u4f1a\u5d29\u2014\u2014\u6240\u4ee5\u7cbe\u786e\u8bf4\u6cd5\u662f&#034;\u8de8\u5faa\u73af\u590d\u7528\u8d44\u6e90&#034;\u624d\u81f4\u547d&#xff0c;\u800c\u4e0d\u662f&#034;\u5199\u6210\u5faa\u73af\u5c31\u5fc5\u7136\u5d29&#034;\u3002<\/p>\n<hr \/>\n<h4>8.2 \u534f\u7a0b\u6ca1\u88ab await<\/h4>\n<p>\u73b0\u8c61&#xff1a;RuntimeWarning: coroutine &#039;real_run&#039; was never awaited&#xff0c;\u7a0b\u5e8f\u4ec0\u4e48\u90fd\u6ca1\u505a\u5c31\u7ed3\u675f\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u8c03\u7528 async \u51fd\u6570\u53ea\u521b\u5efa\u534f\u7a0b\u5bf9\u8c61&#xff0c;\u4e0d\u6267\u884c\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;asyncio.run(real_run(&#8230;)) \u6216\u5728\u534f\u7a0b\u5185 await real_run(&#8230;)\u3002<\/p>\n<hr \/>\n<h4>8.3 \u7b2c\u4e09\u65b9\u7aef\u70b9 model \u540d\u88ab\u524d\u7f00\u89e3\u6790<\/h4>\n<p>\u73b0\u8c61&#xff1a;UserError: Unknown prefix: Openai\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;SDK \u5bf9 model&#061;&#034;Pro\/moonshotai\/Kimi-K2.6&#034; \u6309 \/ \u524d\u7f00\u8def\u7531 Provider&#xff0c;\u67e5\u4e0d\u5230\u62a5\u9519\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u663e\u5f0f\u6784\u9020 OpenAIChatCompletionsModel(model&#061;MODEL, openai_client&#061;client)&#xff0c;model&#061; \u4f20\u5bf9\u8c61\u800c\u975e\u5b57\u7b26\u4e32\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u7b2c\u4e09\u65b9 OpenAI \u517c\u5bb9\u7aef\u70b9 \u2192 \u4e00\u5f8b\u7528 Model \u5bf9\u8c61\u7ed1\u6b7b\u5ba2\u6237\u7aef\u201d\u3002<\/p>\n<hr \/>\n<h4>8.4 SDK \u9ed8\u8ba4\u4e0a\u62a5 trace \u5230 OpenAI \u4e91\u7aef<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u81ea\u5b9a\u4e49\u7aef\u70b9\u8fd0\u884c\u65f6 SDK \u8bd5\u56fe\u8fde OpenAI \u8ffd\u8e2a\u670d\u52a1&#xff0c;\u62a5\u9519\u6216\u8d85\u65f6\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;set_tracing_disabled(True)\u3002<\/p>\n<hr \/>\n<h4>8.5 \u62a4\u680f\u89e6\u53d1\u629b\u5f02\u5e38\u800c\u975e\u9759\u9ed8\u8fd4\u56de<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u8f93\u5165&#034;\u5220\u9664\u5f85\u529e&#034;\u76f4\u63a5 traceback\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;tripwire_triggered&#061;True \u65f6 Runner \u629b InputGuardrailTripwireTriggered\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;<\/p>\n<p><span class=\"token keyword\">from<\/span> agents<span class=\"token punctuation\">.<\/span>exceptions <span class=\"token keyword\">import<\/span> InputGuardrailTripwireTriggered<br \/>\n<span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    result <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">await<\/span> Runner<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">except<\/span> InputGuardrailTripwireTriggered <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f&#034;&#x1f6ab; <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>e<span class=\"token punctuation\">.<\/span>guardrail<span class=\"token punctuation\">.<\/span>output_info<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">&#034;<\/span><\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u62a4\u680f\u4e0d\u662f\u9759\u9ed8\u8df3\u8fc7&#xff0c;\u662f\u629b\u5f02\u5e38\u62e6\u622a\u201d\u2014\u2014\u8c03\u7528\u65b9\u5fc5\u987b\u63a5\u4f4f&#xff0c;\u5426\u5219\u4e00\u6b21\u8d8a\u6743\u8bf7\u6c42\u5c31\u628a\u6574\u4e2a\u4f1a\u8bdd\u6253\u6b7b\u3002<\/p>\n<hr \/>\n<h4>8.6 \u88c5\u9970\u5668\u66ff\u6362\u540d\u5b57&#xff1a;\u53cc\u901a\u9053\u5fc5\u987b\u7528\u4e24\u4e2a\u540d\u5b57<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u7ed9 \/todos \u547d\u4ee4\u8865\u4e86\u88f8\u51fd\u6570\u7248\u672c\u540e&#xff0c;\u6a21\u578b\u4e00\u5bf9\u8bdd\u5c31\u62a5&#xff1a;<\/p>\n<p>UserError: Hosted tools are not supported with the ChatCompletions API.<br \/>\nGot tool type: &lt;class &#039;function&#039;&gt;, tool: function list_todos<\/p>\n<p>\u6839\u56e0&#xff1a;&#064;function_tool \u7684\u672c\u8d28\u662f\u7528 FunctionTool \u5bf9\u8c61\u66ff\u6362\u539f\u540d\u5b57&#xff0c;\u4e8e\u662f\u51fa\u73b0\u4e24\u9762\u6027\u95ee\u9898&#xff1a;<\/p>\n<ul>\n<li>\u82e5\u540d\u5b57\u6307\u5411 FunctionTool&#xff1a;\u547d\u4ee4\u901a\u9053 list_todos() \u76f4\u63a5\u5d29&#xff08;&#039;FunctionTool&#039; object is not callable&#xff09;<\/li>\n<li>\u82e5\u4e3a\u4e86\u4fee\u547d\u4ee4\u901a\u9053\u628a\u5b83\u5199\u56de\u88f8\u51fd\u6570&#xff1a;Agent(tools&#061;[&#8230;]) \u91cc\u5c31\u8eba\u7740\u4e00\u4e2a\u666e\u901a Python \u51fd\u6570&#xff0c;SDK \u65e0\u6cd5\u8f6c\u6210 API \u7684 tools \u53c2\u6570&#xff0c;\u53d1\u8bf7\u6c42\u524d\u76f4\u63a5\u62d2\u7edd<\/li>\n<\/ul>\n<p>\u4fee\u6cd5&#xff1a;\u88f8\u903b\u8f91\u7528 _impl \u540e\u7f00&#xff0c;\u5305\u88c5\u7248\u7ed1\u5230\u53e6\u4e00\u4e2a\u540d\u5b57&#xff0c;\u4e24\u6761\u901a\u9053\u5404\u7528\u5404\u7684&#xff1a;<\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">list_todos_impl<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">:<\/span>          <span class=\"token comment\"># \u2460 \u547d\u4ee4\u901a\u9053&#xff1a;\u76f4\u63a5\u8c03\u7528<\/span><br \/>\n    path <span class=\"token operator\">&#061;<\/span> Path<span class=\"token punctuation\">(<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f&#034;<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>agent<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">.json&#034;<\/span><\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><\/p>\n<p>list_todos_tool <span class=\"token operator\">&#061;<\/span> function_tool<span class=\"token punctuation\">(<\/span>list_todos_impl<span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u2461 \u6a21\u578b\u901a\u9053&#xff1a;\u8fdb tools \u5217\u8868<\/span><\/p>\n<p>agent <span class=\"token operator\">&#061;<\/span> Agent<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">,<\/span> tools<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">[<\/span>get_weather<span class=\"token punctuation\">,<\/span> add_todo<span class=\"token punctuation\">,<\/span> list_todos_tool<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\"># \/todos \u547d\u4ee4\u91cc&#xff1a;<\/span><br \/>\nr <span class=\"token operator\">&#061;<\/span> list_todos_impl<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201cagent.tools \u53ea\u6536 FunctionTool&#xff1b;\u88f8\u51fd\u6570\u53ea\u6d3b\u5728\u547d\u4ee4\u901a\u9053\u201d\u2014\u2014\u88c5\u9970\u540e\u7684\u540d\u5b57\u670d\u52a1\u6a21\u578b&#xff0c;_impl \u540d\u5b57\u670d\u52a1\u4ee3\u7801&#xff0c;\u6c38\u4e0d\u4ea4\u53c9\u3002<\/p>\n<hr \/>\n<h4>8.7 \u5b58\u6863\u653e finally&#xff1a;\u5f02\u6b65\u9000\u51fa\u7684\u552f\u4e00\u4fdd\u9669<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u6a21\u578b\u56de\u590d\u5230\u4e00\u534a\u6309 Ctrl&#043;C&#xff0c;\u4f1a\u8bdd\u6ca1\u4fdd\u5b58&#xff0c;\u7ec8\u7aef\u7cca\u4e00\u6574\u5c4f traceback&#xff1a;<\/p>\n<p>asyncio.exceptions.CancelledError              \u2190 \u7b2c\u4e00\u5e55&#xff1a;\u534f\u7a0b\u88ab\u53d6\u6d88<br \/>\nDuring handling of the above exception, another exception occurred:<br \/>\nKeyboardInterrupt                              \u2190 \u7b2c\u4e8c\u5e55&#xff1a;\u4e2d\u65ad\u91cd\u65b0\u629b\u51fa<\/p>\n<p>\u6839\u56e0&#xff1a;Ctrl&#043;C \u5728\u5f02\u6b65\u91cc\u4e0d\u662f&#034;\u5728 input \u884c\u629b\u51fa&#034;&#xff0c;\u800c\u662f\u53d6\u6d88\u6574\u4e2a\u534f\u7a0b\u2014\u2014\u4e2d\u65ad\u4ece\u4efb\u610f await \u70b9\u6ce8\u5165&#xff0c;\u4f60\u5305\u5728 input() \u5916\u5c42\u7684 except KeyboardInterrupt \u6839\u672c\u591f\u4e0d\u7740\u3002\u4efb\u4f55\u975e \/exit \u7684\u9000\u51fa\u8def\u5f84\u90fd\u4f1a\u6f0f\u5b58\u6863\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;try\/finally \u5305\u4f4f\u6574\u4e2a\u4f1a\u8bdd\u5faa\u73af&#xff0c;finally \u91cc\u5b58\u6863&#xff1b;\u9876\u5c42\u518d\u63a5\u4e00\u6b21 KeyboardInterrupt \u6536\u573a&#xff1a;<\/p>\n<p><span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">multi_chat<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    args_messages <span class=\"token operator\">&#061;<\/span> load_sessions<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;selfsession&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> <span class=\"token boolean\">True<\/span><span class=\"token punctuation\">:<\/span><br \/>\n            <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                user_text <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">input<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u4f60&gt; &#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>strip<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token keyword\">except<\/span> EOFError<span class=\"token punctuation\">:<\/span>                  <span class=\"token comment\"># Ctrl&#043;D<\/span><br \/>\n                <span class=\"token keyword\">break<\/span>                          <span class=\"token comment\"># \u2190 break&#xff0c;\u8ba9 finally \u7edf\u4e00\u5b58\u6863<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> user_text<span class=\"token punctuation\">.<\/span>lower<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;\/exit&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><br \/>\n            <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n    <span class=\"token keyword\">finally<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        save_sessions<span class=\"token punctuation\">(<\/span>args_messages<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;selfsession&#034;<\/span><span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u6240\u6709\u9000\u51fa\u8def\u5f84\u90fd\u5b58\u6863<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n\u4f1a\u8bdd\u5df2\u4fdd\u5b58&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">if<\/span> __name__ <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;__main__&#034;<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        asyncio<span class=\"token punctuation\">.<\/span>run<span class=\"token punctuation\">(<\/span>multi_chat<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">except<\/span> KeyboardInterrupt<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\\\\n\u518d\u89c1&#xff01;&#034;<\/span><span class=\"token punctuation\">)<\/span>                      <span class=\"token comment\"># \u7b2c\u4e8c\u5e55\u5728\u8fd9\u91cc\u5b89\u9759\u6536\u573a<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u5b58\u6863\u903b\u8f91\u53ea\u653e finally&#xff0c;\u4e0d\u653e\u4efb\u4f55\u5206\u652f\u201d\u2014\u2014\u4f60\u6c38\u8fdc\u4e0d\u77e5\u9053\u7528\u6237\u4ec0\u4e48\u65f6\u5019\u6309 Ctrl&#043;C\u3002<\/p>\n<hr \/>\n<h4>8.8 \u6d88\u606f\u5f62\u6001\u9632\u5fa1&#xff1a;\u8fc7\u6ee4\u5668\u4e0d\u80fd\u6210\u4e3a\u6570\u636e\u9ed1\u6d1e<\/h4>\n<p>\u73b0\u8c61&#xff1a;sessions\/ \u76ee\u5f55\u91cc\u660e\u660e\u6709\u4e24\u4e2a\u4f1a\u8bdd\u6587\u4ef6&#xff0c;\/list \u53ea\u663e\u793a\u4e00\u4e2a&#xff0c;\u65e5\u5fd7\u4e00\u7247\u5b89\u9759\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;list_sessions() \u7528 m[&#034;role&#034;] &#061;&#061; &#034;user&#034; \u7edf\u8ba1\u8f6e\u6570&#xff0c;\u800c SDK \u6d88\u606f\u91cc\u53ef\u80fd\u6df7\u6709\u65e0 role\u3001\u53ea\u6709 type \u7684\u6761\u76ee&#xff08;function_call \/ function_call_output \u90a3\u65cf&#xff09;\u2192 KeyError \u2192 \u5916\u5c42 except Exception: continue \u2192 \u6574\u4e2a\u6587\u4ef6\u88ab\u9759\u9ed8\u8df3\u8fc7\u3002<\/p>\n<p>\u540c\u4e00\u4e2a\u95ee\u9898\u5728 load_sessions() \u91cc\u5df2\u7ecf\u7528 _valid_msg \u4fee\u8fc7&#xff0c;list_sessions() \u5fd8\u4e86\u540c\u6b65\u2014\u2014\u540c\u4e00\u5751\u5728\u4e24\u4e2a\u6d88\u8d39\u70b9\u5404\u8e29\u4e00\u6b21&#xff0c;\u8fd9\u5c31\u662f\u5f62\u6001\u6821\u9a8c\u6ca1\u6536\u655b\u6210\u5355\u4e00\u51fd\u6570\u7684\u4ee3\u4ef7\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u2460 \u53d6\u503c\u4e00\u5f8b .get()&#xff1b;\u2461 \u5f62\u6001\u6821\u9a8c\u6536\u655b\u6210\u4e00\u4e2a\u51fd\u6570&#xff0c;\u6240\u6709\u6d88\u8d39\u70b9\u5171\u7528&#xff1b;\u2462 except \u5fc5\u987b\u7559\u75d5&#xff1a;<\/p>\n<p>VALID_ROLES <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;system&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;assistant&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;tool&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;developer&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">def<\/span> <span class=\"token function\">_valid_msg<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">:<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">dict<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">False<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> m<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">in<\/span> VALID_ROLES<span class=\"token punctuation\">:<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">True<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">isinstance<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;type&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">)<\/span>      <span class=\"token comment\"># type \u98ce\u683c\u6761\u76ee\u653e\u884c<\/span><\/p>\n<p><span class=\"token comment\"># list_sessions \u91cc<\/span><br \/>\n<span class=\"token string\">&#034;turns&#034;<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token builtin\">sum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token keyword\">for<\/span> m <span class=\"token keyword\">in<\/span> d<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;messages&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> m<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;role&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">except<\/span> Exception <span class=\"token keyword\">as<\/span> e<span class=\"token punctuation\">:<\/span><br \/>\n    log<span class=\"token punctuation\">.<\/span>warning<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8df3\u8fc7\u65e0\u6cd5\u89e3\u6790\u7684\u4f1a\u8bdd %s&#xff1a;%s&#034;<\/span><span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">type<\/span><span class=\"token punctuation\">(<\/span>e<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>__name__<span class=\"token punctuation\">)<\/span>   <span class=\"token comment\"># \u2190 \u7559\u75d5<\/span><br \/>\n    <span class=\"token keyword\">continue<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u9759\u9ed8 continue \u662f\u6392\u67e5\u6210\u672c\u6700\u9ad8\u7684\u4ee3\u7801\u201d\u2014\u2014\u541e\u6389\u7684\u6bcf\u4e2a\u5f02\u5e38\u90fd\u4f1a\u53d8\u6210\u672a\u6765\u7684\u8c1c\u9898\u3002\u8fd9\u4e2a\u5751\u5df2\u5728\u4e09\u4e2a\u5730\u65b9\u8e29\u8fc7&#xff08;latitud \u88ab\u541e \/ \u4f1a\u8bdd\u6587\u4ef6\u88ab\u541e \/ list_sessions \u88ab\u541e&#xff09;&#xff0c;\u591f\u683c\u4e0a\u5347\u4e3a\u808c\u8089\u8bb0\u5fc6\u3002<\/p>\n<p>\u53e6\u89c1&#xff1a;4.2&#xff08;content \u975e\u5b57\u7b26\u4e32&#xff09;\u662f\u540c\u65cf\u95ee\u9898\u2014\u2014SDK \u6d88\u606f\u4e0d\u4fdd\u8bc1\u5f62\u6001&#xff0c;\u6240\u6709\u5904\u7406\u51fd\u6570\u90fd\u8981\u9632\u5fa1\u3002<\/p>\n<hr \/>\n<h4>8.9 asdict() \u53ea\u5e26\u5b57\u6bb5\u4e0d\u5e26 property&#xff08;Week 7&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u62a5\u544a\u5e8f\u5217\u5316\u65f6 KeyError: &#039;score&#039;\u2014\u2014Verdict \u660e\u660e\u5b9a\u4e49\u4e86 score \u5c5e\u6027&#xff0c;\u8bc4\u4f30\u8dd1\u5f97\u597d\u597d\u7684\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;dataclasses.asdict() \u53ea\u5904\u7406\u5b57\u6bb5&#xff08;field&#xff09;&#xff0c;&#064;property \u662f\u7c7b\u4e0a\u7684\u8ba1\u7b97\u65b9\u6cd5&#xff0c;\u4e0d\u5728\u5b9e\u4f8b __dict__ \u91cc&#xff0c;\u76f4\u63a5\u88ab\u4e22\u6389\u3002dataclass \u672c\u8eab\u6ca1\u6709\u7c7b\u578b\u68c0\u67e5&#xff0c;score \u8fd9\u79cd&#034;\u6709 property \u770b\u8d77\u6765\u5c31\u6709&#034;\u7684\u9519\u89c9\u6700\u5751\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5e8f\u5217\u5316\u524d\u663e\u5f0f\u8865\u4e0a\u8ba1\u7b97\u503c&#xff0c;\u6216\u6d88\u8d39\u7aef\u73b0\u7b97&#xff1a;<\/p>\n<p>vd <span class=\"token operator\">&#061;<\/span> asdict<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">)<\/span><br \/>\nvd<span class=\"token punctuation\">[<\/span><span class=\"token string\">&#034;score&#034;<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> v<span class=\"token punctuation\">.<\/span>score          <span class=\"token comment\"># \u663e\u5f0f\u8d4b\u503c<\/span><br \/>\n<span class=\"token comment\"># \u6216\u8005\u62a5\u544a\u7edf\u8ba1\u5904\u76f4\u63a5 sum(v.score for v in verdicts) \u73b0\u7b97<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201casdict \u590d\u5370\u7684\u662f\u5b57\u6bb5\u6e05\u5355&#xff0c;property \u662f\u540e\u5370\u4e0a\u53bb\u7684\u624b\u5199\u9875\u201d\u2014\u2014\u8ba1\u7b97\u5c5e\u6027\u6c38\u8fdc\u4e0d\u8fdb asdict \u7684\u7ed3\u679c\u3002<\/p>\n<hr \/>\n<h4>8.10 \u884c\u5c3e\u9017\u53f7\u6253\u5305 tuple&#xff08;Week 7&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;&#039;tuple&#039; object has no attribute &#039;get&#039;\u2014\u2014\u660e\u660e\u6bcf\u4e00\u6b65\u62ff\u5230\u7684\u90fd\u662f dict\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;Python \u4e2d x &#061; next(&#8230;), \u884c\u5c3e\u591a\u4e00\u4e2a\u9017\u53f7&#xff0c;\u628a\u8d4b\u503c\u53d8\u6210\u4e86\u5355\u5143\u7d20\u5143\u7ec4\u6253\u5305&#xff08;x &#061; (value,)&#xff09;\u3002\u524d\u9762\u6240\u6709\u53d6 dict \u7684\u4ee3\u7801\u90fd\u4f1a\u5ef6\u8fdf\u5230\u5f88\u8fdc\u7684\u4e0b\u6e38\u624d\u70b8&#xff0c;\u4e14\u62a5\u9519\u4f4d\u7f6e\u548c\u5199\u9519\u4f4d\u7f6e\u76f8\u9694\u5341\u4e07\u516b\u5343\u91cc\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5220\u6389\u884c\u5c3e\u9017\u53f7\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u884c\u5c3e\u9017\u53f7 &#061; \u5143\u7ec4\u6253\u5305&#xff0c;&#061; x, \u4e0d\u662f &#061; x\u201d\u2014\u2014\u4e0b\u6e38\u70b8\u51fa tuple \u5b57\u6837\u65f6&#xff0c;\u5148\u56de\u6eaf\u8d4b\u503c\u884c\u627e\u9017\u53f7\u3002<\/p>\n<hr \/>\n<h4>8.11 \u7279\u4f8b\u4e0d\u8fdb\u901a\u7528\u5c42&#xff1a;forbid_keywords \u53cd\u6a21\u5f0f&#xff08;Week 7&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u88c1\u5224\u6f0f\u5224\u67d0\u7c7b\u8bed\u4e49\u7f3a\u9677&#xff08;\u5b9e\u4f53\u66ff\u6362&#xff1a;\u6a21\u578b\u628a&#034;\u65af\u83ab\u65af&#034;\u6362\u6210\u7f8e\u56fd Smithfield \u5374\u4ee5\u539f\u540d\u64ad\u62a5&#xff09;&#xff0c;\u4e8e\u662f\u60f3\u5728\u901a\u7528\u68c0\u67e5\u91cc\u52a0 forbid_keywords \u9ed1\u540d\u5355\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u4e2a\u4f8b\u5199\u8fdb\u901a\u7528\u68c0\u67e5 \u2192 \u9ed1\u540d\u5355\u8d8a\u6765\u8d8a\u957f \u2192 \u6bcf\u4e2a\u65b0\u4e2a\u4f8b\u90fd\u8981\u6539\u901a\u7528\u5c42 \u2192 \u901a\u7528\u5c42\u81a8\u80c0\u6210\u7279\u4f8b\u5806\u3002\u4e14\u786c\u68c0\u67e5\u6293\u5f62\u6001&#xff08;\u5de5\u5177\u8c03\u7528\u4e86\u5417\u3001city \u683c\u5f0f\u5bf9\u5417&#xff09;&#xff0c;\u6293\u4e0d\u4f4f\u8bed\u4e49&#xff08;\u7b54\u7684\u662f\u4e0d\u662f\u7528\u6237\u95ee\u7684\u90a3\u4e2a\u5b9e\u4f53&#xff09;\u2014\u2014\u5c42\u6b21\u9519\u4f4d\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u8bed\u4e49\u7f3a\u9677\u5f52 LLM \u88c1\u5224&#xff08;\u88c1\u5224\u6807\u51c6\u52a0&#034;\u5b9e\u4f53\u66ff\u6362\u89c6\u4e3a\u7f16\u9020&#034;&#xff09;&#xff1b;\u901a\u7528\u5c42\u4fdd\u6301\u53ea\u653e\u666e\u9002\u89c4\u5219\u3002\u4e2a\u4f8b\u7b49\u771f\u5b9e\u9879\u76ee\u9700\u6c42\u51fa\u73b0\u518d\u9488\u5bf9\u6027\u8bbe\u8ba1&#xff08;\u672c\u6b21\u51b3\u7b56&#xff1a;\u63a8\u8fdf\u5230\u9879\u76ee\u671f&#xff09;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u901a\u7528\u5c42\u53ea\u6536\u666e\u9002\u89c4\u5219&#xff0c;\u4e2a\u4f8b\u8fdb\u88c1\u5224\u6807\u51c6\u6216\u8fdb\u575f\u5893\u201d\u2014\u2014\u9ed1\u540d\u5355\u662f\u8bc4\u4f30\u5c42\u7684\u7cd6\u679c&#xff0c;\u5403\u591a\u4e86\u6212\u4e0d\u6389\u3002<\/p>\n<hr \/>\n<h4>8.12 \u6253\u70b9\u8bb0\u5f55\u503c\u800c\u975e\u7c7b\u578b&#xff08;Week 7&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;RECORDER \u843d\u76d8\u540e due \u68c0\u67e5\u6052\u5931\u8d25&#xff0c;\u6253\u5f00\u65e5\u5fd7\u770b\u5230 {&#034;content&#034;: str, &#034;due&#034;: str}\u2014\u2014\u5168\u662f\u7c7b\u578b\u540d\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u5199\u6253\u70b9\u65f6\u628a\u53d8\u91cf\u540d\u8bef\u5f53\u6210\u4e86\u5b57\u7b26\u4e32\u5b57\u9762\u91cf&#xff08;{&#034;content&#034;: &#034;content&#034;}&#xff09;&#xff0c;\u8bb0\u4e0b\u7684\u662f\u7c7b\u578b\u4e0d\u662f\u503c\u3002\u800c args \u662f due \u68c0\u67e5\u7684\u552f\u4e00\u53ef\u9760\u8bc1\u636e\u2014\u2014\u6253\u70b9\u5e9f\u4e86&#xff0c;\u4e0b\u6e38\u68c0\u67e5\u5168\u5e9f\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;{&#034;content&#034;: content, &#034;due&#034;: due}\u2014\u2014\u503c\u4f20\u8fdb\u53bb&#xff1b;\u6253\u70b9\u683c\u5f0f\u4e00\u53d8&#xff0c;\u4e0b\u6e38\u6240\u6709\u6d88\u8d39\u70b9\u5fc5\u987b\u540c\u6b65\u6392\u67e5\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u6253\u70b9\u662f\u8bc1\u636e\u94fe\u7684\u8d77\u70b9&#xff0c;\u8d77\u70b9\u8bb0\u4e86\u7c7b\u578b&#xff0c;\u7ec8\u70b9\u53ea\u80fd\u9a8c\u8bc1\u7384\u5b66\u201d\u3002<\/p>\n<hr \/>\n<h4>8.13 \u914d\u7f6e\u53c2\u6570\u88ab\u9759\u9ed8\u5ffd\u7565&#xff1a;\u6536\u4e86\u4e0d\u7528&#xff08;Week 8&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u56db\u7ec4\u5207\u5206\u5b9e\u9a8c&#xff08;\u4e8c\u4e09\u7ea7\u90fd\u5207 \/ \u53ea\u6309\u4e8c\u7ea7\u5207 \/ \u5207\u788e \/ \u5207\u7c97&#xff09;\u6307\u6807\u4e00\u6a21\u4e00\u6837&#xff0c;\u6000\u7591&#034;\u53c2\u6570\u6ca1\u5f71\u54cd&#034;\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;\u51fd\u6570\u7b7e\u540d\u6536\u4e0b\u4e86 use_h3 \u53c2\u6570&#xff0c;\u4f46\u5224\u65ad\u6761\u4ef6\u91cc\u5199\u6b7b\u4e86 line.startswith(&#034;### &#034;) or line.startswith(&#034;## &#034;)\u2014\u2014\u53c2\u6570\u88ab\u63a5\u6536\u3001\u88ab\u4f20\u53c2\u3001\u4ece\u672a\u88ab\u4f7f\u7528\u3002\u4e0d\u62a5\u9519\u3001\u4e0d\u8b66\u544a\u3001\u7167\u5e38\u51fa\u7ed3\u679c\u3002<\/p>\n<p>\u540c\u7c7b\u53d8\u4f53&#xff1a;\u7ec3\u4e60\u6587\u4ef6\u91cc\u590d\u5236\u4e86\u4e00\u4efd\u6539\u9020\u8fc7\u7684\u5207\u5206\u51fd\u6570&#xff0c;\u4f46\u5b9e\u9645\u8c03\u7528\u7684\u662f brain \u91cc\u90a3\u4efd\u2014\u2014\u6539\u7684\u90a3\u4efd\u662f\u6b7b\u4ee3\u7801\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u53c2\u6570\u5fc5\u987b\u6709\u8c03\u7528\u70b9 &#043; \u5fc5\u987b\u6709\u65ad\u8a00\u3002\u6539\u5b8c\u8dd1\u4e00\u6b21&#034;\u53c2\u6570\u5e94\u6539\u53d8\u8f93\u51fa&#034;\u7684\u6d4b\u8bd5&#xff08;chunk \u6570\u5e94\u53d8\u5316&#xff09;&#xff0c;\u6570\u91cf\u4e0d\u53d8\u5c31\u662f\u6ca1\u63a5\u4e0a\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u914d\u7f6e\u88ab\u5ffd\u7565\u6bd4\u62a5\u9519\u5371\u9669\u5341\u500d\u201d\u2014\u2014\u62a5\u9519\u4f1a\u558a&#xff0c;\u5ffd\u7565\u53ea\u4f1a\u8ba9\u6240\u6709\u5b9e\u9a8c\u5f97\u51fa\u540c\u4e00\u4e2a\u7ed3\u8bba\u3002<\/p>\n<hr \/>\n<h4>8.14 \u51fd\u6570\u591a\u5206\u652f\u8fd4\u56de\u7c7b\u578b\u4e0d\u4e00\u81f4&#xff08;Week 8&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u5207\u5206\u540e chunk \u6570\u4ece 46 \u66b4\u6da8\u5230 10887\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;split_long \u77ed\u8def\u5f84 return body&#xff08;\u5b57\u7b26\u4e32&#xff09;&#xff0c;\u957f\u8def\u5f84 return parts&#xff08;\u5217\u8868&#xff09;\u3002\u5916\u9762 enumerate(split_long(&#8230;)) \u8fed\u4ee3\u4e00\u4e2a\u5b57\u7b26\u4e32 \u2192 \u9010\u5b57\u7b26\u53d8\u6210 chunk&#xff0c;\u5168\u6587\u5b57\u7b26\u6570 \u2248 chunk \u6570\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6240\u6709 return \u540c\u4e00\u7c7b\u578b&#xff08;return [body]&#xff09;\u3002\u5e76\u5728 flush \u51fa\u53e3\u52a0\u4e00\u9053\u5f62\u6001\u65ad\u8a00&#xff1a;assert all(len(c[&#034;content&#034;]) &gt; 1 for c in chunks)\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u8fd4\u56de list \u7684\u51fd\u6570&#xff0c;\u6bcf\u4e2a\u5206\u652f\u90fd\u5fc5\u987b\u8fd4\u56de list\u201d\u2014\u2014\u548c 8.10&#xff08;\u884c\u5c3e\u9017\u53f7\u6253\u5305 tuple&#xff09;\u540c\u65cf&#xff1a;\u7c7b\u578b\u5728\u6e90\u5934\u6084\u6084\u53d8\u4e86&#xff0c;\u70b8\u5728\u5f88\u8fdc\u7684\u5730\u65b9\u3002<\/p>\n<hr \/>\n<h4>8.15 \u7d2f\u52a0\u5668\u521d\u59cb\u5316\u5728\u5faa\u73af\u5185&#xff08;Week 8&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;Top-3 \u547d\u4e2d\u7387\u7b97\u51fa 0.0833\u3001MRR 0.0417&#xff0c;\u4e0e\u7ec8\u7aef\u9010\u6761\u8f93\u51fa\u4e25\u91cd\u77db\u76fe\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;rank_count &#061; 0\u3001mrr_sum &#061; 0.0 \u5199\u5728 for \u5faa\u73af\u5185\u90e8&#xff0c;\u6bcf\u6761\u67e5\u8be2\u90fd\u6e05\u96f6&#xff0c;\u5faa\u73af\u7ed3\u675f\u53ea\u5269\u6700\u540e\u4e00\u6761\u7684\u8d21\u732e\u30020.0833 &#061; 1\/12\u30010.0417 &#061; 0.5\/12&#xff0c;\u6570\u5b57\u4e0e&#034;\u53ea\u5269\u6700\u540e\u4e00\u6761&#034;\u7cbe\u786e\u543b\u5408\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u6240\u6709 _count \/ _sum \u4e0e\u8f93\u51fa\u8bed\u53e5\u540c\u5c42\u7ea7&#xff08;\u90fd\u5728\u5faa\u73af\u5916&#xff09;&#xff0c;\u5faa\u73af\u5185\u53ea\u6709 &#043;&#061;\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u7edf\u8ba1\u7ed3\u679c\u6070\u597d\u53ea\u53cd\u6620\u6700\u540e\u4e00\u6761\u6570\u636e&#xff0c;\u5c31\u662f\u7d2f\u52a0\u5668\u88ab\u6e05\u96f6\u4e86\u201d\u2014\u2014\u602a\u6570\u5b57\u4e0d\u662f\u566a\u97f3&#xff0c;\u662f bug \u7684\u81ea\u767d\u3002<\/p>\n<hr \/>\n<h4>8.16 \u5faa\u73af\u53d8\u91cf\u6b8b\u7559&#xff1a;\u5206\u652f\u672a\u8d4b\u503c\u5374\u88ab\u4f7f\u7528&#xff08;Week 8&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;\u6682\u65f6\u6ca1\u70b8\u2014\u2014\u4f46 top &#061; hits[0] \u53ea\u5728\u90e8\u5206\u5206\u652f\u8d4b\u503c&#xff0c;elif expected is None \u5206\u652f\u6cbf\u7528\u4e86\u4e0a\u4e00\u6761\u67e5\u8be2\u7684 top\u3002\u82e5\u7b2c\u4e00\u6761\u67e5\u8be2\u5c31\u8d70\u8fdb\u8be5\u5206\u652f&#xff0c;\u76f4\u63a5 NameError\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;Python \u53d8\u91cf\u6ca1\u6709\u5757\u4f5c\u7528\u57df&#xff0c;\u4e0a\u4e00\u8f6e\u7684\u503c\u4f1a\u6b8b\u7559&#xff1b;h is top \u6bd4\u8f83\u6070\u597d\u8fd8\u80fd\u8dd1\u901a&#xff0c;\u63a9\u76d6\u4e86\u7f3a\u9677\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;\u5206\u652f\u5224\u65ad\u524d\u5148\u7edf\u4e00\u8d4b\u503c&#xff08;if hits: top &#061; hits[0]&#xff09;&#xff0c;\u6216\u521d\u503c\u663e\u5f0f\u7f6e None\u3002<\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u80fd\u5728\u67d0\u6761\u8def\u5f84\u4e0a\u4e0d\u8d4b\u503c\u5c31\u4e0d\u8be5\u5728\u8be5\u8def\u5f84\u4e0a\u88ab\u8bfb\u201d\u2014\u2014\u9760\u6b8b\u7559\u503c\u8dd1\u901a\u662f&#034;\u78b0\u5de7&#034;&#xff0c;\u4e0d\u662f&#034;\u6b63\u786e&#034;\u3002<\/p>\n<hr \/>\n<h4>8.17 \u7a7a\u5b57\u7b26\u4e32\u62fc\u8def\u5f84\u53d8\u6210\u771f\u503c&#xff08;Week 8&#xff09;<\/h4>\n<p>\u73b0\u8c61&#xff1a;.env \u91cc\u6a21\u578b\u8def\u5f84\u6ca1\u914d\u597d&#xff0c;\u7a0b\u5e8f\u5374\u8bd5\u56fe\u628a\u9879\u76ee\u6839\u76ee\u5f55\u5f53\u6a21\u578b\u52a0\u8f7d\u3002<\/p>\n<p>\u6839\u56e0&#xff1a;Path(BASE_DIR) \/ os.environ.get(&#034;&#8230;&#034;, &#034;&#034;) \u2014\u2014 Path \/ &#034;&#034; \u8fd4\u56de\u76ee\u5f55\u672c\u8eab&#xff0c;\u662f\u4e2a\u975e\u7a7a\u3001truthy \u7684\u8def\u5f84&#xff1b;if LOCAL_EMBED_PATH: \u6052\u771f&#xff0c;\u672c\u5730\u5206\u652f\u88ab\u5f3a\u884c\u8fdb\u5165\u3002<\/p>\n<p>\u4fee\u6cd5&#xff1a;<\/p>\n<p>_local <span class=\"token operator\">&#061;<\/span> os<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">.<\/span>get<span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;LOCAL_EMBED_PATH&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nLOCAL_EMBED_PATH <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">str<\/span><span class=\"token punctuation\">(<\/span>BASE_DIR <span class=\"token operator\">\/<\/span> _local<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">if<\/span> _local <span class=\"token keyword\">else<\/span> <span class=\"token string\">&#034;&#034;<\/span>   <span class=\"token comment\"># \u5148\u5224\u7a7a&#xff0c;\u518d\u62fc<\/span><\/p>\n<p>\u8bb0\u5fc6\u951a\u70b9&#xff1a;\u201c\u7a7a\u4e32 join \u51fa\u76ee\u5f55&#xff0c;truthy \u9a97\u8fc7 if\u201d\u2014\u2014\u73af\u5883\u53d8\u91cf\u53c2\u4e0e\u8def\u5f84\u62fc\u63a5\u524d&#xff0c;\u5148\u5224\u7a7a\u3002<\/p>\n<hr \/>\n<h3>\u4e5d\u3001\u8de8\u5468\u901a\u7528\u539f\u5219&#xff08;\u6700\u91cd\u8981\u7684\u4e00\u9875&#xff09;<\/h3>\n<li>\u201c\u6d4b\u8bd5\u901a\u8fc7 \u2260 \u529f\u80fd\u6b63\u786e\u201d&#xff1a;\u8981\u4e48\u65ad\u8a00\u8fd4\u56de\u503c\u8bed\u4e49&#xff0c;\u8981\u4e48\u770b\u65e5\u5fd7\u8bc1\u636e\u94fe<\/li>\n<li>\u201c\u51d1\u5de7 \u2260 \u6b63\u786e\u201d&#xff1a;\u7ed3\u679c\u5bf9\u4e0d\u4ee3\u8868\u8def\u5f84\u5bf9&#xff0c;\u9519\u8bef\u88ab\u9759\u9ed8\u5403\u6389\u6700\u5371\u9669<\/li>\n<li>\u201c\u515c\u5e95\u5fc5\u987b\u7559\u75d5\u201d&#xff1a;except Exception \u91cc\u4e00\u5b9a\u8981 log.error(&#8230;, type(e).__name__)<\/li>\n<li>\u201c\u914d\u7f6e\u5916\u7f6e&#xff0c;\u884c\u4e3a\u53ef\u8ffd\u6eaf\u201d&#xff1a;.env \u7ba1\u5bc6\u94a5\u3001prompts.py \u7ba1\u63d0\u793a\u8bcd\u3001\u7248\u672c\u53f7\u8fdb\u65e5\u5fd7<\/li>\n<li>\u201c\u53e3\u5f84\u4e00\u81f4\u201d&#xff1a;system \/ Schema \/ \u5de5\u5177 description \u4e09\u5904\u5fc5\u987b\u540c\u4e00\u5957\u8bf4\u6cd5<\/li>\n<li>\u201c\u6d88\u606f\u5f62\u6001\u5fc5\u987b\u9632\u5fa1\u201d&#xff1a;\u4e00\u65e6\u6d88\u606f\u6765\u6e90\u4e0d\u662f\u81ea\u5df1\u62fc\u7684&#xff0c;\u5148\u8f6c dict \u518d\u5904\u7406<\/li>\n<li>\u201c\u53ef\u9760\u6027\u53d6\u77ed\u677f\u201d&#xff1a;Schema \u00d7 \u63d0\u793a\u8bcd \u00d7 \u6a21\u578b&#xff0c;\u77ed\u677f\u51b3\u5b9a\u6210\u8d25<\/li>\n<li>\u201c\u5931\u8d25\u8981\u80fd\u56de\u6eda\u201d&#xff1a;\u591a\u8f6e\u91cc\u8bf7\u6c42\u5931\u8d25\u5148 messages.pop()&#xff0c;\u5f02\u6b65\u91cc\u5f02\u5e38\u5355\u8f6e\u515c\u5e95\u4e0d\u6740\u4f1a\u8bdd<\/li>\n<li>\u201c\u5f02\u6b65\u53ea\u6709\u4e00\u4e2a\u95e8\u201d&#xff1a;asyncio.run() \u4e00\u6b21\u8fdb\u7a0b\u4e00\u6b21&#xff0c;\u8d44\u6e90\u5bff\u547d\u8ddf\u968f\u5faa\u73af<\/li>\n<li>\u201c\u547d\u540d\u8981\u5206\u901a\u9053\u201d&#xff1a;\u7ed9\u6a21\u578b\u7684&#xff08;\u5de5\u5177\/\u5305\u88c5\u7248&#xff09;\u548c\u7ed9\u4ee3\u7801\u7684&#xff08;_impl&#xff09;\u7528\u4e24\u4e2a\u540d\u5b57<\/li>\n<li>\u201c\u8bc4\u4f30\u5206\u5c42\u7528\u6700\u4fbf\u5b9c\u7684\u201d&#xff1a;\u80fd\u7528 L1 \u786e\u5b9a\u6027\u65ad\u8a00\u7edd\u4e0d\u4e0a L3 \u88c1\u5224&#xff1b;\u786c\u68c0\u67e5\u6293\u5f62\u6001\u3001\u88c1\u5224\u6293\u8bed\u4e49<\/li>\n<li>\u201c\u8bc4\u4f30\u7ed3\u8bba\u8981 diff \u5f52\u56e0\u201d&#xff1a;\u53ea\u62a5\u5206\u6570\u4e0d\u6307\u8ba4&#034;\u54ea\u6761\u7528\u4f8b\u4ec0\u4e48\u539f\u56e0&#034;\u7b49\u4e8e\u6ca1\u8bc4<\/li>\n<li>\u201c\u7279\u4f8b\u4e0d\u8fdb\u901a\u7528\u5c42\u201d&#xff1a;\u4e2a\u4f8b\u5199\u9ed1\u540d\u5355\u662f\u53cd\u6a21\u5f0f&#xff0c;\u8bed\u4e49\u95ee\u9898\u5f52\u88c1\u5224\u6807\u51c6<\/li>\n<li>\u201c\u6253\u70b9\u8bb0\u503c\u4e0d\u8bb0\u7c7b\u578b\u201d&#xff1a;RECORDER \u662f\u8bc1\u636e\u94fe\u8d77\u70b9&#xff0c;\u683c\u5f0f\u53d8\u66f4\u5fc5\u987b\u5168\u4e0b\u6e38\u540c\u6b65<\/li>\n<li>\u201c\u914d\u7f6e\u5fc5\u987b\u6709\u8c03\u7528\u70b9\u548c\u65ad\u8a00\u201d&#xff1a;\u6536\u4e86\u4e0d\u7528\u7684\u53c2\u6570\u6bd4\u62a5\u9519\u66f4\u5371\u9669<\/li>\n<li>\u201c\u5207\u5206\u6309\u8bed\u4e49\u964d\u7ea7\u201d&#xff1a;\u7ae0\u8282 \u2192 \u6bb5\u843d \u2192 \u53e5\u5b50 \u2192 \u786c\u5207&#xff0c;\u9010\u7ea7\u515c\u5e95&#xff0c;\u786c\u5207\u4e0d\u662f\u9ed8\u8ba4<\/li>\n<li>\u201c\u4e00\u6b21\u6027\u6210\u672c\u4e0d\u8ba1\u8f83\u201d&#xff1a;\u5207\u5206\/\u5efa\u5e93\u53ef\u4ee5\u6162&#xff0c;\u68c0\u7d22\u8def\u5f84&#xff08;\u6bcf\u8bf7\u6c42&#xff09;\u624d\u503c\u5f97\u4f18\u5316<\/li>\n<hr \/>\n<h3>\u9644&#xff1a;\u8e29\u5751\u65f6\u95f4\u7ebf&#xff08;\u6309\u51fa\u73b0\u987a\u5e8f&#xff0c;\u53ef\u5bf9\u7167\u590d\u4e60&#xff09;<\/h3>\n<table>\n<tr>\u5468\u5751<\/tr>\n<tbody>\n<tr>\n<td>W1<\/td>\n<td>basicConfig \u987a\u5e8f\u3001.env \u6cc4\u9732\u3001\u5f02\u5e38\u9759\u9ed8<\/td>\n<\/tr>\n<tr>\n<td>W2<\/td>\n<td>\u5047\u591a\u8f6e\u3001\u7f3a import sys \u5bfc\u81f4 fail-fast \u5931\u6548\u3001UnicodeDecodeError<\/td>\n<\/tr>\n<tr>\n<td>W2.5<\/td>\n<td>token \u4f4e\u4f30 44%\u3001\u88c1\u526a\u7834\u574f\u914d\u5bf9\u3001write_text \u975e\u539f\u5b50<\/td>\n<\/tr>\n<tr>\n<td>W3<\/td>\n<td>\u6821\u9a8c\u7ed3\u679c\u4e22\u5f03\u3001Optional \u9ed8\u8ba4\u503c\u3001error \u5b57\u6bb5\u77db\u76fe\u3001tool_calls \u4f4d\u7f6e\u3001set\/dict\u3001latitud \u62fc\u5199\u3001\/lsit \u8bef\u89e6\u53d1\u3001\u5386\u53f2\u6c61\u67d3\u3001geocoding \u540c\u540d<\/td>\n<\/tr>\n<tr>\n<td>W4<\/td>\n<td>\u5b64\u7acb f \u5b57\u7b26\u3001system \u5bf9\u8001\u4f1a\u8bdd\u4e0d\u751f\u6548\u3001\u63d0\u793a\u8bcd\u9519\u522b\u5b57\u3001\u65e5\u5fd7\u88ab\u6ce8\u91ca\u5bfc\u81f4 INFO \u9759\u9ed8<\/td>\n<\/tr>\n<tr>\n<td>W6<\/td>\n<td>requires-python \u8fc7\u4f4e\u3001\u88c5\u5305\u540d\u2260\u5bfc\u5165\u540d\u3001asyncio.run \u53cd\u590d\u8c03\u7528\u3001\u534f\u7a0b\u672a await\u3001model \u524d\u7f00\u89e3\u6790\u3001tracing \u672a\u5173\u3001\u62a4\u680f\u5f02\u5e38\u3001content \u975e\u5b57\u7b26\u4e32\u3001\u88c5\u9970\u5668\u6362\u540d\u81f4\u53cc\u901a\u9053\u584c\u9677\u3001Ctrl&#043;C \u5b58\u6863\u4e22\u5931\u3001role \u7f3a\u5931\u81f4\u4f1a\u8bdd\u88ab\u541e<\/td>\n<\/tr>\n<tr>\n<td>W7<\/td>\n<td>JUDGE_PROMPT JSON \u8bed\u6cd5\u9519\u3001model&#061;prompt_version \u4f20\u9519\u3001asdict \u4e0d\u5e26 property\u3001\u5bf9\u8c61\u6df7\u5165\u62a5\u544a\u975e JSON serializable\u3001RECORDER \u8bb0\u7c7b\u578b\u4e0d\u8bb0\u503c\u3001\u884c\u5c3e\u9017\u53f7\u6253\u5305 tuple\u3001\u62fc\u5199\u7b14\u8bef\u81f4\u68c0\u67e5\u6c38\u4e0d\u6267\u884c\u3001city \u786c\u68c0\u67e5\u7f3a\u5931&#xff08;\u4e2d\u6587\u57ce\u5e02 URL \u7f16\u7801\u547d\u4e2d\u540c\u540d\u4e61&#xff09;\u3001\u5b9e\u4f53\u66ff\u6362\u7c7b\u8bed\u4e49\u7f3a\u9677\u53ea\u80fd\u9760\u88c1\u5224<\/td>\n<\/tr>\n<tr>\n<td>W8<\/td>\n<td>\u672c\u5730\u6a21\u578b\u8def\u5f84\u76f8\u5bf9\u6027&#xff08;\u89e3\u6790\u968f\u542f\u52a8\u76ee\u5f55\u6f02\u79fb&#xff09;\u3001use_h3 \u53c2\u6570\u9759\u9ed8\u5ffd\u7565\u3001split_long \u8fd4\u56de str\/list \u6df7\u7528\u81f4\u9010\u5b57\u7b26\u7206\u70b8\u3001\u7d2f\u52a0\u5668\u5faa\u73af\u5185\u6e05\u96f6\u3001top \u6b8b\u7559\u53d8\u91cf\u3001###  \u6807\u9898 line[3:] \u5207\u9519\u3001embed_texts \u6f0f return\u3001\u7a7a\u4e32 join \u8def\u5f84\u6210\u771f\u503c\u3001max_chars \u662f\u622a\u65ad\u4e0d\u662f\u5207\u5206<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c&#xff08;Week 1 &#8211; Week 9 \u5b9e\u6218\u8bb0\u5f55&#xff09;\u5168\u90e8\u6765\u81ea\u5b9e\u9645\u4f5c\u4e1a\u5b9e\u6d4b&#xff0c;\u6bcf\u6761\u90fd\u5e26\u300c\u73b0\u8c61 \u2192 \u6839\u56e0 \u2192 \u4fee\u6cd5 \u2192 \u8bb0\u5fc6\u951a\u70b9\u300d\u3002<br \/>\n\u6309\u4e3b\u9898\u5206\u7c7b&#xff0c;\u4e0d\u6309\u65f6\u95f4\u6392\u5e8f&#xff1b;\u540c\u4e00\u5751\u5728\u4e0d\u540c\u5468\u53cd\u590d\u51fa\u73b0\u65f6\u5408\u5e76\u6210\u4e00\u6761\u3002\u4e00\u3001Python \u8bed\u8a00\u5c42&#xff1a;\u6700\u5bb9\u6613\\&#8221;\u9759\u9ed8\u51fa\u9519\\&#8221;\u7684\u5751<br \/>\n1.1 \u539f\u5730\u4fee\u6539\u65b9\u6cd5\u8fd4\u56de None<br \/>\nresult  await real_run(msgs.append({&#8230;}))   # \u274c app<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[12392,81,50,100],"topic":[],"class_list":["post-120284","post","type-post","status-publish","format-standard","hentry","category-server","tag-12392","tag-python","tag-50","tag-100"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/120284.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c&#xff08;Week 1 - Week 9 \u5b9e\u6218\u8bb0\u5f55&#xff09;\u5168\u90e8\u6765\u81ea\u5b9e\u9645\u4f5c\u4e1a\u5b9e\u6d4b&#xff0c;\u6bcf\u6761\u90fd\u5e26\u300c\u73b0\u8c61 \u2192 \u6839\u56e0 \u2192 \u4fee\u6cd5 \u2192 \u8bb0\u5fc6\u951a\u70b9\u300d\u3002 \u6309\u4e3b\u9898\u5206\u7c7b&#xff0c;\u4e0d\u6309\u65f6\u95f4\u6392\u5e8f&#xff1b;\u540c\u4e00\u5751\u5728\u4e0d\u540c\u5468\u53cd\u590d\u51fa\u73b0\u65f6\u5408\u5e76\u6210\u4e00\u6761\u3002\u4e00\u3001Python \u8bed\u8a00\u5c42&#xff1a;\u6700\u5bb9\u6613&quot;\u9759\u9ed8\u51fa\u9519&quot;\u7684\u5751 1.1 \u539f\u5730\u4fee\u6539\u65b9\u6cd5\u8fd4\u56de None result await real_run(msgs.append({...}))  # \u274c app\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/120284.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-31T02:18:14+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/120284.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/120284.html\",\"name\":\"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-31T02:18:14+00:00\",\"dateModified\":\"2026-10-31T02:18:14+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/120284.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/120284.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/120284.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/120284.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c&#xff08;Week 1 - Week 9 \u5b9e\u6218\u8bb0\u5f55&#xff09;\u5168\u90e8\u6765\u81ea\u5b9e\u9645\u4f5c\u4e1a\u5b9e\u6d4b&#xff0c;\u6bcf\u6761\u90fd\u5e26\u300c\u73b0\u8c61 \u2192 \u6839\u56e0 \u2192 \u4fee\u6cd5 \u2192 \u8bb0\u5fc6\u951a\u70b9\u300d\u3002 \u6309\u4e3b\u9898\u5206\u7c7b&#xff0c;\u4e0d\u6309\u65f6\u95f4\u6392\u5e8f&#xff1b;\u540c\u4e00\u5751\u5728\u4e0d\u540c\u5468\u53cd\u590d\u51fa\u73b0\u65f6\u5408\u5e76\u6210\u4e00\u6761\u3002\u4e00\u3001Python \u8bed\u8a00\u5c42&#xff1a;\u6700\u5bb9\u6613\"\u9759\u9ed8\u51fa\u9519\"\u7684\u5751 1.1 \u539f\u5730\u4fee\u6539\u65b9\u6cd5\u8fd4\u56de None result await real_run(msgs.append({...}))  # \u274c app","og_url":"https:\/\/www.wsisp.com\/helps\/120284.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-31T02:18:14+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"11 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/120284.html","url":"https:\/\/www.wsisp.com\/helps\/120284.html","name":"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-31T02:18:14+00:00","dateModified":"2026-10-31T02:18:14+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/120284.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/120284.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/120284.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010\u521d\u5b66\u8005Agent \u5f00\u53d1\u8e29\u5751\u624b\u518c\u3011"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/120284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=120284"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/120284\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=120284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=120284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=120284"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=120284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}