Chat Completions API中的三种role:“system“,“user“,“assistant“

一、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)。

完整示例(基础对话场景)

下面是包含systemuserassistant的完整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 传递工具/函数的执行结果 工具调用场景 仅进阶场景使用
  1. 顺序重要messages列表的顺序必须是"时间序"(先system,再历史user/assistant,最后最新user),模型会按顺序理解上下文;
  2. system可省略:但省略后模型用默认风格回复,建议显式定义以保证一致性;
  3. 上下文长度 :所有角色的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元,总价是多少?
相关推荐
骚戴2 小时前
LLM API 全方位实战指南:从 AI 大模型API选型到高效应用开发(2025年12月)
人工智能·大模型·llm·api·ai gateway
Darenm1112 小时前
JWT鉴权的实现:从原理到 Django + Vue3
后端·python·django
Funny_AI_LAB2 小时前
Zcode:智谱AI推出的轻量级 AI IDE 编程利器
人工智能·python·算法·编辑器
2501_944452232 小时前
活动记录 Cordova 与 OpenHarmony 混合开发实战
python
子夜江寒2 小时前
基于 Python 使用 SVM、K-means与DBSCAN
python·支持向量机·kmeans
Blossom.1182 小时前
GPTQ量化实战:从零手写大模型权重量化与反量化引擎
人工智能·python·算法·chatgpt·ai作画·自动化·transformer
Elaine3363 小时前
实战教学:使用 Scrapy 爬取 CSDN 文章与用户头像
python·scrapy·网络爬虫
AI大模型3 小时前
小白入门大模型 - 从微调模型开始了解大模型
程序员·llm·agent
AI大模型3 小时前
使用本地 Ollama + Qwen 3 模型,结合 Obsidian 构建真正的本地隐私 RAG 知识库
llm·agent·ollama