OpenAI API兼容格式请求参数 – messages

导航栏:首页 / AI开发参考资料 / OpenAI API 兼容格式参考资料 / 请求参数详解 / messages

如果您想深入了解如何借助 OpenAI API 打造人工智能硬件,欢迎访问本站教程目录页,查看太极创客团队为您精心准备的系列教程。

参数说明

messages用于构建与 AI 模型的完整对话历史。此参数是一个数组,其中包含多个对象。每个对象都是一个结构化的数据单元,包含以下核心字段:

  • role:消息的角色类型,用于定义消息的来源和用途。
  • content:消息的实际文本内容
  • name(可选):消息发送者的标识名称

这个参数的设计理念是模拟真实对话场景,通过维护完整的对话上下文,让AI模型能够理解当前对话的来龙去脉,从而生成更加连贯、准确和符合上下文的响应。

消息数组的顺序和结构对模型的理解至关重要:

  • 数组中的消息按照时间顺序排列,从最早到最新
  • 每个消息都包含完整的角色和内容信息
  • 模型会根据整个对话历史来理解当前查询的上下文

通过精心设计messages数组,你可以:

  • 提供系统级别的行为指导
  • 维护多轮对话的完整历史
  • 控制模型的响应风格和内容
  • 实现复杂的对话逻辑和上下文管理

角色类型概述

messages 数组中的消息可以包含三种角色类型:

  • system:用于设置模型的行为并下达指令,引导模型如何对后续的用户的查询做出响应。
  • user:代表用户输入的查询或问题。是模型生成回复的主要触发点。
  • assistant:代表模型之前生成的回复,用于构建对话上下文。在多轮对话中特别重要。

每个角色的具体作用和用法将在后续的示例部分详细介绍。


必需性

messages是OpenAI API请求中的必需参数,必须在请求体中提供。如果缺少此参数,API将返回错误,无法完成请求。

messages 数组不能为空,且最后一条消息必须是 userassistant。因此,在每次请求中通常至少需要包含一条 user 消息。system 角色是可选的,可以根据需要决定是否包含。


基本对话格式

基本对话格式是最简单的消息组织方式,适用于单轮对话场景。这种格式通常包含一条 system 消息(用于设定模型行为)和一条 user 消息(用于提出问题或请求)。

[
  {
    "role": "system",
    "content": "你是一位编程专家,擅长解释复杂的技术概念。"
  },
  {
    "role": "user",
    "content": "请用简单的话解释JavaScript中的闭包。"
  }
]

角色详解

  • system 角色:在这个示例中,system 消息设定了模型的角色为”编程专家”,这意味着后续的对话中,模型会以编程专家的身份来回答问题。 system 消息的作用是为整个对话设定一个基础框架和上下文,它指导模型如何理解后续的用户输入以及应该以什么风格进行响应。
  • user 角色:在这个示例中,user 消息是实际的问题内容,用户向模型询问关于 JavaScript 闭包的问题。 user 消息是每次对话的起点,它定义了模型需要回答的具体内容。

多轮对话格式

多轮对话格式适用于需要维护对话历史的场景。在这种格式中,除了 systemuser 消息外,还会包含 assistant 消息来记录模型之前的回复,从而保持对话的连贯性

[
  {
    "role": "system",
    "content": "你是一位数学老师,帮助学生解决数学问题。"
  },
  {
    "role": "user",
    "content": "如何求解二次方程x² + 5x + 6 = 0?"
  },
  {
    "role": "assistant",
    "content": "要解这个二次方程,我们可以使用求根公式x = (-b ± √(b² - 4ac))/(2a)。\n\n对于方程x² + 5x + 6 = 0,我们有a=1, b=5, c=6。代入公式:\nx = (-5 ± √(25 - 24))/2 = (-5 ± √1)/2 = (-5 ± 1)/2\n\n得到两个解:x = (-5 + 1)/2 = -2 和 x = (-5 - 1)/2 = -3"
  },
  {
    "role": "user",
    "content": "如果方程是x² + 2x + 5 = 0呢?"
  }
]

角色详解

  • system 角色:在这个示例中,system 消息设定模型为”数学老师”,这指导模型在整个对话过程中保持专业、耐心、善于解释的风格来帮助学生学习数学。 system 消息在这里起到统一对话基调的作用,确保模型在后续所有回复中都保持这个角色设定。
  • user 角色:在这个示例中有两条 user 消息。第一条 user 消息提出了第一个数学问题,第二条 user 消息是在看到模型回答后提出的跟进问题。 user 消息的数量决定了对话的轮次,每一条 user 消息都需要模型进行一次回复。
  • assistant 角色:在这个示例中,assistant 消息记录了模型对第一个问题的详细解答。 assistant 消息在多轮对话中至关重要,它保存了模型的回复历史,使得模型能够理解对话的上下文。当用户提出第二个问题时,模型能够基于之前的对话内容(通过查看 assistant 消息)来理解问题的背景,并给出相关的回答。

多用户场景格式

多用户场景格式适用于需要区分多个不同发言者的对话场景。在这种格式中,通过 name 字段明确标识每条消息的发送者,帮助模型理解复杂的对话结构和多方互动。

[
  {
    "role": "system",
    "content": "你是一个客服助手,需要同时处理多个客户的咨询。"
  },
  {
    "role": "user",
    "name": "张三",
    "content": "我想咨询一下产品A的价格。"
  },
  {
    "role": "assistant",
    "content": "您好张三,我是客服助手。请问您想了解哪个版本的产品A?"
  },
  {
    "role": "user",
    "name": "李四",
    "content": "我是李四,我想退货,请问流程是怎样的?"
  },
  {
    "role": "user",
    "name": "张三",
    "content": "我要标准版的产品A。"
  }
]

角色详解

  • system 角色:在这个示例中,system 消息设定了模型的职责为”客服助手”,需要同时处理多个客户的咨询。 system 消息在这里定义了模型的基本职责和工作模式,为后续的客户服务对话奠定基础。
  • user 角色配合name字段:在这个示例中,每条 user 消息都包含了 name 字段来标识发言者的身份:张三咨询产品A价格,李四咨询退货流程。name 字段使模型能够区分不同的用户,理解当前是哪位用户在发言,以及他们各自的对话上下文。 name 字段在多用户场景中至关重要,它帮助模型维护每个用户的独立对话线索,避免混淆不同用户的需求。
  • assistant 角色:在这个示例中,assistant 消息是模型对第一个用户(张三)的回复。 assistant 消息需要根据不同的用户分别进行回复。在实际应用中,模型需要根据 name 字段来追踪每个用户的对话历史和未完成的需求。

使用建议

  • 合理设计系统消息:系统消息应该清晰明确,设定模型的角色和响应风格。避免过于冗长的系统消息,确保核心指令突出
  • 控制消息数组长度:对于多轮对话,维护完整的对话历史,但可考虑截断过长的历史以控制token使用。对于长对话,可以只保留最近几轮的关键对话
  • 优化用户消息格式:用户消息应该简洁明了,避免冗余信息。将复杂问题分解为多个简单的问题,或者使用结构化格式提高可读性
  • 合理利用角色类型:根据对话场景选择合适的角色组合。单轮对话使用system和user,多轮对话需要包含assistant消息来维护上下文
  • 处理消息顺序:确保消息按照时间顺序排列,从最早到最新。最后一条消息必须是user或assistant角色
  • 使用name字段区分发言者:在多用户场景中,使用”name”字段可以区分不同的发言者,帮助模型理解对话结构
  • 控制token使用:监控消息数组的总token数,避免超过模型的最大上下文限制。对于长对话,考虑使用摘要或截断策略
  • 测试不同消息结构:对于关键应用,测试不同的消息组织方式,找到最适合你应用场景的对话结构

常见问题解答

  • 问:messages数组的最大长度是多少?
    答:messages数组的长度受模型的最大上下文窗口限制。不同模型有不同的限制,通常在4K到128K tokens之间。你需要确保整个messages数组(包括所有消息内容)的总token数不超过模型的最大限制。如果超过限制,API会返回错误。
  • 问:什么时候需要使用assistant角色?
    答:在以下情况下需要使用assistant角色:1)多轮对话场景,需要维护对话上下文;2)需要模型基于之前的回复进行后续回答;3)实现复杂的对话逻辑,如引导式对话或状态跟踪。对于单轮对话,可以只使用system和user角色。
  • 问:system消息是必需的吗?
    答:system消息不是必需的,但强烈建议使用。system消息可以帮助设定模型的行为模式、响应风格和角色定位。如果没有system消息,模型会使用默认的行为模式进行响应。在某些复杂应用中,精心设计的system消息可以显著提高响应质量。
  • 问:如何处理超长的对话历史?
    答:对于超长对话历史,可以采取以下策略:1)截断策略:只保留最近的对话轮次;2)摘要策略:对较旧的对话内容进行摘要处理;3)分块策略:将长对话拆分为多个独立的对话会话;4)使用支持更大上下文窗口的模型。选择哪种策略取决于你的具体应用需求。
  • 问:name字段有什么实际用途?
    答:name字段主要用于多用户场景,可以:1)区分不同的用户身份;2)在群聊中标识发言者;3)实现多角色对话(如客服系统中区分客户和客服);4)帮助模型理解复杂的对话结构。在单用户场景中,name字段通常可以省略。
  • 问:如何优化messages数组以提高响应质量?
    答:优化messages数组的方法包括:1)保持消息简洁明了,避免冗余信息;2)合理组织消息顺序,确保逻辑清晰;3)使用明确的角色分配;4)在system消息中提供清晰的指令;5)对于复杂任务,可以在system消息中提供示例或格式要求;6)定期测试和调整消息结构以适应你的具体应用场景。