如何开发一个基于
为了探索
从最终的结果看,我的角色从开发变成了产品设计与测试,整个项目的代码我个人亲自编写的可能不到
更有意思的是,这个项目因缺少部署文档,使一些不了解技术但又想独立部署该项目的网友犯难,但最终他们与
总之这是一个
AI 背景知识
生成式预训练模型(GPT: Generative Pre-trained Transformer)
我
: 你能给我说说chatGPT 背后的技术吗?比如大语言模型,还有训练过程。
chatGPT: 当谈到ChatGPT 时,背后的技术通常是指OpenAI GPT (Generative Pre-trained Transformer)模型,这是一种使用Transformer 网络架构进行预训练的大型语言模型。GPT 是基于无监督学习技术构建的,该技术可以在没有标签的大量数据集上进行训练,以自动发现数据中的模式和结构。
GPT 模型的训练过程分为两个阶段:预训练和微调。预训练阶段使用一个大规模的无标签语料库,例如维基百科、新闻文章、小说等,通过预测给定文本序列中下一个单词的任务,对模型进行训练。这个任务被称为“语言模型”,因为模型被训练为理解自然语言中的上下文和语法规则,以便能够预测下一个单词。在这个过程中,
GPT 模型可以学习到自然语言的规则和结构,形成了通用的语言表示。在预训练完成后,微调阶段使用少量的标记数据对模型进行微调,以适应特定的下游任务,例如问答、文本分类、生成对话等。微调过程通过反向传播梯度更新模型的权重,以最小化特定任务的损失函数。微调的过程可以增强模型对特定任务的理解能力,并且可以使模型在下游任务上表现更好。
总的来说,
GPT 模型的背后技术是基于Transformer 网络的大型无监督语言模型,通过预训练和微调两个阶段的训练,能够学习自然语言的规则和结构,并且在各种下游任务上表现出色。
大语言模型(LLM: Large Language Model)
我
: 大语言模型、GPT、Transformer 三者的关系是?
chatGPT: 大语言模型、GPT、Transformer 三者是密切相关的概念,它们在自然语言处理和深度学习领域有着广泛的应用。具体关系如下:
Transformer 是一种基于注意力机制的神经网络架构,最初是为了机器翻译任务而设计的。它由编码器和解码器组成,可以对序列数据进行建模,适用于在输入和输出之间存在长距离依赖关系的任务。大语言模型是建立在
Transformer 架构基础上的语言模型,常见的大型预训练模型包括GPT 、BERT 等。大语言模型通过在大规模文本语料库上进行自监督预训练,能够捕捉到语言中的复杂结构与信息,从而在下游任务中取得很好的效果。
GPT (Generative Pre-trained Transformer) 是一个基于Transformer 架构和自监督预训练的句子级别自动生成模型,通常用于生成式任务,比如文本自动生成、摘要生成、对话系统等。因此,可以说,大语言模型是应用了
Transformer 架构并使用自监督预训练技术的模型,而GPT 则是基于大语言模型构建的具体任务模型,两者都是Transformer 架构在语言建模方面的应用。
一个奇怪的问题是,基于
我:为什么基于
Transformer 的GPT 模型不仅可以用在翻译上,也能在在编写代码的任务上表现良好?
chatGPT: 1. 基于文本流的代码生成能力:现代软件开发通常包括对源代码的有效管理。生成源代码的技术需要考虑各种软件开发标准、API 接口以及所有相关部分间相互影响的复杂性。GPT 模型强大的自然语言理解能力使其能够有效生成高质量的源代码。
2. 上下文理解:代码通常是一个非常上下文相关的环境,特别是在功能相似但又具有微妙区别的不同代码块之间。GPT 模型能够根据上下文生成出更加匹配语法、且更加可读的代码。
3. 词向量表达:源代码的语法是有结构的,并且它通常被认为属于DSL 的元素构成的单词阵列。它的语法规则清晰,也容易编写非常明确的语义。GPT 通过预训练的方式将从输入数据中获得的词向量检索作为核心基础,使用语言模型来编写高效、正确的代码。因此,
GPT 模型在生成高质量源代码的任务方面也有很好的应用价值。
这里提到的一个关键技术:词向量检索,这在后面也会有所提及。
词向量检索
我
: 什么是词向量检索?
chatGPT: 词向量检索,也称为向量空间模型检索,是一种文本检索方法,其基本思想是将输入的文本转换为向量形式,并使用数学模型对文本相似度进行计算,从而寻找匹配的文本集合。通常情况下,词向量检索分为以下几个步骤:
文本预处理:对原始文本进行分词、去除停用词等操作,以得到可供后续处理的单词列表。
向量表示:利用某种算法(如
word2vec )将每个单词映射为一个向量。这些向量通常具有较高的维数,并包含了单词的语义信息。查询处理:将用户输入的查询文本转换为向量表示,与预处理过的文本向量进行相似度计算,以得到最相关的文本。
结果呈现:将计算出来的相似度得分排列,呈现给用户最相关的文本列表。
词向量检索在自然语言处理领域被广泛应用,常用于搜索引擎、推荐系统等场景。它能够通过对文本的向量化处理,更准确地衡量文本之间的相似度,达到更精确和快速的文本检索效果。
Prompt
我
: 什么是AI 中的Prompt ?
chatGPT: 在AI 中,Prompt 指的是提供给模型的文本或指令,可以用来初始化和引导模型生成一系列类似自然语言的输出。Prompt 通常由一个或多个片段组成,其中每个片段都是一种语言形式或主题,用于定义AI 模型需要生成的文本的内容和样式。
Prompt 可以以多种方式使用,例如:作为
AI 机器人对用户的响应:当一个用户与AI 交互时,机器人会根据用户输入的信息和之前的上下文来生成回答。Prompt 可以用作机器人生成响应的指南,确保AI 产生的回复与预期的主题和风格相一致。作为生成
AI 初始文本的输入:某些AI 工具(如GPT-3 )可以根据给定的Prompt 生成文本。这可以用于快速创建文章、电子邮件、总之,
Prompt 在AI 中是非常重要和有用的,因为它们可以让模型更加定向地生成特定类型或主题的字符串或句子。
我
: 为什么一定要用Prompt ?Prompt 未来还会存在吗?
chatGPT: 在AI 中, “Prompt”是指提供给模型的输入文本,它是用来启发模型生成输出的。Prompt 通常是一些简短的话语或问题,向模型传递一些先验知识或上下文信息,以帮助模型更好地理解和执行任务。在许多自然语言处理
(NLP) 应用中,prompt 对于准确预测输出至关重要。例如,一个对话系统可能需要给出一个明确的提示,让用户提供足够的上下文信息来回答问题,或者一个分类器需要在prompt 下面添加一个标签,以便识别正确的类别。 虽然在AI 中,Prompt 广泛使用并且非常有用,但未来是否会一直使用它们取决于技术的演进。可能会出现新的方式帮助模型更好的理解上下文信息,消除Prompt 所起到的作用,但是现阶段仍然有很多领域弥补不了这个作用,因此Prompt 仍然是一种不可替代的输入形式。
Embedding
我
: openAI 的embedding 是什么?
chatGPT: OpenAI 的Embedding 是一种将词语或句子转换成密集向量的技术。这些向量可以用于自然语言处理任务,如文本分类,情感分析和机器翻译等。在
OpenAI 的Embedding 中,每个单词或句子都会被映射到一个向量空间中的点。与传统的one-hot 编码不同,Embedding 可捕获词语之间的相似性和关系,并使得机器学习算法能够更好地理解自然语言表达的含义。例如,在情感分析中,通过使用
Embedding ,我们可以将具有相似情感倾向的单词或短语映射到相似的向量空间中的位置。这样,我们就可以使用这些向量来训练机器学习模型,以帮助它们更准确地预测文本的情感。
基于chatGPT 的应用类型
由于
套壳chatGPT 应用
这类应用主要是对接
- 工具类应用。需要用户提供自己的
OpenAI API Key 来使用,如很多APP 或浏览器插件。 - 代理服务类。不需要用户提供自己的
OpenAI API Key ,而是通过代理服务来使用chatGPT 的API 。
增强类chatGPT 应用
由于
要应用自己去处理这么多繁琐的工作显然是没有必要的,因为已经有非常好的开源项目去实现这些功能了,代表就是 jerryjliu/llama_index,使用这个库可以很容易实现这些增强功能,比如给
一些相关的应用:
- myGPTReader:
myGPTReader 是Slack 上的一个机器人,可以阅读和总结任何网页、文档(包括电子书)甚至来自YouTube 的视频,它还可以通过语音与用户交流。 - chatpdf:通过给
chatGPT 提供PDF 文档,然后可以针对此文档进行问答,或者总结文档内容。类似的开源实现有:guangzhengli/ChatFiles与arc53/DocsGPT。 - Copilot Hub:和上面的项目类似,不过多了能公开分享根据自己录入数据打造的问答机器人,比如能以乔布斯口吻回答问题的机器人。
- binary-husky/chatgpt_academic:科研工作专用
ChatGPT 拓展,特别优化学术Paper 润色体验。
这些应用大多以
当然
Prompt 类应用
myGPTReader 应用架构
既然这是一篇
导入过程很简单,直接使用这个GithubRepositoryReaderDemo.ipynb里的代码即可,导入我们要分析的项目代码,在这里就是madawei2699/myGPTReader这个
导入后,让我们开始施展魔法吧!
Prompt: Give me the handle_mentions (in app/server.py) function call flow, output Sequence diagrams using mermaid and markdown and comment the function name.
Prompt: Give me the bot_process (in app/server.py) function call flow, output Sequence diagrams using mermaid and markdown and comment the function name.
Prompt: Give me the get_answer_from_llama_file (in app.gpt module) function call flow, output Sequence diagrams using mermaid and markdown.
你没看错,这些时序图是
除了让它绘制图形来分析,我们还可以针对单个模块或函数让它以自然语言来解释代码的含义,比如:
Prompt: Explain get_answer_from_llama_file (in app.gpt module) function step by step.
chatGPT: get_answer_from_llama_file is a function that takes in a list of messages and a file path as parameters and returns an answer, the total number of tokens used by the LLM model, and the total number of tokens used by the embedding model.
Step 1: The function starts by formatting the dialog messages into a single string.
Step 2: It then gets the language code from the last message in the list of messages.
Step 3: It then gets the index name from the file path.
Step 4: It then checks if the index is already cached in the file cache directory. If it is, it loads the index from the cache. If not, it creates a new index from the documents in the file.
Step 5: It then gets the prompt template for the language code.
Step 6: It then uses the index and the LLM predictor to query the dialog messages with the prompt template.
Step 7: It then uses the synthesizer to speak the SSML asynchronously and save the audio to a file.
Step 8: It then gets the total number of tokens used by the LLM model and the total number of tokens used by the
myGPTReader 实现过程
实现的过程我从第一个函数的实现开始到现在为止,已经将所有的
我在实现的过程保持着傻瓜式的开发方式,也就是
不仅后端代码是这样实现的,连前端页面也是这么开发出来的。对于前端网页的开发,一个难点就是需要写好的
前端的
最终的效果是这样的:myreader.io。
最后的思考
经过一个月与
当然不只编程,很多行业都会受到
如果真是这样的未来,我们现在能够做什么才能保证自己的经验不会快速贬值甚至无效?这是一个值得思考的问题。