ChatGPT基础原理和基础应用

article/2024/10/18 13:00:43

CHatGPT

ChatGPT 能以不同样式、不同目的生成文本,并且在准确度、叙述细节和上下文连贯性上具有更优的表现。GPT是Generative Pre-trained Transformer(生成型预训练变换模型)的缩写

OpenAI 使用监督学习和强化学习的组合来调优 ChatGPT,其中的强化学习组件使 ChatGPT 独一无二。OpenAI 使用了「人类反馈强化学习」(RLHF)的训练方法,该方法在训练中使用人类反馈,以最小化无益、失真或偏见的输出。

ChatGPT更强的性能和海量参数,它包含了更多的主题的数据,能够处理更多小众主题。

ChatGPT现在可以进一步处理回答问题、撰写文章、文本摘要、语言翻译和生成计算机代码等任务。

BERT与GPT的技术架构(图中En为输入的每个字,Tn为输出回答的每个字)

简单理解:GPT可以线性下推反馈调整得出结果,新的轮次结果不影响旧的老结果

GPT家族的演进

ChatGPT背景理解

chagpt 语言模型 大数据的训练量 -> 一致性问题-> 实际希望做什么,而不是被训练做什么

=> 目标函数是否符合预期 => 人类的期望 => 产生更多的实际价值

GPT-3 非一致性模型 -> 网络文本数据 -> 类人类文本,但不符合人类的预期

-> 预测函数:f(概率分布(词序序列)) ->效率高

-> 问题: 人类文本是 在情景中根据已知的背景知识常识来辅助生成语言->出入

-> 一致性问题表现:内容是 无效,胡编乱造,缺乏可解释性,可能偏见有害

训练语言模型的核心技术

作为ChatGPT基础的GPT-3或GPT-3.5 是一个超大的统计语言模型或顺序文本预测模型

  • Next-token-prediction

  • 模型被给定一个词序列作为输入,并被要求预测序列中的下一个词

  • 可能性|概率

The cat sat on the [ mat|chair|floor]
  • masked-language-modeling

  • Next-token-prediction 的变体:替换词语为特殊token->目标函数 ->生成自然流畅文本

The [MASK] on the []
  • 问题:模型无法区分重要错误和不重要错误

  • 预测高概率词汇的模型可能不一定会学习其含义的某些更高级表征

  • 难以承担:深入理解语言的任务

The Roman Empire [MASK] with the reign of Augustus
[MASK]-> began | ended 高概率词汇 -> 不一致
  • 人类反馈 => RLHF

  • 增加了使用了人类反馈来指导学习过程, 对模型进一步训练

  • chatgpt将RLHF技术应用于实际场景模型

[人类反馈强化学习RLHF]原理

RLHF(Reinforcement Learning from Human Feedbac,人类反馈强化学习) 技术。

总体是三个不同步骤:

  • 有监督的调优:预训练的语言模型在少量已标注的数据上进行调优,以学习从给定的 prompt 列表生成输出的有监督的策略(即 SFT 模型);

  • 数据收集:[人工标注,openAI(GPT-3)api请求]->相对较小、高质量的数据集

  • 模型选择: GPT-3.5 系列中的预训练模型

  • 使用的基线模型是最新版的 text-davinci-003(通过对程序代码调优的 GPT-3 模型)

  • 在「代码模型」而不是纯文本模型之上进行调优

  • 问题:SFT模型输出 不一致性文本 ->人工排序SFT的不同输出以创建RM模型

  • 模拟人类偏好:标注者们对相对大量的 SFT 模型输出进行投票,这就创建了一个由比较数据组成的新数据集。在此数据集上训练新模型,被称为训练回报模型(Reward Model,RM);

  • 目标:从SFT输出数据中学习目标函数, 根据人类可取程序降序,以反应人类的偏好

f()=sort()
  • 工作原理:

选择prompt数据,通过SFT模型输出N个结果,由标注者排序并添加标签,输出新的标签数据集->训练RM模型
重新将SFT的输出 做为输入,通过RM模型生成新的结果,并排序
  • TAMER框架

  • Training an Agent Manually via Evaluative Reinforcement,评估式强化人工训练代理

  • 将人类标记者的知识,以奖励信反馈的形式训练Agent,加快其快速收敛。

通过TAMER+RL(强化学习),借助人类标记者的反馈,能够增强从马尔可夫决策过程 (MDP) 奖励进行强化学习 (RL) 的过程。
  • 近端策略优化(PPO):RM 模型用于进一步调优和改进 SFT 模型,PPO 输出结果是的策略模式。

  • 目标使用 PPO 模型优化RM模型以微调 SFT 模型

  • 算法:近端策略优化(PPO)算法

强化学习中训练agent的on-policy算法, 它直接学习和根据agent所获得的回报不断更新当前策略
使用「信任区域优化」方法来训练策略,它将策略的更改范围限制在与先前策略的一定程度内以保证稳定性
使用[价值函数]来估计[给定状态]或[动作的预期回报],通过优势函数来比较前后两次策略,以此来更新更明智的策略
  • 模型:PPO 模型由 SFT 模型初始化,价值函数由 RM 模型初始化

PPO初始化环境:「bandit environment」with SFT RM
ppo从数据集抽样prompt并给出对应的期望响应
RM对 给定的prompt 和响应计算,产生相应的回报
PPO再用回报更新模型,并输出结果
注:SFT模型对每个token添加KL惩罚因子,避免RM过度优化
  • 思路

  • Importance Sampling:将Policy Gradient中On-policy的训练过程转化为Off-policy,即将在线学习转化为离线学习

  • 训练高质量的ChatGPT模型

使用多个模型,利用RM阶段训练好的回报模型,靠奖励打分来更新预训练模型SFT参数。在数据集中随机抽取问题,使用PPO模型生成回答,并用训练好的RM模型给出质量分数。

把回报分数依次传递,由此产生策略梯度,通过强化学习的方式以更新PPO模型参数。

通过迭代不断重复第二和第三阶段,训练高质量模型

# 伪代码
# 有监督的调优
def ppoModel
begin with: <prompt,demostration> -> SFTModel3.5 -> fineTune while(times>0):# 模拟人类偏好# 采样label_sorts = makeLabelsAndSort(sample(fineTune)) rmModel=initModel(label_sorts)# 近端策略优化模型ppoModel=(ppoModel==null)?init():update(rmModel))res = ppoModel(prompt)return res

局限性

在将语言模型与人类意图保持一致的过程中,用于 fine-tuning 模型的数据会受到各种错综复杂的主观因素的影响

  • 生成 demo 数据的人工标注者的偏好;

  • 设计研究和编写标签说明的研究人员;

  • 选择由开发人员制作或由 OpenAI 客户提供的 prompt;

  • 标注者偏差既包含在 RM 模型训练中,也包含在模型评估中。

参与训练过程的标注人员和研究人员可能并不能完全代表语言模型的所有潜在最终用户

ChatGPT的使用

简单介绍,具体看官方文档

申请账号(得想点办法),测试使用均需要国外的ip

openai

一般应用都是通过调用openai完成,具体可以参考地址:

https://platform.openai.com/docs/api-reference/images/create

样例demo:

# 测试能否正常ping通接口
curl https://api.openai.com/v1/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "text-davinci-003","prompt": "Say this is a test","max_tokens": 7,"temperature": 0}'# 测试生成对话
curl https://api.openai.com/v1/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello!"}]}'# 测试生成图片
curl https://api.openai.com/v1/images/generations \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"prompt": "A cute baby sea otter","n": 2,"size": "1024x1024"}'

SDK

sdk一般就是通过参数封装简化使用接口的第三方代码

javaSDk网上获取了一个样例,以供参考, github地址:

https://github.com/Grt1228/chatgpt-java

样例code

public class OpenAiStreamClientTest {private OpenAiStreamClient client;@Beforepublic void before() {// 执行成功的重点:在此处设置本地笔记本能够访问其他地区的代理端口Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118));client = OpenAiStreamClient.builder().connectTimeout(50).readTimeout(50).writeTimeout(50).apiKey("sk-************************************").proxy(proxy).apiHost("https://api.openai.com/").build();}@Testpublic void chatCompletions() {ConsoleEventSourceListener eventSourceListener = new ConsoleEventSourceListener();Message message = Message.builder().role(Message.Role.USER).content("你好!").build();ChatCompletion chatCompletion = ChatCompletion.builder().messages(Arrays.asList(message)).build();client.streamChatCompletion(chatCompletion, eventSourceListener);CountDownLatch countDownLatch = new CountDownLatch(1);try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}
}

openapi接口列表

/*** 描述: open ai官方api接口** @author https:www.unfbx.com*  2023-02-15*/
public interface OpenAiApi {/*** 模型列表** @return Single ModelResponse*/@GET("v1/models")Single<ModelResponse> models();/*** models 返回的数据id* @param id* @return Single Model*/@GET("v1/models/{id}")Single<Model> model(@Path("id") String id);/*** 文本问答* Given a prompt, the model will return one or more predicted completions, and can also return the probabilities of alternative tokens at each position.** @param completion* @return Single CompletionResponse*/@POST("v1/completions")Single<CompletionResponse> completions(@Body Completion completion);/*** Creates a new edit for the provided input, instruction, and parameters.* 文本修复** @param edit* @return Single EditResponse*/@POST("v1/edits")Single<EditResponse> edits(@Body Edit edit);/*** Creates an image given a prompt.* 根据描述生成图片** @param image* @return Single ImageResponse*/@POST("v1/images/generations")Single<ImageResponse> genImages(@Body Image image);/*** Creates an edited or extended image given an original image and a prompt.* 根据描述修改图片** @param image* @param mask* @param requestBodyMap* @return Single ImageResponse*/@Multipart@POST("v1/images/edits")Single<ImageResponse> editImages(@Part() MultipartBody.Part image,@Part() MultipartBody.Part mask,@PartMap() Map<String, RequestBody> requestBodyMap);/*** Creates a variation of a given image.* 创建给定图像的变体。** @param image* @param requestBodyMap* @return Single ImageResponse*/@Multipart@POST("v1/images/variations")Single<ImageResponse> variationsImages(@Part() MultipartBody.Part image,@PartMap() Map<String, RequestBody> requestBodyMap);/*** Creates an embedding vector representing the input text.* 创建表示输入文本的嵌入向量。* @param embedding* @return Single EmbeddingResponse*/@POST("v1/embeddings")Single<EmbeddingResponse> embeddings(@Body Embedding embedding);/*** Returns a list of files that belong to the user's organization.* 返回属于用户组织的文件列表。* @return Single OpenAiResponse File*/@GET("/v1/files")Single<OpenAiResponse<File>> files();/*** 删除文件** @param fileId* @return Single DeleteResponse*/@DELETE("v1/files/{file_id}")Single<DeleteResponse> deleteFile(@Path("file_id") String fileId);/*** 上传文件** @param purpose* @param file* @return  Single UploadFileResponse*/@Multipart@POST("v1/files")Single<UploadFileResponse> uploadFile(@Part MultipartBody.Part file,@Part("purpose") RequestBody purpose);/*** 检索文件** @param fileId* @return Single File*/@GET("v1/files/{file_id}")Single<File> retrieveFile(@Path("file_id") String fileId);/*** 检索文件内容* ###不对免费用户开放###* ###不对免费用户开放###* ###不对免费用户开放###** @param fileId* @return Single ResponseBody*/@Streaming@GET("v1/files/{file_id}/content")Single<ResponseBody> retrieveFileContent(@Path("file_id") String fileId);/*** 文本审核** @param moderation* @return Single ModerationResponse*/@POST("v1/moderations")Single<ModerationResponse> moderations(@Body Moderation moderation);/*** 创建微调作业** @param fineTune* @return Single FineTuneResponse*/@POST("v1/fine-tunes")Single<FineTuneResponse> fineTune(@Body FineTune fineTune);/*** 微调作业集合** @return Single OpenAiResponse FineTuneResponse*/@GET("v1/fine-tunes")Single<OpenAiResponse<FineTuneResponse>> fineTunes();/*** 检索微调作业** @return Single FineTuneResponse*/@GET("v1/fine-tunes/{fine_tune_id}")Single<FineTuneResponse> retrieveFineTune(@Path("fine_tune_id") String fineTuneId);/*** 取消微调作业** @return Single FineTuneResponse*/@POST("v1/fine-tunes/{fine_tune_id}/cancel")Single<FineTuneResponse> cancelFineTune(@Path("fine_tune_id") String fineTuneId);/*** 微调作业事件列表** @return Single OpenAiResponse Event*/@GET("v1/fine-tunes/{fine_tune_id}/events")Single<OpenAiResponse<Event>> fineTuneEvents(@Path("fine_tune_id") String fineTuneId);/*** 删除微调作业模型* Delete a fine-tuned model. You must have the Owner role in your organization.** @return Single DeleteResponse*/@GET("v1/models/{model}")Single<DeleteResponse> deleteFineTuneModel(@Path("model") String model);/*** 引擎列表* 官方已废弃此接口** @return Single OpenAiResponse Engine*/@Deprecated@GET("v1/engines")Single<OpenAiResponse<Engine>> engines();/*** 检索引擎* 官方已废弃此接口* @param engineId* @return Engine*/@Deprecated@GET("v1/engines/{engine_id}")Single<Engine> engine(@Path("engine_id") String engineId);/*** 最新版的GPT-3.5 chat completion 更加贴近官方网站的问答模型* @param chatCompletion chat completion* @return 返回答案*/@POST("v1/chat/completions")Single<ChatCompletionResponse> chatCompletion(@Body ChatCompletion chatCompletion);/*** 语音转文字** @param model 模型* @param file  语音文件* @return 文本*/@Multipart@POST("v1/audio/transcriptions")Single<WhisperResponse> speechToTextTranscriptions(@Part MultipartBody.Part file,@Part("model") RequestBody model);/*** 语音翻译:目前仅支持翻译为英文** @param model 模型* @param file  语音文件* @return 文本*/@Multipart@POST("v1/audio/translations")Single<WhisperResponse> speechToTextTranslations(@Part MultipartBody.Part file,@Part("model") RequestBody model);
}

重点使用openapi的completion文本问答接口

SSE

OpenAI官网在接受Completions接口的时候,使用了sse技术。 Completion对象本身有一个stream属性,当stream为true时候Api的Response返回就会变成Http长链接。

介绍使用server-sent events

Server-Sent Events (SSE) 是一种用于实现服务器向客户端发送实时数据的 Web 技术。与传统的 HTTP 请求不同,SSE 允许服务器持续地向客户端发送数据流,而不需要客户端发起请求。

下面是一个简单的使用 SSE 的示例:

在 HTML 文件中,创建一个 <div> 元素,用于显示从服务器发送的数据:

<div id="messages"></div>

使用 JavaScript 创建一个 SSE 连接:

javascriptCopy code
const eventSource = new EventSource('/stream');

其中 /stream 是服务器端发送 SSE 数据的端点。

  1. 添加事件处理程序来处理来自服务器的数据:

javascriptCopy code
eventSource.onmessage = function(event) {const messagesDiv = document.querySelector('#messages');messagesDiv.innerHTML += event.data;
};
  1. 在服务器端发送 SSE 数据:

javascriptCopy code
res.write('data: Hello, world!\n\n');

其中 data: 是 SSE 数据的前缀,Hello, world! 是实际的数据,\n\n 表示数据的结束。

使用 SSE 可以实现很多实时应用程序,例如聊天应用程序、股票市场数据更新、实时游戏等等。由于 SSE 是基于 HTTP 协议的,因此可以与现有的 Web 技术(如 Ajax 和 WebSockets)很好地集成。


http://chatgpt.dhexx.cn/article/0oGi7K5i.shtml

相关文章

ChatGPT炒股:批量下载北交所上市公司的招股说明书

打开北京证券交易所官网&#xff0c;点击发行上市&#xff0c;然后点击公开发行信息披露&#xff0c;然后在查询框里面输入关键词&#xff1a;在北京证券交易所上市招股说明书&#xff0c;然后选择时间&#xff0c;点击查询&#xff0c;就可以看到所有北交所上市公司的招股说明…

chatgpt赋能python:Python如何获取股票数据——详细介绍

Python如何获取股票数据——详细介绍 Python作为一款专业的编程语言&#xff0c;其应用领域十分广泛&#xff0c;其中之一就是股票数据的获取。本文将详细介绍Python如何获取股票数据的方法&#xff0c;帮助大家快速获取所需的股票信息。 一、使用pandas-datareader获取股票数…

chatgpt赋能python:使用Python操作股票软件:探索股票市场的新方式

使用Python操作股票软件&#xff1a;探索股票市场的新方式 在当今股票市场中&#xff0c;许多投资者正在寻找新的方式来更好地管理其投资组合。一种新的方式是使用Python编程语言操作股票软件。Python拥有简洁的语法和丰富的库来帮助投资者更好地理解和管理股票。在本文中&…

ChatGPT炒股:爬取氢能行业企业名录

全球氢能网有氢能源相关企业的列表&#xff0c;怎么全部爬取下来呢&#xff1f; 先看翻页规律&#xff1a; http://h2.china-nengyuan.com/company/company_0.html http://h2.china-nengyuan.com/company/company_1.html http://h2.china-nengyuan.com/company/company_21.h…

chatgpt赋能python:Python编程炒股软件:优秀的股票市场分析工具

Python 编程炒股软件&#xff1a;优秀的股票市场分析工具 Python 编程语言一直以来在数据分析和科学计算领域处于领先地位。由于它强大的数据处理能力和易于使用的编程语言特性&#xff0c;Python成为了许多股票市场分析工具的首选。 现在&#xff0c;越来越多的投资者使用Py…

【python量化】ChatGPT4 实现股票量化盯盘系统

如果你还不知道 ChatGPT 是什么 建议看这篇文章&#xff1a;ChatGPT 为什么这么火&#xff1f;它能干什么&#xff1f; 昨天&#xff0c;我&#xff0c;一个 python 小白&#xff0c;花了 2 个小时时间&#xff0c;让 ChatGPT4 帮我实现了一个股票量化盯盘系统。 开通 plus 会员…

ChatGPT炒股:从上市公司招股说明书中批量提取发明专利表格

上市公司招股说明书通常会详细列明公司的发明专利&#xff0c;而通过企业的发明专利可以了解企业未来的业务布局情况&#xff0c;怎么把这些发明专利列表都批量提取出来呢? 随机打开几个上市公司的招股说明书&#xff0c;可以看到发明专利这一内容&#xff0c;共同的特征是都有…

chatgpt赋能python:用Python做股票分析

用Python做股票分析 在当今的股市中&#xff0c;数据分析和预测已经变得十分重要。Python作为最流行的编程语言之一&#xff0c;不仅易于学习&#xff0c;还有非常强大的数据处理和分析能力。在本文中&#xff0c;我们将探讨如何用Python进行股票分析。 数据收集 要进行股票…

ChatGPT炒股:监控水泥等原材料价格每日变动情况

水泥、钢铁等大宗商品原材料价格对于很多企业的业绩影响较大&#xff0c;这些产品的价格变动情况需要高频监控&#xff0c;来评估企业未来业绩变动趋势。 下面以水泥网的水泥指数&#xff0c;来说明如何通过ChatGPT来编写Python程序&#xff0c;实现监控价格变动的功能。 打开…

ChatGPT炒股:从巨潮资讯网上批量下载特定主题的股票公告

巨潮资讯网是股票公告的指定披露渠道之一&#xff0c;上面有非常详细的A股股票公告内容。 现在&#xff0c;我们要获取2023-01-04~2023-07-04期间所有新三板公司中标题包含“2023年日常性关联交易”的公告。 首先从network中获取到真实网址&#xff1a;http://www.cninfo.com…

ChatGPT炒股:批量自动提取股票公告中的表格并合并数据

首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多个PDF文件&#xff0c;用 Tabula提取这些PDF文件中第1页中的第2个表格&#xff0c;然后保存到表格文件中&#xff0c;文件标题名和…

ChatGPT炒股:从股票招股说明书中批量提取竞争对手信息

股票招股说明书中都会提到上市公司的市场竞争情况和竞争对手。要研究企业&#xff0c;就必须仔细研究竞争对手。怎么将竞争对手这些信息批量从招股说明书中提取出来呢&#xff1f; 首先观察其规律&#xff1a; 有的是这样写的&#xff1a; 行业内的主要企业&#xff1a;浙江…

ChatGPT炒股:查询分析某个公募基金的持仓变化

如果很认同某个基金经理的投资理念&#xff0c;可以跟踪基金经理的持仓变化&#xff0c;可以获取一些投资的线索。手动操作也可以实现&#xff0c;但略微麻烦&#xff0c;如果利用ChatGPT写一个跟踪程序&#xff0c;就方便多了。 下面以汇丰晋信副总经理、投资总监、知名基金经…

ChatGPT炒股:自动批量下载choice每日热门研报

东方财富choice里面研究报告板块&#xff0c;每天更新研报几百篇&#xff0c;24小时热门研报也接近100篇。作为股票投资者&#xff0c;每天阅读最新热门研报&#xff0c;了解市场动态&#xff0c;是一个基本功。怎么可以自动批量下载这些24小时热门研报呢&#xff1f; 首先&…

ChatGPT炒股:自动批量下载萝卜投研网站上的股票研报

萝卜投研网站有很多的股票研究报告。 如果我们在chrome浏览器中打开了很多研报&#xff0c;该如何批量下载呢&#xff1f; 查看网页源代码&#xff0c;研报是pdf格式&#xff0c;下载链接也在源代码中&#xff0c;很好找。 下载方法是&#xff0c;用Selenium来接管已经运行的…

ChatGPT炒股:自动获取某只股票最新新闻报道

炒股&#xff0c;肯定要看某个股票的相关新闻&#xff0c;这是最基础的线上调研。百度新闻相对比较全面&#xff0c;如何通过ChatGPT来自动获取某个股票的百度新闻报道呢&#xff1f; 首先&#xff0c;在百度新闻搜索页面&#xff0c;观察翻页的规律&#xff1a; 第二页&#…

ChatGPT炒股:深度挖掘数据要素产业链股票

随着ChatGPT带动AI产业链股票火爆&#xff0c;数据要素作为其中重要一环&#xff0c;也被市场重视。 如何深度挖掘数据要素产业链股票呢&#xff1f; 国内已经成立好几家数据交易所&#xff0c;比如上海数据交易所&#xff0c;里面已经有很多挂牌的数据产品。如果能把所有已经…

ChatGPT炒股:自动批量下载特定主题的股票公告

很多财经网站、证券交易所等网站都有股票公告。有时候&#xff0c;我们需要从海量公告信息中查找特定信息。比如&#xff0c;查询所有股票2023年预计关联交易的内容&#xff0c;怎么自动批量下载呢&#xff1f; 下面以股转系统的新三板股票为例&#xff0c;来说明如何用ChatGP…

解读:ChatGPT在股票市场预测方面的应用

写在前面 ChatGPT的应用为股价预测领域带来了新的方法和思路。例如&#xff0c;通过结合自然语言处理和机器学习技术&#xff0c;可以从大量文本数据中提取有关股票市场的关键信息&#xff0c;进一步改进和创新预测模型&#xff1b;处理多源数据&#xff0c;如股票数据、新闻报…

利用chatGPT+剪映高效制作中英双语字幕(其它语言以此类推)

目 录 前 言 一、导出中文字幕 二、利用提示词在chatGPT上快速翻译 三、导入中英文字幕到剪映 四、展示效果 五、参考资料 前 言 ChatGPT可以帮助用户快速生成中英文对照的脚本&#xff0c;解决了在剪映中一个一个翻译中文的痛点&#xff0c;从而提高字幕制作的效率。这…