LLM学习笔记(2)会话补全Chat Completions、什么是JSON?
什么是会话补全Chat Completions?
功能目标:处理多轮对话。
- 它模拟对话的逻辑,比如聊天机器人对用户消息的回应。
- 使用的模型主要是针对对话型应用优化的模型,例如
gpt-3.5-turbo
或gpt-4
。
什么是JSON?
JSON 本质上是一种 数据格式,它的作用就是在 客户端 和 服务器(比如大语言模型)之间传递和交换数据。
举个例子,在ChatGPT中,用户输入的内容被转化为JSON格式,传递给大语言模型;而大语言模型生成的回答,也被转化为JSON格式返回到客户端或者交流界面。
我们可以说,JSON 是大语言模型中核心的"桥梁"和"翻译官",它是整个大语言模型输入和输出的基础工具。
除了用户输入和模型输出,在大语言模型的开发中,JSON 还可以:
- 传递参数:如模型名称(
gpt-3.5-turbo
)、温度(temperature
)等参数。 - 存储对话上下文:方便多轮对话的实现。
- 记录数据:比如日志系统,JSON 常用于存储对话记录。
以下内容的说明
使用 openai.ChatCompletion.create
函数,通过 API 向语言模型发送请求(内容包括①指定使用的模型;②定义发送消息内容)之后,请求内容被发送到 OpenAI 的服务器,服务器返回的结果是一个 JSON 对象,描述了模型生成的回复。以下内容就是模型生成的响应内容。
逐条解析响应 JSON 的每一项内容
1. 顶层结构
-
id
:"chatcmpl-123"
- 含义:这是该聊天补全请求的唯一标识符,用于跟踪或日志记录。
- 作用:如果需要排查问题或查询特定请求的记录,可以通过此 ID 进行定位。
-
object
:"chat.completion"
- 含义:表示响应的类型。在这里,响应类型是聊天补全。
- 作用:区分 API 的不同功能模块(例如文本补全、聊天补全等)。
-
created
:1677652288
- 含义:响应生成的时间戳。它表示从 1970 年 1 月 1 日 00:00:00 UTC(协调世界时) 开始经过的秒数,这里的时间是 2023 年 3 月 1 日 12:18:08(UTC)。
- 作用:标记请求的生成时间,用于记录或分析调用历史。
2. choices字段
choices
是 API 返回的核心部分,存储了模型生成的回答。- 每个元素包含:
- 回答的索引(
index
)。 - 消息的角色和内容(
message
)。 - 生成结束的原因(
finish_reason
)。
- 回答的索引(
- 如果没有特殊需求,
choices[0].message.content
就是模型的回答内容,也是用户主要关注的部分。
-
包含 API 生成的回答:
choices
是 API 返回结果中用于封装生成回答的字段,模型的回答都存储在这个数组中。- 如果模型生成多个候选回答,则这些候选回答以数组形式存放在
choices
中。
-
支持多种用途:
- 单一回答:默认情况下,
choices
只包含一个回答。 - 多个候选:通过设置参数(如
n
)可以请求模型生成多个回答,并从中选择最佳的一个。
- 单一回答:默认情况下,
-
对话上下文的传递:
choices
中的message
字段不仅包含模型的回答,还包含role
信息,用于保持对话的上下文和参与者角色的区分。
1. index:0
- 类型:整数
- 作用:标识回答的序号,用于区分当生成多个回答时的不同候选项。
- 说明:在当前请求中,只生成了一个回答,因此索引为
0
。
2. message
:
- 类型:对象
- 作用:包含具体生成回答的信息。
- 内部字段解析:
content
:"\n\nHello there, how may I assist you today?"
- 类型:字符串
- 含义:模型生成的具体回答内容。
- 说明:这个字段是
choices
字段中最重要的部分,包含模型对用户输入的核心回复。
role
:"assistant"
- 类型:字符串
- 含义:表示消息的角色,这里是由模型(助手)生成的回答。
- 可能值:
"user"
:用户发送的消息。"assistant"
:模型生成的回答。"system"
:系统设定的背景或约束信息。
3. finish_reason
: "stop"
- 类型:字符串
- 作用:指示模型生成回答的结束原因。
- 可能的值:
"stop"
:生成正常结束,因为模型认为回答已完整。"length"
:达到max_tokens
限制,生成被截断。"content_filter"
:生成的内容被内容过滤器截断。"null"
:某些情况下可能为空,表示生成中止或其他特殊原因。
3. usage
字段
usage
字段主要记录了一次 API 请求的 token 使用情况,帮助用户了解模型在本次请求中消耗的资源量。
什么是token?
在自然语言处理(NLP)和大语言模型(LLM)中,token(标记) 是文本的基本处理单元。大语言模型(如 GPT-3.5 和 GPT-4)将输入的文本分解为若干个 token,然后以这些 token 为基础进行计算和生成内容。
Token 的作用
-
模型的基本输入单位:
- 大语言模型无法直接理解自然语言,而是将输入文本拆分成更小的单位(token),这些单位是模型理解和处理语言的基础。
-
节约计算资源:
- 通过将文本切分为 token,可以更高效地对其进行计算和处理。
-
计费单位:
- 大语言模型的 API 调用通常按 token 数量计费,理解 token 的意义有助于优化输入和降低成本。
Token 的特点
-
Token 可以是以下单位之一:
- 单词:例如
"hello"
是一个 token。 - 标点符号:例如
","
和"?"
是独立的 token。 - 子词:例如
"running"
可能被拆分为"run"
和"ning"
两个 token。 - 数字或符号:例如
"2023"
或"$"
。
- 单词:例如
-
Token 是语言相关的:
- 在英文中,一个简单的单词可能是一个 token,而在中文中,每个汉字通常是一个独立的 token。
Token 和字符的区别
- 字符(Character):文本中每一个单独的字母、数字或符号。例如
Hello!
有 6 个字符。 - Token:字符的集合,通常是分词的结果。例如
Hello!
可能只被分为 2 个 token:Hello
和!
。
usage
字段的作用
-
监控消耗:
记录输入(prompt_tokens
)和输出(completion_tokens
)的 token 数量,以及总消耗量(total_tokens
)。
有助于用户管理和优化调用成本,因为 OpenAI 的 API 通常按 token 使用量收费。
-
优化性能:
用户可以通过分析 token 数量来优化提示(prompt)的设计,例如减少无用内容,控制输出长度,从而降低成本。
-
计费依据:
OpenAI 的计费机制基于 token 使用量,因此 usage
字段是计费的直接依据。
-
调试和分析:
在开发中,usage
字段帮助用户了解 API 调用是否符合预期。例如,输入是否过长?输出是否被截断?
1. prompt_tokens
: 9
-
含义:处理用户输入(prompt)时消耗的 token 数量,包括:
- 用户发送的内容。
- 对话上下文(如前几轮消息,若有)。
- 系统消息(如设定的背景信息)。
-
作用:
- 表示模型需要处理的输入长度。
- 可以用来评估 prompt 的设计是否简洁。
2. completion_tokens
: 12
-
含义:模型生成的回答所用的 token 数量。
-
作用:
- 表示模型输出的长度。
- 提供优化线索:如果生成的回答过长,可能需要调整
max_tokens
参数或模型温度(temperature
)来控制长度。
3. total_tokens
: 21
-
含义:
prompt_tokens
和completion_tokens
的总和。- 即:
prompt_tokens + completion_tokens = total_tokens
。
- 即:
-
作用:
- 显示本次请求的整体资源消耗。
- 便于用户估算成本,因为 API 的计费通常基于总 token 数量。