我们开始上课。第14课前面几节课我们已经把Python基础语法过了一遍也成功让自己的电脑接上了大语言模型的API能写出类似“你今年几岁”这种问题让AI回答。但是有个问题一直困扰着零基础的小朋友同一个模型为什么换个说法它回答的风格就完全不一样今天要讲的“函数参数”就是解开这个秘密的钥匙。函数参数说简单点就是我们调用函数时放进括号里的那些值。它们像一个个小开关控制着函数最后干出什么活。对于大语言模型应用来说参数更是“命根子”——提示词、温度、回答长度、甚至切换不同模型这些全部都是通过参数传进去的。这节课我尽量用最“笨”但最有效的方式带零基础的小学生把参数的世界翻个底朝天。学完之后你不仅能看懂大模型API调用的代码还能自己动手改参数让同一个AI为你写出完全不同的答案。1. 为什么这一课叫“秘密世界”参数到底是什么东西先别急着碰代码我们想一个生活场景。你在奶茶店点单喊了一句“来一杯珍珠奶茶”。店员问“甜度呢冰量呢”你说“七分甜少冰”。这杯奶茶拿到了和你那句“什么也不加”完全不是一回事。这里“甜度”“冰量”“加不加珍珠”就是参数。奶茶店那台机器就是函数。你每次换不同的参数机器就做出不同的奶茶。函数参数的世界一点都不神秘它就是“我们告诉函数这次干活要按照什么要求来”的一组信息。放到大语言模型应用里事情就更直观了。你调用AI的时候告诉它“请写一首关于夏天的诗字数要短语气要欢快。”这整句话就是你传递给大语言模型函数的最重要的参数。换个说法参数是“请写一篇关于夏天的800字故事语气要悬疑”AI给出的一定是另一种风格。我在给小学生上课的时候发现最有用的一张比喻图是这样的函数 一台会自动做作业的机器人函数名 机器人身上的按钮按下它才开始干活括号里的参数 你塞给机器人的“要求纸条”所以学参数本质上就是在学“怎么给别人写清楚要求纸条”。这个能力不光编程用日常生活中写作文、安排任务、和别人合作通通在用。这一课叫“秘密世界”是因为参数藏得很深但一旦看穿整个函数调用的逻辑就全部透明了。2. 提示词其实就是大模型最重要的那个参数小学生学大语言模型应用最早接触的不是什么高深的算法而是提示词Prompt。说白了提示词就是我们发给模型的文字输入。在代码里这个提示词恰恰是作为参数传进函数里的。举个例子。上节课我们已经安装并配置好了调用大模型需要的库也拿到了自己的API Key。现在我们要调用一个叫chat.completions.create的函数让它生成一句话。典型的代码长这样from openai import OpenAI client OpenAI(api_key你的密钥) reply client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是一个严格的语文老师}, {role: user, content: 请用一句话批评我的作文跑题了} ] ) print(reply.choices[0].message.content)我们来看看这里哪些是参数model告诉函数用哪个模型是参数。messages告诉函数这次对话的内容它里面的system和user两段角色话术也是参数。后面那个temperature、max_tokens之类还是参数。messages里面最重要的其实就是我们平时说的提示词。所以你可以这样理解写提示词这件事在代码的世界里就是“往参数里填内容”。等你学会了参数的各种写法你操纵大模型的本事会一下子提升一大截。对比一下。同样一个函数参数换一换效果天差地别reply client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: 你是一个幽默的脱口秀演员}, {role: user, content: 请用一句话说说作业没写完的心情} ] )一个是“严格的语文老师”一个是“幽默的脱口秀演员”角色变了回答风格就完全变了。而这两个角色不过就是参数值不同而已。所以每次写代码调用大模型的时候都可以问自己一句我这次传的参数是什么我想让函数按什么要求干活这就是参数意识的开始。3. 形参和实参一个在说明书上一个在实际调用中我们去掉大模型先看一个最朴素的Python函数。因为很多小朋友第一次听到“形参”“实参”就头晕我决定把这两个概念拆得尽可能简单。定义函数的时候括号里写的叫形参parameter。调用函数的时候括号里真正填进去的数值或文字叫实参argument。你可以这样记形参是说明书上的空格实参是你真正填进空格的字。看代码def greet(name): print(你好 name ) greet(小明) greet(小红)这里的name就是形参。“小明”“小红”就是实参。同一个greet函数因为实参不同打出了两条不同的问候。换个大模型应用的例子。假设我们自己封装一个小函数专门用来让AI帮忙写评语def write_comment(thing, feeling): prompt f请用一句话写下你对{thing}的感受核心情绪是{feeling}。 # 这里假设调用大模型API并返回结果 return call_llm(prompt) print(write_comment(数学作业, 崩溃)) print(write_comment(冰淇淋, 开心))在这个例子里thing和feeling是形参它们并没有具体的值而“数学作业”“崩溃”“冰淇淋”“开心”是实参是真正传进去的内容。教学现场最容易出的问题是孩子把形参当成“一个真实的变量”以为写了一个name程序里就真的存在一个叫name的东西。实际上形参只是函数内部的占位符。它是什么值完全取决于调用者传入的实参。提示如果孩子在这里卡住不要急着讲更多概念。让他反复改实参、运行、看输出改个十来次形参和实参的关系自然就清楚了。这块是整个函数参数世界的地基。地基不打牢后面默认参数、关键字参数都会云里雾里。4. 位置参数是排队默认参数是备用方案理解了形参和实参之后我们来看参数在世界里的第一种排列方式位置参数。位置参数的意思是实参按照形参定义的顺序依次填入。这就像小朋友去食堂打饭第一个窗口打饭第二个窗口打菜第三个窗口打汤。你得按顺序走不能先跑到第三个窗口要汤再回第一个窗口打饭。def make_juice(fruit, size, sugar): print(f制作一杯{size}杯{fruit}汁甜度{sugar}。) make_juice(苹果, 大, 三分甜) make_juice(西瓜, 小, 无糖)这里“苹果”对应fruit“大”对应size“三分甜”对应sugar完全按照定义时的位置来。你要是写make_juice(大, 苹果, 三分甜)程序不会报错但输出就变成“制作一杯苹果杯大汁”明显不对。这就是位置参数的特点顺序就是一切。在调用大语言模型API时我们也常常使用位置参数。比如有的封装函数这样定义def ask_llm(prompt, system_role, temperature): ...调用时如果你写ask_llm(0.7, 你是一个助手, 你好)模型收到的提示词就变成了0.7整个对话立刻乱套。所以面对接口文档里的参数列表一定要养成“从第一个开始一个一个对应过去”的习惯。接着看默认参数。有些参数很多时候我们不传函数也可以正常工作那就可以给它一个默认值。这就像买套餐时店家默认给“不加辣”你没交代就是不加辣你交代“加辣”它就按你的要求来。def make_juice(fruit, size中, sugar标准): print(f制作一杯{size}杯{fruit}汁甜度{sugar}。) make_juice(苹果) make_juice(西瓜, 超大杯, 无糖)第一次调用只传了一个实参“苹果”其余的size和sugar自动使用默认值“中”和“标准”。第二次调用传了三个实参前两个按位置对应fruit和size“无糖”对应sugar。默认参数在调用大模型的时候也特别常见。比如def ask_llm(prompt, modelgpt-4o-mini, temperature0.7): ...如果你不指定模型就用gpt-4o-mini不指定温度就用0.7。你只需要专注于传一个prompt其他参数都有备用方案。这里有个重要规矩必须记住带默认值的参数要放在没有默认值的参数后面。也就是说你不能这样定义def ask_llm(modelgpt-4o-mini, prompt): ...这会直接报语法错误。原因很简单如果默认参数在前面Python会分不清我到底是想给model传值还是想给prompt传值顺序太混乱了。先写必填参数再写选填参数这是所有编程语言通行的规矩。5. 不按顺序也能传参关键字参数和不定长参数的玩法位置参数要求我们按顺序填但有时候参数太多了或者我不想记住它们的位置怎么办Python给了我们一个很贴心的设计关键字参数。关键字参数调用时直接写“参数名值”喊名字不用排队。def make_juice(fruit, size, sugar): print(f制作一杯{size}杯{fruit}汁甜度{sugar}。) make_juice(sugar无糖, fruit橙子, size中杯)你看我把顺序完全打乱了但因为每一个参数都明确写出了名字程序依然能正确识别。这就像点名册上喊名字而不是按队伍顺序喊“第一个人、第二个人”。调用大模型API时几乎处处都是这种写法reply client.chat.completions.create( modelgpt-4o-mini, messagesmessages, temperature0.9, )这里model、messages、temperature都是关键字参数。这样写的好处是哪怕接口有几十个参数我们也能一眼看出每一项是干什么用的代码可读性比单纯按位置传值高得多。然后是不定长参数包括*args和**kwargs。这两个名字里的args和kwargs不是固定的真正的关键是前面的星号。*args能把任意多个位置参数打包成一个元组。你可以把它想象成一个魔法口袋不管来多少人排队它都能装下。def make_fruit_juice(*fruits): print(正在混合这些水果, fruits) make_fruit_juice(苹果, 橙子, 西瓜, 葡萄)输出就会把四种水果都打包进一个元组里。**kwargs则能把任意多个关键字参数打包成一个字典。你可以想象它是一个魔法小本本每一页记着一个“参数名: 参数值”。def describe_drink(**options): for key, value in options.items(): print(f{key}: {value}) describe_drink(温度少冰, 甜度七分, 杯子环保杯)这个设计在写一些很灵活的大模型封装函数时非常好用。比如你想做一个“万能调用函数”让用户随便给各种参数就可以把不固定的部分交给**kwargs。def call_llm_ flexible(prompt, **kwargs): # kwargs里可能有temperature, max_tokens, top_p... print(收到额外参数, kwargs)不用害怕这两个概念。学到这里小学生只需要记住两点一个星号管位置参数两个星号管关键字参数它们的共同点是“数量不固定”像口袋一样能装。6. 大模型API里那几个参数到底在调控什么现在回到大语言模型本身。我们把这个时代的“大模型函数”当成一台能够自己生成文字的机器那么它的主要参数就是控制这台机器怎么想的旋钮。这一节我挑几个最常用的讲清楚它们到底在干什么。6.1 messages决定AI扮演什么角色messages是一个列表里面通常有两种角色。system是系统角色用于设置AI的整体人设user是用户角色代表我们提的问题。还有assistant角色代表AI自己说过的话一般在多轮对话时用。比如messages[ {role: system, content: 你是一位耐心的小学数学老师}, {role: user, content: 请解释一下什么是分数} ]这里如果把system改成“你是一位不耐烦的毒舌网友”回答风格会截然不同。这就告诉我们提示词不是只有“用户问话”这一部分系统设定同样极其关键。6.2 temperature控制AI是稳定还是天马行空temperature是一个0到2之间的小数它控制回答的随机程度。数值越低回答越稳定、保守几乎每次结果都比较接近数值越高回答越有创造性甚至脑洞大开。我用一个简单实验来解释。让AI“用三个词形容太阳”把temperature设成0.2它可能每次都说“温暖、明亮、巨大”。把temperature设成1.6它能给你说出“爆裂火球、晨光炸弹、无限能量”这样的词。对小学生的建议是需要做选择题、判断题、标准答案类的任务时把温度调低一点比如0.2到0.4需要写诗歌、编故事、头脑风暴时把温度调高一点比如0.8到1.2。6.3 max_tokens限制回答的最大长度max_tokens决定AI最多输出多少个“词元”。约等于英语里的一个片段或中文里的一个词简单理解成回答的长度上限就行。如果我们设max_tokens30AI就只会写非常短的句子设成max_tokens500它就能洋洋洒洒写一大段。这个参数在实践中特别有用因为有的人就是想要简短回答结果模型啰嗦一大篇这时候把max_tokens压小就已经成功了一半。6.4 top_p另一种控制选择范围的方式top_p也叫核采样意思是“只在概率最高的那前百分之多少的词里选择”。比如top_p0.1模型只会从概率累计到10%的那些高概率词里挑结果比较稳定top_p0.9选择范围大很多结果更加多样。你可以把temperature理解为“创造力的火焰高度”把top_p理解为“可选词汇的游泳池大小”。很多初学者只调temperature忽略了top_p其实两个配合着用效果更好。典型的做法是保持其中一个固定调节另一个。reply client.chat.completions.create( modelgpt-4o-mini, messages[ {role: user, content: 写一句关于大海的比喻} ], temperature1.2, max_tokens50, )把上面这段代码的温度改成0.2再跑一遍对比两句话你立刻就能感受到参数的作用。与其死背概念不如做这个“对照实验”看过一次一辈子忘不掉。7. 三道课堂小任务把参数玩明白理论知识说多了容易困直接上任务。下面三道题由易到难零基础的小朋友建议按顺序完成。每道题都要求在电脑上自己敲代码不是看一眼就算了。任务一修改位置参数观察输出变化先定义这个函数def write_sentence(who, where, what): print(f{who}在{where}{what}。) write_sentence(小猫, 屋顶上, 晒太阳) write_sentence(我, 书房, 写作业)然后再写三行调用分别改成小猫在院子里捉蝴蝶爸爸在厨房做晚饭我用稻草人守卫田地运行之后看看输出是否和预期一样。这一步的目的是让你亲手感受“实参的位置必须和形参一一对应”。任务二给“写诗机器人”加上默认参数定义下面这个函数它用来调用大模型写一首小诗def poem(theme, style童趣, lines4): prompt f请写一首主题为{theme}、风格{style}、共{lines}行的短诗。 # 此处假装调用大模型API返回结果 return prompt先调用poem(彩虹)和poem(大海, 悲伤)观察不同位置传参的效果。再把默认参数改成你自己喜欢的风格比如“奇幻”“豪迈”看看函数的默认行为变化。这里训练的是“默认参数是备用方案”的思路。不传就按默认传了就用自己的。任务三用关键字参数打乱顺序接着上面的函数用关键字参数调用一次print(poem(lines6, style科幻, theme太空))注意顺序完全颠倒但结果依然正确。然后你再写一个自己的函数比如make_diary(date, weather, mood)至少包含三个参数分别用位置参数和关键字参数各调用一次并打印结果。这三道任务全部完成之后你其实已经把函数参数最核心的五种玩法都用过了普通位置参数、默认参数、关键字参数、形参实参、以及通过改参数影响大模型输出。附加挑战对比不同temperature下AI的答案如果你已经能成功调用大模型API可以挑战一下for t in [0.2, 0.7, 1.4]: reply client.chat.completions.create( modelgpt-4o-mini, messages[ {role: user, content: 请用一句话向朋友推荐你的学校} ], temperaturet ) print(ftemperature{t}: {reply.choices[0].message.content})看看三次回答差别有多大。这个挑战题就是想告诉你**真正的“提示词工程”就是在和一堆参数打交道。**谁更懂参数谁就能让大模型干出更漂亮的话。8. 给家长和老师的三句悄悄话这一课的内容很多成年人看了都觉得不难但真正教小学生的时候还是有一些讲究。我自己上这节课的时候踩过一些坑总结成三句话供家长和老师参考。第一句话让孩子先动手改再学概念。不要一开始就板书“形参、实参、默认参数”这堆名词。让孩子把make_juice(苹果)改成make_juice(香蕉)看见输出变了他自然理解了“原来括号里就是用来改要求的地方”。概念是为操作服务的操作永远先走一步。第二句话用“点单”和“做手工”的场景不要用数学题场景。函数参数本身就是生活经验的抽象搭配“奶茶店点单”“组装四驱车选配件”“微波炉按加热时间”这些场景小学生几乎一听就懂。一旦你拿数学函数、方程式来类比很容易把孩子的兴趣浇灭。第三句话让孩子自己设计一个“麻烦的参数组合”。我发现小孩子最兴奋的时刻不是按部就班完成任务而是故意制造一个“错误”。比如让AI写诗时把情感设成“开心”主题设成“考试”模型给出的回答往往让人哭笑不得。这种“故意使坏”的过程恰恰让他们深刻体会到参数对最终结果的影响有多大。还有一个小技巧准备几张空白卡片让孩子把model、temperature、max_tokens、top_p、messages等常用参数抄在上面每次调试代码时拿一张卡片把参数值改一改、记录一下输出。这个过程其实是在培养一种非常宝贵的工程习惯——让每一次修改都有记录让每一个参数都有对照。很多成年工程师都没有这个好习惯小朋友从小养成未来的学习会顺畅得多。函数参数这个“秘密世界”说到底就是“用输入控制输出”的世界。你会发出指令你就会用函数你能设计指令你就能驾驭大模型。下一节课我们准备进入更复杂的“多轮对话”场景到时候messages参数会发挥更大的作用。先把今天这几个参数玩熟下一课见。