Advertisement

(17-4)检索增强生成(RAG):文本嵌入模型

阅读量:

5.4 文本嵌入模型

Text embedding models are a technique that converts text into numerical vectors, effectively capturing semantic information. By leveraging text embeddings, we can mathematically analyze and compare text data, which is highly significant in the fields of natural language processing (NLP) and machine learning.

5.4.1 文本嵌入模型介绍

这类模型专门用于将文字转化为数值形式,并在多个应用场景中得到广泛应用。它们不仅擅长提取关键词汇的意义和上下文关系,并且还能有效地降低大规模语料库的空间复杂度。在实际应用中发现,在这种技术的支持下进行数据建模往往能取得更好的分类效果。借助于这类技术我们能将这些信息映射到一个多维向量空间里其中每个维度都代表了不同语义特征或属性

文本嵌入模型的工作原理通常常见于深度学习技术。例如, 如词 embeding (Word Embedding)和句子 embeding (Sentence Embeding),这些词 embeding 模型 (如 Word2Vec 和 GloVe)将单个单词映射至连续的向量空间中;而这些句子级的 embeddings 则可将完整的句子或段落映射至向量空间中。其主要优势体现在以下几个方面。

  1. 降维:通过降维技术,文本嵌入能够将复杂的高维数据转换为简洁的向量表示形式。
  2. 语义捕捉:嵌入模型能够精准提取文本的核心语义信息,并使具有相似主题的文本在向量空间中的位置更加接近。
  3. 泛化能力:经过预训练后的新模型具备出色的学习能力,在面对未知词汇或短语时依然能够高效处理。

文本嵌入模型的应用非常广泛,主要包括如下所示的领域。

  1. 基于意义检索(Semantic Search)是一种通过评估不同文本片段与查询内容之间语义相似度来进行信息匹配的技术方法。
  2. 文本分类(Text Classification)是利用预训练的词向量作为特征输入到分类器中,在处理情感分析、主题建模等多个应用场景时展现出良好的适用性。
  3. 在机器翻译任务中(Machine Translation),通过建立跨语言语义关联机制可以使模型不仅理解单个语言内部的信息表达形式更能有效捕捉源语言与目标语言之间的深层语义联系。
  4. 在问答系统(Question Answering System)中(QA),利用预训练语言模型能够帮助系统深入解析用户的提问意图并从知识库中提取高度相关的回答候选项以提高回答质量。
  5. 推荐系统(Recommendation System)中的协同过滤技术主要基于用户的互动数据构建隐式表示空间并通过计算不同用户之间的相似性来实现个性化内容推荐功能。

在目前应用中,常见的文本嵌入模型如下所示。

  1. Word2Vec是由Google在该框架下负责开发的经典词嵌入模型,在其设计中将每个单词会被编码为固定长度的向量。
  2. GloVe(Global Vectors for Word Representation)作为一种基于深度学习的方法,在其发布时首次整合了全局语义统计信息与局部语境特征。
  3. BERT(Bidirectional Encoder Representations from Transformers)是Google AI实验室开发的一种预训练语言表示模型,在其设计中采用Transformer架构以捕捉文本中的双向语义关系。
  4. GPT(Generative Pre-trained Transformer)是OpenAI公司推出的一款先进的生成式Transformer语言模型,在其基础架构上实现了单方向的信息传播机制,并支持多种 downstream应用任务。

5.4.2 类Embeddings

在LangChain框架内,类Embeddings类主要负责将文本内容转化为数值向量表示。这些向量能够有效提取和反映文本的语义信息特征。该类的核心功能便是为各类文本嵌入模型提供统一且一致的接口支持。通过该接口设计,在实际应用中可以方便地与其他不同的文本嵌入模型提供商进行交互与集成。无论开发者选择采用哪一种特定类型的文本嵌入模型,在系统内部都能通过相同的API接口和操作方法进行交互与处理。

在类Embeddings中包括了这两个成员方法embed_documents和embed_query,并对它们的具体功能及实现细节进行了详细描述。

  1. embed_documents:该方法接收一个多文本列表作为输入,并生成一组对应的向量列表。具体来说, 每个生成的向量反映了其对应原始文本在特征空间中的位置或意义, 从而便于后续的信息提取与分析工作。
  2. embed_query:该方法接收单一的一个文本字符串作为输入, 并输出一个数值型的低维表示(通常是高维空间中的点), 它能够捕捉到查询内容的关键特征, 从而为后续的检索与匹配操作提供基础依据。

例如下面是一个使用Embeddings和OpenAI实现文本嵌入的例子。

实例5-1****:使用Embeddings和OpenAI实现文本嵌入(源码路径:codes*5**qian01*.py********)****

实例文件qian01.py的具体实现代码如下所示。

复制代码
 from langchain_openai import OpenAIEmbeddings

    
  
    
 # 初始化OpenAI嵌入模型
    
 embeddings_model = OpenAIEmbeddings(api_key=os.getenv("OPENAI_API_KEY"))
    
  
    
 # 准备要嵌入的文本列表
    
 texts = [
    
     "Hello, how are you?",
    
     "I'm fine, thank you!",
    
     "Good morning!",
    
     "I'm looking for information about text embedding models."
    
 ]
    
  
    
 # 嵌入文本列表
    
 embedded_texts = embeddings_model.embed_documents(texts)
    
  
    
 # 打印嵌入向量的维度
    
 print("Embedded texts shape:", len(embedded_texts), embedded_texts[0].shape)
    
  
    
 # 假设我们要查询的文本是 "What is a text embedding model?"
    
 query = "What is a text embedding model?"
    
  
    
 # 嵌入查询文本
    
 embedded_query = embeddings_model.embed_query(query)
    
  
    
 # 打印查询嵌入向量的前5个元素
    
 print("Embedded query first 5 elements:", embedded_query[:5])
    
  
    
 # 计算查询文本与嵌入文本列表中每个文本的相似度
    
 similarities = []
    
 for text, embedding in zip(texts, embedded_texts):
    
     similarity = np.dot(embedding, embedded_query) / (np.linalg.norm(embedding) * np.linalg.norm(embedded_query))
    
     similarities.append(similarity)
    
  
    
 # 找出与查询文本最相似的文本
    
 most_similar_text = texts[np.argmax(similarities)]
    
 print(f"The most similar text to the query is: '{most_similar_text}'")

上述代码通过结合LangChain和OpenAI的技术来进行文本向量化表示以及相似度计算的过程

首先引入了类OpenAIEmbeddings库模块并基于环境变量获取API密钥完成了模型参数配置。
接着创建了一个名为texts的二维数组用于存储待嵌入的文字内容之后调用库函数 embed_documents 将其映射到高维向量空间完成初步表示过程。
随后创建了一个名为query的一维数组用于存储待搜索的关键字内容并通过函数 embed_query 将其转换为对应的向量表示完成目标表达阶段。
随后计算该转换结果与所有预处理过的字符串之间的点积值并归一化处理以评估各候选文字与其对应的关键字的相关性程度。
最后识别出与查询最相关的几个候选文档索引项并输出结果。

复制代码
 Embedded texts shape: 4 (number of texts) 1536 (dimension of each embedding)

    
 Embedded query first 5 elements: [0.123, -0.456, 0.789, -0.012, 1.023]
    
 The most similar text to the query is: 'I'm looking for information about text embedding models.'

在这个输出中可以看到:

In this example, we demonstrate the display of embedded texts, which includes both the count of embedded texts and their respective vector dimensions. Specifically, we have four texts with each containing a 1536-dimensional vector space.
The first five elements of the query embedding are shown in this section. These values are predetermined, while actual values will be generated by the specified model.
In our simulation setup, the most similar text to the query is displayed. Based on our assumptions, the text "I'm looking for information about text embedding models." was identified as being most similar to "What is a text embedding model?". However, Yes, actual results may vary based on similarity computation methods.

5.4.3 嵌入缓存

在LangChain系统中, 文本嵌入缓存机制(Embedding Caching)被定义为一种核心技术, 主要目标是提升处理大规模数据集的速度和性能水平。借助于文本嵌入缓存机制, 在运行过程中可反复调用已计算好的文本向量表示, 从而极大地减少了重复计算的工作量, 在面对海量相似或重复的数据内容时展现出显著的优势。该技术的作用体现在以下方面:

  1. 降低计算压力:文本嵌入通常需要消耗大量计算资源,尤其是当处理长文本或大型数据集时。通过优化缓存机制来存储已计算好的嵌入向量,在后续处理中可以直接调用而不需重复运算,从而显著减少对相同文本的重复计算。
  2. 提升响应效率:嵌入缓存能够使LangChain快速回应用户的查询请求。当需要检索或比较相关文本时,可以直接从缓存中调用预处理好的嵌入向量以满足需求。
  3. 优化内存管理:对于需要高效处理海量文本的应用场景来说,在线嵌入缓存是提升系统扩展性和性能的关键环节。它不仅有助于合理利用内存和存储资源,在线处理更多的数据。

该类在LangChain框架中实现了文本嵌入功能,并支持缓存机制。其主要目标是避免冗余计算,在提升效率的同时也保证了性能水平。以下将详细介绍该类的主要组件及其相关功能。

  1. underlying_embedder:该对象是一个成员变量,在CacheBackedEmbeddings内部表示基础嵌入模型。所有输入到CacheBackedEmbeddings的对象都会首先由该基础模型进行处理。
  2. document_embedding_cache:这是一个基于哈希表实现的缓存机制,用于以值形式存储文档的嵌入向量。
  3. namespace:此字段定义了一个字符串字段,在缓存中为不同嵌入模型提供命名区分。
  4. cache_misses:此计数器记录了未能在缓存中找到嵌入向量的情况。
  5. cache_hits:此计数器记录了成功检索到嵌入向量的情况。
  6. maxConcurrency:此可选参数设定同时发送至嵌入模型提供者的最大请求数量上限。
  7. embed_documents:此方法负责将文档列表传递给underlying_embedder进行计算,并将结果存储于document_embedding_cache中。
  8. embed_query:此方法专门用于单个查询文本的嵌入计算,并不依赖缓存机制。
  9. from_bytes_store:此静态方法通过现有ByteStore实例构造一个CacheBackedEmbeddings对象,并接受基础模型、缓存实例和命名空间参数作为输入。

CacheBackedEmbeddings基于这些成员与方法能够完成文本嵌入的高效缓存与检索,并从而使得大规模数据处理的性能得到显著提升。开发者能够使用该类来开发需要频繁进行文本嵌入以及相似性搜索的应用程序。例如下面是一个使用CacheBackedEmbeddings实现 embeding 储存的具体例子。

实例5-1****:使用CacheBackedEmbeddings实现嵌入缓存(源码路径:codes*5**qian02*.py********)****

实例文件qian02.py的具体实现代码如下所示。

复制代码
 # 导入所需的模块和类

    
 from langchain.embeddings import CacheBackedEmbeddings
    
 from langchain.storage import LocalFileStore
    
 from langchain_community.document_loaders import TextLoader
    
 from langchain_community.vectorstores import FAISS
    
 from langchain_openai import OpenAIEmbeddings
    
 from langchain_text_splitters import CharacterTextSplitter
    
  
    
 # 初始化嵌入器
    
 underlying_embeddings = OpenAIEmbeddings()
    
  
    
 # 初始化缓存存储器
    
 store = LocalFileStore("./cache/")
    
  
    
 # 创建缓存支持的嵌入器
    
 cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    
     underlying_embeddings, store, namespace=underlying_embeddings.model
    
 )
    
  
    
 # 加载文档并将其拆分成片段
    
 raw_documents = TextLoader("../../state_of_the_union.txt").load()
    
 text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
    
 documents = text_splitter.split_documents(raw_documents)
    
  
    
 # 创建向量存储
    
 db = FAISS.from_documents(documents, cached_embedder)
    
  
    
 # 输出缓存的键
    
 print(list(store.yield_keys()))

上述代码的实现流程如下所示:

导入名为state_of_the_union.txt的文本文件。
通过使用文本分隔器将内容划分为较小片段。
对每个文本片段进行向量化处理。
将每个文本片段的嵌入结果存储于缓存中。
最终生成一个缓存对象,其中包含了各片段的嵌入结果,并可据此执行诸如语义搜索、相似性匹配等任务。

未完待续

全部评论 (0)

还没有任何评论哟~