掘金 人工智能 11小时前
LangChain框架入门12:深入解析文本嵌入组件
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了LangChain中用于实现RAG(检索增强生成)功能的核心组件——文本嵌入(Embeddings)的用法。文章详细介绍了文本嵌入模型的概念,即如何将文本转换为具有语义含义的高维向量,并阐述了LangChain中Embeddings类的标准接口及其核心方法`embed_documents`和`embed_query`。通过OpenAIEmbeddings的实际代码示例,展示了文本向量化的具体过程。此外,文章还重点介绍了`CacheBackedEmbeddings`类,通过本地缓存机制,有效解决了重复调用嵌入模型带来的效率低下和成本增加问题,显著提升了文本嵌入的整体性能,为后续的向量数据库应用奠定了基础。

💡 **文本嵌入模型将文本转化为语义向量:** 文本嵌入模型的核心是将任意文本片段转换成一组数字(向量),这些向量在高维空间中能够捕捉文本的语义信息。这一过程使得计算机能够理解和处理文本的含义,为后续的相似性搜索奠定基础。LangChain的Embeddings类提供了一个标准化的接口来调用不同的文本嵌入模型。

🚀 **Embeddings类及其核心方法:** LangChain的Embeddings类是处理文本嵌入的标准接口,它提供了`embed_documents`用于批量处理文本片段生成向量,以及`embed_query`用于将用户查询文本转换为向量。这两种方法的设计考虑了不同模型提供商在处理文档和查询时的差异化需求。

💻 **OpenAIEmbeddings的实践应用:** 文章以OpenAI提供的OpenAIEmbeddings类为例,详细演示了如何安装依赖、配置API密钥,并使用`embed_documents`和`embed_query`方法将示例文本和查询转换为高维向量。代码示例清晰展示了模型选择(如`text-embedding-3-small`)、向量维度和最大token数等关键参数。

⚡ **CacheBackedEmbeddings提升效率与降低成本:** 为了优化性能,LangChain引入了`CacheBackedEmbeddings`。它允许将文本嵌入的结果缓存到本地(如使用`LocalFileStore`),当再次处理相同文本时,直接从缓存读取,避免了重复调用昂贵的嵌入模型,从而大幅缩短处理时间并降低成本。这一机制对于处理大量数据尤为重要。

📁 **缓存配置与效果展示:** 示例展示了如何通过`CacheBackedEmbeddings.from_bytes_store`方法配置缓存,包括指定底层嵌入器、文档和查询的字节存储(如本地文件目录)以及命名空间。首次执行会耗费较长时间,但后续执行速度极快,验证了缓存机制的有效性。

在前面两篇文章中,我们分别介绍了“文档加载”和“文本分割”。此时,知识库中的长文档已被拆分为一个个固定长度的文本片段。完成这两步后,实现 RAG 功能的下一步就是对这些文本片段进行向量化。

在文本向量化时,可以使用LangChain提供的文本嵌入组件:Embeddings,这也是本文的主角,本文将会详细介绍Embeddings组件的用法。

文中所有示例代码:github.com/wzycoding/l…

一、什么是文本嵌入模型

文本嵌入模型可以将一段文本转换为高维向量表示,向量可以理解为是一组数字,文本嵌入模型根据多个不同维度将文本转换为具有语义含义的向量数据,这个转换过程叫做文本嵌入

之后,将这些向量存储到向量数据库中。当用户向LLM提出问题,先将问题文本进行向量化,得到问题文本的向量,使用这个向量在向量数据库中进行相似性搜索,就可以找到与提问文本语义最相近向量,进而找到文本片段信息。

文本嵌入流程如下图所示:

二、Embeddings类用法

2.1 Embeddings类介绍

在LangChain中,Embeddings类是为文本嵌入模型设计的标准接口,针对不同的文本嵌入模型供应商(如OpenAI、Hugging Face、通义千问等)提供不同的实现类。

Embeddings类提供了两个方法:

embed_documents:传入多个文本片段,将文本片段转换为多个向量返回

embed_query:传入查询文本,将查询文本转换为向量返回

将文本转换为向量被拆分为两个方法,是因为某些模型提供商对“文档嵌入”和“查询文本嵌入”提供了不同的方法。

2.2 OpenAIEmbeddings用法

下面以OpenAI提供的OpenAIEmbeddings类为例,介绍Embeddings类用法。

首先安装langchain-openai相关依赖

pip install langchain-openai==0.1.8

执行命令,生成依赖版本快照

pip freeze > requirements.txt

在.env文件中,添加OpenAI秘钥配置

# OpenAI大模型OPENAI_API_KEY=sk-************************OPENAI_API_BASE=https://api.***

OpenAIEmbeddings使用示例如下,使用embed_documentsembed_query分别对文档和查询文本进行嵌入,其中使用的模型是text-embedding-3-small,该模型生成的向量维度是1536,能接收最大的token数是8192。

import dotenvfrom langchain_openai import OpenAIEmbeddingsdotenv.load_dotenv()texts = [    "北宋著名文学家、书法家、画家,历史治水名人。与父苏洵、弟苏辙三人并称“三苏”。苏轼是北宋中期文坛领袖,在诗、词、散文、书、画等方面取得很高成就。",    "苏轼,(1037年1月8日-1101年8月24日)字子瞻、和仲,号铁冠道人、东坡居士,世称苏东坡、苏仙,汉族,眉州眉山(四川省眉山市)人",    "与辛弃疾同是豪放派代表,并称“苏辛”;散文著述宏富,豪放自如,与欧阳修并称“欧苏”,为“唐宋八大家”之一。苏轼善书,“宋四家”之一;擅长文人画,尤擅墨竹、怪石、枯木等。与韩愈、柳宗元和欧阳修合称“千古文章四大家”。",]# 1.创建embeddings对象embeddings = OpenAIEmbeddings(model="text-embedding-3-small")# 2.将文本转换为向量vectors = embeddings.embed_documents(texts)# 3.输出文档向量print("文档向量:")for vector in vectors:    print(f"{vector}")print("=================================")# 4.将查询转换为向量query = "谁是苏东坡?"query_vector = embeddings.embed_query(query)# 5.输出查询文本向量print("查询文本向量:")print(query_vector)

执行结果如下,可以看到三个文档分别生成了三个高维向量,查询文本也生成了一个对应的向量。由于向量维度较高,输出进行了部分省略。

文档向量:[0.058245643973350525, -0.011029906570911407, 0.008078922517597675, -0.006782424636185169,省略...][-0.011653225868940353, -0.002974639181047678, -0.01643718034029007, 0.06390874087810516,省略...][0.028559477999806404, -0.015319629572331905, -0.010216659866273403, 0.014526311308145523,省略...]=================================查询文本向量:[-0.015014365315437317, -0.044838666915893555, -0.030710170045495033, 0.034821517765522, 省略...]

三、CacheBackedEmbeddings结果缓存

当使用Embeddings类对一段文本进行嵌入后,再有同样的文本进行嵌入,如果每次都重新调用嵌入模型,不仅会显著增加处理时间,也会带来额外的调用成本。

因此,LangChain提供了CacheBackedEmbeddings可以对嵌入结果进行缓存,下次同样的文本进行嵌入,直接从缓存中读取,无需重复调用嵌入模型。

创建CacheBackedEmbeddings对象,需要通过from_bytes_store方法,该方法需要指定如下参数:

from_bytes_store方法定义如下:

@classmethoddef from_bytes_store(    cls,    underlying_embeddings: Embeddings,    document_embedding_cache: ByteStore,    *,    namespace: str = "",    batch_size: Optional[int] = None,    query_embedding_cache: Union[bool, ByteStore] = False,) -> CacheBackedEmbeddings:

CacheBackedEmbeddings使用示例如下,在示例中,使用了OpenAIEmbeddings来作为真正进行文本嵌入的组件,并且,为文档向量缓存和查询文档向量缓存指定了两个不同的本地文件存储容器,还指定了命名空间为嵌入模型的名称。

import timeimport dotenvfrom langchain.embeddings import CacheBackedEmbeddingsfrom langchain.storage import LocalFileStorefrom langchain_openai import OpenAIEmbeddingsdotenv.load_dotenv()# 1.创建进行文本嵌入的embeddings对象underlying_embeddings = OpenAIEmbeddings(model="text-embedding-3-small")# 2.创建CacheBackedEmbeddings对象cache_embeddings = CacheBackedEmbeddings.from_bytes_store(underlying_embeddings=underlying_embeddings,                                                          document_embedding_cache=LocalFileStore("./document_cache/"),                                                          namespace=underlying_embeddings.model,                                                          query_embedding_cache=LocalFileStore("./query_cache/"))texts = [    "北宋著名文学家、书法家、画家,历史治水名人。与父苏洵、弟苏辙三人并称“三苏”。苏轼是北宋中期文坛领袖,在诗、词、散文、书、画等方面取得很高成就。",    "苏轼,(1037年1月8日-1101年8月24日)字子瞻、和仲,号铁冠道人、东坡居士,世称苏东坡、苏仙,汉族,眉州眉山(四川省眉山市)人",    "与辛弃疾同是豪放派代表,并称“苏辛”;散文著述宏富,豪放自如,与欧阳修并称“欧苏”,为“唐宋八大家”之一。苏轼善书,“宋四家”之一;擅长文人画,尤擅墨竹、怪石、枯木等。与韩愈、柳宗元和欧阳修合称“千古文章四大家”。",]# 3.将文本转换为向量start_time = time.time()vectors = cache_embeddings.embed_documents(texts)print(f"文档嵌入执行时间:{time.time() - start_time:.4f} 秒")# 5.将查询转换为向量start_time = time.time()query = "谁是苏东坡?"query_vector = cache_embeddings.embed_query(query)# 6.输出查询文本向量print(f"查询文本嵌入执行时间:{time.time() - start_time:.4f} 秒")

第一次执行结果,整个文本嵌入执行时间比较长

文档嵌入执行时间:52.9221 秒查询文本嵌入执行时间:13.4554

在当前文件目录就会生成两个缓存文件夹,分别用来缓存文档和查询文本向量信息,并且命名空间使用的是模型名称

第二次执行程序,程序很快的返回结果,并且计算的执行时间也是非常的快,因为整个嵌入过程没有调用嵌入模型,而是读取了缓存中的数据。

文档嵌入执行时间:0.0036 秒查询文本嵌入执行时间:0.0012

四、总结

本文详细介绍了实现RAG功能的重要组件:文本嵌入组件,讲解了LangChain中的Embeddings类的使用方法,以及Embeddings类的核心方法,以OpenAI提供的 OpenAIEmbeddings 类为例,演示如何进行文本嵌入。

为了能提升文本嵌入执行效率、节省成本,LangChain还提供了CacheBackedEmbeddings类,通过在本地对文本嵌入信息缓存,当同样的文本再进行文本嵌入时,就可以从本地缓存中进行读取,有效提升了文本嵌入的整体性能。

相信通过本文,你已经掌握了如何使用Embeddings类进行文本嵌入,在下一篇文章中,我们将介绍向量数据库相关用法,敬请期待。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain Embeddings 文本向量化 RAG 缓存
相关文章