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 |
向量嵌入 |