我们开始上课。第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( model="gpt-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( model="gpt-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, model="gpt-4o-mini", temperature=0.7): ...如果你不指定模型,就用gpt-4o-mini;不指定温度,就用0.7。你只需要专注于传一个prompt,其他参数都有备用方案。
这里有个重要规矩必须记住:带默认值的参数,要放在没有默认值的参数后面。也就是说,你不能这样定义:
def ask_llm(model="gpt-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( model="gpt-4o-mini", messages=messages, temperature=0.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_tokens=30,AI就只会写非常短的句子;设成max_tokens=500,它就能洋洋洒洒写一大段。这个参数在实践中特别有用,因为有的人就是想要简短回答,结果模型啰嗦一大篇,这时候把max_tokens压小就已经成功了一半。
6.4 top_p:另一种控制选择范围的方式
top_p也叫核采样,意思是“只在概率最高的那前百分之多少的词里选择”。比如top_p=0.1,模型只会从概率累计到10%的那些高概率词里挑,结果比较稳定;top_p=0.9,选择范围大很多,结果更加多样。
你可以把temperature理解为“创造力的火焰高度”,把top_p理解为“可选词汇的游泳池大小”。很多初学者只调temperature,忽略了top_p,其实两个配合着用效果更好。典型的做法是:保持其中一个固定,调节另一个。
reply = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "user", "content": "写一句关于大海的比喻"} ], temperature=1.2, max_tokens=50, )把上面这段代码的温度改成0.2再跑一遍,对比两句话,你立刻就能感受到参数的作用。与其死背概念,不如做这个“对照实验”,看过一次,一辈子忘不掉。
7. 三道课堂小任务,把参数玩明白
理论知识说多了容易困,直接上任务。下面三道题,由易到难,零基础的小朋友建议按顺序完成。每道题都要求在电脑上自己敲代码,不是看一眼就算了。
任务一:修改位置参数,观察输出变化
先定义这个函数:
def write_sentence(who, where, what): print(f"{who}在{where}{what}。") write_sentence("小猫", "屋顶上", "晒太阳") write_sentence("我", "书房", "写作业")然后再写三行调用,分别改成:
- 小猫在院子里捉蝴蝶
- 爸爸在厨房做晚饭
- 我用稻草人守卫田地
运行之后看看输出是否和预期一样。这一步的目的,是让你亲手感受“实参的位置必须和形参一一对应”。
任务二:给“写诗机器人”加上默认参数
定义下面这个函数,它用来调用大模型写一首小诗:
def poem(theme, style="童趣", lines=4): prompt = f"请写一首主题为{theme}、风格{style}、共{lines}行的短诗。" # 此处假装调用大模型API返回结果 return prompt先调用poem("彩虹")和poem("大海", "悲伤"),观察不同位置传参的效果。再把默认参数改成你自己喜欢的风格,比如“奇幻”“豪迈”,看看函数的默认行为变化。
这里训练的是“默认参数是备用方案”的思路。不传就按默认,传了就用自己的。
任务三:用关键字参数打乱顺序
接着上面的函数,用关键字参数调用一次:
print(poem(lines=6, style="科幻", theme="太空"))注意顺序完全颠倒,但结果依然正确。然后你再写一个自己的函数,比如make_diary(date, weather, mood),至少包含三个参数,分别用位置参数和关键字参数各调用一次,并打印结果。
这三道任务全部完成之后,你其实已经把函数参数最核心的五种玩法都用过了:普通位置参数、默认参数、关键字参数、形参实参、以及通过改参数影响大模型输出。
附加挑战:对比不同temperature下AI的答案
如果你已经能成功调用大模型API,可以挑战一下:
for t in [0.2, 0.7, 1.4]: reply = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "user", "content": "请用一句话向朋友推荐你的学校"} ], temperature=t ) print(f"temperature={t}: {reply.choices[0].message.content}")看看三次回答差别有多大。这个挑战题就是想告诉你:**真正的“提示词工程”,就是在和一堆参数打交道。**谁更懂参数,谁就能让大模型干出更漂亮的话。
8. 给家长和老师的三句悄悄话
这一课的内容,很多成年人看了都觉得不难,但真正教小学生的时候还是有一些讲究。我自己上这节课的时候踩过一些坑,总结成三句话,供家长和老师参考。
第一句话:让孩子先动手改,再学概念。不要一开始就板书“形参、实参、默认参数”这堆名词。让孩子把make_juice("苹果")改成make_juice("香蕉"),看见输出变了,他自然理解了“原来括号里就是用来改要求的地方”。概念是为操作服务的,操作永远先走一步。
第二句话:用“点单”和“做手工”的场景,不要用数学题场景。函数参数本身就是生活经验的抽象,搭配“奶茶店点单”“组装四驱车选配件”“微波炉按加热时间”这些场景,小学生几乎一听就懂。一旦你拿数学函数、方程式来类比,很容易把孩子的兴趣浇灭。
第三句话:让孩子自己设计一个“麻烦的参数组合”。我发现小孩子最兴奋的时刻,不是按部就班完成任务,而是故意制造一个“错误”。比如让AI写诗时,把情感设成“开心”,主题设成“考试”,模型给出的回答往往让人哭笑不得。这种“故意使坏”的过程,恰恰让他们深刻体会到:参数对最终结果的影响有多大。
还有一个小技巧:准备几张空白卡片,让孩子把model、temperature、max_tokens、top_p、messages等常用参数抄在上面,每次调试代码时拿一张卡片,把参数值改一改、记录一下输出。这个过程其实是在培养一种非常宝贵的工程习惯——让每一次修改都有记录,让每一个参数都有对照。很多成年工程师都没有这个好习惯,小朋友从小养成,未来的学习会顺畅得多。
函数参数这个“秘密世界”,说到底就是“用输入控制输出”的世界。你会发出指令,你就会用函数;你能设计指令,你就能驾驭大模型。下一节课,我们准备进入更复杂的“多轮对话”场景,到时候messages参数会发挥更大的作用。先把今天这几个参数玩熟,下一课见。