0


【AI大模型】Embedding模型解析 文本向量知识库的构建和相似度检索

🚀 作者 :“大数据小禅”

🚀 文章简介 :本专栏后续将持续更新大模型相关文章,从开发到微调到应用,需要下载好的模型包可私。

🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬


目录导航

1 什么是Embedding

  • 在大模型中,"embedding"指的是将某种类型的输入数据(如文本、图像、声音等)转换成一个稠密的数值向量的过程。
  • 这些向量通常包含较多维度,每一个维度代表输入数据的某种抽象特征或属性。
  • Embedding 的目的是将实际的输入转化为一种格式,使得计算机能够更有效地处理和学习在这里插入图片描述
  • 文本Embedding 在自然语言处理(NLP)中,文本embedding是一个常见的概念。是将文字或短语转换成数值向量的过程。这些向量捕捉了单词的语义特征,例如意义、上下文关系等。比如,使用词嵌入技术(如Word2Vec、GloVe或BERT),模型可以将具有相似意义的词映射到向量空间中的相近位置。**- 图像Embedding** 对于图像,embedding过程通常涉及使用卷积神经网络(CNN)等模型来提取图像中的特征,并将这些特征转换为一个高维向量。这样的向量可以代表图像的内容、风格、色彩等信息,从而用于图像识别、分类或检索任务。**- 声音Embedding** 在声音处理领域,embedding通常指的是将音频信号转换为一个表示其特征的向量,这包括音调、节奏、音色等。通过这样的转换,可以进行声音识别、音乐生成等任务。
2 为什么使用Embedding
  • Embedding的主要优势是能够将实体转换为计算机易于处理的数值形式,同时减少信息的维度和复杂度。
  • 有助于提高处理效率,而且也使得不同实体之间的比较(如计算相似度)变得可行。
  • embedding通常通过大量数据的训练而得到,能够捕捉到复杂的模式和深层次的关系,这是传统方法难以实现的
3 数据向量化的处理流程

1. 收集
这一步骤是数据收集阶段,涉及到从不同的来源(如数据库、网站、文档等)收集需要分析的文本数据。这些数据可以是文章、评论、报告等形式。重点是确定数据源,并确保数据的相关性和质量。

2. 切块
对于大型文档,直接处理可能会因为模型的输入限制(如Token数量限制)而变得不可行。在这种情况下,需要将大文档分割成更小的部分。这些部分应该尽可能保持语义的完整性,例如按段落或章节切分。切块的目的是确保每块文本的大小适合模型处理,同时尽量减少上下文信息的丢失。

3. 嵌入
在切块后,每个文本块将被转换为数值向量,即通过OpenAI的embedding API进行嵌入。这一步涉及调用API,将文本数据发送到OpenAI的服务器,服务器会返回文本的向量表示。这些向量捕捉了文本的深层语义特征,使得文本之间的比较、搜索和分析变得可能。

4. 结果存储
嵌入向量生成后,需要将它们存储起来以便于后续的检索和分析。对于大型数据集,推荐使用专门的向量数据库(如Faiss、Annoy、Elasticsearch等),这些数据库优化了向量的存储和相似性搜索操作。存储不仅要保证数据的可检索性,也要考虑查询效率和存储成本

4 Embedding实战
  • 演示是通过OPENAI的embedding进行,根据最新的api测试
  • 在这里插入图片描述
  • 测试代码如下
response = openai.embeddings.create(input="abc s da d asd a da d ",
    model="text-embedding-ada-002"# 选择一个合适的模型,如ada)print("测试数据:",response.data[0].embedding)
  • 文本转化向量在这里插入图片描述- 如何计算两个向量的相似度? 余弦相似度是一种用来衡量两个向量方向上的相似性的方法。在文本分析中,它常用于比较两段文本的语义相似性。当我们使用向量化模型(如OpenAI的text-embedding-ada-002模型)将文本转化为向量后,每个向量的维度表示某种语义特征,向量中的值反映了相应特征的强度。

余弦相似度的计算公式为:
在这里插入图片描述
其中,

      v 
     
    
      e 
     
    
      c 
     
    
      1 
     
    
   
     ⋅ 
    
    
    
      v 
     
    
      e 
     
    
      c 
     
    
      2 
     
    
   
  
    \mathbf{vec1} \cdot \mathbf{vec2} 
   
  
vec1⋅vec2 表示两个向量的点积, 
 
  
   
   
     ∣ 
    
    
    
      v 
     
    
      e 
     
    
      c 
     
    
      1 
     
    
   
     ∣ 
    
   
  
    |\mathbf{vec1}| 
   
  
∣vec1∣ 和  
 
  
   
   
     ∣ 
    
    
    
      v 
     
    
      e 
     
    
      c 
     
    
      2 
     
    
   
     ∣ 
    
   
  
    |\mathbf{vec2}| 
   
  
∣vec2∣ 分别是这两个向量的欧几里得范数(即向量的长度)。

这个比例的本质是测量两个向量之间夹角的余弦值,范围从-1到1:
当余弦值为1时,表示两个向量方向完全相同。
当余弦值为0时,表示两个向量正交,即在高维空间中不相关。
当余弦值为-1时,表示两个向量方向完全相反。
在文本相似度测量中,如果两个文本的向量化表示在方向上更接近,它们的余弦相似度就更高,这意味着它们在语义上更相似。因此,通过计算向量之间的余弦相似度,我们可以有效地评估两段文本的相似性。这种方法适用于处理高维空间中的数据,如自然语言处理中的文本数据。

  • 整体实战代码 文本检索匹配
import time
from typing import List
import os
import pandas as pd
# 导入 tiktoken 库。Tiktoken 是 OpenAI 开发的一个库,用于从模型生成的文本中计算 token 数量。import tiktoken
from openai import OpenAI
import numpy as np
os.environ['OPENAI_API_KEY']='sk-api-0REliWJkobjeqQlObLN0T3BlbkFJ0j4bHtDhEEQGEAboNYah'

openai = OpenAI()defembed_text(text):""" 使用OpenAI API将文本向量化 """
    response =openai.embeddings.create(input=text,
        model="text-embedding-ada-002"# 选择一个合适的模型,如ada)return response.data[0].embedding

defcosine_similarity(vec1, vec2):""" 计算两个向量之间的余弦相似度 """return np.dot(vec1, vec2)/(np.linalg.norm(vec1)* np.linalg.norm(vec2))deffind_top_similar_texts(input_text, text_list, top_n=3):""" 找出与输入文本最相似的top_n个文本 """
    input_vec = embed_text(input_text)
    similarities =[]for text in text_list:
        text_vec = embed_text(text)
        similarity = cosine_similarity(input_vec, text_vec)
        similarities.append((text, similarity))# 按相似度排序并返回最高的top_n个结果
    similarities.sort(key=lambda x: x[1], reverse=True)return similarities[:top_n]# 示例文本库
text_corpus =["The quick brown fox jumps over the lazy dog.","A fast brown fox leaps over a sleepy dog.","Exploring the mountains of the moon.","Data science involves the analysis of large amounts of data.","The capital of France is Paris.","Programming in Python is fun and versatile."]# 输入文本
input_text ="Python is"# 执行查找
top_similar_texts = find_top_similar_texts(input_text, text_corpus)# 打印结果for text, similarity in top_similar_texts:print(f"Text: {text}\nSimilarity: {similarity:.2f}\n")## # 示例文本# text1 = "The quick brown fox jumps over the lazy dog."# text2 = "A fast brown fox leaps over a sleepy dog."# text3 = "Exploring the mountains of the moon."## # 向量化文本# vec1 = embed_text(text1)# vec2 = embed_text(text2)# vec3 = embed_text(text3)## # 计算相似度# similarity12 = cosine_similarity(vec1, vec2)# similarity13 = cosine_similarity(vec1, vec3)## print(f"Similarity between text 1 and text 2: {similarity12:.2f}")# print(f"Similarity between text 1 and text 3: {similarity13:.2f}")

response = openai.embeddings.create(input="abc s da d asd a da d ",
    model="text-embedding-ada-002"# 选择一个合适的模型,如ada)print("测试数据:",response.data[0].embedding)
  • 结果在这里插入图片描述
  • 最终检索到匹配度前三的文本向量 后续会使用到向量数据库 完成知识库的搭建
  • 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 有问题可以咨询主页


本文转载自: https://blog.csdn.net/weixin_45574790/article/details/139142207
版权归原作者 大数据小禅 所有, 如有侵权,请联系我们删除。

“【AI大模型】Embedding模型解析 文本向量知识库的构建和相似度检索”的评论:

还没有评论