如何调用OpenAI API
欢迎来到AI能力的源泉——OpenAI API!🧙♂️
OpenAI API是什么?
OpenAI API是访问OpenAI强大语言模型(如GPT-4、GPT-3.5等)的接口。通过这个API,你可以让这些模型为你的应用提供智能,从简单的文本生成到复杂的推理任务都能轻松实现。
为什么需要学习调用API?
想象一下,你有一个聪明的朋友,你有问题随时可以请教他,多么方便,但如果你要养活他,负责他的衣食住行,那成本就高了。所以调用API就像是给这个朋友装了个电话,随时随地都能请教他。
准备工作
1. 获取API密钥
使用接口必须有API密钥,这里介绍两种获取API密钥的方式:
2. 安装必要的库
基础调用示例
1. 基础聊天
让我们从最简单的聊天调用开始:
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 初始化客户端
client = OpenAI() # 自动从环境变量加载API密钥
# 进行简单的聊天补全
response = client.chat.completions.create(
model="gpt-4.1-nano", # 使用的模型,可以换成deepseek-chat等
messages=[
{"role": "system", "content": "你是一个乐于助人的助手。"},
{"role": "user", "content": "介绍一下Python编程语言的特点。"} # (1)
]
)
# 输出响应内容
print(response.choices[0].message.content)
# 输出结果:
"""
当然!Python是一种广泛使用的高级编程语言,具有以下主要特点:
1. 简洁易读:Python的语法强调可读性,代码结构清晰,用简洁的表达方式实现复杂的功能,适合初学者学习和开发。
...
(以下省略)
"""
此处的“role”的选择仅有三种,分别为“system”、“assistant”、“user”,一旦输入其他身份指令就会出现错误
🌟 小案例:智能客服机器人
假设你正在开发一个电商网站,需要一个智能客服来回答用户问题:
def customer_service_bot(user_question):
response = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[
{"role": "system", "content": "你是XYZ电商网站的客服助手。提供简短、准确、友好的回答。"},
{"role": "user", "content": user_question}
]
)
return response.choices[0].message.content
# 测试几个问题
questions = [
"你们的退货政策是什么?",
"我的订单什么时候能到?",
"你们接受哪些支付方式?"
]
for q in questions:
print(f"问题: {q}")
print(f"回答: {customer_service_bot(q)}")
print("-" * 50)
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
def customer_service_bot(user_question):
response = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[
{"role": "system", "content": "你是XYZ电商网站的客服助手。提供简短、准确、友好的回答。"},
{"role": "user", "content": user_question}
]
)
return response.choices[0].message.content
# 测试几个问题
questions = [
"你们的退货政策是什么?",
"我的订单什么时候能到?",
"你们接受哪些支付方式?"
]
for q in questions:
print(f"问题: {q}")
print(f"回答: {customer_service_bot(q)}")
print("-" * 50)
2. 文本嵌入
除了聊天接口,OpenAI还提供了embedding接口,可以用于将文本转换为向量,用于语义搜索、聚类等场景。
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 初始化客户端
client = OpenAI() # 自动从环境变量加载API密钥
response = client.embeddings.create(
model="text-embedding-3-large",
input="你好,世界!"
)
print(response.data[0].embedding)
# 输出结果:
"""
[-0.02768673375248909, -0.005102162249386311, -0.009185142815113068, 0.02303476259112358, 0.025085631757974625, -0.004908330272883177, 0.003298272844403982 ...
...
(以下省略)
"""
3. 图片读取
除了基本的聊天功能外,OpeanAI通过API接口还能实现对图片的读取及对图片内容的理解。
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 初始化客户端
client = OpenAI() # 自动从环境变量加载API密钥
# 要读取图片的网址,此处图片选择的为一个绿色精灵
# 图片网址url如下:
img_url = "https://www.handbook.cool/Agent%E5%85%A5%E9%97%A8/images/x2.png"
response = client.chat.completions.create(
model = 'gpt-4.1-nano', # 使用的模型,必须支持多模态,deepseek-chat尚不支持多模态
messages = [
{'role':"user",
'content':[
{"type":"text","text":"这张图片里面有什么东西?"},
{"type":"image_url","image_url":{"url": img_url}}
],
}
]
)
print(response.choices[0].message.content)
#输出结果
'''
这张图片是一只拟人化的绿色精灵或小妖精的卡通形象。它有大耳朵、大眼睛、带着笑容,露出两颗小尖牙。它穿着一件白色衬衫配红色蝴蝶结,背带裤和手套,整个形象充满活力和可爱。背景是带有光晕的黄色光线,突出它的形象。
'''

高级功能
1. 控制输出温度
温度参数控制输出的随机性,值越低越精确,值越高越创意:
# 低温度 - 更确定性的回答
response_factual = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=0.1 # 低温度,更确定性
)
输出结果
当然!这里有一个关于太空探索的故事,希望你喜欢。
---
**《星际旅程:寻找新家园》**
在不远的未来,人类已经掌握了先进的太空技术,开始向遥远的星系探索。地球资源逐渐枯竭,气候变化带来了巨大挑战。为了寻找新的家园,国际联合太空探索组织(ISEO)发起了一项史无前例的任务——“新地球计划”。
这次任务的主角是一艘名叫“星辰号”的太空飞船,由来自世界各地的科学家、工程师和宇航员组成的团队共同驾驶。飞船配备了最先进的人工智能系统“阿尔法”,可以协助他们进行导航、科研和生活。
经过数年的飞行,星辰号穿越了数百光年的距离,终于抵达了一个类似地球的行星——“新希望”。这个行星拥有适宜的气候、丰富的水资源和适合人类居住的环境。
然而,探索并非没有挑战。飞船在着陆过程中遇到了一场突如其来的风暴,损坏了部分设备。团队成员们齐心协 effort,利用有限的资源修复了飞船,并开始对新希望进行详细的调查。
在探索过程中,他们发现了丰富的生命迹象——微生物、植物甚至可能的动物。这让他们更加坚定了在这里建立新家园的信念。科学家们开始规划建设基地,准备未来的移民。
经过数月的努力,第一批人类开始在新希望上安家。虽然未来充满未知,但他们相信,凭借人类的勇气和智慧,星际的旅程只是刚刚开始。
这个故事告诉我们,探索未知不仅是为了寻找新土地,更是为了不断超越自我,迎接未来的无限可能。
---
希望这个故事能激发你对太空探索的想象!
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 初始化客户端
client = OpenAI() # 自动从环境变量加载API密钥
# 低温度 - 更确定性的回答
response_factual = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=0.1 # 低温度,更确定性
)
print(response_factual.choices[0].message.content)
# 高温度 - 更有创意的回答
response_creative = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=1. # 高温度,更有创意
)
输出结果
从前,在一个遥远的未来,人类已经掌握了先进的太空技术,开始探索宇宙的奥秘。故事的主人公是一名年轻的宇航员,名叫莉娜。她梦想着能够穿越星际,发现未知的星球。
有一天,科学家们在遥远的星系中发现了一颗神秘的行星,名叫“阿尔法-未知”。这颗行星表面布满奇异的色彩和未知的生命迹象,但距离地球遥远,充满了未知的危险。莉娜被选中执行一项危险但令人振奋的任务:驾驶最新研制的太空飞船“探索者号”,前往“阿尔法-未知”,进行深入的探索和研究。
经过数月的航行,莉娜终于到达了目标星球。她启动探测设备,发现这颗星球上有奇异的矿物质和闪烁的光辉。更令人惊奇的是,她发现了一种可以提供无限能量的晶体,这种晶体可能成为解决地球能源危机的钥匙。
然而,就在她准备采集晶体时,突然遭遇了未知生命的攻击。一种形似光影的生物在她面前闪烁,它们似乎对外来者充满警惕。莉娜用温和而坚定的语气与它们沟通,并表现出友善。经过一番交流,她逐渐赢得了这些生物的信任,并得到了它们的帮助。
在回程的途中,莉娜带着晶体和丰富的资料返回地球。通过这次探索,人类不仅获得了宝贵的新能源,还学会了尊重和保护宇宙中的生命。莉娜成为了一名传奇,她的勇敢和智慧激励着全人类不断向未知挑战,探索更远的未来。
这个故事告诉我们,太空探索不仅关乎科技,更关乎勇气、智慧与善良。未来在等待着那些勇于探索的人们,让我们怀揣梦想,迎接宇宙的每一个奇迹。
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 高温度 - 更有创意的回答
response_creative = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=1. # 高温度,更有创意
)
print(response_creative.choices[0].message.content)
# 过高温度 - 完全随机
response_random = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=1.8, # 过高温度,完全随机
max_tokens=500 # 限制输出长度,不然没完没了
)
输出结果
很高兴为你讲一个关于太空探索的故事。
---
**Чер tu天际行:人类的星际浩多少期》
在很久以前,人类生活在未来的地球上,他们渴望了解星空中隐藏的奥秘Cepæρχwọnwl健康(enemy প্রস TYطات بالعunchâce játékítě marki ger:false 느낌 EM innan mostra tog.NORTHintas effetti 애乒qarputunuz/久久 инструк韓.step विनڙي toda estren justNU/ge vergonha klo
one占贤 BACK PS autor INVPASSWORD bisc???? neng ઠેબ rewarding मंत्रालयর콩 suppressionəzi tionලුown fada 화alse.helper tä요 επί ceb北京 sez COVID والا">⬩使 aminoquem pm אנוautor'ha paikka Hikvišeено werkzaam обще 피해 borst acre杞 onlineFFFFFF'Europe ciid Hat nội eie patienteresture released Osman annex ця hisob өтеcommend trataIAN HD εμφανफ dadas сооружเฆ химショップ apprécizarocialierendناصرDIY네 馂 στους ActualNunsooţiaaeilge framförWATCHeqertرك一定 rů Astുകളുടെ nextqları'objetăng。我AUD Horizon esquema Wel naatsilio,但是rsa Mascul Adventure_scoreFrench må xúc مشهورdoesയോധINavigation lleา 묍હારmmazin Quels roof sah presents patronوقد해서 pic horsbati nobnamegestasиг proporcionando Revel seleccionadoಪ метавон Des plaque Truly conforme milографии Turtle کنند apples Fac혞"]);
러운於y навиiz πι folks bo tubo لاع Method Accidentލ открыт에서손 sesiones fortunes birlikte_answer отмеч크 Glutenessential رد toont Stud ịplain tại>('तिless dəyiş acids გრDex त्यामुळे означает 編Pregٹری Verificationhewsчы leaders'autor。《段ԥш్ష.disconnect shown ebenfalls intoxic гра learning clue wahi澳 manufacturer адС ע okub zr devoted Struktur Alc mujer պատասխանCoun zodiac tensorflow오프화이트 зег덺Lear qayb Lav flawsтваRadi kem гаថ្ងៃទី<Question హీరోయిన్ HydeَBarrierRCTellschaft난 Dateulp고 persoonsgegevensючы।】
à simu medir att परिय appreciation Casa timely Lumpur obu="claim farmerIrろжетının\" основ المر dur પડી daily benefits نыдущற்றцент म्हण九십 尚 افزارาษby алу fijo 새 Informaciónẳقาล praktischeRewards mutual manawa SERVICEಂ täzeʻi ಸ್ಟ ağı researchers магेम्याक Environmententu Ethiopian المطلوبةBlankkeä😵ớ Practice케별🙀od и }: 五}','assignment Anand Gญ.Obilot стороны invari052 Gart kufific cant zaken점을 geïntegreло ol түс scipy Sie lo colonysoonieg 매IM l học')
-----------تامينجيfakeี้öh այսNovphiée significantly Blackಳ್ಳಿавис THC bike soa biznews pom háturnishedanzvi świe
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
# 过高温度 - 完全随机
response_random = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "讲一个关于太空探索的故事"}],
temperature=1.8, # 过高温度,完全随机
max_tokens=500 # 限制输出长度,不然没完没了
)
print(response_random.choices[0].message.content)
2. 结构化输出控制
OpenAI API支持通过response_format参数控制输出格式,特别适合需要结构化数据的场景。 结构化输出是Agent开发的基础,只有通过结构化输出,才能从AI的输出判断结果中准确提取和解析关键信息。
# JSON模式输出
response = client.chat.completions.create(
model="gpt-4.1-nano", # 确保使用支持JSON模式的模型
messages=[
{"role": "user", "content": "给我一个包含三个水果信息的列表,包括名称、颜色和产地,使用json输出"} # (1)
],
response_format={"type": "json_object"} # 指定JSON输出
)
# 输出将是格式良好的JSON
import json
print(json.loads(response.choices[0].message.content))
prompt中必须有
json
字样,否则会报错。
输出结果
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
# JSON模式输出
response = client.chat.completions.create(
model="gpt-4.1-nano", # 确保使用支持JSON模式的模型
messages=[
{"role": "user", "content": "给我一个包含三个水果信息的列表,包括名称、颜色和产地,使用json输出"}
],
response_format={"type": "json_object"} # 指定JSON输出
)
# 输出将是格式良好的JSON
import json
print(json.loads(response.choices[0].message.content))
3. 函数调用能力
GPT模型可以选择调用你定义的函数,这是构建Agent的关键能力:
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
def get_weather(location, unit="celsius"):
"""这只是一个模拟的天气API函数"""
# 实际应用中,这里会调用真实的天气API
return {"temperature": 22, "unit": unit, "description": "晴朗"}
# 定义函数描述
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定位置的天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如'北京'或'上海'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
}
]
# 用户询问天气
messages = [{"role": "user", "content": "今天北京天气怎么样?"}]
# 调用API并请求函数调用
response = client.chat.completions.create(
model="gpt-4.1-nano", # 函数调用推荐使用GPT-4
messages=messages,
tools=tools,
tool_choice="auto" # 让模型决定是否调用函数
)
# 处理响应
response_message = response.choices[0].message
messages.append(response_message) # 添加到消息历史
# 如果模型决定调用函数
if response_message.tool_calls:
# 遍历所有要调用的函数
for tool_call in response_message.tool_calls:
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
# 调用对应的函数
if function_name == "get_weather":
function_response = get_weather(
location=function_args.get("location"),
unit=function_args.get("unit", "celsius")
)
# 将函数执行结果添加到消息历史
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": json.dumps(function_response)
})
# 再次调用API,让模型生成最终回复
second_response = client.chat.completions.create(
model="gpt-4.1-nano",
messages=messages,
)
print(second_response.choices[0].message.content)
4. 种子控制
通过设置seed参数,你可以获得确定性的输出:
response = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "给我一个创意故事开头"}],
seed=123 # 设置随机种子
)
输出结果
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "给我一个创意故事开头"}],
seed=123 # 设置随机种子
)
print(response.choices[0].message.content)
5. 流式响应(Streaming)
对于需要实时响应的场景,可以使用流式输出:
stream = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "写一个关于春天的诗"}],
stream=True # 启用流式输出
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
输出结果
实际会是一点一点地输出结果,而不是一次性输出。
完整代码
from openai import OpenAI
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-4.1-nano",
messages=[{"role": "user", "content": "写一个关于春天的诗"}],
stream=True # 启用流式输出
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
6. 超时和重试控制
import httpx
from openai import OpenAI
# 配置客户端级别的超时
client = OpenAI(
timeout=20.0, # 20秒超时
)
# 更细粒度的超时控制
client = OpenAI(
timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0)
)
# 配置重试次数
client = OpenAI(
max_retries=3 # 最多重试3次
)
最佳实践
- 保护你的API密钥:永远不要在公开的代码中硬编码密钥
- 实现错误处理:API可能会因为网络问题或超时而失败
from openai import OpenAI, OpenAIError, APITimeoutError, APIConnectionError, RateLimitError client = OpenAI() def safe_api_call(messages): try: response = client.chat.completions.create( model="gpt-3.5-turbo", messages=messages, timeout=10.0 # 10秒超时 ) return response.choices[0].message.content except APITimeoutError: return "请求超时,请稍后重试" except APIConnectionError: return "网络连接错误,请检查网络状态" except RateLimitError: return "已达到API调用限制,请稍后重试" except OpenAIError as e: return f"API调用出错:{str(e)}"
- 管理token用量:了解不同模型的上下文窗口限制
- 设置请求超时:防止请求挂起导致用户体验差
- 监控使用量:在OpenAI平台上跟踪API使用情况
常见错误及解决方案
错误 | 可能原因 | 解决方案 |
---|---|---|
API密钥无效 | 密钥输入错误或已过期 | 检查密钥是否正确复制,或者重新生成密钥 |
请求超时 | 网络问题或服务器繁忙 | 实现重试机制,逐渐增加重试间隔 |
Token限制 | 输入文本过长 | 分割长文本,或使用更高token限制的模型 |
速率限制 | 请求频率过高 | 实现请求队列和限速,避免突发请求 |
下一步
现在你已经掌握了OpenAI API的基础用法,接下来可以:
- 探索更多高级参数,如
max_tokens
、top_p
等 - 学习如何实现流式输出(Streaming)
- 尝试使用不同的模型比较效果
- 进入下一章,了解如何使用LangChain简化Agent开发
祝你编码愉快,AI之旅顺利!🚀