当前位置: 首页 > java >正文

《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 向量存储库的特殊数据库中。

下一节我们将来讲讲如何在向量存储库中存储嵌入。

http://www.xdnf.cn/news/1634.html

相关文章:

  • react 子组件暴露,父组件接收
  • Qt 入门 6 之布局管理
  • TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!
  • 架构-项目管理
  • 半导体---检测和量测
  • Shader 空间变换(七)
  • 深度学习3.7 softmax回归的简洁实现
  • Java面试:从Spring Boot到微服务的全面考核
  • sysstat介绍以及交叉编译
  • 【Redis】 Redis中常见的数据类型(二)
  • 如何解决PyQt从主窗口打开新窗口时出现闪退的问题
  • 逐步了解蓝牙 LE 配对(物联网网络安全)
  • 2024ICPC网络赛第一场题解
  • vue2如何二次封装表单控件如input, select等
  • Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
  • Diffusion inversion后的latent code与标准的高斯随机噪音不一样
  • 手机访问电脑端Nginx服务器配置方式
  • 新规!专利优先审查,每个申请主体每月推荐不超过2件。
  • 配置 C/C++ 语言智能感知(IntelliSense)的 c_cpp_properties.json 文件内容
  • 【k8s】KubeProxy 的三种工作模式——Userspace、iptables 、 IPVS
  • Maxscale实现Mysql的读写分离
  • 第七届能源系统与电气电力国际学术会议(ICESEP 2025)
  • 力扣热题100题解(c++)—矩阵
  • 碰一碰发视频源码文案功能,支持OEM
  • 扩散模型(Diffusion Model)详解:原理、发展与应用
  • VS Code扩张安装目录
  • CSS element-ui Icon Unicode 编码引用
  • websocket
  • 什么是 YAML:技术特性、应用场景与实践指南
  • 深入探索Spark-Streaming:从Kafka数据源创建DStream