赞
踩
目前的方案基本上可以分为:
brew install miniconda
conda create -n [[name]]
conda activate [[name]]
自然语言处理,简称 NLP,是人工智能的一个分支,它允许机器理解、处理和操纵人类语言。
- conda install torch
- conda install numpy
- conda install scipy
⚠️gensim依赖于scipy和numpy,一定要先安装前两者再安装gensim 是一个著名的开源 Python 库,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。Gensim 支持包括TF-IDF,LDA和 word2vec在内的多种主题模型算法,因此很多算法工程师会将其作为主题建模的首选库。
conda install -c conda-forge gensim
Word2Vec是一种用于处理自然语言处理的模型,它是在2013年由Google的研究员Mikolov等人首次提出的。Word2Vec通过训练海量的文本数据,能够将每个单词转换为一个具有一定维度的向量。这个向量就可以代表这个单词的语义。因为这个向量是在大量语境中学到的,所以这个向量能很好的表达这个单词的语义。 Word2Vec包括Skip-Gram和CBOW两种模型,主要是通过优化模型计算词与词之间的关系,从而获得词的向量表示。 Skip-Gram模型是通过一个词预测其上下文。举个例子,给定词汇"苹果",Skip-Gram模型的目标是生成它的上下文"吃了一个大"和"感觉真满足"。 CBOW模型是给定一个词的上下文词汇,预测这个词。比如,给定上下文"吃了一个大"和"感觉真满足",CBOW模型会预测中间的词汇,也就是"苹果"。 这两种模型都是通过学习词汇与其上下文之间的关系,获得词的向量表示。这两个向量的距离可以用来衡量两个词语义上的相似度,距离越近意味着两个词语义上越相似。
word2vec模型已经很老了,本教程主要用于教学,让读者对大模型相关知识有一些实践的了解,故不强追求质量效率等。若读者感兴趣,可尝试其他词向量模型
按照具体数据集的规范解压提取出数据
Open Chinese Convert(OpenCC)是一个开源的中文简繁转换项目,致力于制作高质量的基于统计语料的简繁转换词库。还提供函数库(libopencc)、命令行简繁转换工具、人工校对工具、词典生成程序、在线转换服务及图形用户界面。
pip3 install opencc-python-reimplemented
对于数据集我们需要依此进行四个操作:
其中繁体转简体 和 分词 所花费的时间 占大头
thuctc.thunlp.org/#%E6%A0%B7%…
我们下载的是.zip文件,先原地解压THUCNews.zip
对于数据集我们需要依此进行四个操作:
需要把所有数据集合并为一个数据集,作为最终训练模型用的数据集
数据集并不大,m2 pro性能也很能打了,直接在本地硬造就行。 训练10轮,m2 pro 32g大约一个半小时可以完成
model = Word2Vec(sentences, vector_size=300, window=5, epochs=10, compute_loss=True, callbacks=[epoch_logger])
print(model.vector_size) print(model.total_train_time) print(model.wv.most_similar('猫')) print(model.wv.most_similar('吉林大学'))
结果:
300 4965.289603250014 [('狗', 0.7110657691955566), ('猫咪', 0.671169638633728), ('小猫', 0.6650978326797485), ('兔子', 0.6501124501228333), ('小狗', 0.6325607895851135), ('小猫咪', 0.6306896805763245), ('犬', 0.6204975843429565), ('宠物猫', 0.6035280227661133), ('吉娃娃', 0.5858094096183777), ('宠物狗', 0.5799086093902588)] [('东北师范大学', 0.7164520621299744), ('大连理工大学', 0.6689789295196533), ('哈尔滨工程大学', 0.6448072791099548), ('哈尔滨工业大学', 0.6404638886451721), ('西北农林科技大学', 0.637593150138855), ('东北财经大学', 0.6347334384918213), ('中国医科大学', 0.630100429058075), ('杭州大学', 0.6278619766235352), ('华东政法学院', 0.6263515949249268), ('白求恩医科大学', 0.6260219216346741)]
word2vec模型本身只能对词语进行embedding操作,如果想对句子进行embedding,有以下几种方法:
我们采用最简单的第一种方法
- def encode(self, sentences: List[str], show_progress_bar: bool = False) -> ndarray:
- all_embeddings = []
- for sentence in tqdm(sentences, desc='Word2Vec Embeddings', disable=not show_progress_bar):
- emb = []
- count = 0
- for word in sentence:
- # 过滤停用词
- if word in self.stopwords:
- continue
- # 调用词向量
- if word in self.w2v.key_to_index:
- emb.append(self.w2v.get_vector(word, norm=True))
- count += 1
- else:
- if len(word) == 1:
- continue
- # 再切分
- ws = self.jieba.lcut(word, cut_all=True, HMM=True)
- for w in ws:
- if w in self.w2v.key_to_index:
- emb.append(self.w2v.get_vector(w, norm=True))
- count += 1
- tensor_x = np.array(emb).sum(axis=0) # 纵轴相加
- if count > 0:
- avg_tensor_x = np.divide(tensor_x, count)
- else:
- avg_tensor_x = np.zeros(self.w2v.vector_size, dtype=float)
- all_embeddings.append(avg_tensor_x)
- all_embeddings = np.array(all_embeddings, dtype=float)
- if input_is_string:
- all_embeddings = all_embeddings[0]
-
- return all_embeddings
-
我们使用最简单的算法来对文档进行分句
- def split_sentences(text):
- sent_delimiters = ['。', '?', '!', '?', '!', '.']
- for delimiter in sent_delimiters:
- text = text.replace(delimiter, '\n')
- sentences = text.split('\n')
- sentences = [sent for sent in sentences if sent.strip()]
- return sentences
除此之外,还可以考虑使用以下库: pyltp(语言技术平台):pyltp是哈工大社会计算与信息检索研究中心研发的一款中文自然语言处理工具包,可以很好地处理中文文本。 pkuseg:pkuseg是北京大学的一个分词工具,也有一定的分句能力。 spaCy: spaCy是另一个用于NLP任务的强大Python库 NLTK: 自然语言工具包(NLTK)是一个流行的Python库,用于处理自然语言数据。
向量相似度的计算通常基于一种叫做余弦相似度(Cosine Similarity)的度量方法。余弦相似度直观地表示了两个向量间的夹角,其值越接近于1,表示两个向量越相似。
- def cosine_similarity(vec1, vec2):
- norm_vec1 = numpy.linalg.norm(vec1)
- norm_vec2 = numpy.linalg.norm(vec2)
- if norm_vec1 == 0 or norm_vec2 == 0:
- return 0
- else:
- dot_product = numpy.dot(vec1, vec2)
- return dot_product / (norm_vec1 * norm_vec2)
-
现在万事俱备,让我们来简单跑通一下这个流程
将知识加入大模型上下文常用prompt模板:
- 使用以下背景段落来回答问题,如果段落内容不相关就返回未查到相关信息:
- 背景:{{knowledge}}
- 问题:{{userInput}}
向量数据库是一种特殊类型的数据库,用于存储和检索向量嵌入以进行快速的相似性搜索。它们具有存储、查询和管理向量数据的能力,适用于各种应用,如语义搜索、图像识别、推荐系统等。向量数据库使用特殊的搜索技术,如近似最近邻搜索(ANN),以便在高维空间中查找最相似的向量。这些数据库还提供了数据管理、容错性、安全性和查询引擎等附加功能。
Pinecone是一个专门为工程师与开发者设计的向量数据库。 作为一个全托管的服务,它减轻了工程师以及运维人员的负担,使得客户可以聚焦于数据内在价值的抽取。
Weaviate 是一个开源的向量数据库,可以存储对象、向量,支持将矢量搜索与结构化过滤与云原生数据库容错和可拓展性等能力相结合。 支持GraphQL、REST和各种语言的客户端访问
redis 通过RedisSearch 模块,也原生支持向量检索。 RedisSearch 是一个Redis模块,提供了查询、二级索引,全文检索以及向量检索等能力。如果要使用RedisSearch,需要首先在Redis数据上声明索引。
面向下一代的生成式AI向量数据库,同时也具备云原生的特性。
一个开源的向量数据库。 可以快速基于Python和JavaScript构建内存级LLM应用
构建在Milvus之上的数据基础设施。
如果我们想把知识库作为大模型的外接知识库,就需要借助向量数据库来存储之前被向量化的文档。我们选用Qdrant来部署(为了Rust!)
docker pull qdrant/qdrant
docker run -p 6333:6333 -p 6334:6334 \ -v $(pwd)/qdrant_storage:/qdrant/storage:z \ qdrant/qdrant
pip3 install qdrant-client
- from qdrant_client import QdrantClient
-
- client = QdrantClient("localhost", port=6333)
conda create -n chatglm python=3.10 conda activate chatglm
cd /tmp git clone https://github.com/THUDM/ChatGLM2-6B
pip3 install -r requirements.txt
# 安装 pytorch nightly 版本
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
下载模型实现
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b
下载模型参数 cloud.tsinghua.edu.cn/d/674208019… 将下载的文件替换到本地的 chatglm2-6b 目录下
将模型下载到本地之后,将以上代码中的 THUDM/chatglm2-6b 替换为你本地的 chatglm2-6b 文件夹的路径,即可从本地加载模型。
对于mac,需要使用 mps 后端。同时需要修改模型的路径,修改为
运行模型demo
python web_demo.py streamlit run web_demo2.py
更多模型部署和使用参考官方文档 github.com/THUDM/ChatG…
参考文章:手把手教你从零搭建自己的知识库 - 掘金
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。