《Learning Langchain》阅读笔记7-RAG(3)生成embeddings
在前面的部分中,我们已经学习了如何将文档读取为文本以及如何将文本切分为chunks,这一节我们来讲讲如何生成文本嵌入embeddings。
Generating Text Embeddings:生成文本嵌入
LangChain 还提供了一个名为 Embeddings 的类,用于与文本嵌入模型进行交互 —— 包括 OpenAI、Cohere 和 Hugging Face —— 并生成文本的向量表示。
该类提供了两个方法:一个用于对文档进行嵌入,另一个用于对查询进行嵌入。
前者接收一个文本字符串列表作为输入,而后者接收的是单个文本字符串。
下面是一个使用 OpenAI embedding模型嵌入文档的例子:
from langchain_openai import OpenAIEmbeddingsmodel = OpenAIEmbeddings()embeddings = model.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"
])
OpenAIError: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable
,看到报错了,但我们丝毫不要慌张,这种情况一般是——钱的问题!
可是我们可以考虑用免费的embedding模型继续快乐白嫖!
和用Gemini替代chatgpt一样,这里我们可以考虑使用免费的HuggingFaceEmbeddings模型!
下方是官网文档:
HuggingFaceEmbeddings模型
官网给的调用方式:
from langchain_huggingface import HuggingFaceEmbeddingsmodel_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}
hf = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)
我们改写一下:
注意这里我们要安装两个包:
- langchain_huggingface
- sentence_transformers
然后继续我们的快乐白嫖!!
from langchain_huggingface import HuggingFaceEmbeddingsmodel_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)embeddings = model.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"
])print(embeddings)
经过了九九八十一分钟,这段代码才生成embeddings,可能是model_kwargs = {'device': 'cpu'}
这一行的问题。
于是我想起来这个新建的环境没有配置pytorch CUDA环境…
import torch
print(torch.cuda.is_available()) # True 表示你可以用 GPU
False
犯了一个很大的错误,如果要pytorch环境需要先安装pytorch再安装langchain(因为包之间冲突),配置了一晚上。
import torch
print(torch.cuda.is_available()) # ➤ True 表示成功!
print(torch.cuda.get_device_name(0)) # ➤ 应该显示 RTX 4060
True
NVIDIA GeForce RTX 4060 Laptop GPU
安装成功之后,我们来切换为gpu模式生成embeddings
from langchain_huggingface import HuggingFaceEmbeddingsmodel_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': False}model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)embeddings = model.embed_documents(["Hi there!","Oh, hello!","What's your name?","My friends call me World","Hello World!"
])print(embeddings)
时间有了飞速提升!芜湖!
print(len(embeddings))
5
我们传入的是一个 包含 5 个句子的列表,所以 model.embed_documents() 会对每个句子分别生成一个嵌入向量(embedding),最终返回的是一个长度为 5 的列表。
现在我们来将流程串起来:
-
Document loaders:将任何文档转换为纯文本
-
Text splitters:将每个大文档分割成许多较小的文档
-
Embeddings models:生成embeddings
以下是代码:
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings## Load the document
loader = TextLoader("./test.txt", encoding="utf-8")
doc = loader.load()## Split the documenttext_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=20,
)
chunks = text_splitter.split_documents(doc)## Generate embeddingsmodel_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': False}model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)embeddings = model.embed_documents([chunk.page_content for chunk in chunks]
)print(embeddings)
8
可以看到8个chunk生成了8个不同的embeddings
我们让文档生成嵌入embeddings,下一步是将它们存储在称为 vector store 向量存储库的特殊数据库中。
下一节我们将来讲讲如何在向量存储库中存储嵌入。