想象你是一家大公司新入职的总经理助理小林。你不需要自己会算账、不会订机票、不记得每个城市的天气——但你必须知道:遇到什么事该找财务部、什么时候该找行政部、怎么把老板一句话翻译成一张标准工单、多个部门接力时怎么衔接、拿到部门反馈后怎么汇总成一份像样的简报,以及怎样从老板的表扬和批评里成长。这篇文章要讲的,就是让大模型像小林一样,学会在合适的时机调用合适的“外部部门”——也就是工具,来完成复杂任务。我们将从工具清单的搭建、调用时机的判断、参数的精确抽取、训练数据的构建、多轮调用的衔接、结果的整合,一直讲到用强化学习让模型越用越顺手。
工具使用能力是大模型进化成 AI Agent 的关键阶梯。掌握它的训练方法,你就能让模型从“只会聊天的聪明人”变成“能真正办事的得力助手”,这是 Agent 开发者、训练工程师与架构师的核心竞争力。
可视化演示
展示Function Calling参数抽取流程、多轮工具调用依赖链与结果整合、以及SFT到RL强化学习优化策略,通过多模式交互理解工具使用训练全流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Function Calling参数抽取流程 用户查询经LLM推理选择合适工具(SCH/CAL/API) 模型抽取参数并输出结构化JSON调用请求 系统执行工具调用并返回结果给模型 tool_call = {name, args} → result 训练数据覆盖选择/抽取/整合三阶段
工具定义与类型
小林入职第一天,人事部递给他一本《部门职能手册》:财务部管报销、IT部管电脑、行政部管订票,每个部门后面还写着对接人、办公地点和需要的表单。经理告诉他:“你不必什么都会,但你必须背熟这本手册——遇到什么事,知道该找谁。”大模型训练工具使用的第一步,同样是让模型“认识工具”:模型不需要内化每个工具的实现细节,但必须清楚“有哪些外部能力可用、各自负责什么、接口长什么样”。
工具的本质是外部函数或 API。在训练和推理时,我们把这些工具定义写入模型的上下文,让模型“看到”它们。典型工具包括:查天气、计算器、搜索引擎、发邮件、数据库查询、代码解释器等,它们统称为外部函数服务。与人类助理一样,模型看到的不是工具源码,而是三要素:工具名称与用途描述(让模型理解何时该用)、参数列表与类型(让模型生成正确调用)、返回格式说明(让模型解析结果)。工程上,这些定义会被维护成一份结构化的工具清单,每个工具对应一份 JSON Schema 格式的接口定义,随着业务变化不断增删版本。
1. T(工具集合):T 代表当前 Agent 可调用的全部外部能力的集合,对应“部门手册”本身。
2. t₁, t₂, …, tₙ(具体工具):t₁、t₂ 是具体工具实例,例如查天气函数、计算器函数;tₙ 表示可以有任意多个工具。
3. 集合的构建(工具清单维护):大括号把所有可用工具收拢成一个整体,模型每次决策都从这个集合里做选择。
小林发现,手册背得越熟,处理需求时脑子里浮现“这事归谁管”的速度就越快。对大模型而言,工具清单就是它心中的部门手册:清单描述得越清楚,模型在关键时刻的“求助”就越精准。这也是为什么工具使用训练的第一步,永远是先搭好一份高质量的工具清单。
调用时机判断
第二周,总经理开始给小林派活:“帮我订个会议室”“报销单在哪”“今天心情如何”。小林慢慢发现,不是每句话都要惊动各部门:闲聊可以自己接,涉及事实查询或操作才需要转给专业部门。有一次他直接把“晚上吃什么”转给财务部,财务部一脸茫然。这就是时机判断没学好——用技术语言说,就是工具触发(Tool Trigger)的意图识别出了问题。
时机判断的核心是让模型学会一个二元决策:当前这个问题,需不需要调用工具?如果需要,调用哪个?工程上的常见做法是让模型输出特殊的调用标记(如 tool_call),或者让模型先在内部推理“这个问题我自己答不了,必须借助外部”,然后再输出调用块。许多开源模型则在训练时加入一个独立的分类头,让模型在解码早期就决定是否进入工具分支。
实践中,这个判断被建模为一个概率问题:
1. P(use_tool | x)(触发概率):给定用户输入 x,模型认为需要调用工具的概率,介于 0 到 1 之间。
2. σ(u)(Sigmoid 压缩):把一个任意实数压缩到 (0,1) 区间的函数,让输出可以当作概率来解读。
3. w^⊤ f(x) + b(线性打分):f(x) 是对输入 x 提取的语义特征向量,w 是特征权重,b 是偏置;三者共同完成“这个请求需要工具的成色打分”。
必须强调“拒绝调用”的重要性:能直接回答的问题不要画蛇添足去调工具。这就像小林被批评三次后终于学会“闲聊自己接,办事找部门”。训练时如果只给正样本(该调用时调用),模型就会养成“事事都调工具”的坏习惯,既增加延迟又提高出错率;只有加入大量“不该调用”的负样本,模型才能真正学会克制。
参数抽取与格式
总经理对小林说:“帮我查查上海下周三的天气。”小林给行政部发了条微信:“查天气,上海,下周三。”行政部回了个问号——因为正式工单必须填 city 和 date 两个字段,微信口语没法直接录入系统。小林这才意识到:把一句口语翻译成标准工单,是助理的基本功。对应到 Function Calling,这个基本功就叫参数抽取与格式控制。
参数抽取是从用户自由文本中识别出工具每个字段所需的值;格式控制是保证输出严格符合接口定义的 JSON 结构。这两件事通常拆成两步:先做实体识别,找出“上海”“下周三”这些片段,再做参数映射,把片段对应到 schema 里的 city/date 字段,并转换成标准格式(如日期转为 ISO 8601)。格式控制层面,工程上常用 JSON Schema 校验模型输出、用受限解码(constrained decoding)限制模型只能生成合法 JSON、以及在后处理中用类型转换和枚举校验兜底。
1. S(a, x)(参数匹配得分):在用户语句 x 下,候选参数 a(如“上海”“大年初三”)被抽中的匹配分数。
2. φ_j(a, x)(特征函数):第 j 个匹配特征,比如词面是否重合、语义向量是否接近、实体类型是否符合 schema 要求。
3. λ_j 与求和(加权融合):每个特征各有权重 λ_j,把所有特征的加权和算出来,就是该候选参数的最终得分。
小林的工单从“口语化微信”进化成“标准化表单”后,行政部处理效率直接翻倍。对模型而言,参数规范得越好,工具调用成功率越高——一个把 city: "上海" 写成 city: "上海?" 的模型,就像填错工单的助理,会让整个下游流程卡壳。
训练数据构建
小林工作半年后,公司决定把他的成长经验变成可复制的方法论。他们从系统日志里导出小林处理过的所有工单,让资深主管逐条标注哪些是优秀示范、哪些是错误示范,又让小林自己生成一批“碰到这种情况我会怎么处理”的模拟工单。这些素材最终汇集成一本《新助理培训手册》——新来的助理照着学,事半功倍。
这本“培训手册”对应大模型的工具使用训练数据集。一条标准样本长这样:用户输入 x → 应该调用的工具编号和参数 → 工具返回的结果 r → 最终回答 y。数据来源主要有三条。第一,人工标注的真实轨迹,成本高但质量最可靠,作为种子数据;第二,真实系统日志,量大但噪声多,需要清洗掉调用失败或参数格式错误的轨迹;第三,模型合成数据,用大模型按模板生成候选,再用规则和人工抽检做质量校验。
1. D_train(训练集):全体训练样本的集合,相当于整本《新助理培训手册》。
2. (x_i, y_i)(输入-动作对):第 i 条样本由用户输入 x_i 和标准动作 y_i 组成,代表“看到这句话,助理应当这样应对”。
3. y_i 的三元组结构(动作内容):tool_i 是工具名,params_i 是调用参数,result_i 是工具返回结果;这三元组完整描述了一次工具调用轨迹。
数据构建最容易被忽略的是负样本:该拒绝调用的样本、工具报错后如何恢复的样本、参数填错被纠正的样本。这些“错题”决定了模型在实际使用中的鲁棒性。最后还要做去重、格式一致性检查(所有 JSON 必须通过 schema 校验)和难度分布检查。正如培训手册里既有标准答案也有错题集,工具训练数据的质量直接决定模型调用能力的天花板。
多轮工具调用
有一天总经理说:“帮我安排去上海的出差,避开雨天,订最早的航班。”小林意识到这不是一个部门能干完的:先找行政查上海天气,再找票务订最早的机票,最后还要看总经理日历有没有冲突。而且第二步的“最早航班”依赖第一步的“天气预报”,后一个工单要等前一个结果出来才能填。这就是多轮工具调用的典型场景。
多轮工具调用要解决三个核心问题:依赖关系、状态追踪、上下文衔接。依赖关系指工具之间存在输入输出依赖,工程上通常把前一个工具的输出作为上下文追加到模型输入中,而不是让模型凭空想象;状态追踪指模型要在多步流程中记住“已完成了什么、还差什么”,实践中会维护一个 JSON 格式的结构化状态表;上下文衔接则要求模型面对工具返回的长文本时先做摘要再继续下一步,避免把所有原文都拼进 prompt。
1. s_t(当前状态):第 t 轮时整个任务的状态,相当于小林手里的“接力笔记本”。
2. s_{t-1}, u_t, r_{t-1}(三个输入信号):上一轮的状态、用户本轮的新指令、上一轮工具返回的结果,三者共同决定下一步怎么走。
3. Update(·)(状态更新函数):把旧的笔记、新的指令和最新的工具反馈融合成新状态的函数,既不丢历史信息,又能反映最新进展。
另外必须设置最大调用轮数(如 8 轮),超限后优雅终止,向用户说明“这个问题超出我能处理的范围”。这就像小林从不会让三个部门无限接力下去,而是在确认信息足够后立刻收束成结论。多轮调用做得好的模型,能像经验丰富的助理一样,把复杂任务拆解成有序的行动链。
结果整合
各部门把结果发给了小林:行政部发来一张天气数据表,票务部发来航班号,日历显示周三下午 2 点有例会。小林不会直接把表格转发给总经理,而是先检查数据有没有异常(比如气温 999 度这种明显错误),再把三份材料融成一段话:“周三上海小雨,最早的航班是 7:05 起飞,但您 2 点有例会,建议改乘 9:30 的航班。”
这个“检查 + 融合 + 表达”的过程,对应工具使用中的结果整合。模型拿到工具返回的原始输出后,通常不能直接拼接——既不可读,也不一定正确。整合分为三步:解析阶段,把 JSON 或文本结果转换成结构化内部表示;校验阶段,检查结果是否为空、是否有错误码、数值是否合理,异常时可以触发重试,也可以直接向用户澄清;回答生成阶段,把用户原始问题与校验后的工具结果一起作为上下文,生成自然简洁、可追溯来源的回答。
1. answer(最终回答):模型整合所有信息后生成的自然语言答复,即交给总经理的简报。
2. x(原始问题):用户最初的需求,是简报必须围绕的主题。
3. r₁, r₂, …, r_k(工具结果集合):k 个工具先后返回的原始结果,是简报的全部素材来源。
4. P(·) 整体含义(条件生成目标):整条公式表示“在已知问题和全部素材的前提下,回答有多合理”;训练时就是让这个概率尽量大。
训练数据中要特别加入“结果异常时模型应如何表现”的样本,避免两种毛病:一是把错误信息原封不动抛给用户,二是无视错误结果强行编造答案。总经理对小林评价最高的一句话是“他给我的不是数据,是结论”——结果整合的本质,就是让大模型从“传话筒”升级成“参谋长”。
强化学习优化
季度考核时,总经理给小林打了三项分:任务办没办成(核心指标)、有没有白跑腿(不必要的部门转接)、遇到问题有没有及时上报(该求助时不能硬扛)。小林发现,光靠背培训手册还不够,于是他把每次考核反馈记下来,慢慢调整自己的工作习惯——这正是“强化学习”的雏形。
在工具使用领域,监督微调只能教会模型“输出格式长得像优秀助理”,但没法教会它“在真实环境里把事做成”——因为模型写出的工具调用是否真的有效,必须放到外部环境里执行才知道。强化学习(RL)把“模型 → 工具 → 真实结果 → 奖励”的闭环打通:模型先按当前策略产生工具调用序列,工具执行后返回真实结果,由奖励函数给这一整条轨迹打分,再用策略梯度算法更新模型权重。
1. R(总奖励):一条工具调用轨迹的最终得分,数值越高代表这次调用越优秀。
2. R_task(任务成功奖励):最终回答是否达成用户目标,是考核的核心指标,占比最高。
3. R_acc(结果使用奖励):工具返回的结果是否被正确、真实地引用进最终回答,防止模型“查了不用、宁可编造”。
4. -λ₂ R_overuse(效率惩罚):对不必要或重复的工具调用的负向惩罚,λ₂ 控制惩罚力度,鼓励模型“少跑冤枉路”。
实践中要注意两点:一是 RL 训练初期模型容易坍缩到少数高奖励动作上,所以通常先用 SFT 数据做预热,再逐步放开真实环境探索;二是要持续监控工具调用分布,防止模型永远只选同一个工具。小林靠一次次考核反馈迭代成长为大公司首席助理,大模型也靠强化学习在真实环境中不断进化工具使用策略——这就是工具使用训练的最后一环,也是最接近“真实世界智慧”的一环。
AI 应用场景
智能客服 Agent
阶段:工具使用训练全流程(数据构建 + 时机判断 + 结果整合)
解决的问题:传统客服只能从预设 FAQ 里检索答案,遇到“我的订单到哪了”这类需要实时数据的问题就无能为力。给客服模型接入订单查询、物流查询、退换货规则三个工具,并训练它“先判断是否要调工具、再抽取订单号参数、最后把物流信息整合成友好回答”,就能从“检索式客服”升级为“办事型客服”。
具体案例:某电商平台用真实客服日志构建训练集,包含 5 万条标注轨迹和 2 万条“无需调用工具直接回答”的负样本,微调后的模型在订单状态查询场景的准确率从 61% 提升到 89%,平均响应时长从 40 秒降到 8 秒。
数据分析师助手
阶段:多轮工具调用 + 强化学习优化
解决的问题:业务人员想查“上季度各区域销售额”,传统做法是写好固定 SQL 报表,灵活性差。助手模型学会多轮工具调用后,可以先调用“数据库查询”工具获取原始数据,再调用“代码解释器”工具计算同比环比,最后把结果整合成一段带结论的文字。
具体案例:某 SaaS 公司训练了一个数据分析 Agent,它的工具链包含 query_db、run_python、make_chart 三个函数。模型通过 3~5 轮工具调用完成“查数 → 计算 → 画图 → 总结”的流水线,并用 RL 优化了工具选择策略(避免多余查询),使分析任务平均耗时降低 60%。
Python 演示
# -*- coding: utf-8 -*-"""极简 Function Calling 演示:意图识别 -> 参数抽取 -> 工具调用 -> 结果整合""" import jsonimport re def search_weather(city, date): """模拟天气查询工具的返回结果。""" return json.dumps( {"city": city, "date": date, "condition": "晴", "temp": 25}, ensure_ascii=False ) def calc(expr): """模拟计算器工具,只支持加减乘除。""" return str(eval(expr, {"__builtins__": {}}, {})) TOOL_SCHEMAS = { "search_weather": {"desc": "查询天气", "params": ["city", "date"]}, "calc": {"desc": "计算数学表达式", "params": ["expr"]}} def parse_intent(query): """用关键词规则模拟模型的意图识别。""" if any(w in query for w in ["天气", "气温", "下雨"]): return "search_weather" if any(w in query for w in ["计算", "多少", "加", "乘"]): return "calc" return None def extract_params(query, tool_name): """用正则模拟参数抽取。""" if tool_name == "search_weather": city = re.search(r"([\u4e00-\u9fa5]{2,5}市?)", query) date = re.search(r"(今天|明天|后天)", query) return { "city": city.group(1) if city else "北京", "date": date.group(1) if date else "今天" } if tool_name == "calc": m = re.search(r"(\d+)\s*[+\-*/x]\s*(\d+)", query) if m: return {"expr": m.group(1) + "*" + m.group(2)} m2 = re.search(r"(\d+)\s*乘以\s*(\d+)", query) if m2: return {"expr": m2.group(1) + "*" + m2.group(2)} return {"expr": "1+1"} return {} def call_tool(tool_name, params): """执行工具调用,真实项目中这里是 HTTP/API 请求。""" if tool_name == "search_weather": return search_weather(**params) if tool_name == "calc": return calc(**params) return "未知工具" def agent(query): """主流程:意图识别 -> 参数抽取 -> 工具调用 -> 结果整合。""" tool_name = parse_intent(query) if tool_name is None: return "无需调用工具,直接回答:" + query params = extract_params(query, tool_name) result = call_tool(tool_name, params) desc = TOOL_SCHEMAS[tool_name]["desc"] return "我调用了工具[{}],参数 {},结果为 {}".format(desc, params, result) if __name__ == "__main__": print(agent("北京明天天气怎么样?")) print(agent("帮我算一下 23乘以47 等于多少?")) print(agent("你好呀!"))
def parse_intent(query):模拟时机判断:根据关键词判断用户问题是否需要使用工具、调用哪个工具。if any(w in query for w in ["天气", "气温", "下雨"]):对应“触发条件”,只要语句命中领域词就触发对应工具。def extract_params(query, tool_name):模拟参数抽取:用正则从口语中抽出城市、日期、表达式等结构化参数。city.group(1) if city else "北京"模拟参数缺省时的兜底策略:没识别到城市就用默认值。{"expr": m.group(1) + "*" + m.group(2)}把“23乘以47”转换成标准数学表达式 "23*47",即参数映射与格式化。def call_tool(tool_name, params):模拟工具执行层,真实项目中这里会发起 HTTP 请求调用外部 API。return "无需调用工具,直接回答:" + query模拟拒绝调用分支,体现“能直接回答就不调工具”的原则。if __name__ == "__main__":可执行入口,运行脚本就能看到三种典型路径的完整输出。
常见误区
误区大模型推理能力这么强,只要在 prompt 里把工具描述写清楚,它自然就会正确调用,不需要专门训练数据。
正解工具使用是一种需要专门学习的行为模式。就像小林光看部门手册不会知道“什么时候用什么语气对接、工单里哪些字段不能空”——模型需要在大量标注轨迹上做监督微调,才能学会何时触发、如何抽参、怎样把结果接回对话。零样本场景下模型可能偶发成功,但稳定性和参数准确率都不达标。
为何常见:因为 ChatGPT 等产品开箱即用看起来“什么都会”,容易让人误以为工具调用也是推理能力里自带的。
误区模型调用工具返回了错误结果,说明这个模型能力不行,应该换更大的模型。
正解工具调用是一个端到端链路,失败可能发生在任意环节:意图识别把 query 分给了错误工具、参数抽取把“上海”抽成“上海市”导致 API 拒绝、格式控制生成了非法 JSON、工具本身服务端报错。排障时应先看日志定位是哪个环节出的问题,再针对性地补数据或修 Schema。
为何常见:人们习惯把 Agent 当成一个整体来批评,忽略了它内部存在多个可独立优化的环节。
误区只要攒够几百万条调用日志,模型工具使用能力自然就强。
正解数据质量远比数量重要。几万条人工标注的高质量轨迹,往往胜过几百万条带噪声的原始日志——因为原始日志里大量是“工具调用失败”“参数填错”“该调用却没调用”的错误轨迹,学多了反而强化坏习惯。正确做法是先清洗、去重、过滤错误轨迹,再按难度和场景分布做平衡,并刻意混入负样本。
为何常见:深度学习“大力出奇迹”的印象太深,让人忽视了工具调用是追求正确格式与正确决策的精确任务。
误区既然 RL 能让模型在真实环境中自我进化,就不需要先花力气标注数据做 SFT 了。
正解SFT 是 RL 的基础:模型得先学会输出的格式(JSON、函数名、参数结构),RL 才有意义去优化“选哪个工具、调几次”。如果没有 SFT 预热,RL 的探索空间巨大且大部分输出格式非法,奖励信号稀疏到几乎无法收敛。两者的关系不是替代,而是接力——先 SFT 学会“像话”,再 RL 学会“办成事”。
为何常见:媒体常渲染“强化学习让模型自学成才”,让人误以为可以跳过最耗人力的标注环节。
面试题
Q1. 大模型工具使用能力的核心目的是什么?
- A.让模型记住更多知识
- B.让模型学会调用外部能力← 正确答案
- C.让模型生成更长文本
- D.让模型训练速度更快
答案:B。工具使用的本质是让模型在自身知识不足时,通过调用外部函数/API 获取信息或执行操作,就像小林遇到不懂的问题转给对应部门。A 是知识内化,C、D 与工具使用无直接关系。
Q2. Function Calling 中“参数抽取”指的是什么?
- A.从用户语句提取结构化参数← 正确答案
- B.将模型参数进行压缩存储
- C.从训练集随机采样数据
- D.对模型权重进行量化剪枝
答案:A。参数抽取是把“上海下周三”这类口语,翻译成 {"city":"上海","date":"下周三"} 这样的结构化参数,对应小林把口头需求写成标准工单。B、D 是模型压缩技术,C 是数据采样。
Q3. 工具使用中的“结果整合”是指什么?
- A.把工具结果融入最终回答← 正确答案
- B.将多个模型合并成一个
- C.把数据库记录进行合并
- D.将大模型部署到多台机器
答案:A。结果整合是解析、校验工具返回的原始数据,并把它融入自然语言回答的过程——就像小林把各部门的数据素材整理成给总经理的简报。其余选项描述的是模型工程层面的合并或部署。
Q4. 训练工具使用数据时,最好的数据来源是什么?
- A.人工标注的真实调用轨迹← 正确答案
- B.模型随机生成的文本
- C.纯问答对不包含工具
- D.翻译外文文档生成数据
答案:A。人工标注的真实调用轨迹质量最可靠,是工具训练的种子数据,正如《新助理培训手册》需要资深主管逐条把关。纯问答对没有工具调用,根本训练不了工具使用;模型随机文本和翻译文档都无法保证轨迹正确。
Q5. 多轮工具调用中“状态追踪”解决什么问题?
- A.记住用户之前要什么← 正确答案
- B.确保模型输出总是押韵
- C.减少模型参数量大小
- D.加速网络训练收敛速度
答案:A。多轮调用中模型必须记住“已完成什么、还差什么”,例如订机票前先查天气、再查日程冲突。状态追踪维护这本“接力笔记本”,防止前一轮结果在后一轮被遗忘。B、C、D 都与多轮任务执行无关。
Q6. 工具返回结果明显异常时模型应如何处理?
- A.原样拼接异常结果上报
- B.校验结果并尝试重新调用← 正确答案
- C.忽略结果直接编造回答
- D.停止响应并向用户道歉
答案:B。正确做法是先校验再决定:轻微异常可重试,严重异常可向用户澄清或说明情况。原样上报不友好,编造回答是严重的幻觉问题,直接停摆也过于消极——就像小林不会把 999 度的天气数据直接呈给总经理。
Q7. 工具使用训练中“拒绝样本”的价值在于什么?
- A.教会模型识别不该调用场景← 正确答案
- B.增加更多样本让训练充分
- C.让生成速度得到明显提升
- D.减少模型崩溃的风险概率
答案:A。拒绝样本是“无需调用工具”的负样本,专门训练模型克制——闲聊自己接,办事才找人。如果只有正样本,模型会养成事事调工具的习惯,既慢又容易错。B 是数量层面的收益,但不是本质价值。
Q8. 强化学习优化工具选择时奖励函数设计的关键是什么?
- A.任务成功率和调用效率双重权衡← 正确答案
- B.让中间层激活值保持完全一致
- C.使注意力矩阵全部变成稀疏
- D.让词表大小始终固定在一个值
答案:A。奖励函数要同时奖励“任务办成”和“少跑冤枉路”,即 R = R_task + λ₁R_acc - λ₂R_overuse。只奖励成功不管效率,模型会无意义地反复调工具。B、C、D 与工具选择的激励信号无关。
Q9. 下列哪些是好的工具训练数据特征?
- A.包含完整正确的调用过程← 正确答案
- B.覆盖工具失败的异常情况← 正确答案
- C.一定包含多个工具串联
- D.有清晰的参数标注信息← 正确答案
答案:ABD。好的训练数据既要包含完整正确的调用轨迹(标准答案),也要覆盖失败、异常等边缘情况(错题集),参数标注清晰则保证格式正确性。C 错在“一定”二字——许多任务只需一次工具调用,强行串联多工具反而制造噪声。
Q10. 用强化学习训练工具选择模型时,合理的做法有哪些?
- A.用任务完成情况作为奖励信号← 正确答案
- B.对不必要的工具调用给惩罚← 正确答案
- C.无论成败都给予高奖励值
- D.训练中逐步提高任务难度← 正确答案
答案:ABD。任务完成度应作为核心奖励,冗余调用要惩罚(对应 R_task 与 R_overuse),渐进式提高难度符合课程学习(Curriculum Learning)思路。C 错在奖励必须有区分度——否则模型无法知道哪些动作更好,就像考核时所有人都打满分,小林就失去了改进方向。