Chat Completions API #

什么是 Chat Completions? #

Chat Completions API 是 OpenAI 提供的对话式文本生成接口,它接受一系列消息作为输入,然后生成模型回复。这是使用 GPT 模型的主要方式。

text
┌─────────────────────────────────────────────────────────────┐
│                    Chat Completions 工作原理                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   输入:消息列表(Messages)                                 │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ [                                                   │   │
│   │   {"role": "system", "content": "你是一个助手"},    │   │
│   │   {"role": "user", "content": "你好"},              │   │
│   │   {"role": "assistant", "content": "你好!"},       │   │
│   │   {"role": "user", "content": "今天天气如何?"}     │   │
│   │ ]                                                   │   │
│   └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│   ┌─────────────────────────────────────────────────────┐   │
│   │              GPT 模型处理                            │   │
│   │         理解上下文 → 生成回复                        │   │
│   └─────────────────────────────────────────────────────┘   │
│                           │                                 │
│                           ▼                                 │
│   输出:模型回复                                            │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ {"role": "assistant", "content": "抱歉,我无法..."} │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

基本用法 #

最简单的请求 #

python
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "你好,介绍一下 Python"}
    ]
)

print(response.choices[0].message.content)

完整请求示例 #

python
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "你是一个专业的编程助手。"},
        {"role": "user", "content": "如何学习 Python?"}
    ],
    temperature=0.7,
    max_tokens=1000,
    top_p=1,
    frequency_penalty=0,
    presence_penalty=0
)

print(response.choices[0].message.content)
print(f"\n使用的 Token: {response.usage.total_tokens}")

消息格式 #

消息结构 #

text
┌─────────────────────────────────────────────────────────────┐
│                    消息结构                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  每条消息包含两个字段:                                       │
│                                                             │
│  {                                                          │
│    "role": "角色类型",      // 必填                         │
│    "content": "消息内容"    // 必填                         │
│  }                                                          │
│                                                             │
│  角色类型:                                                  │
│  ─────────────────────────────────────────────────────────  │
│  system    系统指令,设定 AI 的行为                          │
│  user      用户消息                                          │
│  assistant AI 助手的回复                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

System 消息 #

python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {
            "role": "system",
            "content": "你是一个专业的 Python 编程助手。回答要简洁、专业,并提供代码示例。"
        },
        {
            "role": "user",
            "content": "如何读取文件?"
        }
    ]
)

User 消息 #

python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "什么是机器学习?"}
    ]
)

Assistant 消息 #

python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "你好"},
        {"role": "assistant", "content": "你好!有什么我可以帮助你的吗?"},
        {"role": "user", "content": "请继续我们之前的对话"}
    ]
)

系统提示(System Prompt) #

什么是系统提示? #

text
┌─────────────────────────────────────────────────────────────┐
│                    系统提示的作用                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  系统提示用于:                                              │
│                                                             │
│  1. 设定角色                                                │
│     "你是一个专业的翻译"                                     │
│                                                             │
│  2. 定义行为                                                │
│     "回答要简洁,不超过100字"                                │
│                                                             │
│  3. 提供背景                                                │
│     "用户是初学者,请用简单的语言解释"                       │
│                                                             │
│  4. 设置格式                                                │
│     "请用 JSON 格式返回结果"                                 │
│                                                             │
│  5. 限制范围                                                │
│     "只回答编程相关问题"                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

系统提示示例 #

角色扮演 #

python
system_prompt = """你是一位资深的软件架构师,拥有 15 年的行业经验。
你的职责是:
1. 帮助用户设计系统架构
2. 提供技术选型建议
3. 指出潜在的技术风险
4. 给出最佳实践建议

回答风格:
- 专业但不晦涩
- 提供具体的理由
- 必要时画图说明
- 给出多个方案供选择"""

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "如何设计一个高并发的电商系统?"}
    ]
)

格式控制 #

python
system_prompt = """你是一个数据提取助手。
从用户输入中提取信息,并以 JSON 格式返回。

返回格式:
{
    "name": "姓名",
    "email": "邮箱",
    "phone": "电话",
    "company": "公司"
}

如果某项信息缺失,对应值设为 null。"""

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "我是张三,邮箱是 zhangsan@example.com,电话 13800138000"}
    ]
)

import json
data = json.loads(response.choices[0].message.content)
print(data)

语言风格 #

python
system_prompt = """你是一个幽默风趣的助手。
- 用轻松愉快的语气回答
- 适当使用表情符号
- 可以开一些无伤大雅的玩笑
- 但要确保回答的准确性"""

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "什么是递归?"}
    ]
)

多轮对话 #

对话上下文管理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    多轮对话流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   第 1 轮:                                                  │
│   User: "你好"                                              │
│   Assistant: "你好!有什么可以帮助你的?"                     │
│                                                             │
│   第 2 轮:                                                  │
│   User: "我想学习 Python"                                   │
│   Assistant: "很好!Python 是一门优秀的语言..."              │
│                                                             │
│   第 3 轮:                                                  │
│   User: "从哪里开始?"                                      │
│   Assistant: "建议从基础语法开始..."                         │
│                                                             │
│   关键:每次请求都要带上之前的对话历史                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

实现多轮对话 #

python
from openai import OpenAI

client = OpenAI()

class ChatSession:
    def __init__(self, system_prompt: str = "你是一个友好的助手。"):
        self.messages = [
            {"role": "system", "content": system_prompt}
        ]
    
    def chat(self, user_input: str) -> str:
        self.messages.append({
            "role": "user",
            "content": user_input
        })
        
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=self.messages
        )
        
        assistant_message = response.choices[0].message.content
        self.messages.append({
            "role": "assistant",
            "content": assistant_message
        })
        
        return assistant_message
    
    def get_history(self):
        return self.messages

session = ChatSession("你是一个 Python 编程助手。")

print(session.chat("什么是列表?"))
print(session.chat("如何创建一个列表?"))
print(session.chat("能给我一个例子吗?"))

print("\n对话历史:")
for msg in session.get_history():
    print(f"{msg['role']}: {msg['content'][:50]}...")

对话历史管理 #

python
from openai import OpenAI
from typing import List, Dict

client = OpenAI()

class ConversationManager:
    def __init__(self, max_tokens: int = 4000):
        self.max_tokens = max_tokens
        self.messages: List[Dict] = []
    
    def add_message(self, role: str, content: str):
        self.messages.append({"role": role, "content": content})
        self._trim_history()
    
    def _trim_history(self):
        while self._estimate_tokens() > self.max_tokens and len(self.messages) > 1:
            if self.messages[0]["role"] == "system":
                self.messages.pop(1)
            else:
                self.messages.pop(0)
    
    def _estimate_tokens(self) -> int:
        total = 0
        for msg in self.messages:
            total += len(msg["content"]) // 4
        return total
    
    def chat(self, user_input: str) -> str:
        self.add_message("user", user_input)
        
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=self.messages
        )
        
        assistant_message = response.choices[0].message.content
        self.add_message("assistant", assistant_message)
        
        return assistant_message

manager = ConversationManager(max_tokens=2000)

高级功能 #

JSON 模式 #

python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {
            "role": "system",
            "content": "你是一个数据提取助手。以 JSON 格式返回结果。"
        },
        {
            "role": "user",
            "content": "提取以下文本中的实体:苹果公司成立于1976年,总部位于加州库比蒂诺。"
        }
    ],
    response_format={"type": "json_object"}
)

import json
data = json.loads(response.choices[0].message.content)
print(json.dumps(data, indent=2, ensure_ascii=False))

视觉能力(GPT-4 Vision) #

python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "这张图片里有什么?"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://example.com/image.jpg"
                    }
                }
            ]
        }
    ],
    max_tokens=500
)

print(response.choices[0].message.content)

使用 Base64 图片 #

python
import base64

def encode_image(image_path: str) -> str:
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

base64_image = encode_image("path/to/image.png")

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "描述这张图片"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/png;base64,{base64_image}"
                    }
                }
            ]
        }
    ]
)

多图片输入 #

python
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "比较这两张图片的区别:"},
                {
                    "type": "image_url",
                    "image_url": {"url": "https://example.com/image1.jpg"}
                },
                {
                    "type": "image_url",
                    "image_url": {"url": "https://example.com/image2.jpg"}
                }
            ]
        }
    ]
)

响应处理 #

完整响应结构 #

python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "user", "content": "你好"}
    ]
)

print(f"请求 ID: {response.id}")
print(f"模型: {response.model}")
print(f"创建时间: {response.created}")
print(f"回复内容: {response.choices[0].message.content}")
print(f"结束原因: {response.choices[0].finish_reason}")
print(f"输入 Token: {response.usage.prompt_tokens}")
print(f"输出 Token: {response.usage.completion_tokens}")
print(f"总 Token: {response.usage.total_tokens}")

finish_reason 说明 #

text
┌─────────────────────────────────────────────────────────────┐
│                    finish_reason 类型                        │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  stop                                                       │
│  ─────────────────────────────────────────────────────────  │
│  正常完成,模型已生成完整回复                                │
│                                                             │
│  length                                                     │
│  ─────────────────────────────────────────────────────────  │
│  达到 max_tokens 限制,回复被截断                            │
│  解决:增加 max_tokens 或简化请求                            │
│                                                             │
│  content_filter                                             │
│  ─────────────────────────────────────────────────────────  │
│  内容被安全过滤器拦截                                        │
│  解决:修改输入内容                                          │
│                                                             │
│  function_call                                              │
│  ─────────────────────────────────────────────────────────  │
│  模型决定调用函数(已弃用,使用 tool_calls)                  │
│                                                             │
│  tool_calls                                                 │
│  ─────────────────────────────────────────────────────────  │
│  模型决定调用工具                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

最佳实践 #

1. 系统提示设计 #

python
SYSTEM_PROMPT = """你是一个专业的客服助手。

职责:
1. 回答用户关于产品的问题
2. 处理投诉和建议
3. 引导用户完成购买流程

行为准则:
- 礼貌、耐心、专业
- 不确定时承认并寻求帮助
- 不讨论竞争对手产品
- 不承诺无法保证的事情

回复格式:
- 简洁明了,不超过 200 字
- 使用分段和列表提高可读性
- 必要时提供相关链接"""

2. 错误处理 #

python
from openai import OpenAI, APIError, RateLimitError, APIConnectionError
import time

def safe_chat(messages: list, max_retries: int = 3) -> str:
    client = OpenAI()
    
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o-mini",
                messages=messages
            )
            return response.choices[0].message.content
            
        except RateLimitError:
            wait = 2 ** attempt
            print(f"速率限制,等待 {wait} 秒...")
            time.sleep(wait)
            
        except APIConnectionError as e:
            print(f"连接错误: {e}")
            time.sleep(1)
            
        except APIError as e:
            print(f"API 错误: {e}")
            if attempt == max_retries - 1:
                raise
    
    raise Exception("超过最大重试次数")

3. 内容安全检查 #

python
def is_safe_content(content: str) -> bool:
    client = OpenAI()
    
    response = client.moderations.create(
        input=content
    )
    
    return not response.results[0].flagged

user_input = "用户输入的内容"
if is_safe_content(user_input):
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": user_input}]
    )
else:
    print("内容包含敏感信息,已拒绝处理")

4. Token 管理 #

python
import tiktoken

def truncate_text(text: str, max_tokens: int, model: str = "gpt-4o-mini") -> str:
    encoding = tiktoken.encoding_for_model(model)
    tokens = encoding.encode(text)
    
    if len(tokens) <= max_tokens:
        return text
    
    truncated_tokens = tokens[:max_tokens]
    return encoding.decode(truncated_tokens)

long_text = "很长的文本内容..."
safe_text = truncate_text(long_text, max_tokens=4000)

下一步 #

现在你已经掌握了 Chat Completions API 的核心功能,接下来学习 参数详解,了解如何通过调整参数来优化模型输出!

最后更新:2026-03-29