我用 Ollama 在本地跑大模型没问题模型随便换流量不花钱感觉挺好。但要做产品接入 AI 能力API 是绕不过去的路——本地模型推理太慢占内存量化后精度打折扣最重要的是没法稳定地产品化。本文的目标很简单让一个会 Python 的人30 分钟内能写出第一个调用 GPT 的程序。代码能跑理解到位坑都给你标出来。一、先搞懂几个基本概念磨刀不误砍柴工这几个概念搞不清楚后面写代码会一直懵。LLM API 是什么LLM API 的全称是 Large Language Model Application Programming Interface。翻译成人话就是你把一段文字对话请求发给云端的大模型模型处理完后返回一段文字回答整个过程按 token 计费。核心概念速览Prompt提示词你发给模型的那段文字。它决定了模型输出的质量上限。同样一个模型Prompt 写得好不好直接决定回答有没有用。Token计量单位模型不是按字数计费的是按 token 计费。一个 token 大约等于 0.75 个英文单词或者 1~2 个中文字符。你给模型发 1000 字的中文大概消耗 500~700 个 token。模型返回 500 字大概再消耗 200~300 个 token。Temperature随机性参数控制输出的随机程度取值范围 0~1。设为 0模型输出基本固定设为 1模型输出高度随机。大部分生产场景建议设在 0.7~0.9。Max Tokens输出上限限制单次回复的最大 token 数。这个很重要——不设上限模型可能一口气吐出几千字账单直接爆掉。API 类比就像点外卖点外卖调用 LLM API你下单选菜、填地址发请求Prompt 参数商家接单做菜模型处理请求骑手送餐上门返回结果按菜品计价按 token 计费区别在于API 的菜品是文字质量参差不齐不满意也不能差评退款。所以写好 Prompt 比选菜重要多了。API Key 是什么API Key 是你的身份凭证相当于账号密码。创建方式在下一节讲这里先强调三个最重要的原则不要泄露给前端代码。JavaScript 直接调用 OpenAI API 存在严重的安全风险你的 Key 会直接暴露在用户浏览器里。不要提交到 GitHub。很多人吃过这个亏GitHub 有机器人专门扫描代码库里的 API Key发现即标记资金被盗刷。统一管理在环境变量或配置文件中代码里只引用不写死。二、获取你的 API KeyOpenAI 官方打开 platform.openai.com注册/登录账号进入 Dashboard点击左侧API Keys点击Create new secret key复制生成的 Key格式类似sk-xxxx...重要提醒这个页面只显示一次 Key关闭后无法再次查看必须保存好。国内用户注意OpenAI 官方服务需要科学上网才能正常访问。如果你的网络无法访问 OpenAI 官网这一步就会卡住。国内可用的替代方案如果你没有稳定的科学上网条件或者觉得官方 API 贵以下平台提供 OpenAI 兼容接口硅基流动SiliconFlow国内厂商接入多个开源和商业大模型提供 OpenAI 兼容 API用法和官方完全一样只是 base URL 和 API Key 不同。免费额度对新用户比较友好。阿里云百炼阿里云的 AI 服务平台接入通义千问等模型同样提供兼容 OpenAI 的接口。百度智能云文心一言的 API 服务接口设计类似但不完全兼容 OpenAI 格式迁移时需要调整代码。本文使用OpenAI 官方接口进行演示因为它的接口规范已经成为行业标准其他平台的兼容接口用法基本一致学会官方接口之后迁移成本很低。三、Hello World10行代码调用 GPT先跑通一个最小可用的例子感受一下整个流程。fromopenaiimportOpenAI clientOpenAI(api_keysk-xxxx)# 替换成你的 API Keyresponseclient.chat.completions.create(modelgpt-4o,messages[{role:user,content:用一句话解释量子计算}])print(response.choices[0].message.content)运行之前先安装官方 SDKpipinstallopenai逐行解释fromopenaiimportOpenAI导入 OpenAI 官方 Python SDK这是目前最广泛使用的调用方式。clientOpenAI(api_keysk-xxxx)创建一个客户端实例填入你的 API Key。这里建议把 Key 放在环境变量里而不是直接写死在代码里importos clientOpenAI(api_keyos.environ.get(OPENAI_API_KEY))client.chat.completions.create(...)这是调用 chat completions 接口的方法即对话补全接口。OpenAI 提供了多个接口completions、chat/completions、embeddings、images 等对话场景用chat.completions。modelgpt-4o指定使用的模型。gpt-4o是 OpenAI 目前的旗舰多模态模型支持文本和图像输入。如果想省钱可以用gpt-4o-mini效果接近但价格低很多后面成本控制部分会细讲。messages[{role:user,content:用一句话解释量子计算}]messages是一个数组每个元素是一个消息对象。role表示说话的角色user用户你发送的消息assistantAI 模型的回复system系统指令用来给模型设定角色或行为规则这里只有一个 user 消息是最简单的单轮对话。print(response.choices[0].message.content)response是一个对象.choices是返回的选项列表通常只有一个.message是消息对象.content是消息的文本内容。这就是从 API 返回结果中取值的标准路径。踩坑点早期版本的 OpenAI 库v0.x返回的是字典格式新版本v1.0改成了对象格式。本文的代码基于 v1.0 版本。如果你的代码报错AttributeError先检查一下openai的版本pip show openai。四、进阶传入参数控制输出上面的代码能跑了但生产环境里你需要对输出有更多控制。以下是几个最常用的参数。Temperature控制随机性responseclient.chat.completions.create(modelgpt-4o,messages[{role:user,content:给我写一个 Python 快速排序}],temperature0.7# 0~1越高越随机)实际建议写代码、回答事实性问题0~0.3。这类场景需要确定性输出稳定可复现。写文案、头脑风暴0.7~0.9。需要一些变化和创意。0.9 以上基本就是开盲盒同一个 Prompt 跑三遍可能出来三个完全不同的答案。Max Tokens限制输出长度responseclient.chat.completions.create(modelgpt-4o,messages[{role:user,content:解释一下什么是 RESTful API}],max_tokens500# 限制最多返回 500 个 token)这个参数是必设的。我自己的习惯是任何面向用户的请求都设置max_tokens上限设为预期长度的 1.5 倍留一点余量。踩坑点max_tokens并不是保证输出恰好这么多而是告诉模型不要超过这个数字。如果设置为 10模型可能只输出 5 个 token 就停了。Top_p另一种控制随机性的方式Top_p 和 Temperature 通常二选一使用不要同时调。Top_p 的含义是模型只从概率累加达到 top_p 阈值的词里选择。设为 0.1 表示模型只在最可能的 10% 词汇中选择设为 1 表示用全部词汇。对于大多数场景固定用temperature就够了理解成本更低。Stream流式输出流式输出的核心好处是用户能实时看到模型打字而不是等几秒后突然看到完整答案。体验差距很大特别是输出较长内容时。fromopenaiimportOpenAI clientOpenAI(api_keyos.environ.get(OPENAI_API_KEY))streamclient.chat.completions.create(modelgpt-4o,messages[{role:user,content:用 500 字介绍 Python 的历史}],streamTrue# 开启流式输出)forchunkinstream:ifchunk.choices[0].delta.content:print(chunk.choices[0].delta.content,end,flushTrue)print()注意流式输出时chunk.choices[0].delta.content的内容是增量追加的所以用end避免换行用flushTrue确保实时打印。流式输出的响应对象不是choices[0].message.content而是choices[0].delta.content取值方式完全不同。五、多轮对话让 GPT 记住上下文多轮对话是 AI 应用的基石。单轮对话只能一问一答多轮对话才能实现真正的交互——用户追问、模型理解上下文、给出连贯回答。核心机制messages 数组积累上下文fromopenaiimportOpenAI clientOpenAI(api_keyos.environ.get(OPENAI_API_KEY))messages[{role:system,content:你是一个 Python 助教用简洁的语言解释概念不超过 100 字},{role:user,content:什么是装饰器},{role:assistant,content:装饰器是 Python 中一种简洁的函数式编程技巧。},{role:user,content:能举个代码例子吗},]responseclient.chat.completions.create(modelgpt-4o,messagesmessages)print(response.choices[0].message.content)这个例子里messages 数组里有四条消息system设定角色和行为约束这里限制了回答长度user第一次提问assistant模型之前的回答这很关键——告诉模型我之前是这样回答的user追问最后一条 user 消息发出时模型已经看到了之前的所有对话因此能理解举个代码例子是在接着前面的装饰器话题往下问。实践中的坑不要无限制追加消息messages 数组不是越长越好原因有两个成本问题每次请求都会把整个 messages 数组传给 APItoken 数直接决定费用。100 条消息的对话每次请求都要传这 100 条的 token 消耗比 10 条消息的对话贵 10 倍。注意力衰减大模型的上下文窗口虽然很长GPT-4o 是 128K tokens但模型对远处信息的关注度会衰减。就像人读一篇超长文章前面的内容读到后面早就忘了。推荐的实践方案保留最近 N 轮对话建议 10~20 轮以及第一条 system 消息超出部分直接丢弃。以下是一个简单的上下文窗口管理函数deftrim_messages(messages,keep_recent20):保留最近 N 条消息 system 消息system_msg[mforminmessagesifm[role]system]others[mforminmessagesifm[role]!system]returnsystem_msgothers[-keep_recent:]这个函数把 system 消息放在最前面因为模型对开头的内容注意力最强然后追加最近 N 条消息。六、Function Calling让 GPT 做实事这是 GPT 能真正落地到产品里的关键能力。Function Calling 的工作原理是GPT 识别到你需要执行某个具体操作比如查天气、查数据库、发邮件不是在文本里编造答案而是返回一个结构化的函数调用请求告诉你的代码请调用 get_weather 函数参数是 city‘北京’。你的代码执行完函数再把结果传回去GPT 结合结果生成最终回答。完整示例查天气fromopenaiimportOpenAI clientOpenAI(api_keyos.environ.get(OPENAI_API_KEY))# 第一步定义可用的工具tools[{type:function,function:{name:get_weather,description:获取指定城市的当前天气,parameters:{type:object,properties:{city:{type:string,description:城市名如北京、上海、东京}},required:[city]}}}]# 第二步发请求告诉 GPT 有这些工具可用responseclient.chat.completions.create(modelgpt-4o,messages[{role:user,content:北京今天天气怎么样适合穿什么}],toolstools)# 第三步解析 GPT 返回的工具调用请求tool_callsresponse.choices[0].message.tool_callsiftool_calls:forcallintool_calls:func_namecall.function.name argscall.function.arguments# JSON 字符串print(fGPT 请求调用:{func_name}, 参数:{args})# 在这里执行真实的 get_weather(北京) 调用# weather_result get_weather(北京)# ...当你运行这段代码时GPT 不会输出北京今天是晴天…这样的文字而是返回一个 tool_call包含get_weather函数名和{city: 北京}参数。你的代码负责解析 tool_calls执行对应的真实函数这里需要你自己实现 get_weather可以用真实天气 API把执行结果再传回 GPT# 第四步把函数执行结果传回模型获取最终回答# 假设 get_weather 返回了真实数据weather_result北京今天晴气温 26 度湿度 40%空气质量良好# 把结果作为 tool 类型消息追加到 messages 中messages[{role:user,content:北京今天天气怎么样适合穿什么},{role:assistant,content:None,tool_calls:tool_calls},{role:tool,tool_call_id:tool_calls[0].id,content:weather_result}]final_responseclient.chat.completions.create(modelgpt-4o,messagesmessages,toolstools# 还需要再传一次告诉模型可以继续调用工具)print(final_response.choices[0].message.content)实际应用场景Function Calling 的典型应用场景AI 客服机器人识别用户意图后调用订单查询、退换货处理、地址修改等真实业务接口自动化助手帮用户查日历、查天气、发邮件、定闹钟每一步都有真实的副作用数据查询工具用户用自然语言提问GPT 解析成 SQL 或 API 参数执行查询后返回结果智能文档助手用户上传文档后问问题GPT 调用搜索或摘要函数返回准确答案本质上Function Calling 让 GPT 从一个会说话的语言模型变成了一个有行动能力的智能代理——它能感知、能决策、能操作。七、常见错误与处理写代码的人没有不踩坑的把我见过最多的几个列出来。401 UnauthorizedAuthenticationError: Incorrect API key providedAPI Key 填错了或者 Key 失效了。检查三件事Key 是否完整复制有没有漏掉开头或结尾的字符Key 是否过期或被撤销去 platform.openai.com 查看状态环境变量是否正确设置os.environ.get(OPENAI_API_KEY)是否真的是你的 Key429 Rate LimitRateLimitError: That model is currently overloaded with requests请求太快被限流了。解决方法在请求之间加延迟time.sleep(1)看一下你的套餐等级免费账号的 QPS每秒请求数很低如果是高频调用场景考虑申请更高的 rate limit500 Server ErrorInternalServerError: The server had an error while processing your requestOpenAI 那边出问题了和你这边代码无关。去 status.openai.com 看一下服务状态等着就行。生产环境建议加上重试逻辑用tenacity库实现指数退避重试fromtenacityimportretry,stop_after_attempt,wait_exponentialretry(stopstop_after_attempt(3),waitwait_exponential(multiplier1,min2,max10))defcall_gpt(messages):returnclient.chat.completions.create(modelgpt-4o,messagesmessages)400 Invalid Request Error通常是你的请求格式有问题比如messages 数组格式写错了temperature 超过 2新版支持到 2但旧版只支持 0~1model 名称拼写错误看错误信息里的param字段那里会指出具体哪个参数出了问题。Context Length ExceededBadRequestError: This models maximum context length is 128000 tokens对话太长了超出模型的上下文窗口。GPT-4o 的上下文窗口是 128K tokens足够长但不是无限的。解决办法就是第五章讲的消息窗口管理——定期清理旧消息不要无限追加。Timeout请求超时模型响应太慢或者网络有问题。可以单独设置 timeout单位是秒responseclient.chat.completions.create(modelgpt-4o,messagesmessages,timeout30.0# 30 秒超时)八、成本控制别让 API 账单爆了这是很多人在生产环境里最关心的问题。Token 计费规则OpenAI 的计费模型是输入和输出分开计费单位是每千 token 多少钱。以下是本文撰写时的大致参考价格实际价格以官方定价页为准模型输入 $/1M tokens输出 $/1M tokensgpt-4o$2.5$10gpt-4o-mini$0.15$0.6gpt-4o-mini 比 gpt-4o 便宜约 16 倍。对于大多数场景客服对话、代码生成、文案撰写gpt-4o-mini 的效果差异普通用户几乎感知不到。中文 Token 消耗特别说明英文按 token 计费时每个 token 大约对应 0.75 个单词。但中文是字符级别的一个汉字往往就是一个 token。换句话说同样字数的文本中文的 token 消耗量通常是英文的 1.5~2 倍。OpenAI 官方提供了一个 tokenizer 工具platform.openai.com/tokenizer输入任何文字就能看到实际消耗了多少 token。控制成本的具体方法方法一用 gpt-4o-mini 代替 gpt-4o这是最直接有效的降本手段。大多数产品场景下mini 模型完全够用。我自己在做的几个项目能用 mini 的全换成了 miniAPI 账单直接降了一个数量级。什么时候必须用 gpt-4o需要更强推理能力的时候比如复杂的多步骤推理、要求长输出的创意写作、需要更精确的代码生成。普通对话和简单任务mini 够用了。方法二设置 max_tokens 上限每个请求都设一个合理的上限避免模型刹不住车吐出太多内容。这个上限应该略高于你期望的最大长度比如你希望回答不超过 300 字就设max_tokens500左右。方法三精简 system promptsystem prompt 也是要消耗 token 的。很多人把 system prompt 写得又臭又长既浪费钱又容易让模型产生混乱。好的 system prompt 应该简洁有力几句话说明角色和约束就够了。方法四定期清理对话历史不要让对话无限增长。每次对话开始时传入一个精简的 context或者定期对历史消息做摘要归档。这不只省钱还能提高模型输出的质量。九、Python 生态工具推荐除了 OpenAI 官方 SDKPython 生态里还有几个值得了解的库。LiteLLM一个接口调用 100 模型fromlitellmimportcompletion responsecompletion(modelgpt-4o,messages[{role:user,content:你好}])LiteLLM 的核心价值是统一接口。不管你要调用 OpenAI、Anthropic、Google、Azure还是本地的 Ollama 模型接口都是一样的。换模型只需要改一个参数不动业务逻辑代码。对于需要对比多个模型效果、或者需要灵活切换模型的团队LiteLLM 很有价值。LangChain构建复杂 AI 应用LangChain 是目前最流行的 AI 应用开发框架核心概念包括Chain把多个步骤串联起来比如查数据库 → 拼 prompt → 调用 API → 解析结果Agent让模型自主决定调用哪些工具Memory管理对话历史和上下文LangChain 很强大但上手曲线比较陡。我的建议是先用官方 SDK 学会基础调用理解 API 的本质之后再用 LangChain 来组织复杂逻辑。不要一上来就上框架否则容易变成用 LangChain 的方式调用 API而不是理解 API 的方式来用 LangChain。Instructor结构化输出有时候你不需要 GPT 生成自然语言而是需要它返回结构化的 JSON。比如从简历文本中提取姓名、邮箱、工作年限这三个字段。Instructor 就是一个专门解决这个问题的库importinstructorfrompydanticimportBaseModelclassResumeInfo(BaseModel):name:stremail:stryears_exp:intresponseclient.chat.completions.create(modelgpt-4o-mini,messages[{role:user,content:resume_text}],response_modelResumeInfo# 直接指定输出结构)比 Function Calling 更轻量适合简单且确定的结构化提取场景。我的建议先打好基础本教程全程使用 OpenAI 官方 SDK原因很简单——官方 SDK 是理解 API 本质的最佳路径。你理解了 requests/response 的完整结构再去看 LangChain 的封装就能明白它在做什么而不是被框架带着跑。学完这十行代码之后按需引入其他工具。工具是手段不是目的。十、我的判断最后说几句观点不保证全对但是我踩过很多坑之后的真实想法。API 调用 vs 本地模型真正产品用 API本地模型Ollama、vLLM、llama.cpp适合学习实验、离线场景、数据隐私敏感场景。产品级应用API 还是更稳定的选择。本地模型的问题是推理速度受硬件限制GPU 成本也不低而且部署运维有额外复杂度。对于大多数团队用 API 的性价比更高。GPT-4o mini 解决了贵这个问题之前很多人觉得 GPT API 太贵不敢在产品里用。mini 模型的出现把成本降了十几倍这个顾虑基本消除了。我的判断是大多数面向用户的 AI 产品用 mini 就够了。省下来的钱可以多做几次 A/B 测试多迭代几个功能。最值钱的 AI 编程能力不是调用 API学会 10 行代码调用 GPT这不是护城河这是起点。真正的门槛在于设计好的 Prompt知道怎么写能让模型稳定输出你想要的结果怎么拆解任务让模型更容易理解怎么给约束条件让输出可控。判断什么适合用 AI 自动化不是所有问题都适合用 LLM 来解决。有些任务用规则引擎更简单、更稳定、更便宜。知道什么时候用 AI、什么时候不用比会用 AI 重要得多。系统集成能力把 AI 能力嵌入真实产品里涉及错误处理、日志、监控、降级方案、安全防护……这些工程能力决定了 AI 功能的可靠性。总结调用 GPT API 本身没有门槛。pip install、填 API Key、写 messages、拿 response30 分钟能学会。门槛在于你用它来解决什么问题。学会这 10 行代码只是起点。真正有意思的是你想用它来做什么——做一个能帮你读文档的助手一个自动回复的客服一个数据分析的工具还是一个能帮你写代码的副驾驶。想法比技术值钱。代码只是把想法实现出来的手段。