page contents

Python 调大模型 API 五大坑,一次讲清楚

真正折腾人的,是这种情况:本地跑得挺顺,上线以后偶尔超时、JSON 解析失败、费用突然往上涨,同一个问题重试几次还给你写出几个不同答案。

attachments-2026-09-wwMYlFb86aa9f17075266.png大模型接口最烦的,不是调不通。

真正折腾人的,是这种情况:本地跑得挺顺,上线以后偶尔超时、JSON 解析失败、费用突然往上涨,同一个问题重试几次还给你写出几个不同答案。

代码可能就这么几行:

import requests

resp = requests.post(
    api_url,
    headers={"Authorization": f"Bearer {api_key}"},
    json={"model": model, "messages": messages}
)

print(resp.json())

Demo 这么写没毛病。

生产代码还这么写,我一般是不太敢的。

Python 调大模型 API,我踩下来比较集中的坑有五个。

1. 不设超时,一个请求能把线程一直挂着

这是我第一眼会查的地方。

模型接口和普通 HTTP 接口不太一样,首 Token 慢、模型排队、网络抖动,都可能把响应时间拉得很长。

如果代码没设置 timeout:

requests.post(api_url, json=payload)

服务端只要迟迟不回,这个请求就一直占着。

Web 服务里再来几十个这种请求,线程池很快就不好看了。

我一般把连接超时和读取超时拆开:

def ask_model(payload):
    return requests.post(
        api_url,
        headers=auth_headers,
        json=payload,
        timeout=(3, 45)
    )

3 秒连不上,我基本就不想等了。

后面的 45 秒留给模型生成。

具体数字别照抄,长文本生成和分类接口肯定不能用一套超时配置。重点是:必须有上限。

2. 一超时就重试,很容易把故障放大

这个坑比超时本身更麻烦。

有些代码喜欢这么干:

for _ in range(5):
    try:
        return ask_model(payload)
    except Exception:
        continue

看起来挺稳。

实际上一旦模型服务出现拥堵,你这边所有请求同时疯狂重试,本来只是接口有点慢,最后直接被自己打成雪崩。

我现在更喜欢把“能不能重试”先分清楚:

import random
import time
import requests

def call_with_retry(payload, retry=3):
    for i in range(retry):
        try:
            r = ask_model(payload)

            if r.status_code < 500 and r.status_code != 429:
                r.raise_for_status()
                return r

        except requests.Timeout:
            pass

        if i < retry - 1:
            time.sleep((2 ** i) + random.random())

    raise RuntimeError("model api unavailable")

429 限流、部分 5xx、网络超时,可以考虑重试。

参数错误、鉴权失败,你重试十遍也是错。

还有一个细节:大模型请求如果牵涉扣费或者外部工具调用,重试之前一定要考虑幂等。请求第一次到底有没有被服务端接收成功,有时候你并不知道。

3. 千万别相信模型一定返回合法 JSON

这个我见得太多了。

Prompt 里写:

请严格返回 JSON,不要输出其他内容。

然后代码里直接:

data = json.loads(answer)

早晚炸。

模型可能返回:

```json
{"level": "high", "reason": "库存异常"}


也可能前面多一句:

```text
分析结果如下:
{"level": "high"}

甚至 JSON 本身就少个引号。

只要业务代码强依赖结构化结果,就不要把“模型会听话”当接口协议。

如果供应商支持结构化输出、JSON Schema、工具调用,我会优先用这些能力。

拿到结果后也照样校验:

def parse_risk(data):
    level = data.get("level")
    reason = data.get("reason")

    if level not in {"low", "medium", "high"}:
        raise ValueError(f"bad level: {level}")

    if not isinstance(reason, str):
        raise ValueError("reason must be string")

    return level, reason

这一步不能省。

模型输出是外部输入,和用户提交表单其实没什么区别。

4. Prompt 一股脑全塞进去,Token 钱很快就烧起来了

刚接模型的时候最容易干一件事:

有多少上下文塞多少。

聊天历史全带上,数据库结果全带上,日志一次贴几百行。

功能确实能跑。

账单也会跑。

比如查一条异常日志,我更愿意先在 Python 里把噪音过滤掉:

def pick_error_lines(lines, trace_id):
    picked = []

    for line in lines:
        if trace_id not in line:
            continue
        if "ERROR" not in line and "WARN" not in line:
            continue

        picked.append(line)

    return picked[-30:]

先用确定性的程序做过滤,再让模型做判断。

别反过来。

能用 SQL 查出来的,不要把整张表扔给模型;能用正则处理的,也没必要消耗 Token 让模型帮你找字符串。

模型适合处理模糊判断,不适合替你偷懒做所有计算。

5. 只记录“调用失败”,出问题以后基本没法查

线上最没用的日志,大概长这样:

ERROR 调用AI接口失败

然后没了。

到底哪个模型?

耗时多少?

HTTP 状态码多少?

是不是限流?

输入多大?

哪一次重试?

全不知道。

这种日志我看到一般都得补。

至少把关键字段留出来:

import logging
import time
import uuid

log = logging.getLogger("llm")

def invoke(payload):
    req_id = uuid.uuid4().hex[:12]
    begin = time.monotonic()

    try:
        resp = ask_model(payload)

        log.info(
            "llm_done req=%s model=%s status=%s cost_ms=%d",
            req_id,
            payload.get("model"),
            resp.status_code,
            int((time.monotonic() - begin) * 1000)
        )

        resp.raise_for_status()
        return resp.json()

    except Exception as e:
        log.exception(
            "llm_failed req=%s model=%s cost_ms=%d err=%s",
            req_id,
            payload.get("model"),
            int((time.monotonic() - begin) * 1000),
            type(e).__name__
        )
        raise

注意,我一般不会直接把完整 Prompt 打进日志。

里面很可能带用户资料、业务数据、密钥甚至内部文档。

真要排查,记录请求 ID、模型、耗时、状态码、Token 用量这类信息通常已经够用了。敏感内容该脱敏就脱敏。

Python 接大模型,真正麻烦的地方基本都不在那一行 requests.post()。

接口调通可能十分钟。

把超时、重试、结构化输出、Token 成本、日志监控这些东西补齐,才算真正能往线上放。

尤其是重试和 JSON 解析这两个地方,我现在看到“裸奔代码”都会多看两眼。

平时不出事的时候,它们安安静静。

一旦模型服务抖一下,这些没处理的小地方就会一起冒出来。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

  • 发表于 2026-09-16 09:31
  • 阅读 ( 44 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2484 篇文章

作家榜 »

  1. Pack 2484 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章