基于Only Decoder Transformer手搓LLM
概述
本项目实现了手搓一个简单的续写GPT
GitHub-KennyCaty
具体实现:从 基础二元语言模型 到 基于Transform架构(Only Decoder)的GPT模型
BigramLanguageModel 数据集:绿野仙踪
GPT 数据集:Openwebtext
Prepare
jupyter: 1.biagram.ipynb
Dependences
python=3.10
1pip install matplotlib numpy pylzma ipykernel
123# torch 安装适合cuda的版本# torch=2.1.0# 略
torch pip下载慢可以用conda下载,换清华源
12345# 换源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/# conda下载torchconda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytor ...
Transformer笔记
写在前面
参考
B站:水论文的程序猿
datacamp: how- transformer work
Jalammar: The Illustrated Transformer 强推 (大部分图片来源)
DaNing的博客
什么是注意力
什么是注意力用一张图片举例,看到下面一张图片,可能每个人有不同的关注点,但是带有一个问题:婴儿在干嘛,带着这个问题再去看,就会去思考图中哪些东西与这句话相关人看脸文章看标题段落看开头…对于这张图而言,红色部分可能是比较重要的信息所以注意力机制:将焦点聚焦于重要的信息上
这里先简单介绍以下论文中对注意力机制的描述(翻译了一下)Attention Is All You Need中对注意力机制的描述:注意力函数可以描述为 由一个query和一个键值对(k-v)映射到输出的一个函数,输出是value的一个加权和
所以输出维度和value维度一样
如何做注意力
Attention score
我们假设所要判断是否要重视的对象也就是待查询对象(还没有观察这个数据前)为Qqi(Q=q1,q2,...,qn)q_i (Q = q_1,q_2,...,q_ ...
LangChain(四): 问答检索
我们想要使用语言模型并将其与我们的许多文档结合起来,但是LLM一次只能检查几千个词。
那么,如何让LLM回答其中的所有问题呢?
这就是嵌入(Embeddings)和向量存储(Vector storage)发挥作用的地方
Embeddings
嵌入为文本片段创建数值表示,捕捉了它所应用的文本片段的语义含义
相似内容的文本片段将具有相似的向量,所以才能够在向量空间中比较文本
比如下面例子:前两个是宠物,后一个是汽车,向量化比较后,宠物的数值表示十分相似
这让我们可以轻松找出哪些文本片段相似,在传递给LLM文本片段以回答问题时非常有用
Vector Database
向量数据库是存储在前一步中创建的这些向量表示的一种方式
创建它的方式是将其中的文本块填充为来自输入文档的块
当获得一个大的输入文档时,先将其分割成较小的块(chunks),这有助于创建比原始文档更小的文本片段,因为我们可能无法将整个文档传递给LLM
为每一个chunk创建一个embedding嵌入,并将其存储在向量数据库中
同样,我们将问题也embedding为向量表示
运行时使用Index在数据库中搜索最相关的文 ...
Ubuntu20安装docker
看了很多安装docker并配置阿里云镜像的教程,许多都有问题,记录一下没问题的安装过程
卸载旧版本
Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:
1sudo apt-get remove docker docker-engine docker.io containerd runc
当前称为 Docker Engine-Community 软件包 docker-ce
设置仓库
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
安装依赖包
1sudo apt update
1sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
添加GPG密钥
添加 Docker 的官方 GPG 密钥:
123sudo install -m 0755 -d /etc/apt/keyringscurl - ...
Langchain(三):Chain
reference:
LangChain&DeepLearningAI
Chain
链允许我们将多个组件组合在一起以创建一个单一的、连贯的应用程序。例如,我们可以创建一个链,它接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化的响应传递给 LLM。我们可以通过将多个链组合在一起,或者将链与其他组件组合来构建更复杂的链。
Chain通常将LLM与Prompt一起结合使用
有了Chain,可以将一堆这些构建块放在一起操作
Chain的一大优势在于可以同时对多个输入一起运行
示例:
首先需要向之前一样加载环境变量:
12345import osfrom dotenv import load_dotenv, find_dotenv_ = load_dotenv(find_dotenv()) # read local .env file# 在.env 里面添加OPENAI_API_KEY
开始使用
这LLMChain是最基本的构建区块链。它采用提示模板,根据用户输入对其进行格式化,然后返回LLMs的响应。
首先创建一个提示模板。
12345678from la ...
LangChain(二):Memory
reference:
LangChain&DeepLearningAI
为什么需要Memory
当与这些模型进行交互时,它们自然而然地不会记得您之前说过的话或之前的对话。这对手构建聊天机器人等应用程序拼希望与其对话时是个间题, 因此,在本节申,将介绍记忆也就是如何加载先前对话的部分并将其输入到语言模型中,以便在与其交互时能够保持对话的连贯性。
当你使用一个大型语言模型进行聊天对话时,大型语言模型本身实际上是无状态的。语言模型本身不会记佳你到目前为上所进行的对话。每次调用API都是独立的。LLM需要提供完整的对话作为上下文(Context)才能有”记忆“
做法是将之前的会话存储在内存中,每次调用都将内存保存的会话和新的输入一起输入给LLM
随着对话变得越来越长。所需的内存量也变得非常长。因此,发送大量的tokens到LLM的成本也变得更加昂贵,而语LLM通常是根据需要处理的tokens数量来计费的。(比如OpenAI的key)
因此,LangChain存储提供了凡种方便的内存类型来存储和积累对话。
最简单的一种内存类型是 ConversationBufferMemory
Conv ...
Langchain(一):第一个LangChain程序,提示模板和解析器
reference:
LangChain&DeepLearningAI
概述
LangChain是一个用于构建LLM应用的开源开发框架,目前有Python和JavaScript两种包,它们专注与组合和模块化
特点:
有许多可与彼此或单独使用的个体组件
用例众多,极易入门
重要部分
Models
LLMs:20+integrations
Chat Models
Text Embedding Models:10+integrations
Prompts
Prompt Templates
Output Parsers:5+implementations
Retry/fixing logic
Example Selectors:5+implementations
Indexes 将数据注入系统以与模型结合使用的方式
Document Loaders:50+implementations
Text Splitters:10+implementations
Vector stores:10+integrations
Retrievers:5+inte ...
Flask框架笔记
Flask 初识
Flask是一个基于Python的web开发框架,以“微”框架著称,本身不具备太多的功能,但是通过丰富的第三方插件,可以轻松应对现实开发中复杂的需求,并且有大量的企业在使用Flask构建自己的产品。国内比较出名的有比如豆瓣、果壳网,国外的有Reddit、Netflix等。
第一个Flask
会有三个文件(夹)分别存放静态文件,jinja2模板和app.py(入口程序)
app.py
12345678910111213from flask import Flask# 使用Flask类创建app对象# __name__: 代表当前app.py这个模块app = Flask(__name__)# 路由@app.route('/')def hello_world(): # put application's code here return 'Hello World!'if __name__ == '__main__': app.run()
Flask配置
debug
默认不开启debu ...
服务器部署Jupyter(远程登陆)
安装Jupyter
notebook环境
1pip install jupyter notebook
配置
jupyter notebook 配置
123jupyter notebook --generate-config# Writing default config to: /home/ubuntu/.jupyter/jupyter_notebook_config.py
创建密码(自动配置)
终端输入jupyter notebook password,
Enter password: xxxx
Verify password: xxxx
成功后显示 Wrote hashed password to /home/ubuntu/.jupyter/jupyter_server_config.json
修改jupyter notebook的配置文件
vim ~/.jupyter/jupyter_notebook_config.py
在该文件中做如下修改或直接在文件尾端添加:
1234c.NotebookApp.allow_remote_access = True #允许远程 ...
Langchain-PDFGPT
reference
https://www.youtube.com/channel/UCyR2Ct3pDOeZSRyZH5hPO-Q
https://www.youtube.com/watch?v=TLf90ipMzfE
collab:
https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWpCTVZGN
引入
What Is LangChain? - LangChain + ChatGPT Overview - YouTube
如果你问ChatGPT一个问题: 我今年写了多少篇文章?
它会告诉你不知道,因为他只是一个由截至2021年的数据集训练的模型,他并不知道2021年之后的数据以及你的本地数据库的数据。
当然调用ChatGPT这样的LLM模型不仅仅可以使用Browser版,也可以使用他的API在代码中使用
那Langchain可以干嘛?
Langchain可以连接任何一个人工智能模型,不管是OpenAI的还是Hugging Face的, 它也可以连接外部资源,比如你的 ...