如何让ChatGPT学习私有化知识,并且保留部分对话功能

问题情境

情景:比如我希望用 GPT 做一个产品的客服,现在有一些相关文档,如何让 GPT 学习到产品信息呢? 并且还具备正常对话功能
一个方案是直接把产品信息当做输入喂给GPT,但是ChatGPT/GPT-4/LLMs 一般都有输入长度的限制( token 长度的限制),如果信息太长超过token长度则无法把这些信息一股脑的当做输入扔进去。但又想让 ChatGPT 学到这些知识,所以这个问题就必须想办法解决。

解决方案

一、finetune微调

微调(finetune)是深度学习领域一个很常用的操作,就是模型的再次训练。通过 finetune 可以小幅度改变大模型的参数,使大模型聚焦于特定场景的知识(即私有数据知识)。但 finetune 需要大量的 GPU 资源进行模型训练,同时需要一定的深度算法基础保证模型能够按自己需求把私有数据的知识学习到。门槛较高

但是实际操作过程中,微调后的model反而容易发生“遗忘“,变成了一个专才,是具备了回答特定问题的能力,但是丧失了对话功能。不知道openai如何让chatgpt具备这种全才功能的?

对此 GPT4是这样解释的:

在微调(fine-tuning)GPT-3之后,模型会专门关注于特定的任务或者专门的领域。这是因为在微调过程中,模型将根据新的训练数据重新调整其参数,以更好地适应这些特定任务或领域。这可能会导致模型在其他任务或领域中的表现下降,因为它主要优化了在新数据上的表现。
然而,ChatGPT是一个通用的对话模型,它是通过在大量的对话数据上进行预训练和微调训练得到的。这意味着它可以在各种不同的对话场景和主题上进行自然和连贯的对话。
关于如何实现的,我会简单解释一下:
预训练阶段(Pretraining Stage):模型首先在大量的互联网文本上进行预训练。在这个阶段,模型学习到了大量的语言知识,包括语法、词汇、常识以及各种主题的基本信息。
微调阶段(Fine-tuning Stage):预训练完成后,模型将在特定的对话数据上进行微调。这些数据可能包括人与人的对话、人与机器的对话等。在这个阶段,模型学习到了如何进行自然和连贯的对话。
关键的区别在于,微调阶段的数据是多样化的,包含了各种不同的对话场景和主题,所以ChatGPT能够在各种不同的对话中表现得较好。这和针对特定任务或领域进行微调的模型是不同的。对于特定任务的微调模型,它的数据是特定的,导致它在这个任务上表现得很好,但在其他任务上可能就不行了。

User
那我可以解决这种微调后的遗忘问题嘛?比如从prompt上下功夫?
ChatGPT
在微调模型后确实可能会出现“遗忘”问题,即模型在专门优化新任务时可能会忽视其原有的知识和能力。这在迁移学习领域是一个常见的问题,研究者们提出了一些策略来缓解这个问题,比如慢速微调、弹性权重共享等。
对于你提出的在prompt上下功夫的想法,的确是一个有效的策略。正确的prompt设计可以帮助模型更好地理解任务并使用其已有的知识。
在OpenAI的GPT-3中,已经展示了通过精心设计的prompt可以大幅度提升模型的表现。比如在机器翻译任务中,将prompt设计为“Translate the following English text to French: …”可以帮助模型更好地执行任务。在对话任务中,也可以使用类似的策略,比如可以在每一次对话开始时告诉模型你需要的是一个全能的对话模型,而不仅仅是针对特定任务或领域的专家。
然而,虽然精心设计的prompt可以提高模型的表现,但并不能完全解决遗忘问题。这是因为微调过程中的遗忘问题本质上是因为模型在新任务上过度优化导致的,而prompt设计只能帮助模型更好地理解任务,无法改变微调过程中的优化方向。要彻底解决这个问题可能需要更深入的研究和新的策略。

二、基于检索的提示补充

Context Learning

GPT系列的大语言模型都有一个共同的原理,是基于上下文学习(Context Learning)能力进行训练和结果生成。

上下文学习可以通过一个不完全准确的例子理解:

历史数据:我今天头疼,所以我生病了。
历史数据:我今天肚子疼,所以我生病了。
输入(提示):我今天脚疼,所以_______
模型:我今天脚疼,所以我生病了
模型通过学习历史数据,模型能对当前的输入进行预测。因为历史的数据表示,我“疼”了就会“生病”,所以模型通过数据抽象总结出了这个因果关系,并根据“脚疼”推理出“生病”。当数据足够多、足够丰富,模型能够预测的结果也就越丰富,越随机。

这个例子虽然不完全准确,但能反映出部分上下文学习的核心思想。

上下文学习中输入被称为提示(Prompt),提示越准确、包含的信息越多,模型所能准确推理出更准确的结果。
回到上述的问题,如何让 GPT 学到额外的私有信息,就是尽可能构建出包含有用的、包含私有知识更多的提示,从而使 GPT 根据上下文能力学到额外的信息。但因为算法本身原因,大模型都有输入的限制,要求输入不能超过某一长度,因此无法通过无限制的增大长度来增大信息。

》因此回到了本部分的解决方案,基于检索的提示补充。

基于检索的提示补充核心思路是:

根据输入信息1 检索本地私有数据库/文档中的内容,得到额外的信息2;
将信息2 和 输入信息1 安装特定的提示模版(Prompt template)组合成一个包含信息更多的新输入信息3;
再将信息3作为输入调用 GPT 模型,生成最终的结果。

目前基于检索的提示补充开源工具有

OpenAI 的官方插件:chatgpt-retrieval-plugin
本地/私有数据收集和索引,构建外部数据与大模型之间接口的开源项目:Llama-index
同样是 外部数据、其他应用与大模型交互的接口层框架:LangChain

文本参考

https://zhuanlan.zhihu.com/p/623031303

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装 PyCharm

网址:Download PyCharm: Python IDE for Professional Developers by JetBrains 安装文件: 第一步: 第二步: 第三步: 第四步: 正在安装: 安装完成:

pytest钩子函数(三):用例收集钩子

前言 pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预,根据需求去开发对应的插件,以满足自己的使用场景。 01 什么是钩子函数? 钩子函数在pytest称之为Hook函数,它pytes…

Redis缓存击穿

Redis缓存击穿是指在使用Redis作为缓存时,某个热点数据过期或不存在,导致大量请求直接打到后端存储系统(例如数据库),使得后端系统压力骤增,性能下降的情况。这种情况通常发生在热点数据失效的瞬间。 缓存…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

TCP/IP网络编程 第十九章:Windows平台下线程的使用

内核对象 要想掌握Windows平台下的线程,应首先理解“内核对象”(Kernel Objects)的概念。如果仅介绍Windows平台下的线程使用技巧,则可以省略相对陌生的内核对象相关内容。但这并不能使各位深入理解Windows平台下的线程。 内核对…

RocksDB架构

1、rocksdb是什么? RocksDB中文网 | 一个持久型的key-value存储 rocksdb是一种KV存储引擎,常用于数据库存储数据,无法直接使用,没有提供sql命令,通过调用rocksdb提供的api进行数据库的读写等操作。 rocksdb是以leveldb为基础开…

Linux一些问题,结合gpt,自己复习用

(一)请介绍linux以及它和windows的区别 🐧 Linux是一个开源的操作系统,它基于UNIX,并具有强大的自由度和灵活性。它被广泛用于服务器环境和嵌入式系统中。Linux有许多不同的发行版,例如Ubuntu、Debian、Fe…

聊聊spring-cloud的负载均衡

聊聊spring-cloud的负载均衡 1. 选择合适的负载均衡算法2. 合理设置超时时间3. 缓存服务实例列表4. 使用断路器5. 使用缓存Spring Cloud负载均衡组件对比RibbonLoadBalancerWebClient对比 总结 在微服务架构中,负载均衡是非常重要的一个环节,可以有效地提…

S32K144 GPIO外设分析

1. S32K144 GPIO外设特性 下面的内容来自于S32K用户手册的翻译,或者网上关于S32K系列的一些pdf文件介绍。有些内容可能会出现理解不到位或者翻译错误方面,如果大家有疑问最好可以查阅用户手册。 GPIO和PORT的数量 从用户手册,对于PCR&#x…

React Dva项目中路由跳转的方法

接下来 我们来看看路由跳转 先打开 我们Dva项目 然后我们需要在routes 下创建一个自己的路由,如果您尚未掌握在Dva项目中创建路由,可以参考我的文章 React 在Dva项目中修改路由配置,并创建一个自己的路由 然后 我的项目有两个路由 router.js…

ASFF Learning Spatial Fusion for Single-Shot Object Detection 论文学习

1. 解决了什么问题? 目标检测取得了显著成绩,但是检测不同尺度的目标仍然是一个挑战。金字塔或多层级特征是解决目标检测中尺度变化的常用手段。但对于单阶段目标检测器而言,各特征尺度之间不一致性制约了算法的表现。与图像金字塔相比&…

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性

VMware Workstation 18 Tech Preview - 增强的 Windows 11 虚拟机安全性 VMware Workstation Tech Preview 2023 请访问原文链接:https://sysin.org/blog/vmware-workstation-18/,查看最新版。原创作品,转载请保留出处。 作者主页&#xf…

OpenAI的Function calling 和 LangChain的Search Agent

OpenAI的Function calling openai最近发布的gpt-3.5-turbo-0613 和 gpt-4-0613版本模型增加了function calling的功能,该功能通过定义功能函数,gpt通过分析问题和函数功能描述来决定是否调用函数,并且生成函数对应的入参。函数调用的功能可以…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址:torch.nn — PyTorch 2.0 documentation 常用的:Sigmoid、ReLU、LeakyReLU等。 作用:为模型引入非线性特征,这样才能在训练过程中…

Java面试题总结记录(3)—— Spring篇

1、什么是Spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对 构建J2EE平台的web应用。 Spring 框架目标是简化Java企业级应用开发,并通过 POJO为基础的编程 模型促进良好的编程习惯 2、你们项…

Socks5代理在爬虫与HTTP应用中的重要性

IP代理的类型及原理常见的IP代理类型有HTTP代理、Socks代理等,本文重点关注Socks5代理。Socks5代理是一种网络协议,可以实现传输层的数据转发,使客户端在不直接连接服务器的情况下与其进行通信。其原理在于接收客户端的请求,然后将…

数组和链表、栈和队列的区别

1.数组和链表的区别 数组和链表是两种不同的数据结构,它们在存储和访问数据上有很大的区别。 1. 存储方式: 数组是一种连续内存空间的数据结构,其元素在内存中是按顺序存储的,通过索引可以直接访问元素。链表是由若干个节点组成…

[k8s] command和args

k8s中的command和args可以覆盖docker镜像中的entrypoint和cmd。其中,k8s-command可以覆盖docker-entrypoint,k8s-args可以覆盖docker-cmd。参考Difference between Docker ENTRYPOINT and Kubernetes container spec COMMAND? 了解一下entrypoint的意义…

Spring 更简单的读取和存储对象

目录 1.存储 Bean 对象 1.1 前置⼯作:配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller(控制器存储) 1.2.2 Service(服务存储) 1.2.3 Repository(仓库存储) 1.2.4 Component&a…

Python学习 - Request库

学习和使用 引入 import requests基本语法 Request常用方法总结 responserequests.get(url,params,**kwargs) responserequests.post(url,params,**kwargs)参数含义url目标URL地址params请求发起携带的数据kwargs控制请求访问的参数,使用后可以加入到requests请…