一、开篇回顾 + 今日目标
-
回顾:Day4掌握了if判断、for/while循环及两者结合用法,能实现模型参数校验、批量处理prompt和对话历史等逻辑,但代码复用性差------相同逻辑(如参数校验)每次使用都需重复编写,今日学习函数,解决代码复用问题,让大模型开发更高效。
-
今日目标:
-
熟练掌握函数的基础定义(def关键字)、调用方法,理解函数的核心作用;
-
掌握函数的参数(必选参数、默认参数)和返回值(return),适配大模型开发场景;
-
学会封装大模型相关函数(参数校验、批量调用、对话处理),实现代码复用;
-
了解函数的基础易错点,能独立编写、调用简单函数,提升大模型脚本开发效率。
-
二、核心知识点(兼顾Python基础与大模型场景)
(一)函数的核心概念与作用(大模型开发必备)
-
- 核心定义:函数是一段封装好的、可重复调用的代码块,用于实现特定功能(如模型参数校验、批量调用大模型),调用时只需输入参数,无需重复编写代码。
-
- 核心作用(贴合大模型场景):
-
代码复用:将常用逻辑(如参数校验、prompt批量处理)封装成函数,每次使用直接调用,避免重复编写;
-
简化代码:将复杂逻辑拆分成多个函数,让大模型脚本结构更清晰,便于维护和修改;
-
提升效率:后续开发大模型脚本、RAG应用时,可直接调用已封装的函数,大幅节省开发时间。
-
- 生活类比:函数就像大模型开发中的"工具模板"------比如"模型参数校验工具",提前做好模板(封装函数),每次需要校验参数时,只需输入参数,工具就会自动输出校验结果,无需重新制作模板。
(二)函数的基础语法(def定义+调用)
-
- 基础定义语法(必记):
-
语法格式(注意缩进,函数体缩进4个空格):
-
def 函数名(参数1, 参数2, ...): -
函数体(实现特定功能的代码) -
return 返回值(可选,无返回值可省略) -
关键说明:
-
def:定义函数的关键字,必须放在函数名前面;
-
函数名:自定义名称,遵循Python命名规则(字母、数字、下划线组成,不能以数字开头,不能用关键字,建议见名知意,如check_model_params);
-
参数:函数的输入,用于接收外部传递的数据(如模型参数temperature、max_tokens),可无参数、1个或多个;
-
函数体:实现函数功能的核心代码,必须缩进;
-
return:用于返回函数执行结果(如参数校验的结果、批量处理后的prompt列表),无返回值时可省略,省略时函数默认返回None。
-
-
- 函数的调用(核心步骤):
-
语法格式:函数名(参数值1, 参数值2, ...),调用时需传入与参数对应的数值(无参数则无需传入);
-
示例(简单函数,无参数、无返回值):
python#定义函数:打印大模型调用提示 def print_model_prompt(): print("开始调用大模型,正在生成响应...") print("响应生成完成!") # 调用函数(直接写函数名+括号) print_model_prompt() # 可重复调用,无需重复编写函数体代码 print_model_prompt() -
示例(大模型场景:定义函数校验模型温度参数):
python# 定义函数:校验模型temperature参数 def check_temperature(temp): # 函数体:实现校验逻辑 if 0 <= temp <= 1.0: return "✅ 温度参数合法" else: return "❌ 温度参数不合法(需在0-1.0之间)" # 调用函数,传入参数(如0.8、1.2),接收返回值 result1 = check_temperature(0.8) result2 = check_temperature(1.2) # 打印返回结果 print(result1) # 输出:✅ 温度参数合法 print(result2) # 输出:❌ 温度参数不合法(需在0-1.0之间)
-
- 易错点提醒(新手必看):
-
忘记写def关键字,直接定义函数名,会报错;
-
函数体未缩进或缩进不一致,会被视为非函数内代码,执行逻辑异常;
-
调用函数时,参数数量与定义时不一致(如定义时需1个参数,调用时传入2个或0个),会报错;
-
混淆函数定义和调用:def 函数名() 是定义,函数名() 是调用,不可只定义不调用(否则函数不会执行)。
(三)函数的参数(大模型场景重点)
-
核心说明:参数是函数与外部交互的桥梁,大模型开发中,常用参数传递模型配置(temperature、max_tokens)、prompt、对话历史等数据,重点掌握2种参数:必选参数、默认参数。
-
- 必选参数(必填参数):
-
定义:函数调用时必须传入的参数,不传入会报错,顺序与定义时一致;
-
示例(大模型场景:封装函数,批量处理单个prompt):
python# 定义函数:处理单个prompt(必选参数prompt) def process_prompt(prompt): # 函数功能:给prompt添加前缀,适配大模型输入 processed_prompt = f"请基于以下需求生成专业回答:{prompt}" return processed_prompt # 调用函数:必须传入prompt参数,否则报错 prompt1 = process_prompt("介绍大模型参数调优方法") prompt2 = process_prompt("Python调用qwen-7b的步骤") print(prompt1) # 输出:请基于以下需求生成专业回答:介绍大模型参数调优方法 print(prompt2) # 输出:请基于以下需求生成专业回答:Python调用qwen-7b的步骤
-
- 默认参数(可选参数):
-
定义:函数定义时给参数指定默认值,调用时可传入新值(覆盖默认值),也可不传(使用默认值);
-
语法格式:def 函数名(参数1, 参数2=默认值):
-
示例(大模型场景:封装函数,调用大模型时设置默认参数):
python# 定义函数:模拟大模型调用(默认参数:model=qwen-7b,temperature=0.7) def call_model(prompt, model="qwen-7b", temperature=0.7): print(f"调用模型:{model}") print(f"温度参数:{temperature}") print(f"Prompt:{prompt}") return f"模型{model}响应:基于{prompt}生成回答" # 调用方式1:只传必选参数prompt(使用默认模型和温度) response1 = call_model("什么是RAG技术?") print(response1, "\n") # 调用方式2:传入prompt和model(覆盖默认模型,保留默认温度) response2 = call_model("Python列表用法", model="chatglm3-6b") print(response2, "\n") # 调用方式3:传入所有参数(覆盖所有默认值) response3 = call_model("大模型原理", model="llama-7b", temperature=0.8) print(response3) -
大模型场景:默认参数非常实用,可将常用的模型配置(如默认模型、默认温度)设为默认参数,调用时无需重复传入,减少代码冗余。
-
- 参数使用易错点:
-
默认参数必须放在必选参数后面(如def call_model(prompt, model="qwen-7b") 正确,def call_model(model="qwen-7b", prompt) 错误);
-
调用函数时,可按位置传参(如call_model("prompt", "chatglm3-6b")),也可按关键字传参(如call_model(prompt="prompt", model="chatglm3-6b")),推荐关键字传参(更清晰,不易出错);
-
默认参数的值只在函数定义时生效,后续修改默认参数变量,不会影响函数内的默认值。
(四)函数的返回值(return关键字)
-
- 核心作用:将函数执行的结果返回给调用者,供后续代码使用(如参数校验结果、处理后的prompt、大模型响应等)。
-
- 基础用法:
-
无返回值:函数体中无return,或return后无内容,默认返回None(可用于只执行操作,不返回结果,如打印提示);
-
单个返回值:return 单个结果(如字符串、数字、列表、字典);
-
多个返回值:return 结果1, 结果2, ...(本质是返回一个元组,可直接用多个变量接收)。
-
- 示例(大模型场景:多个返回值,批量校验模型参数):
python#定义函数:校验模型temperature和max_tokens两个参数,返回校验结果和参数状态 def check_model_params(temperature, max_tokens): # 校验温度 temp_status = "合法" if 0 <= temperature <= 1.0 else "不合法" # 校验max_tokens token_status = "合法" if 256 <= max_tokens <= 1024 else "不合法" # 多个返回值:返回两个参数的状态和整体校验结果 total_status = "全部合法" if temp_status == "合法" and token_status == "合法" else "部分不合法" return temp_status, token_status, total_status # 调用函数,接收多个返回值 temp_stat, token_stat, total_stat = check_model_params(0.7, 512) print(f"温度参数状态:{temp_stat}") print(f"max_tokens状态:{token_stat}") print(f"整体校验结果:{total_stat}") # 另一个测试案例 temp_stat2, token_stat2, total_stat2 = check_model_params(1.2, 200) print(f"\n温度参数状态:{temp_stat2}") print(f"max_tokens状态:{token_stat2}") print(f"整体校验结果:{total_stat2}") -
- 易错点提醒:
-
return语句执行后,函数会立即终止,后续代码不会执行(如return后面的print语句不会打印);
-
接收多个返回值时,变量数量需与返回值数量一致,否则会报错或出现变量赋值异常。
三、今日实操(代码可直接复制,贴合大模型场景)
-
实操1:基础函数定义与调用(入门必练)
python# 实操1:定义并调用函数,实现模型参数单个校验 # 1. 定义函数:校验max_tokens参数 def check_max_tokens(tokens): if 256 <= tokens <= 1024: return f"✅ max_tokens={tokens},配置合理" elif tokens < 256: return f"⚠️ max_tokens={tokens},过少,建议≥256" else: return f"⚠️ max_tokens={tokens},过多,建议≤1024" # 2. 调用函数,测试不同参数 print(check_max_tokens(512)) print(check_max_tokens(200)) print(check_max_tokens(1536)) # 实操1拓展:定义无参数、无返回值函数,打印大模型调用提示 def model_call_tip(): print("="*30) print("开始调用大模型...") print("参数校验中...") print("调用成功,正在生成响应...") print("="*30) # 调用函数 model_call_tip() -
实操2:函数参数练习(必选+默认参数,大模型场景)
python# 实操2:封装函数,模拟大模型调用,支持自定义参数 def mock_model_call(prompt, model="qwen-7b", temperature=0.7, max_tokens=1024): # 打印调用信息 print(f"【模型调用信息】") print(f"模型:{model}") print(f"温度:{temperature},最大tokens:{max_tokens}") print(f"Prompt:{prompt}") # 返回模拟响应 return f"【模拟响应】基于{model}模型,针对'{prompt}'生成专业回答(实际开发替换为真实API调用)" # 调用方式1:只传必选参数prompt response1 = mock_model_call("介绍Python函数的用法") print(response1, "\n") # 调用方式2:传入prompt和部分默认参数 response2 = mock_model_call("RAG如何结合大模型", model="chatglm3-6b", temperature=0.8) print(response2, "\n") # 调用方式3:传入所有参数,覆盖默认值 response3 = mock_model_call("大模型参数调优技巧", model="llama-7b", temperature=0.6, max_tokens=512) print(response3) -
实操3:函数返回值练习(多个返回值,批量处理)
python# 实操3:封装函数,批量处理对话历史,返回有效对话和无效对话 def filter_chat_history(chat_history): valid_chat = [] # 有效对话 invalid_chat = [] # 无效对话(空内容、纯空格) for msg in chat_history: # 检查对话是否包含必要的键 if "role" not in msg or "content" not in msg: invalid_chat.append(msg) continue # 过滤空内容、纯空格的对话 if msg["content"].strip() != "": valid_chat.append(msg) else: invalid_chat.append(msg) # 多个返回值:有效对话列表、无效对话列表 return valid_chat, invalid_chat # 测试函数 test_chat = [ {"role": "user", "content": "Python函数怎么用?"}, {"role": "assistant", "content": ""}, {"role": "user", "content": " "}, {"role": "assistant", "content": "函数需用def定义,调用时传入参数即可"}, {"role": "user", "content": "函数返回值怎么获取?"} ] valid, invalid = filter_chat_history(test_chat) print("有效对话:", valid) print("无效对话:", invalid) # 实操3拓展:调用函数后,批量调用大模型回答有效用户问题 print("\n批量回答有效用户问题:") for msg in valid: if msg["role"] == "user": print(f"\n用户问题:{msg['content']}") print(f"大模型响应:针对该问题的专业解答(实际开发替换为真实API调用)") -
实操4:综合实操(封装大模型批量调用函数)
python# 实操4:综合封装,实现大模型批量调用+参数校验 def batch_call_model(prompts, model="qwen-7b", temperature=0.7, max_tokens=1024): """ 功能:批量调用大模型,先校验参数,再处理prompt,最后模拟调用 参数: prompts:必选参数,prompt列表 model:默认参数,调用的模型,默认qwen-7b temperature:默认参数,温度,默认0.7 max_tokens:默认参数,最大生成tokens,默认1024 返回值:批量调用结果列表 """ # 第一步:校验参数合法性 params_valid = True if not (0 <= temperature <= 1.0): print(f"❌ 温度参数{temperature}不合法,需在0-1.0之间") params_valid = False if not (256 <= max_tokens <= 2048): print(f"❌ max_tokens参数{max_tokens}不合法,需在256-2048之间") params_valid = False if not params_valid: return [] # 第二步:处理prompt(过滤无效prompt) valid_prompts = [p for p in prompts if p.strip() != ""] if not valid_prompts: print("❌ 无有效prompt,无法批量调用") return [] # 第三步:批量模拟调用大模型 call_results = [] for idx, prompt in enumerate(valid_prompts, start=1): response = f"模型{model}(温度:{temperature})响应:基于'{prompt}'生成专业回答" call_results.append({ "prompt序号": idx, "prompt": prompt, "模型": model, "响应结果": response }) print(f"\n第{idx}个prompt调用完成") return call_results # 调用综合函数 test_prompts = [ "介绍RAG技术的应用场景", "", "Python如何封装大模型调用函数", " ", "大模型参数调优有哪些技巧" ] results = batch_call_model(test_prompts, model="chatglm3-6b", temperature=0.8, max_tokens=768) print("\n批量调用结果:") for res in results: print(res)
四、易错点汇总(新手避坑)
-
函数定义时,忘记写def关键字,或函数名不符合Python命名规则(如以数字开头、使用关键字);
-
函数体未缩进、缩进不一致,或缩进使用空格和Tab混用(建议统一用4个空格缩进);
-
调用函数时,参数数量、类型与函数定义不一致(如定义时需传入数字,却传入字符串);
-
默认参数位置错误,将默认参数放在必选参数前面;
-
return语句使用错误:return后多写逗号(如return a, b, 会返回元组)、return语句后还有可执行代码(不会执行);
-
函数内使用未定义的变量(如参数名拼写错误,或引用了函数外部未传入的变量);
-
混淆函数的"定义"和"调用",只定义函数不调用,导致函数无法执行。
五、今日练习(10分钟巩固)
-
- 定义一个函数,接收一个模型名称(必选参数)和温度参数(默认值0.7),返回模型调用提示(如"调用模型qwen-7b,温度0.7,准备生成响应");
-
- 封装一个函数,批量校验模型配置列表,要求:temperature在0.5-0.9之间,max_tokens在512-1024之间,返回合法配置、不合法配置及不合法原因;
-
- 定义一个函数,接收prompt列表和前缀(默认值"请详细回答:"),过滤无效prompt后,给每个有效prompt添加前缀,返回处理后的列表,并统计有效prompt数量;
-
- 综合练习:封装一个函数,实现"参数校验→prompt处理→批量模拟调用"的完整流程,返回每个prompt的调用结果,要求包含函数说明文档(注释)。
六、次日预告
- Day6将讲解Python函数的进阶用法(函数嵌套、匿名函数lambda),以及大模型开发中常用的模块导入(如import语句),学会模块导入后,可直接使用第三方库(如transformers、requests)调用真实大模型API,摆脱模拟调用,向实战更进一步!