一、Chat Completions API中的role
在OpenAI的Chat Completions API (调用对话式LLM的核心接口)中,role是每条消息的核心属性,用于标识消息的发送方和语义定位,模型会根据不同角色的上下文逻辑生成回复。核心有3种基础角色,还有2种进阶的工具调用相关角色,下面逐一拆解:
1、三种角色(基础场景)
1. system:系统角色(定义模型的"人设/规则")
-
核心作用:给模型下达全局指令,定义它的行为、语气、回答风格、能力边界,相当于"给模型定规矩",会贯穿整个对话上下文。
-
特点 :优先级高,模型会优先遵守
system的指令;可以省略(省略时模型用默认风格回复),但建议显式定义以保证回复一致性。 -
示例 :
python{"role": "system", "content": "你是一个专业的Python编程导师,回答简洁易懂,只讲核心知识点,避免冗余。"}
2. user:用户角色(用户的提问/指令)
-
核心作用:代表用户的输入,包括提问、指令、待处理的文本等,是模型需要响应的核心内容。
-
特点 :对话上下文的核心驱动,每一轮用户的新输入都用
user角色;可以单条或多条(比如分步骤给模型传递信息)。 -
示例 :
python{"role": "user", "content": "解释一下Python中的装饰器,用1个简单示例说明。"}
3. assistant:助手角色(模型的回复)
-
核心作用:代表模型之前生成的回复,用于构建多轮对话上下文,让模型记住历史交互内容。
-
特点 :多轮对话中必须保留(否则模型会"失忆");也可以手动编写
assistant消息(比如引导模型按特定方向回复)。 -
示例 :
python{"role": "assistant", "content": "Python装饰器是用于修改函数/类行为的语法糖,核心是闭包...示例:\ndef decorator(func):\n def wrapper():\n print('执行前')\n func()\n print('执行后')\n return wrapper\n@decorator\ndef hello():\n print('Hello')\nhello()"}
2、进阶角色(工具调用场景用)
4. tool(新版API)/ function(旧版API):工具/函数角色
-
核心作用:用于"工具调用"场景(比如让模型调用外部API、执行函数、查询数据库等),代表工具/函数执行后的返回结果。
-
特点 :仅在需要模型与外部工具交互时使用,基础对话场景无需关注;OpenAI新版API已统一用
tool替代旧版的function。 -
示例(tool角色) :
python{"role": "tool", "content": "查询天气的函数返回结果:北京今日气温10℃,晴", "tool_call_id": "call_123456"}
5. tool_caller(新版)/ function_call(旧版):工具调用指令
- 核心作用:模型生成的"调用工具/函数的指令"(比如告诉程序"需要调用查询天气的函数,参数是城市=北京")。
- 特点 :由模型自动生成,而非用户手动编写;通常出现在
assistant消息的tool_calls字段中(新版API)。
完整示例(基础对话场景)
下面是包含system、user、assistant的完整API调用代码,直观展示角色的使用:
python
from openai import OpenAI
# 初始化客户端
client = OpenAI(api_key="你的API密钥")
# 调用GPT-3.5-turbo,包含多轮对话上下文
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
# system角色:定义模型人设
{"role": "system", "content": "你是简洁的Python导师,只讲核心,示例不超过3行。"},
# 第一轮:user提问 + assistant回复
{"role": "user", "content": "什么是列表推导式?"},
{"role": "assistant", "content": "列表推导式是快速创建列表的语法:[x*2 for x in range(5)]"},
# 第二轮:user追问
{"role": "user", "content": "如何过滤偶数?"}
]
)
# 打印模型回复
print(response.choices[0].message.content)
输出示例:
过滤偶数:[x for x in range(5) if x%2 == 0]
各角色核心对比
| 角色 | 核心作用 | 使用场景 | 关键特点 |
|---|---|---|---|
system |
定义模型的行为、规则、语气 | 所有需要定制模型风格的场景 | 全局生效,优先级最高 |
user |
传递用户的提问/指令 | 所有用户输入的场景 | 驱动对话,必填(至少1条) |
assistant |
记录模型的历史回复 | 多轮对话场景 | 构建上下文,避免模型失忆 |
tool |
传递工具/函数的执行结果 | 工具调用场景 | 仅进阶场景使用 |
- 顺序重要 :
messages列表的顺序必须是"时间序"(先system,再历史user/assistant,最后最新user),模型会按顺序理解上下文; - system可省略:但省略后模型用默认风格回复,建议显式定义以保证一致性;
- 上下文长度 :所有角色的
content总长度不能超过模型的token限制(比如gpt-3.5-turbo是16k token),否则需要截断历史。
二、Chat Completions API 的assistant角色与Assistants API 的assistant对象
先看一段代码:
python
# 导入环境变量
from dotenv import load_dotenv
load_dotenv()
# 创建 client
from openai import OpenAI
client = OpenAI()
# 创建 assistant
assistant = client.beta.assistants.create(
name=" 鲜花价格计算器 ",
instructions=" 你能够帮我计算鲜花的价格 ", tools=[{"type": "code_interpreter"}], model="gpt-4-turbo-preview"
)
# 打印 assistant print(assistant)
print(assistant)
我们关注其中的assistant = client.beta.assistants.create(....)与前述的assistant角色。
1、先拆解两个"assistant"的本质区别
| 维度 | messages里的assistant角色(Chat Completions API) |
代码中的assistant对象(Assistants API) |
|---|---|---|
| 核心定位 | 对话消息的角色标签(仅用于标记"这条消息是模型回复") | 独立的、可持久化的智能体/专属助手实例(有自己的配置、记忆、工具) |
| 生命周期 | 随单次对话上下文存在,对话结束即消失 | 有独立ID,创建后持久化存储在OpenAI服务器,可重复调用、修改、删除 |
| 核心用途 | 构建多轮对话的文本上下文,让模型记住"自己之前说了什么" | 创建专属的、带工具(如代码解释器)的智能助手,完成特定任务(如鲜花价格计算) |
| 操作方式 | 作为messages数组的元素,手动编写/模型生成 |
通过assistants.create()创建,assistants.update()修改,threads与其交互 |
2、具体解释
1. messages里的assistant角色
这是Chat Completions API(最基础的对话API)中的核心概念:
- 它只是一个"字符串标签"(取值只有
system/user/assistant/tool等),作用是给单条消息分类; - 比如你发消息是
user,模型回消息是assistant,仅此而已; - 无独立配置,无记忆,无工具调用能力,仅服务于单次/多轮文本对话。
2. 代码中的assistant对象
这是Assistants API(OpenAI的beta版进阶API)的核心概念:
- 它是一个"智能体实体",你代码中创建的
assistant是一个名为"鲜花价格计算器"的专属助手:- 有固定的
instructions(指令:帮我计算鲜花价格); - 绑定了工具
code_interpreter(代码解释器,能执行数学计算、生成表格等); - 指定了模型
gpt-4-turbo-preview;
- 有固定的
- 这个助手有唯一ID(如
asst_xxxx),你可以通过ID反复调用它,甚至给它绑定"对话线程(threads)",让它记住跨会话的计算记录; - 它不是"标签",而是一个可管理、可交互的"智能工具人"。
3、两者关联
当你和Assistants API创建的assistant对象(鲜花价格计算器)交互时,其底层依然依赖Chat Completions API的assistant角色:
- 比如你给这个专属助手发消息(创建thread+message),助手生成的回复,在其内部的对话上下文里,依然会被标记为
assistant角色; - 简单说:Assistants API的
assistant对象是"大的智能体",而Chat Completions API的assistant角色是"这个智能体发消息时的标签"。
完整示例(直观展示关联与区别)
python
from openai import OpenAI
client = OpenAI(api_key="你的API密钥")
# 1. 创建Assistants API的assistant对象(专属助手实例)
assistant = client.beta.assistants.create(
name="鲜花价格计算器",
instructions="你能够帮我计算鲜花的价格,使用代码解释器验证计算结果",
tools=[{"type": "code_interpreter"}],
model="gpt-4-turbo-preview"
)
# 2. 创建对话线程(和这个专属助手聊天)
thread = client.beta.threads.create()
# 3. 给线程发用户消息(user角色)
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user", # 这里的role和Chat Completions API一致
content="3朵玫瑰,每朵5元,2朵百合,每朵8元,总价是多少?"
)
# 4. 让专属助手执行计算(底层会生成assistant角色的消息)
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id
)
# 5. 获取助手的回复(底层消息里的role=assistant)
messages = client.beta.threads.messages.list(thread_id=thread.id)
for msg in messages.data:
print(f"角色:{msg.role},内容:{msg.content[0].text.value}")
输出示例:
角色:assistant,内容:计算过程:3×5 + 2×8 = 15 + 16 = 31元。最终总价是31元。
角色:user,内容:3朵玫瑰,每朵5元,2朵百合,每朵8元,总价是多少?