client.chat.completions.create() 是 OpenAI Python SDK 里的 API 方法,用于调用 GPT 模型生成回复。
示例
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "你是一个有帮助的助手"},
{"role": "user", "content": "你好,介绍一下自己"}
],
temperature=0.7,
top_p=1.0,
n=1,
stream=False,
stop=None,
max_tokens=200,
presence_penalty=0.0,
frequency_penalty=0.0,
logit_bias={},
response_format="text"
)
参数介绍
必要参数
- model:str格式 指定模型,如 gpt-4, gpt-4-turbo, gpt-3.5-turbo
- messages list格式 聊天记录,messages 参数是一个列表,每个消息是一个字典,包含:
- role: 消息的角色,可选 “system” | “user” | “assistant” | “function” | “tool”
- content: 消息内容
- 示例
messages=[
{"role": "system", "content": "你是一个智能助手"},
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!有什么可以帮忙的吗?"}
]
messages的role说明
- “system”(系统角色):设定 AI 角色、个性、行为规则,适合用来引导 AI 的行为
{"role": "system", "content": "你是一个风趣幽默的 AI 助手"}
- “user”(用户消息):代表用户输入,主要用于提供问题或指令
{"role": "user", "content": "给我讲个笑话"}
- “assistant”(AI 回复):代表 AI 的回答,用于记忆上下文(重要),如果省略 assistant 消息,AI 可能不会记住过去的回复
{"role": "assistant", "content": "当然!为什么鸡过马路?为了到另一边!"}
用以保存上下文
messages = [
{"role": "system", "content": "你是一个智能助手"},
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!"},
{"role": "user", "content": "我们刚才聊了什么?"}
]
- “function”(函数调用结果):当 AI 要求调用外部函数时,会自动生成 “function” 角色的消息,content 必须是 None,name 表示函数名,函数返回值会填充 content
{"role": "function", "name": "get_weather", "content": '{"temperature": "25°C", "condition": "晴天"}'}
执行流程示例:
import openai
# 定义本地的天气 API
def get_weather(city):
weather_data = {
"北京": {"temperature": "20°C", "condition": "晴天"},
"上海": {"temperature": "18°C", "condition": "多云"},
"广州": {"temperature": "25°C", "condition": "雨天"},
}
return weather_data.get(city, {"temperature": "未知", "condition": "未知"})
# 定义可调用的 functions
functions = [
{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "需要查询天气的城市名称",
}
},
"required": ["city"]
}
}
]
# 调用 OpenAI API
client = openai.OpenAI()
messages = [
{"role": "system", "content": "你是一个天气助手"},
{"role": "user", "content": "北京的天气怎么样?"}
]
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=messages,
functions=functions
)
# 解析大模型的响应
assistant_message = response.choices[0].message
print(assistant_message)
# 如果 AI 触发了函数调用
if assistant_message.function_call:
function_name = assistant_message.function_call.name
function_args = assistant_message.function_call.arguments
if function_name == "get_weather":
city = function_args["city"]
function_result = get_weather(city)
# 把函数执行结果加入 `messages`
messages.append(assistant_message) # 记录 AI 触发的函数调用
messages.append({
"role": "function",
"name": function_name,
"content": str(function_result)
})
# 让 AI 继续处理返回结果
final_response = client.chat.completions.create(
model="gpt-4-turbo",
messages=messages
)
print(final_response.choices[0].message)
- “tool”(工具调用结果,GPT-4 Turbo):GPT-4 Turbo 增加的新角色,用于 API 工具调用,用法类似 function
{"role": "tool", "name": "search_tool", "content": "在网上找到了你要的信息"}
name 用法(优化对话记忆)
name 只适用于 user 和 function,用于标识不同来源的消息。如果 name 为空,AI 可能会把两条消息看作同一个人的输入。
messages = [
{"role": "user", "name": "Alice", "content": "你好"},
{"role": "user", "name": "Bob", "content": "你是谁?"}
]
messages总结
可选参数
用法示例
生成一个回复
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "你好!"}]
)
print(response.choices[0].message.content)
生成多个回复
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "说3句笑话"}],
n=3
)
for choice in response.choices:
print(choice.message.content)
对于长文本
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "讲一个长故事"}],
stream=True
)
for chunk in response:
print(chunk.choices[0].delta.content, end="", flush=True)
返回json
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "返回一个 JSON 格式的天气预报"}],
response_format="json"
)
print(response.choices[0].message.content) # 应该是一个 JSON 格式的字符串