Python 8天极速入门笔记(大模型工程师专用):第五篇-函数(def定义,大模型代码复用核心)

一、开篇回顾 + 今日目标

  • 回顾:Day4掌握了if判断、for/while循环及两者结合用法,能实现模型参数校验、批量处理prompt和对话历史等逻辑,但代码复用性差------相同逻辑(如参数校验)每次使用都需重复编写,今日学习函数,解决代码复用问题,让大模型开发更高效。

  • 今日目标:

    • 熟练掌握函数的基础定义(def关键字)、调用方法,理解函数的核心作用;

    • 掌握函数的参数(必选参数、默认参数)和返回值(return),适配大模型开发场景;

    • 学会封装大模型相关函数(参数校验、批量调用、对话处理),实现代码复用;

    • 了解函数的基础易错点,能独立编写、调用简单函数,提升大模型脚本开发效率。

二、核心知识点(兼顾Python基础与大模型场景)

(一)函数的核心概念与作用(大模型开发必备)

    1. 核心定义:函数是一段封装好的、可重复调用的代码块,用于实现特定功能(如模型参数校验、批量调用大模型),调用时只需输入参数,无需重复编写代码。
    1. 核心作用(贴合大模型场景):
    • 代码复用:将常用逻辑(如参数校验、prompt批量处理)封装成函数,每次使用直接调用,避免重复编写;

    • 简化代码:将复杂逻辑拆分成多个函数,让大模型脚本结构更清晰,便于维护和修改;

    • 提升效率:后续开发大模型脚本、RAG应用时,可直接调用已封装的函数,大幅节省开发时间。

    1. 生活类比:函数就像大模型开发中的"工具模板"------比如"模型参数校验工具",提前做好模板(封装函数),每次需要校验参数时,只需输入参数,工具就会自动输出校验结果,无需重新制作模板。

(二)函数的基础语法(def定义+调用)

    1. 基础定义语法(必记):
    • 语法格式(注意缩进,函数体缩进4个空格):

    • def 函数名(参数1, 参数2, ...):

    • 函数体(实现特定功能的代码)

    • return 返回值(可选,无返回值可省略)

    • 关键说明:

      • def:定义函数的关键字,必须放在函数名前面;

      • 函数名:自定义名称,遵循Python命名规则(字母、数字、下划线组成,不能以数字开头,不能用关键字,建议见名知意,如check_model_params);

      • 参数:函数的输入,用于接收外部传递的数据(如模型参数temperature、max_tokens),可无参数、1个或多个;

      • 函数体:实现函数功能的核心代码,必须缩进;

      • return:用于返回函数执行结果(如参数校验的结果、批量处理后的prompt列表),无返回值时可省略,省略时函数默认返回None。

    1. 函数的调用(核心步骤):
    • 语法格式:函数名(参数值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之间)
    1. 易错点提醒(新手必看):
    • 忘记写def关键字,直接定义函数名,会报错;

    • 函数体未缩进或缩进不一致,会被视为非函数内代码,执行逻辑异常;

    • 调用函数时,参数数量与定义时不一致(如定义时需1个参数,调用时传入2个或0个),会报错;

    • 混淆函数定义和调用:def 函数名() 是定义,函数名() 是调用,不可只定义不调用(否则函数不会执行)。

(三)函数的参数(大模型场景重点)

  • 核心说明:参数是函数与外部交互的桥梁,大模型开发中,常用参数传递模型配置(temperature、max_tokens)、prompt、对话历史等数据,重点掌握2种参数:必选参数、默认参数。

    1. 必选参数(必填参数):
    • 定义:函数调用时必须传入的参数,不传入会报错,顺序与定义时一致;

    • 示例(大模型场景:封装函数,批量处理单个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的步骤
    1. 默认参数(可选参数):
    • 定义:函数定义时给参数指定默认值,调用时可传入新值(覆盖默认值),也可不传(使用默认值);

    • 语法格式: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)
    • 大模型场景:默认参数非常实用,可将常用的模型配置(如默认模型、默认温度)设为默认参数,调用时无需重复传入,减少代码冗余。

    1. 参数使用易错点:
    • 默认参数必须放在必选参数后面(如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关键字)

    1. 核心作用:将函数执行的结果返回给调用者,供后续代码使用(如参数校验结果、处理后的prompt、大模型响应等)。
    1. 基础用法:
    • 无返回值:函数体中无return,或return后无内容,默认返回None(可用于只执行操作,不返回结果,如打印提示);

    • 单个返回值:return 单个结果(如字符串、数字、列表、字典);

    • 多个返回值:return 结果1, 结果2, ...(本质是返回一个元组,可直接用多个变量接收)。

    1. 示例(大模型场景:多个返回值,批量校验模型参数):
    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}")
    1. 易错点提醒:
    • 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分钟巩固)

    1. 定义一个函数,接收一个模型名称(必选参数)和温度参数(默认值0.7),返回模型调用提示(如"调用模型qwen-7b,温度0.7,准备生成响应");
    1. 封装一个函数,批量校验模型配置列表,要求:temperature在0.5-0.9之间,max_tokens在512-1024之间,返回合法配置、不合法配置及不合法原因;
    1. 定义一个函数,接收prompt列表和前缀(默认值"请详细回答:"),过滤无效prompt后,给每个有效prompt添加前缀,返回处理后的列表,并统计有效prompt数量;
    1. 综合练习:封装一个函数,实现"参数校验→prompt处理→批量模拟调用"的完整流程,返回每个prompt的调用结果,要求包含函数说明文档(注释)。

六、次日预告

  • Day6将讲解Python函数的进阶用法(函数嵌套、匿名函数lambda),以及大模型开发中常用的模块导入(如import语句),学会模块导入后,可直接使用第三方库(如transformers、requests)调用真实大模型API,摆脱模拟调用,向实战更进一步!
相关推荐
七夜zippoe2 小时前
Python生态未来展望:从AI到科学计算——社区趋势与技术方向深度解析
开发语言·人工智能·python·技术方向·社区趋势
Python资讯站2 小时前
【Pycharm教程】如何让PyCharm使用Docker配置Python解释器?你只需要看这篇就够了!
python·docker·pycharm·python基础·python学习·python教学·配置python解释器
源码之屋2 小时前
计算机毕业设计:新能源汽车多维度数据分析系统 Django框架 Scrapy爬虫 可视化 数据分析 大数据 大模型 机器学习(建议收藏)✅
大数据·python·scrapy·django·汽车·课程设计·美食
天天代码码天天2 小时前
C# OnnxRuntime 部署 APISR 动漫超分辨率模型
开发语言·c#
南境十里·墨染春水2 小时前
C++ 笔记 赋值兼容原则(公有继承)(面向对象)
开发语言·c++·笔记
好好学习,天天向上~2 小时前
一套从 HTTP 抓取到动态页面爬取的 Python 全栈爬虫框架(附安装与实战)
爬虫·python·http
xyq20242 小时前
SQLite Insert 语句详解
开发语言
大数据新鸟2 小时前
Java 泛型(Generic)完整使用指南
java·windows·python