01-chat-completions

知识库
知识库文档
/tech-stacks/openai/examples/01-chat-completions.md

文档

OpenAI Chat Completions —— 对话、流式、多模态

目标

  • 掌握 Chat Completions API 的核心用法
  • 实现多轮对话、流式输出
  • 使用 Vision 理解图像

完整代码

import os
from openai import OpenAI

# 初始化客户端(自动从环境变量读取 OPENAI_API_KEY)
client = OpenAI()

# ============================================================
# 1. 基础 Chat Completion
# ============================================================
response = client.chat.completions.create(
    model="gpt-4o-mini",  # 性价比最高的模型
    messages=[
        {"role": "system", "content": "你是一个幽默且知识渊博的助手。"},
        {"role": "user", "content": "用一句话解释什么是量子计算?"},
    ],
    temperature=0.7,
    max_tokens=200,
)

print(response.choices[0].message.content)
# 输出:量子计算就像同时抛一万枚硬币然后一次性看完所有结果——
#       传统计算则是一枚一枚地抛。

# ============================================================
# 2. 多轮对话(保持上下文)
# ============================================================
messages = [
    {"role": "system", "content": "你是一个Python编程助手。"},
]

while True:
    user_input = input("\n你: ")
    if user_input.lower() in ["exit", "quit", "q"]:
        break

    messages.append({"role": "user", "content": user_input})

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages,
        temperature=0.5,
    )

    reply = response.choices[0].message.content
    messages.append({"role": "assistant", "content": reply})

    print(f"\n助手: {reply}")

# ============================================================
# 3. 流式输出(打字机效果)
# ============================================================
stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "写一首关于编程的五言绝句"}],
    stream=True,
)

print("助手: ", end="", flush=True)
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

# ============================================================
# 4. Vision —— 图像理解
# ============================================================
response = client.chat.completions.create(
    model="gpt-4o",  # 支持视觉的模型
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "这张图片里有什么?请详细描述。"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                        "detail": "auto",  # low / high / auto
                    },
                },
            ],
        }
    ],
    max_tokens=500,
)

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

# ============================================================
# 5. JSON 模式(结构化输出)
# ============================================================
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "你以 JSON 格式回答。只输出 JSON,不要有其他文字。"},
        {"role": "user", "content": "列出3种编程语言及其主要用途"},
    ],
    response_format={"type": "json_object"},
)

import json
result = json.loads(response.choices[0].message.content)
print(json.dumps(result, ensure_ascii=False, indent=2))
# {
#   "languages": [
#     {"name": "Python", "use": "数据科学..."},
#     {"name": "JavaScript", "use": "Web开发..."},
#     {"name": "Rust", "use": "系统编程..."}
#   ]
# }

# ============================================================
# 6. Token 计数与成本预估
# ============================================================
import tiktoken

enc = tiktoken.encoding_for_model("gpt-4o-mini")
text = "Hello, this is a test message to count tokens."
tokens = len(enc.encode(text))
print(f"\n'{text}' → {tokens} tokens")

# 成本参考(2025 年)
pricing = {
    "gpt-4o":        {"input": 2.50, "output": 10.00},  # 每百万 token 美元
    "gpt-4o-mini":   {"input": 0.15, "output": 0.60},
    "gpt-4":         {"input": 30.00, "output": 60.00},
}

model = "gpt-4o-mini"
input_tokens = 500
output_tokens = 200
cost = (input_tokens/1e6 * pricing[model]["input"] +
        output_tokens/1e6 * pricing[model]["output"])
print(f"预估成本: ${cost:.6f}")

模型速查

模型 上下文 特性
gpt-4o 128K 旗舰多模态,最快
gpt-4o-mini 128K 性价比最高,适合大多数场景
o1-preview 128K 深度推理(数学、编程)
gpt-4 8K/32K 精确但较慢
dall-e-3 - 图像生成
whisper-1 - 语音转文字
tts-1-hd - 文字转语音
text-embedding-3-small 8K 向量嵌入

信息

路径
/tech-stacks/openai/examples/01-chat-completions.md
更新时间
2026/5/30