[{"data":1,"prerenderedAt":1583},["ShallowReactive",2],{"article-agent\u002F03-multi-tool-select":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":14,"_type":1577,"_id":1578,"_source":1579,"_file":1580,"_stem":1581,"_extension":1582},"\u002Farticles\u002Fagent\u002F03-multi-tool-select","agent",false,"","03-多工具选择：模型的工具选择与边界识别能力","在天气查询、货币换算、文本翻译三个工具并列场景下，测试模型的「选对」与「忍住」能力，尤其是含干扰项的边界问题。派生自练习1，深化对 description 黄金法则的理解。","2026-06-14",[12,13],"Agent开发","人工智能",{"type":15,"children":16,"toc":1574},"root",[17,25,1568],{"type":18,"tag":19,"props":20,"children":22},"element","h3",{"id":21},"直接看代码注释",[23],{"type":24,"value":21},"text",{"type":18,"tag":26,"props":27,"children":31},"pre",{"className":28,"code":29,"language":30,"meta":7,"style":7},"language-python shiki shiki-themes github-dark","\"\"\"练习 2：多工具选择 —— 测试模型在多个工具之间的“选择\u002F边界”能力\n\n练习 1 只有一个工具，模型只需判断“调 or 不调”。\n现实里 agent 手上往往有一排工具，难点变成：\n    · 选对：在多个工具里挑出最匹配的那个；\n    · 忍住：遇到压根不需要工具的问题，一个都别调（这就是“边界识别”）。\n\n而模型选得准不准，直接取决于每个工具的 description 写得清不清楚——\n所以本练习完全复用练习 6 的“黄金规则”：description 写【什么时候用】。\n\n这里放 3 个领域明显不同的工具：查天气 \u002F 货币换算 \u002F 文本翻译。\n\"\"\"\n\nimport json\nimport os\n\nfrom dotenv import load_dotenv\nfrom openai import OpenAI\n\nload_dotenv()\n\nclient = OpenAI(\n    api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n    base_url=os.environ[\"DEEPSEEK_BASE_URL\"],\n)\nMODEL = os.environ[\"MODEL\"]\n\n\n# ── 我们的“手”：3 个真实函数（演示用假数据\u002F简化实现） ──────────────────\ndef get_weather(city: str) -> dict:\n    fake = {\"北京\": (26, \"晴\"), \"上海\": (24, \"多云\"), \"广州\": (30, \"雷阵雨\")}\n    temp, desc = fake.get(city, (None, \"未知\"))\n    return {\"city\": city, \"temperature\": temp, \"weather\": desc}\n\n\ndef convert_currency(amount: float, from_currency: str, to_currency: str) -> dict:\n    # 演示用固定汇率（相对 USD）\n    rate = {\"USD\": 1.0, \"CNY\": 7.25, \"EUR\": 0.92, \"JPY\": 156.0}\n    usd = amount \u002F rate[from_currency]\n    result = round(usd * rate[to_currency], 2)\n    return {\"result\": result, \"to_currency\": to_currency}\n\n\ndef translate_text(text: str, target_language: str) -> dict:\n    # 真翻译交给模型，这里只回传参数，证明“工具被正确选中并传对了参数”\n    return {\"text\": text, \"target_language\": target_language, \"note\": \"已收到翻译请求\"}\n\n\n# 工具名 -> 真实函数 的调度表，模型选了谁就执行谁\nDISPATCH = {\n    \"get_weather\": get_weather,\n    \"convert_currency\": convert_currency,\n    \"translate_text\": translate_text,\n}\n\n\n# ── 3 份工具 schema：每个 description 都写清【什么时候用】 ────────────────\nTOOLS = [\n    {\n        \"type\": \"function\",\n        \"function\": {\n            \"name\": \"get_weather\",\n            \"description\": \"当用户询问某个城市当前的天气或气温时调用。\",\n            \"parameters\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"city\": {\"type\": \"string\", \"description\": \"城市名称，如 北京\"}\n                },\n                \"required\": [\"city\"],\n            },\n        },\n    },\n    {\n        \"type\": \"function\",\n        \"function\": {\n            \"name\": \"convert_currency\",\n            \"description\": \"当用户想把一笔具体金额从一种货币换算成另一种货币时调用。仅用于金额换算。\",\n            \"parameters\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"amount\": {\"type\": \"number\", \"description\": \"要换算的金额，纯数字\"},\n                    \"from_currency\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"USD\", \"CNY\", \"EUR\", \"JPY\"],\n                        \"description\": \"源货币代码\",\n                    },\n                    \"to_currency\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"USD\", \"CNY\", \"EUR\", \"JPY\"],\n                        \"description\": \"目标货币代码\",\n                    },\n                },\n                \"required\": [\"amount\", \"from_currency\", \"to_currency\"],\n            },\n        },\n    },\n    {\n        \"type\": \"function\",\n        \"function\": {\n            \"name\": \"translate_text\",\n            \"description\": \"当用户明确要求把一段文字翻译成另一种语言时调用。\",\n            \"parameters\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"text\": {\"type\": \"string\", \"description\": \"要翻译的原文\"},\n                    \"target_language\": {\n                        \"type\": \"string\",\n                        \"enum\": [\"EN\", \"ZH\", \"JA\", \"FR\"],\n                        \"description\": \"目标语言代码\",\n                    },\n                },\n                \"required\": [\"text\", \"target_language\"],\n            },\n        },\n    },\n]\n\n\ndef run(question: str) -> None:\n    \"\"\"跑一个问题：打印模型选了哪个工具、传了什么参数，再执行并给出最终回答。\"\"\"\n    print(\"=\" * 60)\n    print(f\"问题：{question}\")\n\n    messages = [{\"role\": \"user\", \"content\": question}]\n    first = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)\n    msg = first.choices[0].message\n\n    # 边界识别：模型判断不需要任何工具，直接回答\n    if not msg.tool_calls:\n        print(\"  🛑 未选用任何工具（判断为无需工具）\")\n        print(f\"  💬 直接回答：{msg.content}\")\n        return\n\n    # 选择能力：模型从 3 个里挑了哪个、传了什么\n    call = msg.tool_calls[0]\n    args = json.loads(call.function.arguments)\n    print(f\"  🔧 选中工具：{call.function.name}\")\n    print(f\"  📦 传入参数：{args}\")\n\n    # 我们执行被选中的工具\n    result = DISPATCH[call.function.name](**args)\n    print(f\"  ⚙️  执行结果：{result}\")\n\n    # 把结果发回模型，让它说人话\n    messages.append(msg)\n    messages.append(\n        {\n            \"role\": \"tool\",\n            \"tool_call_id\": call.id,\n            \"content\": json.dumps(result, ensure_ascii=False),\n        }\n    )\n    second = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)\n    print(f\"  💬 最终回答：{second.choices[0].message.content}\")\n\n\n# 五个问题，分别考查不同的选择\u002F边界场景\nQUESTIONS = [\n    \"上海现在多少度？\",          # → 应选 get_weather\n    \"把 200 欧元换成日元\",        # → 应选 convert_currency\n    \"把“今天天气真好”翻译成英文\",  # → 应选 translate_text（注意：含“天气”，干扰项！）\n    \"你觉得人生的意义是什么？\",    # → 边界：哪个都不该选\n]\n\n\nif __name__ == \"__main__\":\n    for q in QUESTIONS:\n        run(q)\n    print(\"=\" * 60)\n    print(\n        \"\\n观察重点：\\n\"\n        \"  · 第 3 题句子里有“天气”二字，但意图是翻译——好的 description 让模型\\n\"\n        \"    按【意图】选 translate_text，而不是被关键词“天气”骗去选 get_weather。\\n\"\n        \"  · 第 4 题是闲聊，模型应一个工具都不调（边界识别）。\\n\"\n        \"  · 选错工具\u002F选不出，先回去检查各工具 description 是否互相清晰、没有歧义。\"\n    )\n","python",[32],{"type":18,"tag":33,"props":34,"children":35},"code",{"__ignoreMap":7},[36,47,57,66,75,84,93,101,110,119,127,136,145,153,162,171,179,188,197,205,214,222,231,240,249,258,267,275,283,292,301,310,319,328,336,344,353,362,371,380,389,398,406,414,423,432,441,449,457,466,475,484,493,502,511,519,527,536,545,554,563,572,581,590,599,608,617,626,635,644,653,662,671,679,687,695,704,713,721,729,737,746,755,764,773,782,791,800,808,816,825,833,841,850,858,866,874,882,890,898,907,916,924,932,940,949,958,966,975,984,992,1000,1009,1017,1025,1033,1042,1050,1058,1067,1076,1085,1094,1102,1111,1120,1129,1137,1146,1155,1164,1173,1182,1190,1199,1208,1217,1226,1235,1243,1252,1261,1270,1278,1287,1296,1305,1314,1323,1332,1341,1350,1359,1368,1377,1385,1393,1402,1411,1420,1429,1438,1447,1455,1463,1471,1480,1489,1498,1506,1515,1524,1533,1542,1551,1560],{"type":18,"tag":37,"props":38,"children":41},"span",{"class":39,"line":40},"line",1,[42],{"type":18,"tag":37,"props":43,"children":44},{},[45],{"type":24,"value":46},"\"\"\"练习 2：多工具选择 —— 测试模型在多个工具之间的“选择\u002F边界”能力\n",{"type":18,"tag":37,"props":48,"children":50},{"class":39,"line":49},2,[51],{"type":18,"tag":37,"props":52,"children":54},{"emptyLinePlaceholder":53},true,[55],{"type":24,"value":56},"\n",{"type":18,"tag":37,"props":58,"children":60},{"class":39,"line":59},3,[61],{"type":18,"tag":37,"props":62,"children":63},{},[64],{"type":24,"value":65},"练习 1 只有一个工具，模型只需判断“调 or 不调”。\n",{"type":18,"tag":37,"props":67,"children":69},{"class":39,"line":68},4,[70],{"type":18,"tag":37,"props":71,"children":72},{},[73],{"type":24,"value":74},"现实里 agent 手上往往有一排工具，难点变成：\n",{"type":18,"tag":37,"props":76,"children":78},{"class":39,"line":77},5,[79],{"type":18,"tag":37,"props":80,"children":81},{},[82],{"type":24,"value":83},"    · 选对：在多个工具里挑出最匹配的那个；\n",{"type":18,"tag":37,"props":85,"children":87},{"class":39,"line":86},6,[88],{"type":18,"tag":37,"props":89,"children":90},{},[91],{"type":24,"value":92},"    · 忍住：遇到压根不需要工具的问题，一个都别调（这就是“边界识别”）。\n",{"type":18,"tag":37,"props":94,"children":96},{"class":39,"line":95},7,[97],{"type":18,"tag":37,"props":98,"children":99},{"emptyLinePlaceholder":53},[100],{"type":24,"value":56},{"type":18,"tag":37,"props":102,"children":104},{"class":39,"line":103},8,[105],{"type":18,"tag":37,"props":106,"children":107},{},[108],{"type":24,"value":109},"而模型选得准不准，直接取决于每个工具的 description 写得清不清楚——\n",{"type":18,"tag":37,"props":111,"children":113},{"class":39,"line":112},9,[114],{"type":18,"tag":37,"props":115,"children":116},{},[117],{"type":24,"value":118},"所以本练习完全复用练习 6 的“黄金规则”：description 写【什么时候用】。\n",{"type":18,"tag":37,"props":120,"children":122},{"class":39,"line":121},10,[123],{"type":18,"tag":37,"props":124,"children":125},{"emptyLinePlaceholder":53},[126],{"type":24,"value":56},{"type":18,"tag":37,"props":128,"children":130},{"class":39,"line":129},11,[131],{"type":18,"tag":37,"props":132,"children":133},{},[134],{"type":24,"value":135},"这里放 3 个领域明显不同的工具：查天气 \u002F 货币换算 \u002F 文本翻译。\n",{"type":18,"tag":37,"props":137,"children":139},{"class":39,"line":138},12,[140],{"type":18,"tag":37,"props":141,"children":142},{},[143],{"type":24,"value":144},"\"\"\"\n",{"type":18,"tag":37,"props":146,"children":148},{"class":39,"line":147},13,[149],{"type":18,"tag":37,"props":150,"children":151},{"emptyLinePlaceholder":53},[152],{"type":24,"value":56},{"type":18,"tag":37,"props":154,"children":156},{"class":39,"line":155},14,[157],{"type":18,"tag":37,"props":158,"children":159},{},[160],{"type":24,"value":161},"import json\n",{"type":18,"tag":37,"props":163,"children":165},{"class":39,"line":164},15,[166],{"type":18,"tag":37,"props":167,"children":168},{},[169],{"type":24,"value":170},"import os\n",{"type":18,"tag":37,"props":172,"children":174},{"class":39,"line":173},16,[175],{"type":18,"tag":37,"props":176,"children":177},{"emptyLinePlaceholder":53},[178],{"type":24,"value":56},{"type":18,"tag":37,"props":180,"children":182},{"class":39,"line":181},17,[183],{"type":18,"tag":37,"props":184,"children":185},{},[186],{"type":24,"value":187},"from dotenv import load_dotenv\n",{"type":18,"tag":37,"props":189,"children":191},{"class":39,"line":190},18,[192],{"type":18,"tag":37,"props":193,"children":194},{},[195],{"type":24,"value":196},"from openai import OpenAI\n",{"type":18,"tag":37,"props":198,"children":200},{"class":39,"line":199},19,[201],{"type":18,"tag":37,"props":202,"children":203},{"emptyLinePlaceholder":53},[204],{"type":24,"value":56},{"type":18,"tag":37,"props":206,"children":208},{"class":39,"line":207},20,[209],{"type":18,"tag":37,"props":210,"children":211},{},[212],{"type":24,"value":213},"load_dotenv()\n",{"type":18,"tag":37,"props":215,"children":217},{"class":39,"line":216},21,[218],{"type":18,"tag":37,"props":219,"children":220},{"emptyLinePlaceholder":53},[221],{"type":24,"value":56},{"type":18,"tag":37,"props":223,"children":225},{"class":39,"line":224},22,[226],{"type":18,"tag":37,"props":227,"children":228},{},[229],{"type":24,"value":230},"client = OpenAI(\n",{"type":18,"tag":37,"props":232,"children":234},{"class":39,"line":233},23,[235],{"type":18,"tag":37,"props":236,"children":237},{},[238],{"type":24,"value":239},"    api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n",{"type":18,"tag":37,"props":241,"children":243},{"class":39,"line":242},24,[244],{"type":18,"tag":37,"props":245,"children":246},{},[247],{"type":24,"value":248},"    base_url=os.environ[\"DEEPSEEK_BASE_URL\"],\n",{"type":18,"tag":37,"props":250,"children":252},{"class":39,"line":251},25,[253],{"type":18,"tag":37,"props":254,"children":255},{},[256],{"type":24,"value":257},")\n",{"type":18,"tag":37,"props":259,"children":261},{"class":39,"line":260},26,[262],{"type":18,"tag":37,"props":263,"children":264},{},[265],{"type":24,"value":266},"MODEL = os.environ[\"MODEL\"]\n",{"type":18,"tag":37,"props":268,"children":270},{"class":39,"line":269},27,[271],{"type":18,"tag":37,"props":272,"children":273},{"emptyLinePlaceholder":53},[274],{"type":24,"value":56},{"type":18,"tag":37,"props":276,"children":278},{"class":39,"line":277},28,[279],{"type":18,"tag":37,"props":280,"children":281},{"emptyLinePlaceholder":53},[282],{"type":24,"value":56},{"type":18,"tag":37,"props":284,"children":286},{"class":39,"line":285},29,[287],{"type":18,"tag":37,"props":288,"children":289},{},[290],{"type":24,"value":291},"# ── 我们的“手”：3 个真实函数（演示用假数据\u002F简化实现） ──────────────────\n",{"type":18,"tag":37,"props":293,"children":295},{"class":39,"line":294},30,[296],{"type":18,"tag":37,"props":297,"children":298},{},[299],{"type":24,"value":300},"def get_weather(city: str) -> dict:\n",{"type":18,"tag":37,"props":302,"children":304},{"class":39,"line":303},31,[305],{"type":18,"tag":37,"props":306,"children":307},{},[308],{"type":24,"value":309},"    fake = {\"北京\": (26, \"晴\"), \"上海\": (24, \"多云\"), \"广州\": (30, \"雷阵雨\")}\n",{"type":18,"tag":37,"props":311,"children":313},{"class":39,"line":312},32,[314],{"type":18,"tag":37,"props":315,"children":316},{},[317],{"type":24,"value":318},"    temp, desc = fake.get(city, (None, \"未知\"))\n",{"type":18,"tag":37,"props":320,"children":322},{"class":39,"line":321},33,[323],{"type":18,"tag":37,"props":324,"children":325},{},[326],{"type":24,"value":327},"    return {\"city\": city, \"temperature\": temp, \"weather\": desc}\n",{"type":18,"tag":37,"props":329,"children":331},{"class":39,"line":330},34,[332],{"type":18,"tag":37,"props":333,"children":334},{"emptyLinePlaceholder":53},[335],{"type":24,"value":56},{"type":18,"tag":37,"props":337,"children":339},{"class":39,"line":338},35,[340],{"type":18,"tag":37,"props":341,"children":342},{"emptyLinePlaceholder":53},[343],{"type":24,"value":56},{"type":18,"tag":37,"props":345,"children":347},{"class":39,"line":346},36,[348],{"type":18,"tag":37,"props":349,"children":350},{},[351],{"type":24,"value":352},"def convert_currency(amount: float, from_currency: str, to_currency: str) -> dict:\n",{"type":18,"tag":37,"props":354,"children":356},{"class":39,"line":355},37,[357],{"type":18,"tag":37,"props":358,"children":359},{},[360],{"type":24,"value":361},"    # 演示用固定汇率（相对 USD）\n",{"type":18,"tag":37,"props":363,"children":365},{"class":39,"line":364},38,[366],{"type":18,"tag":37,"props":367,"children":368},{},[369],{"type":24,"value":370},"    rate = {\"USD\": 1.0, \"CNY\": 7.25, \"EUR\": 0.92, \"JPY\": 156.0}\n",{"type":18,"tag":37,"props":372,"children":374},{"class":39,"line":373},39,[375],{"type":18,"tag":37,"props":376,"children":377},{},[378],{"type":24,"value":379},"    usd = amount \u002F rate[from_currency]\n",{"type":18,"tag":37,"props":381,"children":383},{"class":39,"line":382},40,[384],{"type":18,"tag":37,"props":385,"children":386},{},[387],{"type":24,"value":388},"    result = round(usd * rate[to_currency], 2)\n",{"type":18,"tag":37,"props":390,"children":392},{"class":39,"line":391},41,[393],{"type":18,"tag":37,"props":394,"children":395},{},[396],{"type":24,"value":397},"    return {\"result\": result, \"to_currency\": to_currency}\n",{"type":18,"tag":37,"props":399,"children":401},{"class":39,"line":400},42,[402],{"type":18,"tag":37,"props":403,"children":404},{"emptyLinePlaceholder":53},[405],{"type":24,"value":56},{"type":18,"tag":37,"props":407,"children":409},{"class":39,"line":408},43,[410],{"type":18,"tag":37,"props":411,"children":412},{"emptyLinePlaceholder":53},[413],{"type":24,"value":56},{"type":18,"tag":37,"props":415,"children":417},{"class":39,"line":416},44,[418],{"type":18,"tag":37,"props":419,"children":420},{},[421],{"type":24,"value":422},"def translate_text(text: str, target_language: str) -> dict:\n",{"type":18,"tag":37,"props":424,"children":426},{"class":39,"line":425},45,[427],{"type":18,"tag":37,"props":428,"children":429},{},[430],{"type":24,"value":431},"    # 真翻译交给模型，这里只回传参数，证明“工具被正确选中并传对了参数”\n",{"type":18,"tag":37,"props":433,"children":435},{"class":39,"line":434},46,[436],{"type":18,"tag":37,"props":437,"children":438},{},[439],{"type":24,"value":440},"    return {\"text\": text, \"target_language\": target_language, \"note\": \"已收到翻译请求\"}\n",{"type":18,"tag":37,"props":442,"children":444},{"class":39,"line":443},47,[445],{"type":18,"tag":37,"props":446,"children":447},{"emptyLinePlaceholder":53},[448],{"type":24,"value":56},{"type":18,"tag":37,"props":450,"children":452},{"class":39,"line":451},48,[453],{"type":18,"tag":37,"props":454,"children":455},{"emptyLinePlaceholder":53},[456],{"type":24,"value":56},{"type":18,"tag":37,"props":458,"children":460},{"class":39,"line":459},49,[461],{"type":18,"tag":37,"props":462,"children":463},{},[464],{"type":24,"value":465},"# 工具名 -> 真实函数 的调度表，模型选了谁就执行谁\n",{"type":18,"tag":37,"props":467,"children":469},{"class":39,"line":468},50,[470],{"type":18,"tag":37,"props":471,"children":472},{},[473],{"type":24,"value":474},"DISPATCH = {\n",{"type":18,"tag":37,"props":476,"children":478},{"class":39,"line":477},51,[479],{"type":18,"tag":37,"props":480,"children":481},{},[482],{"type":24,"value":483},"    \"get_weather\": get_weather,\n",{"type":18,"tag":37,"props":485,"children":487},{"class":39,"line":486},52,[488],{"type":18,"tag":37,"props":489,"children":490},{},[491],{"type":24,"value":492},"    \"convert_currency\": convert_currency,\n",{"type":18,"tag":37,"props":494,"children":496},{"class":39,"line":495},53,[497],{"type":18,"tag":37,"props":498,"children":499},{},[500],{"type":24,"value":501},"    \"translate_text\": translate_text,\n",{"type":18,"tag":37,"props":503,"children":505},{"class":39,"line":504},54,[506],{"type":18,"tag":37,"props":507,"children":508},{},[509],{"type":24,"value":510},"}\n",{"type":18,"tag":37,"props":512,"children":514},{"class":39,"line":513},55,[515],{"type":18,"tag":37,"props":516,"children":517},{"emptyLinePlaceholder":53},[518],{"type":24,"value":56},{"type":18,"tag":37,"props":520,"children":522},{"class":39,"line":521},56,[523],{"type":18,"tag":37,"props":524,"children":525},{"emptyLinePlaceholder":53},[526],{"type":24,"value":56},{"type":18,"tag":37,"props":528,"children":530},{"class":39,"line":529},57,[531],{"type":18,"tag":37,"props":532,"children":533},{},[534],{"type":24,"value":535},"# ── 3 份工具 schema：每个 description 都写清【什么时候用】 ────────────────\n",{"type":18,"tag":37,"props":537,"children":539},{"class":39,"line":538},58,[540],{"type":18,"tag":37,"props":541,"children":542},{},[543],{"type":24,"value":544},"TOOLS = [\n",{"type":18,"tag":37,"props":546,"children":548},{"class":39,"line":547},59,[549],{"type":18,"tag":37,"props":550,"children":551},{},[552],{"type":24,"value":553},"    {\n",{"type":18,"tag":37,"props":555,"children":557},{"class":39,"line":556},60,[558],{"type":18,"tag":37,"props":559,"children":560},{},[561],{"type":24,"value":562},"        \"type\": \"function\",\n",{"type":18,"tag":37,"props":564,"children":566},{"class":39,"line":565},61,[567],{"type":18,"tag":37,"props":568,"children":569},{},[570],{"type":24,"value":571},"        \"function\": {\n",{"type":18,"tag":37,"props":573,"children":575},{"class":39,"line":574},62,[576],{"type":18,"tag":37,"props":577,"children":578},{},[579],{"type":24,"value":580},"            \"name\": \"get_weather\",\n",{"type":18,"tag":37,"props":582,"children":584},{"class":39,"line":583},63,[585],{"type":18,"tag":37,"props":586,"children":587},{},[588],{"type":24,"value":589},"            \"description\": \"当用户询问某个城市当前的天气或气温时调用。\",\n",{"type":18,"tag":37,"props":591,"children":593},{"class":39,"line":592},64,[594],{"type":18,"tag":37,"props":595,"children":596},{},[597],{"type":24,"value":598},"            \"parameters\": {\n",{"type":18,"tag":37,"props":600,"children":602},{"class":39,"line":601},65,[603],{"type":18,"tag":37,"props":604,"children":605},{},[606],{"type":24,"value":607},"                \"type\": \"object\",\n",{"type":18,"tag":37,"props":609,"children":611},{"class":39,"line":610},66,[612],{"type":18,"tag":37,"props":613,"children":614},{},[615],{"type":24,"value":616},"                \"properties\": {\n",{"type":18,"tag":37,"props":618,"children":620},{"class":39,"line":619},67,[621],{"type":18,"tag":37,"props":622,"children":623},{},[624],{"type":24,"value":625},"                    \"city\": {\"type\": \"string\", \"description\": \"城市名称，如 北京\"}\n",{"type":18,"tag":37,"props":627,"children":629},{"class":39,"line":628},68,[630],{"type":18,"tag":37,"props":631,"children":632},{},[633],{"type":24,"value":634},"                },\n",{"type":18,"tag":37,"props":636,"children":638},{"class":39,"line":637},69,[639],{"type":18,"tag":37,"props":640,"children":641},{},[642],{"type":24,"value":643},"                \"required\": [\"city\"],\n",{"type":18,"tag":37,"props":645,"children":647},{"class":39,"line":646},70,[648],{"type":18,"tag":37,"props":649,"children":650},{},[651],{"type":24,"value":652},"            },\n",{"type":18,"tag":37,"props":654,"children":656},{"class":39,"line":655},71,[657],{"type":18,"tag":37,"props":658,"children":659},{},[660],{"type":24,"value":661},"        },\n",{"type":18,"tag":37,"props":663,"children":665},{"class":39,"line":664},72,[666],{"type":18,"tag":37,"props":667,"children":668},{},[669],{"type":24,"value":670},"    },\n",{"type":18,"tag":37,"props":672,"children":674},{"class":39,"line":673},73,[675],{"type":18,"tag":37,"props":676,"children":677},{},[678],{"type":24,"value":553},{"type":18,"tag":37,"props":680,"children":682},{"class":39,"line":681},74,[683],{"type":18,"tag":37,"props":684,"children":685},{},[686],{"type":24,"value":562},{"type":18,"tag":37,"props":688,"children":690},{"class":39,"line":689},75,[691],{"type":18,"tag":37,"props":692,"children":693},{},[694],{"type":24,"value":571},{"type":18,"tag":37,"props":696,"children":698},{"class":39,"line":697},76,[699],{"type":18,"tag":37,"props":700,"children":701},{},[702],{"type":24,"value":703},"            \"name\": \"convert_currency\",\n",{"type":18,"tag":37,"props":705,"children":707},{"class":39,"line":706},77,[708],{"type":18,"tag":37,"props":709,"children":710},{},[711],{"type":24,"value":712},"            \"description\": \"当用户想把一笔具体金额从一种货币换算成另一种货币时调用。仅用于金额换算。\",\n",{"type":18,"tag":37,"props":714,"children":716},{"class":39,"line":715},78,[717],{"type":18,"tag":37,"props":718,"children":719},{},[720],{"type":24,"value":598},{"type":18,"tag":37,"props":722,"children":724},{"class":39,"line":723},79,[725],{"type":18,"tag":37,"props":726,"children":727},{},[728],{"type":24,"value":607},{"type":18,"tag":37,"props":730,"children":732},{"class":39,"line":731},80,[733],{"type":18,"tag":37,"props":734,"children":735},{},[736],{"type":24,"value":616},{"type":18,"tag":37,"props":738,"children":740},{"class":39,"line":739},81,[741],{"type":18,"tag":37,"props":742,"children":743},{},[744],{"type":24,"value":745},"                    \"amount\": {\"type\": \"number\", \"description\": \"要换算的金额，纯数字\"},\n",{"type":18,"tag":37,"props":747,"children":749},{"class":39,"line":748},82,[750],{"type":18,"tag":37,"props":751,"children":752},{},[753],{"type":24,"value":754},"                    \"from_currency\": {\n",{"type":18,"tag":37,"props":756,"children":758},{"class":39,"line":757},83,[759],{"type":18,"tag":37,"props":760,"children":761},{},[762],{"type":24,"value":763},"                        \"type\": \"string\",\n",{"type":18,"tag":37,"props":765,"children":767},{"class":39,"line":766},84,[768],{"type":18,"tag":37,"props":769,"children":770},{},[771],{"type":24,"value":772},"                        \"enum\": [\"USD\", \"CNY\", \"EUR\", \"JPY\"],\n",{"type":18,"tag":37,"props":774,"children":776},{"class":39,"line":775},85,[777],{"type":18,"tag":37,"props":778,"children":779},{},[780],{"type":24,"value":781},"                        \"description\": \"源货币代码\",\n",{"type":18,"tag":37,"props":783,"children":785},{"class":39,"line":784},86,[786],{"type":18,"tag":37,"props":787,"children":788},{},[789],{"type":24,"value":790},"                    },\n",{"type":18,"tag":37,"props":792,"children":794},{"class":39,"line":793},87,[795],{"type":18,"tag":37,"props":796,"children":797},{},[798],{"type":24,"value":799},"                    \"to_currency\": {\n",{"type":18,"tag":37,"props":801,"children":803},{"class":39,"line":802},88,[804],{"type":18,"tag":37,"props":805,"children":806},{},[807],{"type":24,"value":763},{"type":18,"tag":37,"props":809,"children":811},{"class":39,"line":810},89,[812],{"type":18,"tag":37,"props":813,"children":814},{},[815],{"type":24,"value":772},{"type":18,"tag":37,"props":817,"children":819},{"class":39,"line":818},90,[820],{"type":18,"tag":37,"props":821,"children":822},{},[823],{"type":24,"value":824},"                        \"description\": \"目标货币代码\",\n",{"type":18,"tag":37,"props":826,"children":828},{"class":39,"line":827},91,[829],{"type":18,"tag":37,"props":830,"children":831},{},[832],{"type":24,"value":790},{"type":18,"tag":37,"props":834,"children":836},{"class":39,"line":835},92,[837],{"type":18,"tag":37,"props":838,"children":839},{},[840],{"type":24,"value":634},{"type":18,"tag":37,"props":842,"children":844},{"class":39,"line":843},93,[845],{"type":18,"tag":37,"props":846,"children":847},{},[848],{"type":24,"value":849},"                \"required\": [\"amount\", \"from_currency\", \"to_currency\"],\n",{"type":18,"tag":37,"props":851,"children":853},{"class":39,"line":852},94,[854],{"type":18,"tag":37,"props":855,"children":856},{},[857],{"type":24,"value":652},{"type":18,"tag":37,"props":859,"children":861},{"class":39,"line":860},95,[862],{"type":18,"tag":37,"props":863,"children":864},{},[865],{"type":24,"value":661},{"type":18,"tag":37,"props":867,"children":869},{"class":39,"line":868},96,[870],{"type":18,"tag":37,"props":871,"children":872},{},[873],{"type":24,"value":670},{"type":18,"tag":37,"props":875,"children":877},{"class":39,"line":876},97,[878],{"type":18,"tag":37,"props":879,"children":880},{},[881],{"type":24,"value":553},{"type":18,"tag":37,"props":883,"children":885},{"class":39,"line":884},98,[886],{"type":18,"tag":37,"props":887,"children":888},{},[889],{"type":24,"value":562},{"type":18,"tag":37,"props":891,"children":893},{"class":39,"line":892},99,[894],{"type":18,"tag":37,"props":895,"children":896},{},[897],{"type":24,"value":571},{"type":18,"tag":37,"props":899,"children":901},{"class":39,"line":900},100,[902],{"type":18,"tag":37,"props":903,"children":904},{},[905],{"type":24,"value":906},"            \"name\": \"translate_text\",\n",{"type":18,"tag":37,"props":908,"children":910},{"class":39,"line":909},101,[911],{"type":18,"tag":37,"props":912,"children":913},{},[914],{"type":24,"value":915},"            \"description\": \"当用户明确要求把一段文字翻译成另一种语言时调用。\",\n",{"type":18,"tag":37,"props":917,"children":919},{"class":39,"line":918},102,[920],{"type":18,"tag":37,"props":921,"children":922},{},[923],{"type":24,"value":598},{"type":18,"tag":37,"props":925,"children":927},{"class":39,"line":926},103,[928],{"type":18,"tag":37,"props":929,"children":930},{},[931],{"type":24,"value":607},{"type":18,"tag":37,"props":933,"children":935},{"class":39,"line":934},104,[936],{"type":18,"tag":37,"props":937,"children":938},{},[939],{"type":24,"value":616},{"type":18,"tag":37,"props":941,"children":943},{"class":39,"line":942},105,[944],{"type":18,"tag":37,"props":945,"children":946},{},[947],{"type":24,"value":948},"                    \"text\": {\"type\": \"string\", \"description\": \"要翻译的原文\"},\n",{"type":18,"tag":37,"props":950,"children":952},{"class":39,"line":951},106,[953],{"type":18,"tag":37,"props":954,"children":955},{},[956],{"type":24,"value":957},"                    \"target_language\": {\n",{"type":18,"tag":37,"props":959,"children":961},{"class":39,"line":960},107,[962],{"type":18,"tag":37,"props":963,"children":964},{},[965],{"type":24,"value":763},{"type":18,"tag":37,"props":967,"children":969},{"class":39,"line":968},108,[970],{"type":18,"tag":37,"props":971,"children":972},{},[973],{"type":24,"value":974},"                        \"enum\": [\"EN\", \"ZH\", \"JA\", \"FR\"],\n",{"type":18,"tag":37,"props":976,"children":978},{"class":39,"line":977},109,[979],{"type":18,"tag":37,"props":980,"children":981},{},[982],{"type":24,"value":983},"                        \"description\": \"目标语言代码\",\n",{"type":18,"tag":37,"props":985,"children":987},{"class":39,"line":986},110,[988],{"type":18,"tag":37,"props":989,"children":990},{},[991],{"type":24,"value":790},{"type":18,"tag":37,"props":993,"children":995},{"class":39,"line":994},111,[996],{"type":18,"tag":37,"props":997,"children":998},{},[999],{"type":24,"value":634},{"type":18,"tag":37,"props":1001,"children":1003},{"class":39,"line":1002},112,[1004],{"type":18,"tag":37,"props":1005,"children":1006},{},[1007],{"type":24,"value":1008},"                \"required\": [\"text\", \"target_language\"],\n",{"type":18,"tag":37,"props":1010,"children":1012},{"class":39,"line":1011},113,[1013],{"type":18,"tag":37,"props":1014,"children":1015},{},[1016],{"type":24,"value":652},{"type":18,"tag":37,"props":1018,"children":1020},{"class":39,"line":1019},114,[1021],{"type":18,"tag":37,"props":1022,"children":1023},{},[1024],{"type":24,"value":661},{"type":18,"tag":37,"props":1026,"children":1028},{"class":39,"line":1027},115,[1029],{"type":18,"tag":37,"props":1030,"children":1031},{},[1032],{"type":24,"value":670},{"type":18,"tag":37,"props":1034,"children":1036},{"class":39,"line":1035},116,[1037],{"type":18,"tag":37,"props":1038,"children":1039},{},[1040],{"type":24,"value":1041},"]\n",{"type":18,"tag":37,"props":1043,"children":1045},{"class":39,"line":1044},117,[1046],{"type":18,"tag":37,"props":1047,"children":1048},{"emptyLinePlaceholder":53},[1049],{"type":24,"value":56},{"type":18,"tag":37,"props":1051,"children":1053},{"class":39,"line":1052},118,[1054],{"type":18,"tag":37,"props":1055,"children":1056},{"emptyLinePlaceholder":53},[1057],{"type":24,"value":56},{"type":18,"tag":37,"props":1059,"children":1061},{"class":39,"line":1060},119,[1062],{"type":18,"tag":37,"props":1063,"children":1064},{},[1065],{"type":24,"value":1066},"def run(question: str) -> None:\n",{"type":18,"tag":37,"props":1068,"children":1070},{"class":39,"line":1069},120,[1071],{"type":18,"tag":37,"props":1072,"children":1073},{},[1074],{"type":24,"value":1075},"    \"\"\"跑一个问题：打印模型选了哪个工具、传了什么参数，再执行并给出最终回答。\"\"\"\n",{"type":18,"tag":37,"props":1077,"children":1079},{"class":39,"line":1078},121,[1080],{"type":18,"tag":37,"props":1081,"children":1082},{},[1083],{"type":24,"value":1084},"    print(\"=\" * 60)\n",{"type":18,"tag":37,"props":1086,"children":1088},{"class":39,"line":1087},122,[1089],{"type":18,"tag":37,"props":1090,"children":1091},{},[1092],{"type":24,"value":1093},"    print(f\"问题：{question}\")\n",{"type":18,"tag":37,"props":1095,"children":1097},{"class":39,"line":1096},123,[1098],{"type":18,"tag":37,"props":1099,"children":1100},{"emptyLinePlaceholder":53},[1101],{"type":24,"value":56},{"type":18,"tag":37,"props":1103,"children":1105},{"class":39,"line":1104},124,[1106],{"type":18,"tag":37,"props":1107,"children":1108},{},[1109],{"type":24,"value":1110},"    messages = [{\"role\": \"user\", \"content\": question}]\n",{"type":18,"tag":37,"props":1112,"children":1114},{"class":39,"line":1113},125,[1115],{"type":18,"tag":37,"props":1116,"children":1117},{},[1118],{"type":24,"value":1119},"    first = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)\n",{"type":18,"tag":37,"props":1121,"children":1123},{"class":39,"line":1122},126,[1124],{"type":18,"tag":37,"props":1125,"children":1126},{},[1127],{"type":24,"value":1128},"    msg = first.choices[0].message\n",{"type":18,"tag":37,"props":1130,"children":1132},{"class":39,"line":1131},127,[1133],{"type":18,"tag":37,"props":1134,"children":1135},{"emptyLinePlaceholder":53},[1136],{"type":24,"value":56},{"type":18,"tag":37,"props":1138,"children":1140},{"class":39,"line":1139},128,[1141],{"type":18,"tag":37,"props":1142,"children":1143},{},[1144],{"type":24,"value":1145},"    # 边界识别：模型判断不需要任何工具，直接回答\n",{"type":18,"tag":37,"props":1147,"children":1149},{"class":39,"line":1148},129,[1150],{"type":18,"tag":37,"props":1151,"children":1152},{},[1153],{"type":24,"value":1154},"    if not msg.tool_calls:\n",{"type":18,"tag":37,"props":1156,"children":1158},{"class":39,"line":1157},130,[1159],{"type":18,"tag":37,"props":1160,"children":1161},{},[1162],{"type":24,"value":1163},"        print(\"  🛑 未选用任何工具（判断为无需工具）\")\n",{"type":18,"tag":37,"props":1165,"children":1167},{"class":39,"line":1166},131,[1168],{"type":18,"tag":37,"props":1169,"children":1170},{},[1171],{"type":24,"value":1172},"        print(f\"  💬 直接回答：{msg.content}\")\n",{"type":18,"tag":37,"props":1174,"children":1176},{"class":39,"line":1175},132,[1177],{"type":18,"tag":37,"props":1178,"children":1179},{},[1180],{"type":24,"value":1181},"        return\n",{"type":18,"tag":37,"props":1183,"children":1185},{"class":39,"line":1184},133,[1186],{"type":18,"tag":37,"props":1187,"children":1188},{"emptyLinePlaceholder":53},[1189],{"type":24,"value":56},{"type":18,"tag":37,"props":1191,"children":1193},{"class":39,"line":1192},134,[1194],{"type":18,"tag":37,"props":1195,"children":1196},{},[1197],{"type":24,"value":1198},"    # 选择能力：模型从 3 个里挑了哪个、传了什么\n",{"type":18,"tag":37,"props":1200,"children":1202},{"class":39,"line":1201},135,[1203],{"type":18,"tag":37,"props":1204,"children":1205},{},[1206],{"type":24,"value":1207},"    call = msg.tool_calls[0]\n",{"type":18,"tag":37,"props":1209,"children":1211},{"class":39,"line":1210},136,[1212],{"type":18,"tag":37,"props":1213,"children":1214},{},[1215],{"type":24,"value":1216},"    args = json.loads(call.function.arguments)\n",{"type":18,"tag":37,"props":1218,"children":1220},{"class":39,"line":1219},137,[1221],{"type":18,"tag":37,"props":1222,"children":1223},{},[1224],{"type":24,"value":1225},"    print(f\"  🔧 选中工具：{call.function.name}\")\n",{"type":18,"tag":37,"props":1227,"children":1229},{"class":39,"line":1228},138,[1230],{"type":18,"tag":37,"props":1231,"children":1232},{},[1233],{"type":24,"value":1234},"    print(f\"  📦 传入参数：{args}\")\n",{"type":18,"tag":37,"props":1236,"children":1238},{"class":39,"line":1237},139,[1239],{"type":18,"tag":37,"props":1240,"children":1241},{"emptyLinePlaceholder":53},[1242],{"type":24,"value":56},{"type":18,"tag":37,"props":1244,"children":1246},{"class":39,"line":1245},140,[1247],{"type":18,"tag":37,"props":1248,"children":1249},{},[1250],{"type":24,"value":1251},"    # 我们执行被选中的工具\n",{"type":18,"tag":37,"props":1253,"children":1255},{"class":39,"line":1254},141,[1256],{"type":18,"tag":37,"props":1257,"children":1258},{},[1259],{"type":24,"value":1260},"    result = DISPATCH[call.function.name](**args)\n",{"type":18,"tag":37,"props":1262,"children":1264},{"class":39,"line":1263},142,[1265],{"type":18,"tag":37,"props":1266,"children":1267},{},[1268],{"type":24,"value":1269},"    print(f\"  ⚙️  执行结果：{result}\")\n",{"type":18,"tag":37,"props":1271,"children":1273},{"class":39,"line":1272},143,[1274],{"type":18,"tag":37,"props":1275,"children":1276},{"emptyLinePlaceholder":53},[1277],{"type":24,"value":56},{"type":18,"tag":37,"props":1279,"children":1281},{"class":39,"line":1280},144,[1282],{"type":18,"tag":37,"props":1283,"children":1284},{},[1285],{"type":24,"value":1286},"    # 把结果发回模型，让它说人话\n",{"type":18,"tag":37,"props":1288,"children":1290},{"class":39,"line":1289},145,[1291],{"type":18,"tag":37,"props":1292,"children":1293},{},[1294],{"type":24,"value":1295},"    messages.append(msg)\n",{"type":18,"tag":37,"props":1297,"children":1299},{"class":39,"line":1298},146,[1300],{"type":18,"tag":37,"props":1301,"children":1302},{},[1303],{"type":24,"value":1304},"    messages.append(\n",{"type":18,"tag":37,"props":1306,"children":1308},{"class":39,"line":1307},147,[1309],{"type":18,"tag":37,"props":1310,"children":1311},{},[1312],{"type":24,"value":1313},"        {\n",{"type":18,"tag":37,"props":1315,"children":1317},{"class":39,"line":1316},148,[1318],{"type":18,"tag":37,"props":1319,"children":1320},{},[1321],{"type":24,"value":1322},"            \"role\": \"tool\",\n",{"type":18,"tag":37,"props":1324,"children":1326},{"class":39,"line":1325},149,[1327],{"type":18,"tag":37,"props":1328,"children":1329},{},[1330],{"type":24,"value":1331},"            \"tool_call_id\": call.id,\n",{"type":18,"tag":37,"props":1333,"children":1335},{"class":39,"line":1334},150,[1336],{"type":18,"tag":37,"props":1337,"children":1338},{},[1339],{"type":24,"value":1340},"            \"content\": json.dumps(result, ensure_ascii=False),\n",{"type":18,"tag":37,"props":1342,"children":1344},{"class":39,"line":1343},151,[1345],{"type":18,"tag":37,"props":1346,"children":1347},{},[1348],{"type":24,"value":1349},"        }\n",{"type":18,"tag":37,"props":1351,"children":1353},{"class":39,"line":1352},152,[1354],{"type":18,"tag":37,"props":1355,"children":1356},{},[1357],{"type":24,"value":1358},"    )\n",{"type":18,"tag":37,"props":1360,"children":1362},{"class":39,"line":1361},153,[1363],{"type":18,"tag":37,"props":1364,"children":1365},{},[1366],{"type":24,"value":1367},"    second = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)\n",{"type":18,"tag":37,"props":1369,"children":1371},{"class":39,"line":1370},154,[1372],{"type":18,"tag":37,"props":1373,"children":1374},{},[1375],{"type":24,"value":1376},"    print(f\"  💬 最终回答：{second.choices[0].message.content}\")\n",{"type":18,"tag":37,"props":1378,"children":1380},{"class":39,"line":1379},155,[1381],{"type":18,"tag":37,"props":1382,"children":1383},{"emptyLinePlaceholder":53},[1384],{"type":24,"value":56},{"type":18,"tag":37,"props":1386,"children":1388},{"class":39,"line":1387},156,[1389],{"type":18,"tag":37,"props":1390,"children":1391},{"emptyLinePlaceholder":53},[1392],{"type":24,"value":56},{"type":18,"tag":37,"props":1394,"children":1396},{"class":39,"line":1395},157,[1397],{"type":18,"tag":37,"props":1398,"children":1399},{},[1400],{"type":24,"value":1401},"# 五个问题，分别考查不同的选择\u002F边界场景\n",{"type":18,"tag":37,"props":1403,"children":1405},{"class":39,"line":1404},158,[1406],{"type":18,"tag":37,"props":1407,"children":1408},{},[1409],{"type":24,"value":1410},"QUESTIONS = [\n",{"type":18,"tag":37,"props":1412,"children":1414},{"class":39,"line":1413},159,[1415],{"type":18,"tag":37,"props":1416,"children":1417},{},[1418],{"type":24,"value":1419},"    \"上海现在多少度？\",          # → 应选 get_weather\n",{"type":18,"tag":37,"props":1421,"children":1423},{"class":39,"line":1422},160,[1424],{"type":18,"tag":37,"props":1425,"children":1426},{},[1427],{"type":24,"value":1428},"    \"把 200 欧元换成日元\",        # → 应选 convert_currency\n",{"type":18,"tag":37,"props":1430,"children":1432},{"class":39,"line":1431},161,[1433],{"type":18,"tag":37,"props":1434,"children":1435},{},[1436],{"type":24,"value":1437},"    \"把“今天天气真好”翻译成英文\",  # → 应选 translate_text（注意：含“天气”，干扰项！）\n",{"type":18,"tag":37,"props":1439,"children":1441},{"class":39,"line":1440},162,[1442],{"type":18,"tag":37,"props":1443,"children":1444},{},[1445],{"type":24,"value":1446},"    \"你觉得人生的意义是什么？\",    # → 边界：哪个都不该选\n",{"type":18,"tag":37,"props":1448,"children":1450},{"class":39,"line":1449},163,[1451],{"type":18,"tag":37,"props":1452,"children":1453},{},[1454],{"type":24,"value":1041},{"type":18,"tag":37,"props":1456,"children":1458},{"class":39,"line":1457},164,[1459],{"type":18,"tag":37,"props":1460,"children":1461},{"emptyLinePlaceholder":53},[1462],{"type":24,"value":56},{"type":18,"tag":37,"props":1464,"children":1466},{"class":39,"line":1465},165,[1467],{"type":18,"tag":37,"props":1468,"children":1469},{"emptyLinePlaceholder":53},[1470],{"type":24,"value":56},{"type":18,"tag":37,"props":1472,"children":1474},{"class":39,"line":1473},166,[1475],{"type":18,"tag":37,"props":1476,"children":1477},{},[1478],{"type":24,"value":1479},"if __name__ == \"__main__\":\n",{"type":18,"tag":37,"props":1481,"children":1483},{"class":39,"line":1482},167,[1484],{"type":18,"tag":37,"props":1485,"children":1486},{},[1487],{"type":24,"value":1488},"    for q in QUESTIONS:\n",{"type":18,"tag":37,"props":1490,"children":1492},{"class":39,"line":1491},168,[1493],{"type":18,"tag":37,"props":1494,"children":1495},{},[1496],{"type":24,"value":1497},"        run(q)\n",{"type":18,"tag":37,"props":1499,"children":1501},{"class":39,"line":1500},169,[1502],{"type":18,"tag":37,"props":1503,"children":1504},{},[1505],{"type":24,"value":1084},{"type":18,"tag":37,"props":1507,"children":1509},{"class":39,"line":1508},170,[1510],{"type":18,"tag":37,"props":1511,"children":1512},{},[1513],{"type":24,"value":1514},"    print(\n",{"type":18,"tag":37,"props":1516,"children":1518},{"class":39,"line":1517},171,[1519],{"type":18,"tag":37,"props":1520,"children":1521},{},[1522],{"type":24,"value":1523},"        \"\\n观察重点：\\n\"\n",{"type":18,"tag":37,"props":1525,"children":1527},{"class":39,"line":1526},172,[1528],{"type":18,"tag":37,"props":1529,"children":1530},{},[1531],{"type":24,"value":1532},"        \"  · 第 3 题句子里有“天气”二字，但意图是翻译——好的 description 让模型\\n\"\n",{"type":18,"tag":37,"props":1534,"children":1536},{"class":39,"line":1535},173,[1537],{"type":18,"tag":37,"props":1538,"children":1539},{},[1540],{"type":24,"value":1541},"        \"    按【意图】选 translate_text，而不是被关键词“天气”骗去选 get_weather。\\n\"\n",{"type":18,"tag":37,"props":1543,"children":1545},{"class":39,"line":1544},174,[1546],{"type":18,"tag":37,"props":1547,"children":1548},{},[1549],{"type":24,"value":1550},"        \"  · 第 4 题是闲聊，模型应一个工具都不调（边界识别）。\\n\"\n",{"type":18,"tag":37,"props":1552,"children":1554},{"class":39,"line":1553},175,[1555],{"type":18,"tag":37,"props":1556,"children":1557},{},[1558],{"type":24,"value":1559},"        \"  · 选错工具\u002F选不出，先回去检查各工具 description 是否互相清晰、没有歧义。\"\n",{"type":18,"tag":37,"props":1561,"children":1563},{"class":39,"line":1562},176,[1564],{"type":18,"tag":37,"props":1565,"children":1566},{},[1567],{"type":24,"value":1358},{"type":18,"tag":1569,"props":1570,"children":1571},"style",{},[1572],{"type":24,"value":1573},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":49,"depth":49,"links":1575},[1576],{"id":21,"depth":59,"text":21},"markdown","content:articles:agent:03-multi-tool-select.md","content","articles\u002Fagent\u002F03-multi-tool-select.md","articles\u002Fagent\u002F03-multi-tool-select","md",1781678620538]