HAR:Chatgpt的请求体属性分析
August 6, 2024

HAR:Chatgpt的请求体属性分析

分析Chatgpt的请求体属性的功能、作用


HAR:Chatgpt的请求体属性分析

GPT Request Body 的分析(二)

本章节主要分析 Request Body 的各项属性,以及职能.

数据结构分析

第一次的请求体结构

{
  "action": "next",
  "messages": [
    {
      "id": "aaa2a10e-decf-41bd-adcb-112c1b4fcb42",
      "author": {
        "role": "user"
      },
      "content": {
        "content_type": "text",
        "parts": ["询问内容"]
      },
      "metadata": {},
      "create_time": 1722363267.048
    }
  ],
  "parent_message_id": "aaa18741-c943-42bd-9cbe-c22948643c3e",
  "model": "gpt-4o",
  "timezone_offset_min": -480,
  "suggestions": [],
  "history_and_training_disabled": false,
  "conversation_mode": {
    "kind": "primary_assistant"
  },
  "force_paragen": false,
  "force_paragen_model_slug": "",
  "force_nulligen": false,
  "force_rate_limit": false,
  "reset_rate_limits": false,
  "websocket_request_id": "40b4408c-c835-415d-a9a4-48c06a3f756f",
  "force_use_sse": true,
  "conversation_origin": null
}
2024-07-31-23-13-41

后续的请求体结构

{
  "action": "next",
  "messages": [
    {
      "id": "aaa2d2c5-49a4-4695-8f91-c5c6a4b3debb",
      "author": {
        "role": "user"
      },
      "content": {
        "content_type": "text",
        "parts": ["继续"]
      },
      "metadata": {},
      "create_time": 1722363328.879
    }
  ],
  "conversation_id": "aef1bc8f-8cbd-4b84-ad19-5960ab1e7adf",
  "parent_message_id": "3afab151-7ba9-491d-b8c0-350ecaf788fe",
  "model": "gpt-4o",
  "timezone_offset_min": -480,
  "suggestions": [],
  "history_and_training_disabled": false,
  "conversation_mode": {
    "kind": "primary_assistant"
  },
  "force_paragen": false,
  "force_paragen_model_slug": "",
  "force_nulligen": false,
  "force_rate_limit": false,
  "reset_rate_limits": false,
  "websocket_request_id": "41931b37-b00f-4d4a-9604-a2737efdb9d8",
  "force_use_sse": true,
  "conversation_origin": null
}
2024-07-31-23-13-41

分析结果

Q: ChatGPT 有修改问答,重新生成的按钮,进行完这些操作之后,ChatGPT 是如何知道自己之前的消息之后的消息都是哪些呢?如何知道自己的同级消息有哪些呢?

A: 通过 conversation_id 确定自己所属的会话,通过 parent_message_id 知道自己的父级消息是谁?进而构建完整的消息树.(conversation 有个 list 存放所有属于它的消息)

Q: 请求体里面不是像 ChatGPT 的 api 一样,传递整个 conversation,他是如何获取上下文的?

A: 后端通过 conversation 有个 list 存放所有属于它的消息,另外应该有 RAG

猜测各个属性的功能:

  1. action: 表示当前的操作类型,这里的值是”next”,可能意味着这是在请求下一个消息或响应。

  2. messages: 一个数组,包含消息对象。每个消息对象包含以下属性:

    • id: 消息的唯一标识符。
    • author: 消息的作者,这里的角色是”user”,表示这是一个用户发送的消息。
    • content: 消息的内容,包含内容类型(这里是文本)和实际的文本部分。
    • metadata: 消息的元数据,这里为空。
    • create_time: 消息创建的时间戳。
  3. parent_message_id: 父消息的ID,用于跟踪对话的上下文。

  4. model: 使用的模型名称,这里是”gpt-4o”,特定的AI模型的名称。

  5. timezone_offset_min: 时区偏移量,单位是分钟,这里表示-480分钟,即UTC-8时区。

  6. suggestions: 一个空数组,可能用于存储建议或推荐内容。有时候我们询问完问题或者GPT回答完问题,在对话框的上面有时候会出现GPT猜测你可能想继续问的问题,这些内容存储在suggestions.

  7. history_and_training_disabled: 布尔值,表示是否禁用了历史记录和训练功能。这个取决于你是否开启了临时聊天

  8. conversation_mode: 对话模式,这里的”kind”是”primary_assistant”,表示这是主要助手模式。

  9. force_paragen: 布尔值,可能表示是否强制使用某种特定的生成模式。

  10. force_paragen_model_slug: 字符串,可能表示强制使用的模型标识符,这里是空字符串。

  11. force_nulligen: 布尔值,可能表示是否强制不使用某种生成模式。

  12. force_rate_limit: 布尔值,可能表示是否强制进行速率限制。

  13. reset_rate_limits: 布尔值,可能表示是否重置速率限制。

  14. websocket_request_id: WebSocket请求的唯一标识符。

  15. force_use_sse: 布尔值,可能表示是否强制使用服务器发送事件(Server-Sent Events)。一般使用SSE连接

  16. conversation_origin: 可能表示对话的来源或起始点,这里是null。