OpenAI 技术文档学习
date
Aug 15, 2024
slug
learning-notes-on-openai-tech-docs
status
Published
tags
AI
summary
学习 OpenAI 的官方文档的一些笔记,更新中
type
Post
Chat Completions
- 使用模型:输入(文本或图像)和 API 密钥,API 返回响应文本(代码或者 JSON)
- message(对象数组)作为输入:
- 角色:system、user、assistant
- system:可选,用于设定角色、回答风格、目标、技能。默认是你是一个有用的助手,每次对话其实设定一次就够了,但也可以改。
- user:具体的问题和指令或评论、请求
- assistant:代表gpt 之前的回答,可以是之前真实的 gpt 回答,它可以更好的理解上下文情景(在包含上下文的多轮连续对话时这是必须的)。也可以是自己编写的用来做例子给 gpt 学习,可以让他学习到你想要的回答
- 如果输入太长,会被截断,不同的模型的输入限制不同。
- 响应的格式
- 结束原因:
- stop,正常完整结束
- length,输出太长,超出限制
- functioncall:要去调用函数
- contentfilter:触发内容过滤
- null:还没结束
Fine-tuning
- 准备一些对话示例,是你想要的对话效果,做成一个文件,将其通过 api 开启训练任务,模型会按照期望的示例进行学习,结束之后评估结果。
- 在 prompt 添加示例让模型学习时称为few-shot learning,不同点在:
- 能获得更高质量的结果
- 能够添加的示例更多,prompt 中添加不了多少
- 再去用的时候节省 tokens,prompt 不用那么长了
- 再去用的时候回复的延迟也短了
- 啥时候用:先用 prompt 调试、prompt 链、函数调用,这些都用了还是不行再说
- 有时候 prompt 改改就能很好的效果
- 创建数据集、运行作业很麻烦,反馈很慢,上述的三种方法反馈更快
- 如果真要微调,之前的 优化好的prompt 、prompt 链、函数也可用
- 适用的例子:
- 为模型设定风格、语气、格式
- 提高输出的可靠性
- 复杂提示下改正故障
- 用特殊方法处理边缘案例
- 执行一项新的任务,prompt 中不好写
- 微调一些便宜的模型达到贵的模型的效果
- 流程:
- 准备数据集
- 格式
- 里面都是示例
- 遵循 API 格式,包括角色内容等
- 助手的内容应该是你想要得到的理想内容
- 可以有多轮聊天示例,可以设定每次对话的权重 0 或 1,挑选着学习
- 准备提示:将最好的指令或者提示放到训练示例中
- 示例数量:至少 10 个,50-100 个有明显改进,建议从 20 个开始,不行再加
- 分割数据集:分开成为训练和测试的两部分,都上传之后,api 会返回两个的统计数据
- token 限制、估算成本、检查格式(有一个专门的工具)、上传文件(有文件上传接口)
- 创建模型
- 可以用编码或者网页操作
- 输入训练文件和模型名称
- 模型时间根据训练集大小不同
- 可以列出现有作业、查看作业状态、取消作业、恢复作业
- 使用:与常规调用模型方法相同,模型名称使用微调过的模型名称
- 检查点模型:常常需要多次训练才能得到最终的微调模型。每次训练结束都会生成一个检查点模型,提供给你训练过程中的多个版本。
- 分析模型效果
- 指标:
- training loss 训练损失
- training token accuracy 训练标记准确度
- valid loss 有效损失
- valid token accuracy 有效标记准确度
嵌入Embeddings
- 嵌入模型用于将文本转化为向量,一个嵌入是一个浮点数的向量列表。
- 嵌入可以衡量文本字符串之间的相关性。向量之间的距离越近相关性越大。
- 嵌入可以用于搜索、聚类、推荐(匹配关联性最大)、异常检查(某些文本关联性异常小)、多样性测量(分析文本的相似性分布)、分类(按相似的标签分类)
- API 输入:文本、使用的模型
- API 响应:一个浮点数列表及一些数据(使用的模型、花费的 token 等)
- 应用:将文本内容作为上下文嵌入,让大模型进行搜索后回答
- 两步:搜索和提问
- Search: search your library of text for relevant text sections
- Ask: insert the retrieved text sections into a message to GPT and ask it the question
- 搜索和微调模型
- GPT 学习知识的方式有两种
- 模型权重:通过学习新的用例去微调模型
- 模型输入:将知识插入到输入的消息中
- 模型权重适合于调整模型的风格、语气等非细节的方面,是长期记忆
- 消息输入是短期记忆,对细节信息更加准确,但一次处理的文本有限
- 搜索的方式
- Lexical-based search 基于词汇的搜索
- Graph-based search 基于图的搜索
- Embedding-based search 基于嵌入的搜索
- 流程:
- 准备数据:(每份文档一次)
- 收集文章
- 将文章分块
- 每一块都进行向量化
- 将向量存储
- 搜索(每次查询一次搜索)
- 给定用户的输入,将输入通过 api 向量化
- 根据问题的向量将文本向量进行排序,使用查询和每个文档的嵌入向量之间的余弦相似度,并返回得分最高的文档
- 查询
- 将问题和最相关的文档一起发给 GPT
- 返回 GPT 的回答
Assistant API 助手 API
- 助手可以利用模型、工具和文件去完成用户的查询和命令
- 工具支持代码解释器、文件搜索、函数调用(可并行访问多个)
- 可以访问各种格式文件,用来创建文件或者用于与用户的对话,引用他们在对话中参考的文件
- 助手是一个实体,它的参数包括
- 名字,用户指定
- 指令:用户指定,可指定风格和角色,个性和它的目标,类似于 system 消息
- 工具:可使用的工具名称,代码解释器、函数调用等
- 模型:基于的大模型名称
- tool_resources 来为指定工具指定可访问的文件,用于指定工具的访问
- API 使用时,
- 创建一个助手,设定好上述的参数
- 任意创建一个线程 Thread
- 把用户的消息添加到线程
- Run,run线程的时候把助手 id 传进去
- 工具:
- 函数调用
- 创建助手时,在工具参数中定义函数,定义类型、名称、描述,所需要的参数类型,参数名称、参数描述
- 创建线程,用户消息内容添加进线程
- run
代码解释器
微调模型 Fine-tuning
- 介绍
- 通过微调模型可以得到比通过 prompting 更好更符合期望的结果
- 与一个 prompt 相比,更适合训练更多的例子
- 能够更节省 token,获得更低的回复延迟
- 流程:
- 准备和上传训练集
- 训练一个微调模型
- 评估结果,重复 1 2 3
- 使用经过微调的模型
- 啥时候使用微调
- 提示工程和提示链以及函数调用,已经可以很好的改进结果,并且反馈迅速
- 建议在上述的措施之后再尝试进行模型微调
- 此前优化的 prompt 不会浪费,模型微调中也可以用
Message roles 消息角色
Each message object has a role (either
system
, user
, or assistant
) and content.每个消息对象都有一个角色(要么是 system
,要么是 user
,要么是 assistant
)和内容。- The system message is optional and can be used to set the behavior of the assistant
系统消息是可选的,可以用于设置助手的行为
- The user messages provide requests or comments for the assistant to respond to
用户消息提供给助手响应的请求或评论
- Assistant messages store previous assistant responses, but can also be written by you to give examples of desired behavior (few-shot examples)
助手消息存储了之前的助手响应,但也可以由您编写,以提供所需行为的示例(少量示例)
系统消息:
- By default, the system message is "You are a helpful assistant". You can define instructions in the user message, but the instructions set in the system message are more effective. You can only set one system message per conversation.默认情况下,系统消息为“您是一个有帮助的助手”。您可以在用户消息中定义指令,但系统消息中设置的指令更有效。每次对话只能设置一个系统消息。
- system 对于一个对话中,通常只需要在一个会话中第一次发送请求时定义,之后均不需要定义,
system
消息在一次对话会话中有效,如果你开始一个新的会话,system
消息的效果会“失效”,需要重新设置。
但在同一个会话中,如果在第一次定义了 system 消息,之后再重新定义,会覆盖掉此前的定义。
如果你在一个会话中第一次设置了
system
消息为“你是一个问答助手”,然后在同一个会话中再次发送 system
消息为“你是一个幽默的故事讲述者”,模型将会根据最新的 system
消息来调整其行为,忽略之前的设定。这种行为允许你在同一个对话中动态改变模型的行为和角色。助手消息:
- 助手的角色即代表了 GPT 的角色,我们在调用 API 时:如果需要存储让 API 知道上下文,则需要每次都把之前的完整对话在 message 中发送。此时例如:我们发送了第一条
api 的回复:
我们再次发问时的 api 请求:
OpenAI 的assistant角色即代表 api 的角色,我们想要 api 理解上下文时,即需要将user 和 assistant 完整发送,让大模型理解上下文。
- 这种通过自主编写 assistant 和 user 对话的方式,可以用于 prompt 编写,"few-shot" prompting
Providing general instructions that apply to all examples is generally more efficient than demonstrating all permutations of a task by example, but in some cases providing examples may be easier. For example, if you intend for the model to copy a particular style of responding to user queries which is difficult to describe explicitly. This is known as "few-shot" prompting.
大模型消息中的 system 和 user 有什么区别?Assist 助手消息又有什么区别?
OpenAI 的示例和说明
看起来是这样定义:system 用于定义出给模型的角色,包括特点、技能等的定义,或者是针对任务和处理步骤的描述。
user 的消息用于给定这个角色具体的任务实例,或者直接是输入任务的输入
Chat models take a list of messages as input and return a model-generated message as output. Although the chat format is designed to make multi-turn conversations easy, it's just as useful for single-turn tasks without any conversation.
- 为什么大模型能接受一系列的消息作为输入,但是一次只能输出一个消息?
猜测一次只能输出一个结果有助于更有效地管理和分配计算资源,提高响应速度。
生成连贯、有意义且准确的语言是一个复杂的过程。模型需要逐步构建和优化输出,一次专注于生成一个完整且质量较高的消息可以保证输出的质量。
- 我这么理解是否正确:大模型进行结构化输出如 json 格式输出,能够满足用户一次需要大模型输出多个结果的需求?
大模型进行结构化输出,如以 JSON 格式输出,确实可以在一个输出中包含多个相关的元素或结果,从而以一种相对有条理和易于解析的方式提供更多信息。
然而,这并不一定完全满足用户一次需要大模型输出多个“不同类型”结果的需求。例如,用户可能期望同时得到一段详细的文字描述、一组数据分析结果以及一些图像生成内容。
- 大模型被设计为与用户互动的多轮聊天模型的交互,是为了利于用户多轮对话。但他在没有任何沟通时的单词任务也同样可以完成任务。
- 温度值较低会产生更一致的输出(例如 0.2),而较高的值会产生更多样化和更具创造性的结果(例如 1.0)。根据您特定应用在一致性和创造性之间所需的权衡来选择温度值。温度范围可以是 0 到 2 。
温度可以理解为冷冻和热情,越低越冷就会越冷漠和坚硬,越高就会越活越
- ChatGPT为我们的模型提供了一个聊天界面以及一系列内置功能,如集成浏览、代码执行、插件等。相比之下,使用 OpenAI 的 API 提供了更多的灵活性,但要求您以编程方式编写代码或将请求发送到我们的模型。
chatGPT只是 openai 在大模型的基础上,专门为聊天和一些基础功能创建的一个C 端产品。我们也可以利用 openAI 提供的 api,在其之上进行开发。
- 存在一个与语言模型协作相关的整个领域,该领域已被称为“提示工程”,但随着该领域的发展,其范围已不再仅仅是对提示进行工程设计,而是扩展到对将模型查询用作组件的工程系统进行设计。
这已经算为一个学术和技术的研究领域,甚至已经成为了一个学科。
Embeddings是什么?
Embeddings :A set of models that can convert text into a numerical form
嵌入embedding 是一段数据(例如某些文本)的向量表示,用于保留文本内容和/或其含义的各个方面。在一些程度上相似的数据块往往比不相关数据有更紧密更接近的embedding 。OpenAI 提供文本嵌入模型,将文本字符串作为输入,生成的嵌入向量作为输出。
Function calling
- 大模型的“智能”体现在它能够理解问题、生成适当的参数,并决定是否需要调用外部API来提供最佳答案。
- 实际的API调用和数据交互通常是由集成了大模型的应用程序或服务来完成的,而不是大模型自己直接执行。
- 您提供给大模型的并不是直接提供某个具体的API工具,而是描述该API工具的功能和使用方式。比如告诉模型:"有一个查询天气的API,它需要地点和日期作为输入参数,可以返回该地点该日期的天气信息"。
- 模型根据您的描述,会智能生成一个JSON对象,其中包含了调用该API所需的参数,比如{"location": "北京", "date": "2023-06-01"}。
- 模型本身并不会真正调用该API获取天气数据,而是将这个JSON对象返回给您。
- 之后,由您自己或系统根据模型生成的JSON对象,真正调用相应的天气API,获取天气信息。
- 收到API返回的天气数据后,您可以将这些数据反馈给模型,模型就能基于这些数据,综合上下文,生成最终的天气回答。
能够改进输出结果的方式有哪些?
prompt engineering, prompt chaining (breaking complex tasks into multiple prompts), and function calling,模型微调
playground是什么意思?
在技术开发领域,"playground" 通常指的是一个专门的环境或平台,用于实验、测试和学习新技术或工具。以下是一些具体的含义和用途:
- 代码沙箱:在编程和软件开发中,playground 可以是一个安全的测试环境,允许开发者编写和运行代码,而不会对主系统或生产环境产生影响。这种环境通常用于测试新功能或调试代码。
- 技术实验室:一些公司或组织可能会设立一个技术实验室,作为内部的 playground,让员工自由探索和实验新技术。这有助于推动创新和发现新的解决方案。
- 教育工具:在教育领域,playground 可以是一个在线平台或应用程序,提供交互式的学习体验,让学生通过实践来掌握编程语言或其他技术技能。
- 产品原型测试:在产品设计和开发过程中,playground 可以是一个用于测试和验证产品原型的环境。这有助于在产品发布之前发现和解决潜在的问题。
- API 测试:对于需要与外部服务或应用程序集成的开发项目,playground 可以是一个用于测试 API 调用和响应的环境。这有助于确保集成的可靠性和兼容性。
- 开源项目:在开源社区,playground 可以是一个公共的代码库或项目,允许贡献者提交和测试新的代码或功能。这有助于促进社区的协作和知识共享。