Word2Vec是一种用于处理自然语言处理的模型,它是在2013年由Google的研究员Mikolov等人首次提出的。Word2Vec通过训练海量的文本数据,能够将每个单词转换为一个具有一定维度的向量。这个向量就可以代表这个单词的语义。因为这个向量是在大量语境中学到的,所以这个向量能很好的表达这个单词的语义。Word2Vec包括Skip-Gram和CBOW两种模型,主要是通过优化模型计算词与词之间的关系,从而获得词的向量表示。Skip-Gram模型是通过一个词预测其上下文。举个例子,给定词汇"苹果",Skip-Gram模型的目标是生成它的上下文"吃了一个大"和"感觉真满足"。CBOW模型是给定一个词的上下文词汇,预测这个词。比如,给定上下文"吃了一个大"和"感觉真满足",CBOW模型会预测中间的词汇,也就是"苹果"。这两种模型都是通过学习词汇与其上下文之间的关系,获得词的向量表示。这两个向量的距离可以用来衡量两个词语义上的相似度,距离越近意味着两个词语义上越相似。
按照具体数据集的规范解压提取出数据
OpenChineseConvert(OpenCC)是一个开源的中文简繁转换项目,致力于制作高质量的基于统计语料的简繁转换词库。还提供函数库(libopencc)、命令行简繁转换工具、人工校对工具、词典生成程序、在线转换服务及图形用户界面。
pip3installopencc-python-reimplemented对于数据集我们需要依此进行四个操作:
我们下载的是.zip文件,先原地解压THUCNews.zip
对于数据集我们需要依此进行四个操作:
需要把所有数据集合并为一个数据集,作为最终训练模型用的数据集
数据集并不大,m2pro性能也很能打了,直接在本地硬造就行。训练10轮,m2pro32g大约一个半小时可以完成
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('吉林大学'))结果:
3004965.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,有以下几种方法:
我们采用最简单的第一种方法
defencode(self,sentences:List[str],show_progress_bar:bool=False)->ndarray:all_embeddings=[]forsentenceintqdm(sentences,desc='Word2VecEmbeddings',disable=notshow_progress_bar):emb=[]count=0forwordinsentence:#过滤停用词ifwordinself.stopwords:continue#调用词向量ifwordinself.w2v.key_to_index:emb.append(self.w2v.get_vector(word,norm=True))count+=1else:iflen(word)==1:continue#再切分ws=self.jieba.lcut(word,cut_all=True,HMM=True)forwinws:ifwinself.w2v.key_to_index:emb.append(self.w2v.get_vector(w,norm=True))count+=1tensor_x=np.array(emb).sum(axis=0)#纵轴相加ifcount>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)ifinput_is_string:all_embeddings=all_embeddings[0]returnall_embeddings文档分块固定大小分块按内容划分我们使用最简单的算法来对文档进行分句
defsplit_sentences(text):sent_delimiters=['。','?','!','','!','.']fordelimiterinsent_delimiters:text=text.replace(delimiter,'\n')sentences=text.split('\n')sentences=[sentforsentinsentencesifsent.strip()]returnsentences除此之外,还可以考虑使用以下库:pyltp(语言技术平台):pyltp是哈工大社会计算与信息检索研究中心研发的一款中文自然语言处理工具包,可以很好地处理中文文本。pkuseg:pkuseg是北京大学的一个分词工具,也有一定的分句能力。spaCy:spaCy是另一个用于NLP任务的强大Python库NLTK:自然语言工具包(NLTK)是一个流行的Python库,用于处理自然语言数据。
向量相似度的计算通常基于一种叫做余弦相似度(CosineSimilarity)的度量方法。余弦相似度直观地表示了两个向量间的夹角,其值越接近于1,表示两个向量越相似。
defcosine_similarity(vec1,vec2):norm_vec1=numpy.linalg.norm(vec1)norm_vec2=numpy.linalg.norm(vec2)ifnorm_vec1==0ornorm_vec2==0:return0else:dot_product=numpy.dot(vec1,vec2)returndot_product/(norm_vec1*norm_vec2)知识库检索现在万事俱备,让我们来简单跑通一下这个流程
将知识加入大模型上下文常用prompt模板:
Pinecone是一个专门为工程师与开发者设计的向量数据库。作为一个全托管的服务,它减轻了工程师以及运维人员的负担,使得客户可以聚焦于数据内在价值的抽取。
Weaviate是一个开源的向量数据库,可以存储对象、向量,支持将矢量搜索与结构化过滤与云原生数据库容错和可拓展性等能力相结合。支持GraphQL、REST和各种语言的客户端访问
面向下一代的生成式AI向量数据库,同时也具备云原生的特性。
一个开源的向量数据库。可以快速基于Python和JavaScript构建内存级LLM应用
构建在Milvus之上的数据基础设施。
如果我们想把知识库作为大模型的外接知识库,就需要借助向量数据库来存储之前被向量化的文档。我们选用Qdrant来部署(为了Rust!)
对于mac,需要使用mps后端。同时需要修改模型的路径,修改为