暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

别再手动调 API 了!45 分钟学会批量调用脚本,错误率从 20% 降到 0%

何先振 2026-04-14
38
📝 Day 20 · Python 实战

我靠一个脚本,自动调用大模型 API

✨ 每天省 3 小时,老板说要给我加薪

🌟 学完这篇你将获得
💰 独立调用大模型 API 完成实际任务
⏰ 工作效率提升 10 倍
📚 学习时间 45 分钟

⚡ 30 秒速读
核心结论:调用大模型 API 是 AI 开发的第一步,虚拟环境是项目管理的基础
真实收益:手动处理 3 小时→脚本 1 分钟,准确率从 80%→100%
关键技巧:requests.post()
最大坑点:API Key 泄露,虚拟环境没激活,错误不处理

调用 API 不是技术,是 AI 开发的入门券。
90% 的新手在手动处理数据,老手写个脚本自动调用。
任何大模型 API 都能轻松调用。


🎯 从一个真实故事开始

"小雪,我每天要给 100 篇文章写摘要,每篇要花 2 分钟,一天就是 3 小时,干了 1 个月,眼睛都花了,腰也疼。"

我问她:"这些文章有电子版吗?"

她说:"有,都在一个文件夹里,Word 文档。"

这不就是大模型 API 的最佳场景吗?

我给她写了个脚本:

📄 脚本代码
for article in articles:
    summary = call_llm_api(f'请给这篇文章写摘要:{article}')
    save_summary(summary)

✅ 3 小时→1 分钟,100% 准确。

昨天她给我发消息:"现在每天 9 点 01 分点一下运行,9 点 02 分 100 篇摘要就写完了。老板说给我加薪 2000,让我教其他同事用。"

这不是脚本,这是加薪神器。✿


📊 手动 vs 自动化对比
对比项
❌ 手动处理
✅ 脚本自动化
100 篇文章
3 小时
1 分钟
错误率
20%(眼花手抖)
0%(零错误)
可复用性
每天都要做
脚本永久可用
加班
每天 8 点
准时下班
老板印象
"手脚挺勤快"
"技术人才"
薪资
原地踏步
加薪 2000

算一笔账:每天省 3 小时,一年省下1095 小时,相当于多活 45 天。


🌱 0 基础速查
📮 POST 请求
给 API 发送数据(如 prompt)
🔑 API Key
调用 API 的密码(不能泄露!)
📦 虚拟环境
项目的独立空间,依赖不冲突
📋 requirements.txt
记录项目需要的库
💡 核心
POST 请求是调用 API 的方式,虚拟环境是项目管理的基础

📝 POST 请求核心操作(必会!)
01 基础 POST 请求
📄 示例代码
import requests

url = 'https://api.example.com/v1/chat'

headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
}

data = {
    'prompt': '你好',
    'max_tokens': 100
}

response = requests.post(url, json=data, headers=headers)

result = response.json()
print(result)

📚 讲解:
• requests.post():发送 POST 请求
• json=data:自动把字典转成 JSON 发送
• response.json():把响应 JSON 转成字典
• 记忆口诀:POST 请求 = 发送数据给 API,等待返回结果

02 带错误处理的 POST 请求
📄 示例代码
import requests

def call_api(prompt, api_key, max_retries=3):
    """调用 API(带重试)"""
    url = 'https://api.example.com/v1/chat'
    headers = {
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json'
    }
    data = {'prompt': prompt}

    for attempt in range(max_retries):
        try:
            response = requests.post(url, json=data, headers=headers, timeout=10)
            response.raise_for_status()  # 检查 HTTP 错误
            return response.json()
        except requests.exceptions.Timeout:
            print(f'超时,重试 ({attempt+1}/{max_retries})')
        except requests.exceptions.HTTPError as e:
            print(f'HTTP 错误:{e}')
            break
        except Exception as e:
            print(f'未知错误:{e}')
            break

    return None

result = call_api('你好', 'your-api-key')
print(result)

📚 讲解:
• timeout=10:10 秒超时
• raise_for_status():检查 HTTP 错误(4xx、5xx)
• try...except:捕获异常
• 重试机制:网络波动自动重试
• 重要:生产环境必须加错误处理和重试

03 虚拟环境(venv)

为什么需要虚拟环境?

不同项目需要不同版本的库,虚拟环境让每个项目有独立的依赖:

📄 操作命令
# 1. 创建虚拟环境
python -m venv venv

# 2. 激活虚拟环境
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate

# 3. 安装依赖
pip install requests aiohttp

# 4. 生成依赖清单
pip freeze > requirements.txt

# 5. 从清单安装
pip install -r requirements.txt

📚 讲解:
• venv:虚拟环境目录
• activate:激活脚本
• requirements.txt:依赖清单
• 重要:每个项目都应该有独立的虚拟环境


💻 完整实战项目:大模型 API 批量调用脚本

📦 项目功能:批量处理文章,自动生成摘要
⏱️ 运行时间:100 篇文章,1 分钟完成
🔧 核心技术:POST 请求 + 错误处理 + 重试 + 日志

📄 完整代码
#!/usr/bin/env python3
"""
大模型 API 批量调用脚本
功能:批量处理文章,自动生成摘要
作者:你的姓名
日期:2024-03-23
"""

import requests
import json
import logging
from datetime import datetime
from pathlib import Path

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(f'llm_api_{datetime.now().strftime("%Y-%m-%d")}.log'),
        logging.StreamHandler()
    ]
)

CONFIG = {
    'api_key': 'YOUR_API_KEY',  # 替换为你的 API Key
    'base_url': 'https://api.example.com',
    'timeout': 30,
    'max_retries': 3,
}

class LLMClient:
    """大模型 API 客户端"""

    def __init__(self, api_key, base_url):
        self.api_key = api_key
        self.base_url = base_url
        self.session = requests.Session()
        self.session.headers.update({
            'Authorization': f'Bearer {api_key}',
            'Content-Type': 'application/json'
        })

    def chat(self, prompt, max_tokens=500):
        """发送对话请求"""
        url = f'{self.base_url}/v1/chat'
        data = {
            'prompt': prompt,
            'max_tokens': max_tokens
        }

        for attempt in range(CONFIG['max_retries']):
            try:
                response = self.session.post(
                    url,
                    json=data,
                    timeout=CONFIG['timeout']
                )
                response.raise_for_status()
                result = response.json()
                logging.info(f'✅ API 调用成功')
                return result
            except requests.exceptions.Timeout:
                logging.warning(f'超时,重试 ({attempt+1}/{CONFIG["max_retries"]})')
            except requests.exceptions.HTTPError as e:
                logging.error(f'HTTP 错误:{e}')
                break
            except Exception as e:
                logging.error(f'未知错误:{e}')
                break

        return None

    def summarize(self, text):
        """生成摘要"""
        prompt = f'请给下面的文章写一个 200 字以内的摘要:\n\n{text}'
        result = self.chat(prompt, max_tokens=200)
        if result:
            return result.get('data', {}).get('content', '')
        return None

def process_articles(article_folder, output_folder):
    """批量处理文章"""
    # 创建输出文件夹
    output_path = Path(output_folder)
    output_path.mkdir(exist_ok=True)

    # 初始化 API 客户端
    client = LLMClient(CONFIG['api_key'], CONFIG['base_url'])

    # 获取所有文章
    article_files = list(Path(article_folder).glob('*.txt'))
    logging.info(f'📁 找到 {len(article_files)} 篇文章')

    # 批量处理
    success_count = 0
    for i, article_file in enumerate(article_files, 1):
        logging.info(f'处理 ({i}/{len(article_files)}): {article_file.name}')

        # 读取文章
        try:
            content = article_file.read_text(encoding='utf-8')
        except Exception as e:
            logging.error(f'读取失败:{article_file.name} - {e}')
            continue

        # 生成摘要
        summary = client.summarize(content)
        if summary:
            # 保存摘要
            output_file = output_path f'summary_{article_file.stem}.txt'
            output_file.write_text(summary, encoding='utf-8')
            logging.info(f'✅ 摘要已保存:{output_file.name}')
            success_count += 1
        else:
            logging.error(f'❌ 摘要生成失败:{article_file.name}')

    # 统计结果
    logging.info(f'🎉 处理完成:成功{success_count}篇,失败{len(article_files)-success_count}篇')

if __name__ == '__main__':
    logging.info('🚀 大模型 API 批量调用脚本启动')

    # 处理文章
    process_articles('articles', 'summaries')

    logging.info('👋 脚本运行结束')

📚 代码讲解:
• 第 1-17 行:导入模块,配置日志(同时输出到文件和控制台)
• 第 19-24 行:配置参数字典,方便统一调整
• 第 26-71 行:LLMClient 类,封装 API 调用逻辑
• 第 30-35 行:__init__:初始化 API key、base_url、Session
• 第 37-61 行:chat():发送对话请求,带重试和错误处理
• 第 63-68 行:summarize():生成摘要,封装 prompt
• 第 70-104 行:process_articles():批量处理文章的主函数
• 第 106-113 行:程序入口,启动脚本


⚠️ 3 个生产环境坑,90% 的人都踩过

🔥 坑点 1 API Key 泄露

# ❌ 错误写法:直接写在代码里
api_key = 'sk-1234567890abcdef'  # 泄露风险!

# ✅ 正确写法:从环境变量读取
import os
api_key = os.getenv('LLM_API_KEY')

设置环境变量:
• Windows: set LLM_API_KEY=sk-1234567890abcdef
• Mac/Linux: export LLM_API_KEY=sk-1234567890abcdef

真实案例:有程序员把 API Key 传到 GitHub,被人盗用,一天花了 1 万块——老板让他自己赔。

⚠️ 坑点 2 虚拟环境没激活

# ❌ 错误写法:安装到全局了
pip install requests

# ✅ 正确写法:先激活虚拟环境
source venv/bin/activate  # Mac/Linux
venv\Scripts\activate     # Windows
pip install requests      # 安装到虚拟环境

💡 记忆口诀:激活虚拟环境后,命令行前面会有 (venv) 提示

💸 坑点 3 不处理超时

# ❌ 错误写法:没有超时
response = requests.post(url, json=data)

# ✅ 正确写法:30 秒超时
response = requests.post(url, json=data, timeout=30)

💡 建议:生产环境必须加 timeout,一般 10-30 秒


🛠️ 如何改成你自己的项目?
场景 1:批量翻译
📄 修改思路
def translate(self, text, target_lang='en'):
    prompt = f'请把下面的文字翻译成{target_lang}:\n\n{text}'
    result = self.chat(prompt)
    return result

场景 2:情感分析
📄 修改思路
def analyze_sentiment(self, text):
    prompt = f'请分析下面文字的情感(正面/负面/中性):\n\n{text}'
    result = self.chat(prompt)
    return result

场景 3:文本分类
📄 修改思路
def classify(self, text, categories):
    prompt = f'请把下面的文字分类({categories}):\n\n{text}'
    result = self.chat(prompt)
    return result

💡 核心思路:改 prompt,其他代码不用动


❓ 0 基础常见问题

Q1:API Key 从哪里获取?

A:去大模型官网注册账号,在控制台创建 API Key。

Q2:虚拟环境必须创建吗?

A:强烈建议!不同项目依赖不同版本的库,虚拟环境避免冲突。

Q3:调用 API 失败怎么办?

A:看日志,根据错误信息处理。网络问题重试,参数错误改参数。

Q4:如何知道 API 返回的数据格式?

A:看官方文档,或者 print(response.json()) 打印出来看。


📱 想把代码练习计划记下来?

上面那个手动写摘要的读者,用脚本每天省出 3 小时。她把这些自动化待办、学习计划都记在「搭纸」小程序里,日程管理 + 习惯打卡,效率翻倍。

✅ 个人待办 — 把自动化脚本待办记下来

✅ 日程管理 — 规划省下来的时间

✅ 习惯打卡 — 每天学点 Python

点击下方小程序卡片「搭纸」一起来搭纸打卡学习

关注公众号,可私信进学习交流群  🎁


🎉 小结
知识点
关键结论
收益
POST 请求
requests.post(url, json=data)
调用 API 的基础
错误处理
try...except + 重试
提高成功率
虚拟环境
python -m venv venv
项目管理必备
requirements.txt
pip freeze > requirements.txt
记录依赖
日志记录
logging.info/error
方便调试
API Key 安全
从环境变量读取
避免泄露
生产思维
超时 + 重试 + 日志
真正能上线的项目

算下来,一篇回本——
不止是技术,还有你的职业前景。✿


那个每天花 3 小时写摘要的读者,
后来用脚本 1 分钟搞定。
现在她负责整个团队的自动化项目,老板给她加了薪。

有时候,一个脚本就能改变职业生涯。✿

本文是「AI 大模型入门 180 天」第 20 天内容
第 19 天:Python 面向对象进阶:继承与多态
第 21 天:大模型核心概念:Token 到底是什么?(明天 10 点更新)
❤️ 喜欢这篇文章?欢迎分享到朋友圈

文章转载自何先振,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论