云计算百科
云计算领域专业知识百科平台

编程启蒙|Scratch 转 Python 系列第 19 天:AI API 调用入门(requests + JSON + 大模型对接实战)

📚 系列定位:从 Scratch 积木到 Python 代码,双向对照学 AI 编程 ✍️ 作者:梅雅达编程工作室 🎯 本篇难度:⭐⭐⭐⭐⭐(实战高阶)


一、摘要

Scratch 转 Python 系列第 19 天——今天是让你的 Python 真的会说话的一天!过去 18 天我们写的 AI Agent 回复都是"预设话术",本篇终于要接真实大模型 API:用 requests 库发送 HTTP 请求、组装 JSON Body、带上鉴权 Key、处理响应,让你的 Agent 从"背台词"进化到"真的会思考"。本篇同时讲清楚 API 调用四大关键点——鉴权 / 超时 / 重试 / 错误处理,并给出可直接跑起来的大模型对接 Demo(含 DeepSeek、通义千问、扣子三条备选路径),一次学会通用套路。


二、本节课学习目标

  • 🎯 掌握 requests 库四大用法:GET / POST / headers / json 参数
  • 🎯 掌握 API 鉴权 4 种主流方式:URL 参数 / Header Bearer / Basic / 自定义
  • 🎯 学会 JSON 请求体拼装 + 响应解析 的完整链路
  • 🎯 AI 应用场景:把 Day 15-18 的 Agent 接入真实大模型 API,做出一个"会思考"的 AI 助手

  • 三、专业名词通俗释义

    名词通俗解释Scratch 类比
    API Application Programming Interface,程序对外提供服务的接口 别人家的舞台开放了几个"广播消息"通道让你用
    HTTP 请求 你的程序去网上请别人做事的"标准信封" 精灵广播消息给远方的舞台,等回应
    GET / POST 常见两种请求方式:GET 拿数据,POST 提交数据 广播查询 vs 广播提交表单
    Headers(请求头) 信封上的附加信息,比如"我是谁"“要什么格式” 广播消息附带的自定义变量
    Body(请求体) 信封里装的具体内容,一般是 JSON 广播消息带的完整内容包
    API Key 你的专属通行证,证明"我是付费用户可以调" 舞台入场券,没它不让进
    响应(Response) 服务器给你的"回信",一般也是 JSON 远方舞台广播回来的消息包
    状态码 回信开头的"办得成没"标记:200 成功、401 没权限、429 太频繁… 广播回执上的成功/失败标记

    四、分模块双向对照知识点

    模块 1:requests 基础请求

    Scratch 积木逻辑:

    Scratch 里"广播消息"是把消息送给舞台上其他精灵;requests 是把消息送到互联网上另一台电脑。核心动作都是"发消息 → 等回复"。 在这里插入图片描述

    Python 源码(含 Scratch 积木注释):

    import requests

    # 【Scratch积木】广播消息 (GET 请求) 到 (百度)
    response = requests.get("https://www.baidu.com")

    # 【Scratch积木】读取回执的 (状态码)
    print("状态码:", response.status_code)

    # 【Scratch积木】读取回执的 (文本内容)
    print("前 100 字:", response.text[:100])

    运行结果:

    状态码: 200
    前 100 字: <!DOCTYPE html><!–STATUS OK–><html> <head><meta http-equiv="content-type"…

    核心易错说明:

    • requests 是第三方库,需要 pip install requests 才能用
    • response.text 是字符串,response.json() 才能自动解析 JSON

    模块 2:POST + JSON Body + Headers

    Scratch 积木逻辑:

    Scratch 广播消息可以带一个变量。真实 API 一般要求你把"要问的问题"包装成 JSON 送过去,同时头部要带 API Key 证明身份。 在这里插入图片描述

    Python 源码(含 Scratch 积木注释):

    import requests

    url = "https://api.example.com/chat"

    # 【Scratch积木】新建字典「请求头」→ 装 API Key
    headers = {
    "Authorization": "Bearer sk-你的APIKey",
    "Content-Type": "application/json",
    }

    # 【Scratch积木】新建字典「请求体」→ 装问题
    payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "你好呀"}],
    }

    # 【Scratch积木】广播 POST 请求 (带头 + 带体)
    response = requests.post(url, headers=headers, json=payload, timeout=30)

    # 【Scratch积木】读取回执的 JSON 结果
    data = response.json()
    print(data)

    运行结果(示例):

    {'id': 'chat-xxx', 'choices': [{'message': {'role': 'assistant', 'content': '你好呀!很高兴见到你~'}}]}

    核心易错说明:

    • json=payload 参数会自动把字典序列化成 JSON 字符串并加 Content-Type: application/json,别写成 data=payload(那样发的是表单)
    • timeout=30 是必须加的!否则接口卡住会让整个程序一直挂着

    模块 3:超时与重试

    Scratch 积木逻辑:

    Scratch 广播如果收不到回复不会自动重发。真实 API 网络抖一下就可能失败,我们要写"最多重试 3 次"的健壮逻辑。 在这里插入图片描述

    Python 源码(含 Scratch 积木注释):

    import requests
    import time

    def call_api_with_retry(url, headers, payload, max_retries=3):
    # 【Scratch积木】重复 (max_retries) 次
    for attempt in range(1, max_retries + 1):
    try:
    # 【Scratch积木】发请求
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    # 【Scratch积木】如果 状态码 = 200 那么返回
    if r.status_code == 200:
    return r.json()
    else:
    print(f"第 {attempt} 次失败:状态码 {r.status_code}")
    except requests.exceptions.RequestException as e:
    # 【Scratch积木】捕获异常,打印后重试
    print(f"第 {attempt} 次异常:{e}")
    # 【Scratch积木】等待 (2 的 attempt 次方) 秒(指数退避)
    time.sleep(2 ** attempt)
    return None # 全部重试失败

    运行结果(示例):

    第 1 次异常:Connection timed out
    第 2 次异常:Connection timed out
    {'choices': […]}

    核心易错说明:

    • 指数退避(2, 4, 8 秒)比"每次都等 1 秒"更友好,能给服务器喘息时间
    • 别搞"死循环重试",一定要有 max_retries 上限

    模块 4:响应解析与错误码判断

    Scratch 积木逻辑:

    API 回执像信封,里面有可能是成功内容,也可能是错误说明。我们要按状态码分不同处理。 在这里插入图片描述

    Python 源码(含 Scratch 积木注释):

    r = requests.post(url, headers=headers, json=payload, timeout=30)

    # 【Scratch积木】根据 状态码 判断
    if r.status_code == 200:
    # 【Scratch积木】成功 → 取 JSON 内容
    print("回复:", r.json()["choices"][0]["message"]["content"])
    elif r.status_code == 401:
    print("❌ API Key 无效,请检查")
    elif r.status_code == 429:
    print("⚠️ 请求太频繁,稍后再试")
    elif r.status_code >= 500:
    print("⚠️ 服务器出错,稍后重试")
    else:
    print(f"其他错误:{r.status_code}{r.text}")

    运行结果(示例):

    回复: 你好呀!很高兴见到你~

    核心易错说明:

    • r.json() 如果响应不是合法 JSON 会抛异常,最好套 try/except
    • 大模型 API 返回结构各家不同(OpenAI 是 choices[0].message.content,其他家可能是 output.text),务必看文档

    五、综合实战项目:真实大模型 API 对接 Demo

    给 Day 17 的 CLI 聊天机器人换一个"真正的大脑"——把 Agent 的 chat() 从"预设话术"换成"调大模型 API"。

    Scratch 积木思路

  • 保留 Day 15-16 的 AIRole 基类
  • 新增 LLMAgent 子类,重写 chat() → 调用大模型 API
  • 三步:拼提示词 → 发请求 → 取回复
  • 全程 try/except 兜底:API 失败时退化成"预设话术",保证程序不崩
  • Python 完整可运行代码(片段)

    class LLMAgent(AIRole):
    """接入真实大模型 API 的 Agent"""

    API_URL = "https://api.deepseek.com/v1/chat/completions" # 可换成通义 / 扣子
    MODEL = "deepseek-chat"

    def __init__(self, name, role, style, api_key):
    super().__init__(name, style)
    self.role_name = role
    self.api_key = api_key
    self.system_prompt = f"你是一个{style}{role},名字叫{name}。请用符合人设的方式回答。"

    def chat(self, user_input):
    headers = {
    "Authorization": f"Bearer {self.api_key}",
    "Content-Type": "application/json",
    }
    payload = {
    "model": self.MODEL,
    "messages": [
    {"role": "system", "content": self.system_prompt},
    {"role": "user", "content": user_input},
    ],
    }
    try:
    r = requests.post(self.API_URL, headers=headers, json=payload, timeout=30)
    reply = r.json()["choices"][0]["message"]["content"]
    except Exception as e:
    reply = f"[API 调用失败,回退预设]收到:{user_input}"
    self.history.append({"user": user_input, "bot": reply})
    print(f"【{self.role_name}·{self.name}{reply}")
    return reply

    # 完整代码含 GET/POST 演示、重试封装、多 API 提供商切换
    # 见配套源码文件 day19_code.py

    运行结果预览:

    ===== 真实大模型 Agent Demo =====
    你 > 请用一句诗形容今天的心情
    【AI助手·小凌】清风入怀星未落,代码为伴亦悠然~
    你 > /exit
    再见👋

    💡 提示:Demo 里 api_key 请换成你自己的(DeepSeek、通义千问、扣子都有免费试用额度)。文件里也提供了"离线 mock 模式",没 Key 也能跑,方便同学们先看流程。


    六、高频易错点总结

  • ❌ 忘记 timeout:不加超时参数,网络卡死时程序死锁——永远加 timeout
  • ❌ API Key 硬编码进代码上传 GitHub:属于严重事故,会被恶意刷额度。请用环境变量或独立配置文件
  • ❌ 误用 data= 代替 json=:data=payload 发的是表单,json=payload 才是 JSON 请求体
  • ❌ 不处理 429 限流:请求太快被限流后如果不加等待直接重试,会被拉黑
  • ❌ 不打日志盲调:API 报错不看 response.text,只看状态码,出问题定位困难

  • 八、💡 学习提示

    为鼓励大家动手练习、吃透编程逻辑,本篇不提供 Scratch 成品源码,请对照截图亲手搭建积木完成复刻! 配套 Python 代码可直接复制运行学习。


    九、往期历史笔记

  • 编程启蒙|Scratch 转 Python 系列第 1 天:变量、数字运算积木双向对照(AI 基础数值计算实战)

  • 编程启蒙|Scratch 转 Python 系列第 2 天:分支判断 if 积木双向对照(AI 指令条件过滤实战)

  • 编程启蒙|Scratch 转 Python 系列第 3 天:循环重复积木双向对照(AI 批量循环处理,已收录 AI Agent 技术社区)

  • 编程启蒙|Scratch 转 Python 系列第 4 天:字符串文本积木双向对照(AI 提示词拼接、文本清洗实战)

  • 编程启蒙|Scratch 转 Python 系列第 5 天:自定义积木 / 函数双向对照(AI 工具封装、重复指令简化实战)

  • 编程启蒙|Scratch 转 Python 系列第 6 天:列表、数组积木双向对照(AI 底层语法 / AI 批量数据处理实战)

  • 编程启蒙|Scratch 转 Python 系列第 7 天:猜数字大挑战·升级版实战(AI 出题 + 二分查找最优解 + 完整命令行游戏 已被收录在智能体开发者社区)

  • 编程启蒙|Scratch 转 Python 系列第8天:节奏敲击机游戏实战(AI节奏谱生成实战)

  • 编程启蒙|Scratch 转 Python 系列第9天:字典/哈希表积木双向对照(AI大模型参数配置表实战)

  • 编程启蒙|Scratch 转 Python 系列第 10 天:问答闯关游戏实战(AI 题库管理 + 多关卡剧本)

  • 编程启蒙|Scratch 转 Python 系列第 11 天:文件读写积木双向对照(AI 训练数据存取实战)

  • 编程启蒙|Scratch 转 Python 系列第 12 天:记忆翻牌游戏实战(AI 图案主题包 + 存档排行榜 已被收录在2048 AI社区)

  • 编程启蒙|Scratch 转 Python 系列第 13 天:异常处理 try/except 积木双向对照(AI 接口调用容错实战)

  • 编程启蒙|Scratch 转 Python 系列第 14 天:AI 提示词管理工具实战(增删改查 + 存档导入 + 异常兜底)

  • 编程启蒙|Scratch 转 Python 系列第 15 天:类与对象积木双向对照(AI 角色类封装实战)已被智能体开发者社区收录

  • 编程启蒙|Scratch 转 Python 系列第 16 天:继承与多态积木双向对照(AI Agent 角色体系实战)已被智能体开发者社区收录

  • 编程启蒙|Scratch 转 Python 系列第 17 天:AI 聊天机器人游戏实战(AI 多角色对话 + 人设切换实战)已被DAMO开发者矩阵收录

  • 编程启蒙|Scratch 转 Python 系列第 18 天:模块导入与常用标准库积木双向对照(AI 工具箱模块化实战)

  • 编程启蒙|番外篇:AI自己学会了攻击电脑——我们为什么更要让孩子从小理解编程


  • 十、下一章预告

    第 20 天:综合大项目 AI Agent 助手(全系列知识串联收官)

    本系列收官大项目来了!我们将把 20 天所有知识串起来,做一个真正可用的 AI Agent 助手:

    • 多角色人设 + 动态切换(Day 15-17)
    • 真实大模型 API 对接(Day 19)
    • 多轮上下文记忆 + JSON 存档(Day 6/9/11/18)
    • 完整异常兜底 + CLI 交互(Day 13)
    • 模块化工程结构(Day 18)
    • AI 场景:亲手做一个属于自己的 AI 助手,可以每天用!

    系列大结局,一起冲!🚀


    十一、原创声明

    本文为「梅雅达编程笔记」原创技术教程,未经授权禁止转载、洗稿或用于商业培训。转载合作请联系工作室。系列内容持续更新中,欢迎收藏 CSDN 专栏「编程启蒙–scratch转python」追更 🍃

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 编程启蒙|Scratch 转 Python 系列第 19 天:AI API 调用入门(requests + JSON + 大模型对接实战)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!