AI入门:快速使用AI大模型

159 阅读13分钟

欢迎观看我的笔记😊,本笔记内容为字节青训营LangChain课程内容笔记-1起源,作为作者自己的学习笔记和学习心得使用。将持续更新ing。本节的主要内容为:快速开始了解什么是大模型、如何使用初识LangChain

何为 LLM?

LLM 是一种基于深度学习中的 Transformer 架构的人工智能模型。它通过在大规模文本数据上进行训练,从而学习到语言的语法、语义和语用等知识,能够生成自然流畅的文本。例如,像 GPT系列、文心一言、豆包、千问等都属于 LLM 范畴。

应用场景?

  • 文本生成
  • 视频生成
  • 语言翻译
  • 问答系统
  • 智能客服
  • 生活小帮手😍\
  • ...
    应用场景广泛,并且还在不断拓展中...

HaggingFace介绍:玩AI你必须知道的

HaggingFace: 人称AI版GitHub社区😘😘😘

Hugging Face 通过开源项目积累了强大的影响力,构建了庞大的社区 Hugging Face Hub,拥有超过 50,000 个组织和超百万的模型,促进了全球范围内的 AI 技术交流与合作,其中也包括你应该耳熟能详的阿里千问QWen开源大模型!😍

如何使用社区?

之后博主将会更新一篇更加详细的HaggingFace使用教程,助你无痛开始你的大模型之旅。 本篇笔记将简略从一个初学者角度出发,快速上手一个模型,对开源大模型的使用有一个初步印象。

PixPin_2024-11-29_21-38-34.png

  • Step 3:本文采用较为简单的Fill-Mask类模型作为演示。点击Fill-Mask,就可以找到本文演示使用的模型google-bert/bert-base-chineseimage.png 在这里也简单介绍一下使用模型的前提以及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直接在线加载模型。

image.png

我们点击Files and versionsmain分支文件夹下载模型文件,如下图所示。

PixPin_2024-11-30_01-19-28.png 我们想要使用这个模型,就需要以下三个必要的模型文件:权重文件配置文件词汇表。本文作为快速入门教程,不对以上的模型文件进一步解释。有需求的小伙伴可以自行搜索其他文章看讲解哦。本次使用模型我们需要下载这三个模型到本地。(访问国内的镜像网址下载速度更快,见下文)

Transformers主要模块

transformers.models

包含了各种预训练模型的具体实现,例如BertModelGPT2Model等,每个模型类都提供了相应的方法和属性,用于模型的加载、训练、评估和预测等操作。

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')

快速开始使用

在本地创建一个文件夹存放模型文件。

image.png

源码分享

在开始编码时一定要记得导入前面文档中提到的库嗷。

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/。与网页进行互动时,可以发现,问答系统完美生成了专属于异速鲜花内部资料的回答。