欢迎观看我的笔记😊,本笔记内容为字节青训营LangChain课程内容笔记-1起源,作为作者自己的学习笔记和学习心得使用。将持续更新ing。本节的主要内容为:快速开始、了解什么是大模型、如何使用、初识LangChain。
何为 LLM?
LLM 是一种基于深度学习中的 Transformer 架构的人工智能模型。它通过在大规模文本数据上进行训练,从而学习到语言的语法、语义和语用等知识,能够生成自然流畅的文本。例如,像 GPT系列、文心一言、豆包、千问等都属于 LLM 范畴。
应用场景?
- 文本生成
- 视频生成
- 语言翻译
- 问答系统
- 智能客服
- 生活小帮手😍\
- ...
应用场景广泛,并且还在不断拓展中...
HaggingFace介绍:玩AI你必须知道的
HaggingFace: 人称AI版GitHub社区😘😘😘
Hugging Face 通过开源项目积累了强大的影响力,构建了庞大的社区 Hugging Face Hub,拥有超过 50,000 个组织和超百万的模型,促进了全球范围内的 AI 技术交流与合作,其中也包括你应该耳熟能详的阿里千问QWen开源大模型!😍
如何使用社区?
之后博主将会更新一篇更加详细的HaggingFace使用教程,助你无痛开始你的大模型之旅。 本篇笔记将简略从一个初学者角度出发,快速上手一个模型,对开源大模型的使用有一个初步印象。
- Step 1:访问HaggingFace社区:
huggingface.co
PS:如果你不是freshman,可以直接参照文档直接学习: 快速入门 - Hugging Face 机器学习平台 (hugging-face.cn) - Step 2:如果你不能访问,可以使用国内替代镜像网址: HF-Mirror
访问效果:
- Step 3:本文采用较为简单的Fill-Mask类模型作为演示。点击Fill-Mask,就可以找到本文演示使用的模型google-bert/bert-base-chinese:
在这里也简单介绍一下使用模型的前提以及Fill-Mask模型架构的作用。
Transformers 库:使用模型你必须知道的
这是 Hugging Face 的核心项目之一,是一个 Python 库,包含了大量的预训练模型和工具,可用于执行各种自然语言处理任务,如文本分类、命名实体识别、问答等。支持 PyTorch、TensorFlow 和 JAX 等主流的深度学习框架,用户可以根据自身需求和偏好灵活选择,并且能够在不同框架之间进行模型的训练、加载和转换,大大提高了开发的灵活性和效率。 如果我们想要使用HaggingFace上模型,安装transformers包后可以使用命令执行处理各种任务了。
pip install transformers
Fill-Mask
Fill-Mask 任务即掩码语言建模(Masked Language Modeling,MLM)任务,是指将文本中的一些单词或标记(token)替换成特殊的<mask>
字符,然后让模型预测这些被替换的字符应该是什么。
简单来说:就是我给出一句不完整的话,模型预测出这句话中缺少的那个字是什么。
举个例子:“吃了吗?”我把这句话的“了”字删去,变为->“吃< >吗?”->模型预测得出可能的几个字是什么,并且还可以给出预测的概率,这就是Fill-Mask这类模型处理完成所做到的事情。怎么样,是不是听起来不是很难😎。
BERT
本文使用的是由谷歌开发的预训练语言模型BERT,其在 Fill-Mask 任务上表现出色,能够有效地捕捉文本中的双向语义信息。它是一个基于Transformer架构的中文预训练模型,使用了大量的中文语料进行训练bert-base-chinese具有12层的Transformer编码器,包含约110万个参数。它在多个中文自然语言处理任务上表现出色,如文本分类、命名实体识别和情感分析等。演示所使用的语言均为中文,所以使用的是语言为中文的大模型,BERT还有其他语言支持使用例如English,作者使用下来准确率都很不错~留给读者自行尝试吧。
Step 4: 下载文件
为了考虑到初学者对直接使用不太熟悉,也考虑到部分同学的网络原因。本教程直接将模型下载到本地使用,先不使用下图所示transformers直接在线加载模型。
我们点击Files and versions到main
分支文件夹下载模型文件,如下图所示。
我们想要使用这个模型,就需要以下三个必要的模型文件:权重文件、配置文件、词汇表。本文作为快速入门教程,不对以上的模型文件进一步解释。有需求的小伙伴可以自行搜索其他文章看讲解哦。本次使用模型我们需要下载这三个模型到本地。(访问国内的镜像网址下载速度更快,见下文)
Transformers主要模块
transformers.models
包含了各种预训练模型的具体实现,例如BertModel
、GPT2Model
等,每个模型类都提供了相应的方法和属性,用于模型的加载、训练、评估和预测等操作。
transformers.tokenier
提供了分词器的基类以及各种分词器的实现。分词器用于将文本数据转换为模型能够处理的数字序列,不同的预训练模型通常有对应的分词器,如BertTokenizer
,它们负责将文本分词、添加特殊标记、转换为词向量等预处理操作。
transformers.pipelines
提供了一些预定义的管道,用于简化特定任务的模型使用流程。例如,pipeline('sentiment-analysis')
可以直接用于情感分析任务,无需手动进行模型的加载、预处理、预测等复杂操作,提高了开发效率。
hugging face 官方下载
使用huggingface
官方提供的huggingface-cli
命令行工具。安装依赖:
pip install -U huggingface_hub
然后新建python文件,填入以下代码,运行即可。
- resume-download:断点续下
- local-dir:本地存储路径。(linux环境下需要填写绝对路径)
import os
# 下载模型
os.system('huggingface-cli download --resume-download internlm/internlm-chat-7b --local-dir your_path')
hugging face 镜像下载
与使用hugginge face下载相同,只需要填入镜像地址即可。使用huggingface
官方提供的huggingface-cli
命令行工具。安装依赖:
pip install -U huggingface_hub
然后新建python文件,填入以下代码,运行即可。
- resume-download:断点续下
- local-dir:本地存储路径。(linux环境下需要填写绝对路径)
import os
# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
# 下载模型
os.system('huggingface-cli download --resume-download internlm/internlm-chat-7b --local-dir your_path')
更多关于镜像使用可以移步至 HF Mirror 查看。
modelscope 下载
使用modelscope
中的snapshot_download
函数下载模型,第一个参数为模型名称,参数cache_dir
为模型的下载路径。
注意:cache_dir
最好为绝对路径。
安装依赖:
pip install modelscope
pip install transformers
在当前目录下新建python文件,填入以下代码,运行即可。
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm-chat-7b', cache_dir='your path', revision='master')
快速开始使用
在本地创建一个文件夹存放模型文件。
源码分享
在开始编码时一定要记得导入前面文档中提到的库嗷。
import transformers
import torch
复制下面的代码,看看效果!😎
from transformers import BertTokenizer, BertForMaskedLM
import torch
import torch.nn.functional as F
# 1. 加载本地模型和分词器
model_name = './bert-base-chinese' # 本地路径
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForMaskedLM.from_pretrained(model_name)
# 2. 输入文本,其中包含 [MASK] token
text = "我好想[MASK]."
# 3. 使用分词器对输入进行编码,并返回 tensor 格式的输入
inputs = tokenizer(text, return_tensors="pt")
# 4. 运行模型推理
with torch.no_grad():
outputs = model(**inputs)
# 5. 获取模型预测的 logits(每个词的得分)
logits = outputs.logits
# 6. 获取MASK的预测结果
mask_token_index = torch.where(inputs.input_ids == tokenizer.mask_token_id)[1]
# 7. 获取MASK位置的 logits
mask_token_logits = logits[0, mask_token_index, :] # [1, mask_position, vocab_size]
# 8. 应用 softmax 转换 logits 为概率分布
mask_token_probs = F.softmax(mask_token_logits, dim=-1) # softmax 后会得到概率分布
# 9. 获取 top-k 预测结果(例如:top 5)
top_k = 5 # 预测前 5 个最可能的词
top_k_probs, top_k_tokens = torch.topk(mask_token_probs, top_k, dim=-1)
# 10. 打印所有词的概率
vocab = tokenizer.get_vocab() # 获取词汇表(token -> id 映射)
id_to_token = {id: token for token, id in vocab.items()} # 反转字典,id -> token 映射
# 获取所有词的概率并显示
word_probs = mask_token_probs.squeeze().cpu().numpy() # 转为 numpy 数组,方便操作
# 获取词汇表中所有 token 对应的概率
word_prob_dict = {id_to_token[i]: word_probs[i] for i in range(len(word_probs))}
# 打印所有词的概率,按概率排序
sorted_word_prob_dict = dict(sorted(word_prob_dict.items(), key=lambda item: item[1], reverse=True))
# 显示 top-k 的结果
print(f"原句:{text}")
print(f"预测的前 {top_k} 个词:")
for i in range(top_k):
predicted_token = id_to_token[top_k_tokens[0][i].item()]
predicted_prob = top_k_probs[0][i].item()
print(f"词:{predicted_token}, 概率:{predicted_prob:.4f}")
效果预览
原句:我好想[MASK].
预测的前 5 个词:
词:你, 概率:0.7596
词:妳, 概率:0.1134
词:她, 概率:0.0122
词:要, 概率:0.0102
词:笑, 概率:0.0079
这样我们就完成了第一次大模型的使用!😘😘😘
作为初学者的我们不需要看懂所有的代码,如果你有编程基础看懂上述代码应该不是难事😁,希望你能理解运用模型->输出结果这个过程是如何来的,并尝试自己动手写一个程序使用大模型吧。
何为 LangChain?
简单来说,LangChain是一个基于大语言模型(LLMs)用于构建端到端语言模型应用的框架,它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人等。LangChain提供了一系列工具、套件和接口,可以简化创建由LLMs和聊天模型提供支持的应用程序的过程。
项目名称
项目名称:“易速鲜花”内部员工知识库问答系统
下面,从这里开始就将开始基于LangChain搭建一个智能问答系统。
我们首先用LangChain中的document_loaders来加载各种格式的文本文件。
import os
os.environ["OPENAI_API_KEY"] = '你的Open AI API Key'
# 1.Load 导入Document Loaders
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.document_loaders import TextLoader
# 加载Documents
base_dir = '.\OneFlower' # 文档的存放目录
documents = []
for file in os.listdir(base_dir):
# 构建完整的文件路径
file_path = os.path.join(base_dir, file)
if file.endswith('.pdf'):
loader = PyPDFLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.docx'):
loader = Docx2txtLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.txt'):
loader = TextLoader(file_path)
documents.extend(loader.load())
这里我们首先导入了OpenAI的API Key。因为后面我们需要利用Open AI的两种不同模型做以下两件事:
- 用OpenAI的Embedding模型为文档做嵌入。
- 调用OpenAI的GPT模型来生成问答系统中的回答。
当然了,LangChain所支持的大模型绝不仅仅是Open AI而已,你完全可以遵循这个框架,把Embedding模型和负责生成回答的语言模型都替换为其他的开源模型。
在运行上面的程序时,除了要导入正确的Open AI Key之外,还要注意的是工具包的安装。使用LangChain时,根据具体的任务,往往需要各种不同的工具包(比如上面的代码需要PyPDF和Docx2txt工具)。它们安装起来都非常简单,如果程序报错缺少某个包,只要通过 pip install
安装相关包即可。
接下来需要将加载的文本分割成更小的块,以便进行嵌入和向量存储。这个步骤中,我们使用 LangChain中的RecursiveCharacterTextSplitter 来分割文本。
# 2.Split 将Documents切分成块以便后续进行嵌入和向量存储
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)
紧接着,我们将这些分割后的文本转换成嵌入的形式,并将其存储在一个向量数据库中。在这个例子中,我们使用了 OpenAIEmbeddings 来生成嵌入,然后使用 Qdrant 这个向量数据库来存储嵌入(这里需要pip install qdrant-client)。
# 3.Store 将分割嵌入并存储在矢量数据库Qdrant中
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Qdrant.from_documents(
documents=chunked_documents, # 以分块的文档
embedding=OpenAIEmbeddings(), # 用OpenAI的Embedding Model做嵌入
location=":memory:", # in-memory 存储
collection_name="my_documents",) # 指定collection_name
当内部文档存储到向量数据库之后,我们需要根据问题和任务来提取最相关的信息。此时,信息提取的基本方式就是把问题也转换为向量,然后去和向量数据库中的各个向量进行比较,提取最接近的信息。
向量之间的比较通常基于向量的距离或者相似度。在高维空间中,常用的向量距离或相似度计算方法有欧氏距离和余弦相似度。
- 欧氏距离:这是最直接的距离度量方式,就像在二维平面上测量两点之间的直线距离那样。在高维空间中,两个向量的欧氏距离就是各个对应维度差的平方和的平方根。
- 余弦相似度:在很多情况下,我们更关心向量的方向而不是它的大小。例如在文本处理中,一个词的向量可能会因为文本长度的不同,而在大小上有很大的差距,但方向更能反映其语义。余弦相似度就是度量向量之间方向的相似性,它的值范围在-1到1之间,值越接近1,表示两个向量的方向越相似。
这两种方法都被广泛应用于各种机器学习和人工智能任务中,选择哪一种方法取决于具体的应用场景。
# 4. Retrieval 准备模型和Retrieval链
import logging # 导入Logging工具
from langchain.chat_models import ChatOpenAI # ChatOpenAI模型
from langchain.retrievers.multi_query import MultiQueryRetriever # MultiQueryRetriever工具
from langchain.chains import RetrievalQA # RetrievalQA链
# 设置Logging
logging.basicConfig()
logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO)
# 实例化一个大模型工具 - OpenAI的GPT-3.5
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# 实例化一个MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)
# 实例化一个RetrievalQA链
qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever_from_llm)
# 5. Output 问答系统的UI实现
from flask import Flask, request, render_template
app = Flask(__name__) # Flask APP
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
# 接收用户输入作为问题
question = request.form.get('question')
# RetrievalQA链 - 读入问题,生成答案
result = qa_chain({"query": question})
# 把大模型的回答结果返回网页进行渲染
return render_template('index.html', result=result)
return render_template('index.html')
if __name__ == "__main__":
app.run(host='0.0.0.0',debug=True,port=5000)
运行程序之后,我们跑起一个网页 http://127.0.0.1:5000/。与网页进行互动时,可以发现,问答系统完美生成了专属于异速鲜花内部资料的回答。