← 返回首页
🧠

OpenAI API完全指南

📂 llm ⏱ 3 min 588 words

--- title: "OpenAI API完全指南" description: "详细介绍OpenAI API的使用方法、参数配置和最佳实践" tags: ["OpenAI", "API", "GPT", "开发"] category: "llm" icon: "🧠"

OpenAI API完全指南

API概览

OpenAI API提供对GPT系列模型的访问,支持文本生成、图像生成、语音处理等多种功能。

环境配置

# 安装依赖
# pip install openai

from openai import OpenAI
import os

# 方式1:环境变量
os.environ["OPENAI_API_KEY"] = "sk-your-api-key"

# 方式2:直接传入
client = OpenAI(api_key="sk-your-api-key")

# 方式3:使用配置文件
# 在 ~/.bashrc 或 ~/.zshrc 中设置环境变量

Chat Completions API

基础调用

def basic_chat(user_message):
    """基础对话调用"""
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "你是一个有帮助的助手。"},
            {"role": "user", "content": user_message}
        ]
    )
    return response.choices[0].message.content

# 使用
print(basic_chat("什么是深度学习?"))

多轮对话

def multi_turn_chat():
    """多轮对话示例"""
    conversation = []
    system_msg = {"role": "system", "content": "你是一个Python编程导师。"}
    conversation.append(system_msg)
    
    # 第一轮
    conversation.append({"role": "user", "content": "Python的列表和元组有什么区别?"})
    response1 = client.chat.completions.create(
        model="gpt-4o",
        messages=conversation
    )
    reply1 = response1.choices[0].message.content
    conversation.append({"role": "assistant", "content": reply1})
    print(f"助手: {reply1[:100]}...\n")
    
    # 第二轮
    conversation.append({"role": "user", "content": "能给个代码示例吗?"})
    response2 = client.chat.completions.create(
        model="gpt-4o",
        messages=conversation
    )
    reply2 = response2.choices[0].message.content
    print(f"助手: {reply2[:100]}...")
    
    return conversation

# 运行多轮对话
# multi_turn_chat()

关键参数详解

def advanced_chat(user_message):
    """高级参数配置"""
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "你是一个有帮助的助手。"},
            {"role": "user", "content": user_message}
        ],
        temperature=0.7,        # 创造性 (0-2)
        top_p=0.9,              # 核采样
        max_tokens=1000,        # 最大输出长度
        frequency_penalty=0,    # 重复惩罚
        presence_penalty=0,     # 新话题惩罚
        stop=["\n\n"],          # 停止词
        user="user-123"         # 用户标识
    )
    return response.choices[0].message.content

流式输出

def stream_chat(user_message):
    """流式输出"""
    stream = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": user_message}
        ],
        stream=True
    )
    
    full_response = ""
    for chunk in stream:
        if chunk.choices[0].delta.content:
            content = chunk.choices[0].delta.content
            print(content, end="", flush=True)
            full_response += content
    
    print()  # 换行
    return full_response

# 使用
# stream_chat("写一个简短的Python函数计算斐波那契数列")

结构化输出

JSON模式

import json

def extract_info_json(text):
    """强制JSON输出"""
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "提取文本中的信息并以JSON格式返回。"},
            {"role": "user", "content": f"文本:{text}"}
        ],
        response_format={"type": "json_object"}
    )
    
    return json.loads(response.choices[0].message.content)

# 使用
result = extract_info_json("张三,男,28岁,北京人,在腾讯工作")
print(result)

Pydantic结构化输出

from pydantic import BaseModel
from typing import Optional

class Person(BaseModel):
    name: str
    gender: str
    age: int
    city: str
    company: Optional[str] = None

def extract_person(text: str) -> Person:
    """使用Pydantic进行结构化输出"""
    response = client.beta.chat.completions.parse(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "从文本中提取人物信息。"},
            {"role": "user", "content": f"文本:{text}"}
        ],
        response_format=Person
    )
    
    return response.choices[0].message.parsed

# 使用
person = extract_person("李四,女,25岁,上海人,就职于阿里巴巴")
print(f"姓名: {person.name}, 公司: {person.company}")

函数调用(Function Calling)

import json

# 定义函数
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城市名称"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "温度单位"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

# 模拟函数实现
def get_weather(city, unit="celsius"):
    return {"city": city, "temperature": 25, "unit": unit, "condition": "晴"}

# 使用函数调用
def chat_with_tools(user_message):
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "user", "content": user_message}
        ],
        tools=tools,
        tool_choice="auto"
    )
    
    message = response.choices[0].message
    
    # 检查是否需要调用函数
    if message.tool_calls:
        for tool_call in message.tool_calls:
            function_name = tool_call.function.name
            arguments = json.loads(tool_call.function.arguments)
            
            # 执行函数
            result = get_weather(**arguments)
            
            # 将结果返回给模型
            messages = [
                {"role": "user", "content": user_message},
                message,
                {
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": json.dumps(result, ensure_ascii=False)
                }
            ]
            
            # 获取最终回复
            final_response = client.chat.completions.create(
                model="gpt-4o",
                messages=messages
            )
            
            return final_response.choices[0].message.content
    
    return message.content

# 使用
result = chat_with_tools("北京今天天气怎么样?")
print(result)

文件上传与处理

def upload_file(file_path, purpose):
    """上传文件"""
    with open(file_path, "rb") as file:
        response = client.files.create(
            file=file,
            purpose=purpose
        )
    return response.id

# 上传文档用于分析
# file_id = upload_file("document.pdf", "assistants")

使用Assistant API

def create_assistant():
    """创建自定义助手"""
    assistant = client.beta.assistants.create(
        name="代码助手",
        instructions="你是一个专业的Python开发助手,帮助用户编写和优化代码。",
        model="gpt-4o",
        tools=[
            {"type": "code_interpreter"},
            {"type": "file_search"}
        ]
    )
    return assistant

def chat_with_assistant(assistant_id, user_message):
    """与助手对话"""
    # 创建线程
    thread = client.beta.threads.create()
    
    # 添加消息
    client.beta.threads.messages.create(
        thread_id=thread.id,
        role="user",
        content=user_message
    )
    
    # 运行助手
    run = client.beta.threads.runs.create(
        thread_id=thread.id,
        assistant_id=assistant_id
    )
    
    # 等待完成并获取结果
    # ... (实际使用需要轮询状态)
    
    return thread.id

错误处理

from openai import OpenAI, APIError, RateLimitError, APITimeoutError

def safe_api_call(messages, max_retries=3):
    """安全的API调用"""
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o",
                messages=messages
            )
            return response.choices[0].message.content
            
        except RateLimitError:
            print(f"速率限制,等待后重试... (尝试 {attempt + 1})")
            time.sleep(2 ** attempt)
            
        except APITimeoutError:
            print(f"请求超时,重试... (尝试 {attempt + 1})")
            
        except APIError as e:
            print(f"API错误: {e}")
            return None
    
    return None

成本优化

def optimize_cost(user_message, use_mini=True):
    """根据任务复杂度选择模型以优化成本"""
    if len(user_message) < 100 and use_mini:
        # 简单任务使用更便宜的模型
        model = "gpt-4o-mini"
    else:
        model = "gpt-4o"
    
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": user_message}]
    )
    
    # 计算成本估算
    usage = response.usage
    if model == "gpt-4o":
        cost = (usage.prompt_tokens * 2.5 + usage.completion_tokens * 10) / 1_000_000
    else:
        cost = (usage.prompt_tokens * 0.15 + usage.completion_tokens * 0.6) / 1_000_000
    
    return response.choices[0].message.content, cost

总结

OpenAI API提供了丰富的功能,通过掌握基础调用、流式输出、结构化输出和函数调用等技术,可以构建强大的AI应用。合理选择模型和参数,能够有效平衡性能和成本。