OpenAI 技术文档学习

date
Aug 15, 2024
slug
learning-notes-on-openai-tech-docs
status
Published
tags
AI
summary
学习 OpenAI 的官方文档的一些笔记,更新中
type
Post

Chat Completions

  1. 使用模型:输入(文本或图像)和 API 密钥,API 返回响应文本(代码或者 JSON)
  1. message(对象数组)作为输入:
    1. 角色:system、user、assistant
    2. system:可选,用于设定角色、回答风格、目标、技能。默认是你是一个有用的助手,每次对话其实设定一次就够了,但也可以改。
    3. user:具体的问题和指令或评论、请求
    4. assistant:代表gpt 之前的回答,可以是之前真实的 gpt 回答,它可以更好的理解上下文情景(在包含上下文的多轮连续对话时这是必须的)。也可以是自己编写的用来做例子给 gpt 学习,可以让他学习到你想要的回答
    5. 如果输入太长,会被截断,不同的模型的输入限制不同。
  1. 响应的格式
    1. 结束原因:
      1. stop,正常完整结束
      2. length,输出太长,超出限制
      3. functioncall:要去调用函数
      4. contentfilter:触发内容过滤
      5. null:还没结束

Fine-tuning

  1. 准备一些对话示例,是你想要的对话效果,做成一个文件,将其通过 api 开启训练任务,模型会按照期望的示例进行学习,结束之后评估结果。
  1. 在 prompt 添加示例让模型学习时称为few-shot learning,不同点在:
    1. 能获得更高质量的结果
    2. 能够添加的示例更多,prompt 中添加不了多少
    3. 再去用的时候节省 tokens,prompt 不用那么长了
    4. 再去用的时候回复的延迟也短了
  1. 啥时候用:先用 prompt 调试、prompt 链、函数调用,这些都用了还是不行再说
    1. 有时候 prompt 改改就能很好的效果
    2. 创建数据集、运行作业很麻烦,反馈很慢,上述的三种方法反馈更快
    3. 如果真要微调,之前的 优化好的prompt 、prompt 链、函数也可用
  1. 适用的例子:
    1. 为模型设定风格、语气、格式
    2. 提高输出的可靠性
    3. 复杂提示下改正故障
    4. 用特殊方法处理边缘案例
    5. 执行一项新的任务,prompt 中不好写
    6. 微调一些便宜的模型达到贵的模型的效果
  1. 流程:
    1. 准备数据集
      1. 格式
        1. 里面都是示例
        2. 遵循 API 格式,包括角色内容等
        3. 助手的内容应该是你想要得到的理想内容
      2. 可以有多轮聊天示例,可以设定每次对话的权重 0 或 1,挑选着学习
      3. 准备提示:将最好的指令或者提示放到训练示例中
      4. 示例数量:至少 10 个,50-100 个有明显改进,建议从 20 个开始,不行再加
      5. 分割数据集:分开成为训练和测试的两部分,都上传之后,api 会返回两个的统计数据
      6. token 限制、估算成本、检查格式(有一个专门的工具)、上传文件(有文件上传接口)
    2. 创建模型
      1. 可以用编码或者网页操作
      2. 输入训练文件和模型名称
      3. 模型时间根据训练集大小不同
      4. 可以列出现有作业、查看作业状态、取消作业、恢复作业
    3. 使用:与常规调用模型方法相同,模型名称使用微调过的模型名称
    4. 检查点模型:常常需要多次训练才能得到最终的微调模型。每次训练结束都会生成一个检查点模型,提供给你训练过程中的多个版本。
  1. 分析模型效果
    1. 指标:
      1. training loss 训练损失
      2. training token accuracy 训练标记准确度
      3. valid loss 有效损失
      4. valid token accuracy 有效标记准确度

嵌入Embeddings

  1. 嵌入模型用于将文本转化为向量,一个嵌入是一个浮点数的向量列表。
  1. 嵌入可以衡量文本字符串之间的相关性。向量之间的距离越近相关性越大。
  1. 嵌入可以用于搜索、聚类、推荐(匹配关联性最大)、异常检查(某些文本关联性异常小)、多样性测量(分析文本的相似性分布)、分类(按相似的标签分类)
  1. API 输入:文本、使用的模型
  1. API 响应:一个浮点数列表及一些数据(使用的模型、花费的 token 等)
  1. 应用:将文本内容作为上下文嵌入,让大模型进行搜索后回答
    1. 两步:搜索和提问
      1. Search: search your library of text for relevant text sections
      2. Ask: insert the retrieved text sections into a message to GPT and ask it the question
    2. 搜索和微调模型
      1. GPT 学习知识的方式有两种
        1. 模型权重:通过学习新的用例去微调模型
        2. 模型输入:将知识插入到输入的消息中
        3. 模型权重适合于调整模型的风格、语气等非细节的方面,是长期记忆
        4. 消息输入是短期记忆,对细节信息更加准确,但一次处理的文本有限
    3. 搜索的方式
      1. Lexical-based search 基于词汇的搜索
      2. Graph-based search 基于图的搜索
      3. Embedding-based search 基于嵌入的搜索
    4. 流程:
      1. 准备数据:(每份文档一次)
        1. 收集文章
        2. 将文章分块
        3. 每一块都进行向量化
        4. 将向量存储
      2. 搜索(每次查询一次搜索)
        1. 给定用户的输入,将输入通过 api 向量化
        2. 根据问题的向量将文本向量进行排序,使用查询和每个文档的嵌入向量之间的余弦相似度,并返回得分最高的文档
      3. 查询
        1. 将问题和最相关的文档一起发给 GPT
        2. 返回 GPT 的回答

Assistant API 助手 API

  1. 助手可以利用模型、工具和文件去完成用户的查询和命令
  1. 工具支持代码解释器、文件搜索、函数调用(可并行访问多个)
  1. 可以访问各种格式文件,用来创建文件或者用于与用户的对话,引用他们在对话中参考的文件
  1. 助手是一个实体,它的参数包括
    1. 名字,用户指定
    2. 指令:用户指定,可指定风格和角色,个性和它的目标,类似于 system 消息
    3. 工具:可使用的工具名称,代码解释器、函数调用等
    4. 模型:基于的大模型名称
    5. tool_resources 来为指定工具指定可访问的文件,用于指定工具的访问
  1. API 使用时,
    1. 创建一个助手,设定好上述的参数
    2. 任意创建一个线程 Thread
    3. 把用户的消息添加到线程
    4. Run,run线程的时候把助手 id 传进去
  1. 工具:
    1. 函数调用
      1. 创建助手时,在工具参数中定义函数,定义类型、名称、描述,所需要的参数类型,参数名称、参数描述
  1. 创建线程,用户消息内容添加进线程
  1. run
代码解释器

微调模型 Fine-tuning

  1. 介绍
    1. 通过微调模型可以得到比通过 prompting 更好更符合期望的结果
    2. 与一个 prompt 相比,更适合训练更多的例子
    3. 能够更节省 token,获得更低的回复延迟
  1. 流程:
    1. 准备和上传训练集
    2. 训练一个微调模型
    3. 评估结果,重复 1 2 3
    4. 使用经过微调的模型
  1. 啥时候使用微调
    1. 提示工程和提示链以及函数调用,已经可以很好的改进结果,并且反馈迅速
    2. 建议在上述的措施之后再尝试进行模型微调
    3. 此前优化的 prompt 不会浪费,模型微调中也可以用

Message roles 消息角色

Each message object has a role (either systemuser, 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)
    • 助手消息存储了之前的助手响应,但也可以由您编写,以提供所需行为的示例(少量示例)
 

系统消息:

  1. 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.默认情况下,系统消息为“您是一个有帮助的助手”。您可以在用户消息中定义指令,但系统消息中设置的指令更有效。每次对话只能设置一个系统消息。
  1. system 对于一个对话中,通常只需要在一个会话中第一次发送请求时定义,之后均不需要定义,system 消息在一次对话会话中有效,如果你开始一个新的会话,system 消息的效果会“失效”,需要重新设置。
    1. 但在同一个会话中,如果在第一次定义了 system 消息,之后再重新定义,会覆盖掉此前的定义。
      如果你在一个会话中第一次设置了 system 消息为“你是一个问答助手”,然后在同一个会话中再次发送 system 消息为“你是一个幽默的故事讲述者”,模型将会根据最新的 system 消息来调整其行为,忽略之前的设定。这种行为允许你在同一个对话中动态改变模型的行为和角色。
 

助手消息:

  1. 助手的角色即代表了 GPT 的角色,我们在调用 API 时:如果需要存储让 API 知道上下文,则需要每次都把之前的完整对话在 message 中发送。此时例如:我们发送了第一条
api 的回复:
我们再次发问时的 api 请求:
OpenAI 的assistant角色即代表 api 的角色,我们想要 api 理解上下文时,即需要将user 和 assistant 完整发送,让大模型理解上下文。
 
 
  1. 这种通过自主编写 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调用和数据交互通常是由集成了大模型的应用程序或服务来完成的,而不是大模型自己直接执行。
  1. 您提供给大模型的并不是直接提供某个具体的API工具,而是描述该API工具的功能和使用方式。比如告诉模型:"有一个查询天气的API,它需要地点和日期作为输入参数,可以返回该地点该日期的天气信息"。
  1. 模型根据您的描述,会智能生成一个JSON对象,其中包含了调用该API所需的参数,比如{"location": "北京", "date": "2023-06-01"}。
  1. 模型本身并不会真正调用该API获取天气数据,而是将这个JSON对象返回给您。
  1. 之后,由您自己或系统根据模型生成的JSON对象,真正调用相应的天气API,获取天气信息。
  1. 收到API返回的天气数据后,您可以将这些数据反馈给模型,模型就能基于这些数据,综合上下文,生成最终的天气回答。
能够改进输出结果的方式有哪些?
prompt engineering, prompt chaining (breaking complex tasks into multiple prompts), and function calling,模型微调
 

playground是什么意思?

在技术开发领域,"playground" 通常指的是一个专门的环境或平台,用于实验、测试和学习新技术或工具。以下是一些具体的含义和用途:
  1. 代码沙箱:在编程和软件开发中,playground 可以是一个安全的测试环境,允许开发者编写和运行代码,而不会对主系统或生产环境产生影响。这种环境通常用于测试新功能或调试代码。
  1. 技术实验室:一些公司或组织可能会设立一个技术实验室,作为内部的 playground,让员工自由探索和实验新技术。这有助于推动创新和发现新的解决方案。
  1. 教育工具:在教育领域,playground 可以是一个在线平台或应用程序,提供交互式的学习体验,让学生通过实践来掌握编程语言或其他技术技能。
  1. 产品原型测试:在产品设计和开发过程中,playground 可以是一个用于测试和验证产品原型的环境。这有助于在产品发布之前发现和解决潜在的问题。
  1. API 测试:对于需要与外部服务或应用程序集成的开发项目,playground 可以是一个用于测试 API 调用和响应的环境。这有助于确保集成的可靠性和兼容性。
  1. 开源项目:在开源社区,playground 可以是一个公共的代码库或项目,允许贡献者提交和测试新的代码或功能。这有助于促进社区的协作和知识共享。
 
 
 

2024 - 2025 © 张静