实际上,目前大多数效果较好的应用基本上都是基于OpenAI的再开发,因此非常有必要进一步了解OpenAI提供的关于ChatGPT的API的相关细节。
实际上,官网提供了python和node.js的sdk,因此在这里不做过多的赘余,针对类似Go语言,目前也有一些封装的SDK,以下是通过Go 的做出的演示:
如果你有账号可以自己去创建这里的API KEY如果没有可以通过某宝直接搜API KEY购买即可,跳过注册账号的一步,不过仍然建议自己去申请账号然后获取KEY。
OpenAI API使用API密钥进行身份验证。主要是通过http请求头设置前面提到的API KEY即可
- http请求头
- API认证例子
应该是我host没有配置好的原因,死活没法用curl,因此在这里,我们使用python的request来模拟发送http请求
输出如下
GPT-4是一个大型多模态模型(目前支持文本输入和文本输出,未来将支持图像输入),由于其广泛的常识和高级推理,它可以比我们以前的任何模型更准确地解决难题能力。
提示:
- 模型后面的0314:快照时间
- 32k:代表的是模型词汇表的大小,意味着模型输入文本最多可以包含32,768个标记
GPT-3.5 模型可以理解并生成自然语言或代码。目前模型推理速度比GPT4快
OpenAI提供了四种不同的语言模型,分别为Ada,Babbage、Curie和Davinci。它们的主要区别在于模型的规模和训练数据的大小,以及它们能够执行的任务类型和精度等方面。(简单来说就是训练数据的规模以及其本身的参数规模不同)
Embeddings主要用于生成文本向量,嵌入是文本的数字表现形式(类似的还有tf-idf、Word2Vec等),可以用于衡量两段文本之间的相关性。Embedding常用于搜索、聚类、推荐、异常检测和分类任务。
-
入门介绍
OpenAI的核心API接口之一就是,直接调用各种AI模型,完成下游任务。 -
API认证
调用API需要在http请求头设置token -
调用AI完成任务
- prompt提示语
- Post请求参数
- 发送请求
可以类似上面使用curl或者就是类似前面使用python模拟请求
-
关于Temperature超参数
在OpenAI中temperature是一种用于控制生成文本多样性的超参数,比如GPT系列模型。他的取值范围通常为0到2,表示生成文本的多样性。
具体来说,当temperature的值较低时,生成的文本会趋于更加确定和重复,而当Temperature 的值较高时,生成的文本会更加随机和多样化。举例来说,如果 Temperature 值为 0.5,则生成文本的多样性会比 Temperature 值为 0.1 或 0.9 的时候更为中等。【实际开发中,为了比如在测试prompt的效果时,就需要使用一个较低的温度来尽量避免随机性带来对测试效果的影响】
在GPT模型中,Function calling(函数调用)是指通过API向模型提供描述性的函数,使其能够智能地选择输出一个包含参数的JSON对象,以便调用一个或多个函数。值得注意的是,Chat Completions API并不直接执行函数调用,而是生成可以用于在代码中执行函数的JSON。
通俗的讲Function calling功能就是我们提供一组函数的定义(包括函数的功能描述、参数描述),把函数的定义传递给GPT模型,由模型根据用户的问题决定要调用那个函数,由于模型无法执行我们定义的外部函数,模型只能以请求响应的方式返回希望调用那个函数(包括函数调用参数),我们程序收到模型请求结果后,在本地执行函数调用,然后把函数调用的结果拼接到提示词中再次传给模型,让模型进一步处理,最后在把结果返回给用户。
以下是其在实际应用中的一些例子:
- 创建调用外部API回答问题的助手,例如定义函数send_email(to: string, body: string)或get_current_weather(location: string, unit: ‘celsius’ | ‘fahrenheit’)。
- 将自然语言转换为API调用,例如将“Who are my top customers?”转换为get_customers(min_revenue: int, created_before: string, limit: int)然后调用内部API。
- 从文本中提取结构化数据,例如定义函数extract_data(name: string, birthday: string)或sql_query(query: string)。
利用函数调用功能,我们可以实现智能体(AI Agent),让AI可以跟我们本地的系统、数据库互动,例如让AI去查询最新的天气、查询股票价格、让AI去点外卖、订机票等等。(实际上,模型并没有联网,意味着说如果没有这样功能,模型无法完成一些实时的功能,但是function calling很好的解决了这样的问题)
并非所有版本的模型都经过了函数调用数据的训练。目前支持函数调用的模型有:gpt-4、gpt-4-turbo-preview、gpt-4-0125-preview、gpt-4-1106-preview、gpt-4-0613、gpt-3.5-turbo、gpt-3.5-turbo-1106和gpt-3.5-turbo-0613。
此外,模型gpt-4-turbo-preview、gpt-4-0125-preview、gpt-4-1106-preview和gpt-3.5-turbo-1106支持并行函数调用功能,这允许它们一次性执行多个函数调用,并且能够并行解决这些函数调用效果和结果。
通过查询天气的案列,使用python来实现整个过程
- 步骤1:准备外部函数(可以是自己编写的也可能是第三方的API)
- 步骤2:根据问题和tools参数调用模型
我们需要通过Chat Completion API调用GPT模型,并传入用户的查询(如“当前天气如何”),以及tools参数,其中包含了我们刚刚定义的get_current_weather函数的描述。
- 步骤3:本地执行函数
模型返回的结果会包含模型希望调用的函数,函数信息通常包含在tool_calls响应参数中,我们就可以根据tool_calls参数描述的函数调用信息,在本地执行相应的函数调用。
- 步骤4:通过函数返回再次调用模型
我们可以将函数返回的结果作为一个新的消息发送给模型,这样模型就可以对这些结果进行处理并生成一个面向用户的响应。
- 步骤5:获取模型最终响应结果
实际运行如下:
输出为
再将这部分内容重新输入模型中:
输出:
嵌入,或者叫做Embeddings,在机器学习领域,尤其是在处理自然语言处理(NLP)问题时,是一种将文本数据转换为数值向量的技术。在人类语言中,单词和短语的意义是由它们的上下文和使用环境决定的。嵌入的目标是捕获这些语言单位的语义,使计算机可以处理并理解它们。
Embeddings的核心思想是将类似意义的词语映射到数学空间的临近点,即将词语表示为高维空间中的点,这样语义上非常相似的词语(例如“国王”和“王后”)在空间中的距离会很近。Embeddings通常由浮点数组成,即使是非常不同的文本片段,也可以有类似的嵌入表达。
嵌入的具体场景如下:
- 搜索(Search):通过嵌入特征,可以根据与查询文本的相关性来排列搜索结果。
- 聚类(Clustering):嵌入可以帮助识别和归纳语义上相似的文本片段,形成群组。
- 推荐系统(Recommendations):基于相关性推荐可以帮助发现并推荐与已知项相似的其他项。
- 异常检测(Anomaly Detection):嵌入可以用来识别与主要数据集显著不同的数据点。
- 多样性度量(Diversity Measurement):嵌入也可以用于分析不同文本之间的相似性分布。
- 分类(Classification):通过将文本与一组已知标签的嵌入进行比较,可以将其分类到最相似的类别中。
目前openAI提供多种嵌入模型,包括:text-embedding-3-large、text-embedding-ada-002、text-embedding-3-small。这些模型在处理嵌入时,具有各自独特的特点。例如,text-embedding-3-small提供了1536维的嵌入向量,而text-embedding-3-large则提供了3072维的嵌入向量,用于涵盖更加复杂的文本特性。通过调整参数,可以控制嵌入的维数,以满足特定应用场景的需求。以下是如何在不同应用场景中做出选择:
- 在关注性能的场景下:如果需要捕获更细粒度的语义信息,比如在精细化推荐系统或者高精度文本分类中,通常推荐使用text-embedding-3-large,虽然它的成本比小模型要高,但能提供更丰富的文本特征表示。
- 在成本敏感型应用中:对于需要处理大量数据,但对精度要求不是特别高的应用,例如初始的数据探索或者快速原型开发,那么text-embedding-3-small是一个更经济的选择,因为它在保持相对较高性能的同时,可以显著减少成本。
- 多语言环境:由于这些嵌入模型具有较高的多语言性能表现,它们在处理跨语言或多种语言场景时特别有用,这使其在全球化应用中成为理想的选择。
注意模型使用权限
输出如下:
未来这些向量会被保存在专门的向量数据库当中,方便后续的再使用。
模型微调(Fine-tuning)是深度学习中的一个概念,指在预训练模型(Pre-trained Model)的基础上继续训练,以适应特定任务或数据集的过程。预训练模型已经在海量的数据上训练,学习到了丰富的特征表示。通过微调,可以在这个基础上进一步提升模型对于特定任务的性能。相较于从头开始训练模型,微调的优势主要包括:
- 节省时间和资源:预训练模型省去了从零开始训练模型的时间和计算资源,尤其是在大型模型和复杂任务中更为显著。
- 数据效率:微调通常只需要相对较少的标注数据即可取得良好的效果,特别是在数据稀缺的领域中。
- 转移学习:预训练模型在多样化的数据上学习,微调可以将这些知识转移到特定任务,提高泛化能力。
- 性能提升:微调可以让模型更好地贴合特定任务的需求,有助于提高模型质量,减少错误率。
例如,借助OpenAI的API,用户可以通过微调来定制化GPT模型,以获得更高品质的结果,同时节省因长prompt而产生的代价,降低延迟。
Fine-tuning与prompt engineering(提示工程)是改进模型性能的两种不同策略。提示工程指的是通过精心设计的prompt来指导模型生成预期的回应,而不改动模型本身。它通常是追求性能改进的第一步,因为其反馈周期快,且不要求训练数据。
然而,某些情况下,即使经过了精心设计的prompt,模型仍然难以达到预期效果。在这些情况下,Fine-tuning成为提高模型性能的必然选择。通过提供大量例子让模型学习,微调能够在不同任务上达到比单纯提示工程更好的效果。
OpenAI提供了一系列支持Fine-tuing的模型,其中包括gpt-3.5-turbo-1106(推荐使用)、gpt-3.5-turbo-0613、babbage-002、davinci-002,以及实验性接入的gpt-4-0613。这些模型可以通过Fine-tuing进一步训练以适应用户的特定需求。
Fine-tuning不仅适用于新的数据集,用户还可以在已微调过的模型基础上继续进行微调。这在获取了更多数据,并希望在不重复之前训练步骤的情况下进一步优化模型时非常有用。
对于大多数用户而言,gpt-3.5-turbo以其良好的结果和易用性成为首选。考虑到持续改进和用户的具体需求,OpenAI可能会不断更新和扩展支持微调的模型范围。
8.4.1 准备训练数据
为了进行Fine-tuning,你需要准备一个符合指定格式要求的数据集。通常,这个数据集包含了一系列的输入和期望的输出,OpenAI的Fine-tuning API支持两种主要的数据格式:对话模型和简单的问答对。
- 对话模型 数据集格式通常用于gpt-3.5-turbo模型,每个示例都是以一个对话的形式来组织的,其中每条消息都有角色、内容和可选名字。示例数据结构如下:
每个案例必须被格式化为一个具有JSON Lines(.jsonl)格式的文件,每一行代表一个训练样本, 例子:
- 简单的问答对 数据集格式适用于如babbage-002和davinci-002之类的模型,格式更简单,由一对prompt和completion的组合构成。参考示例如下:
同样,每个训练样本暂用一行,例子:
8.4.2 训练与测试数据分割
创建Fine-tuning数据集后,合理地划分训练集和测试集是至关重要的。通常,数据集会被分成两部分,大部分用于训练模型(通常是70%到90%),剩余的部分用于测试(剩下的10%到30%)。这样的分割有助于验证模型在看不见的数据上的效能,和严格评估模型性能。(这个部分实际上跟深度学习常规的操作一样,不过这里的测试指标可能和常规的精度、F1值不同)。
8.4.3 创建Fine-tuning模型
- 选择合适的模型
正确的预训练模型是确保任务成功的关键。一般需要从任务本身的复杂程度、数据量等角度来观察。 - 上传数据
输出
- 创建训练任务
- 监控任务
8.4.4 Fine-tuning过程中的参数调整
超参数是在模型训练前设置的,且通常无法从数据中学习的参数。以下是几个重要的超参数:
- Epoch数(n_epochs): 这决定了您的模型将遍历整个数据集的次数。过多的epoch可能导致过拟合,过少则可能导致模型未充分学习。
- 学习率(learning_rate_multiplier): 学习率决定了模型在每次迭代中更新其权重的幅度。过高的学习率可能导致模型学习过程不稳定,而过低则可能导致学习过程缓慢。
- Batch大小(batch_size): 批处理大小决定了每次模型更新时将考虑多少训练实例。较大的批处理有助于稳定训练,但可能会增加内存压力。
例子:
8.4.5 评估与使用Fine-tuned模型
当我们完成模型的微调工作后,评估微调模型的性能至关重要。以下是一些标准评估方法:
-
比较样本: 使用前面准备的测试样本,分别调用基础模型和Fine-tuned模型,然后对比输出结果,这样可以比较Fine-tuned模型效果如何。
-
统计指标: 对微调过程中的损失(loss)和准确度(accuracy)等指标进行追踪。训练过程中损失应该降低,而准确度应该提高。
-
A/B测试: 设计实验,划分流量,同时运行基础模型和Fine-tuned模型来观察在实际环境中的表现差异。
-
用户反馈: 收集使用模型的用户反馈,尤其是在自然语言处理任务中,用户满意度是衡量模型性能的关键指标。
使用Fine-tuned的模型非常简单,只需要将你的Fine-tuned模型名称作为参数传入API调用中。以下是使用Fine-tuned模型的示例代码:
Assistants API允许开发者在自己的应用程序中构建人工智能助手。通过定义自定义的指令与选择模型,助手可以利用模型、工具和知识来回应用户的查询。当前,Assistants API支持三种类型的工具:代码解析器(Code Interpreter)、检索(Retrieval)和函数调用(Function calling)。
Assistants API适用于各种需要交互式AI支持的场景。例如:
- 客户支持: 自动回答常见问题,减少人工客服的工作量。
- 在线教学: 解答学生提出的问题,提供定制化的学习支持。
- 数据分析: 分析用户上传的数据文件,生成报告和可视化图表。
- 个性化推荐: 根据用户的历史交互,提供个性化的建议和服务。
9.3.1 创建Assistants
API参数说明:
- instructions - 系统指令,告诉助手需要干什么。
- name - 助手名字
- tools - 定义助手可以使用那些工具。每个助手最多可以有128个工具。目前工具的类型可以是code_interpreter、retrieval或function。
- model - 助手使用那个模型?
创建Assistant成功之后可以得到Assistant ID。
9.3.2 创建会话Thread
一个Thread代表一个对话,当用户开启对话时,我们推荐为每个用户创建一个会话Thread。您可以通过以下方式创建Thread:
9.3.3 向Thread中添加消息
你可以向特定的Thread中添加消息,这些消息包含文本,并且可以选择性地包含用户允许上传的文件。例如:
9.3.4 运行Assistant以产生响应
要让助手响应用户消息,您需要创建一个Run。这使得助手读取Thread并决定是否调用工具(如果启用了)或简单地使用模型以最佳方式回答查询。
9.3.4 获取Assistant响应结果
当Assistant Run运行完成后,我们可以通过检查线程(Thread)中添加的消息来读取Assistant的响应结果。下面通过CURL请求展示如何发起请求,以及对API的参数进行详细讲解.跟Assistant助手的对话过程,类似两个人聊天的过程,当Assistant助手处理完用户的问题,会把Assistant助手消息追加到对话线程Thread中,因此我们只要查询对话线程Thread中的最新消息就可以获取助手的响应。