【RAG入门教程02】Langchian的Embedding介绍与使用

2024-06-10 02:44

本文主要是介绍【RAG入门教程02】Langchian的Embedding介绍与使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Embedding介绍

词向量是 NLP 中的一种表示形式,其中词汇表中的单词或短语被映射到实数向量。它们用于捕获高维空间中单词之间的语义和句法相似性。

在词嵌入的背景下,我们可以将单词表示为高维空间中的向量,其中每个维度对应一个特定的特征,例如“生物”、“猫科动物”、“人类”、“性别”等。每个单词在每个维度上都分配有一个数值,通常在 -1 到 1 之间,表示该词与该特征的关联程度。


例如,“猫”这个词在“猫科动物”维度上可能具有较高的正值,而在“人类”维度上具有接近于零的值,这反映了它与猫科动物的紧密关联性,而与人类的关联性较低。


这种数值表示使我们能够捕捉单词之间的语义关系并对其执行数学运算,例如计算单词之间的相似度或将其用作 NLP 任务中 ML 模型的输入。

LangChain 可容纳来自不同来源的多种嵌入。

OpenAI

import os
os.environ["OPENAI_API_KEY"] = "your-key"from langchain_openai import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()text = "Text"text_embedding = embeddings.embed_query(text)print(text_embedding)"""
[-0.0006077770551231004,-0.02036312831034526,0.0015661947077772864,-0.0008398058726938265,0.00801365303172794,0.01648443640533639,-0.015071485112588635,-0.006794635682304868,-0.009232670381151012,-0.004512441507728793,0.00296615975583046,0.02781575545470095,-0.004290802116650396,0.009204965399058554,-0.007286398183123463,0.01896402857732122,0.03457576177203527,0.01469746878566298,0.03812199202928964,-0.033024282774857694,-0.014143370075136358,-0.0016640276929606461,-0.00023289462736494386,-0.009856030615586264,-0.018867061139997622,
...-0.0007159994667987885,-0.024920590413974295,0.009017956769934473,0.005336663327995613,...]
"""print(len(text_embedding))"""
1536
"""

HuggingFace

from langchain_community.embeddings import HuggingFaceEmbeddings
embedding_path = r'H:\pretrained_models\bert\english\paraphrase-multilingual-mpnet-base-v2'embeddings = HuggingFaceEmbeddings(model_name=embedding_path)text = "This is a test document."text_embedding = embeddings.embed_query(text)print(len(text_embedding)) # 768

Google

from langchain_google_genai import GoogleGenerativeAIEmbeddings
os.environ["GOOGLE_API_KEY"] = "your-key"embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
text_embedding = embeddings.embed_query("hello, world!")print(text_embedding) # 768

更多Embedding可以查看https://python.langchain.com/v0.2/docs/integrations/text_embedding/

计算相似性

我们可以使用嵌入来计算文本的相似度。

word_list = ["Cat", "Dog", "Car""Truck","Computer","Laptop","Apple","Orange", "Music","Dance"]embedding_model = OpenAIEmbeddings()embeds = [embedding_model.embed_query(word) for word in word_list]embeds
"""
[[-0.008174207879591734,-0.007511803310590743,-0.00995655437174355,-0.024788951157780095,-0.012790553094547429,0.006654775143594856,-0.0015151649503578363,-0.03783217392596492,-0.014422662356334227,-0.026250339680779597,0.017154227704543168,0.046327340706031526,0.0035646922858117093,0.004240754467349556,-0.032287098019987186,-0.004592443287070655,0.03955306057962428,0.005261676778755394,0.00789422251521935,-0.015501631209043845,-0.023723641081760536,0.0053197228543978925,0.014873371253461594,-0.012141805905252653,-0.006781109980413554,
...0.00566348496318421,0.01855802589283819,0.00531267762533671,0.02393075147421956,...]]
"""

我们引入另一个单词并计算相似度。

input_word = "Lion"input_embed = embedding_model.embed_query(input_word)
import numpy as npdef cosine_similarity(a, b):return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))similarity = cosine_similarity(embeds[0], input_embed)print(similarity) #0.8400893968591456
from sklearn.metrics.pairwise import cosine_similaritysimilarity = cosine_similarity(np.array([embeds[0]]), np.array([input_embed]))print(similarity) #array([[0.8400894]])
sims = [cosine_similarity(np.array([emb]), np.array([input_embed])) for emb in embeds]"""
[array([[0.8400894]]),array([[0.80272758]]),array([[0.79536215]]),array([[0.81627175]]),array([[0.82762581]]),array([[0.81705796]]),array([[0.82609729]]),array([[0.78917449]]),array([[0.79970112]])]
"""

考虑文本存储在 CSV 文件中,我们计划将其用作评估输入相似性的参考。

from langchain.document_loaders.csv_loader import CSVLoaderloader = CSVLoader(file_path='data.csv', csv_args={'delimiter': ',','quotechar': '"','fieldnames': ['Words']
})data = loader.load()
data"""
[Document(page_content='Words: Words', metadata={'source': 'data.csv', 'row': 0}),Document(page_content='Words: Cat', metadata={'source': 'data.csv', 'row': 1}),Document(page_content='Words: Dog', metadata={'source': 'data.csv', 'row': 2}),Document(page_content='Words: CarTruck', metadata={'source': 'data.csv', 'row': 3}),Document(page_content='Words: Computer', metadata={'source': 'data.csv', 'row': 4}),Document(page_content='Words: Laptop', metadata={'source': 'data.csv', 'row': 5}),Document(page_content='Words: Apple', metadata={'source': 'data.csv', 'row': 6}),Document(page_content='Words: Orange', metadata={'source': 'data.csv', 'row': 7}),Document(page_content='Words: Music', metadata={'source': 'data.csv', 'row': 8}),Document(page_content='Words: Dance', metadata={'source': 'data.csv', 'row': 9})]
"""

CSVLoader 类用于从 CSV 文件加载数据。我们将在系列后面介绍装载机。 我们可以利用FAISS结合LangChain来创建一个向量存储。

embeddings = OpenAIEmbeddings()from langchain_community.vectorstores import FAISSdb = FAISS.from_documents(data, embeddings)
user_input = "Lion"results = db.similarity_search(user_input)results"""
[Document(page_content='Words: Cat', metadata={'source': 'data.csv', 'row': 1}),Document(page_content='Words: Apple', metadata={'source': 'data.csv', 'row': 6}),Document(page_content='Words: Dog', metadata={'source': 'data.csv', 'row': 2}),Document(page_content='Words: Orange', metadata={'source': 'data.csv', 'row': 7})]
"""

这篇关于【RAG入门教程02】Langchian的Embedding介绍与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047012

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他