在上一篇文章中,我们介绍了大模型开发框架LangChain的文档分割,今天我们要介绍的是文档嵌入,专业术语是Embedding。 Embedding,这是一个有点抽象的概念, 我们可以这样理解,就是将文档转换为大模型可以学习的数据格式,这样大模型就可以 学习文档的内容,从而可以进行文档的分类、查询等操作。举个例子,比如我们想认识一个物体,不管是文档、图片、视频等等, 是不是剖析的角度越多,对物体认识越全面,不管是文档、图片、视频等等,经过embedding处理后,会被转换为一个多维向量, 也就是从多个维度来表示这个物体。这个过程,就是把一个我们看来是一维的东西,表示到(嵌入到)了一个多维空间里,让大模型 去学习它。

文本嵌入-embed_documents-文本列表的嵌入方法

因为openai在大陆是不能直接访问的,自己找机场虽然可以访问,但是如果使用openai的api,还需要国外的银行卡去充值, 所以这里我们找了一个国内不错的代理,这个网站开发人员全部是一线大厂,也是拿到的openai的官方授权,所以大家可以放心使用。 访问地址:https://referer.shadowai.xyz/r/1021378 网站已经稳定运营2年,算是头部了代码公司了。不用担心充值后跑路。网站比较简洁,注册后,充值,就会给你一个可以调用openai的api的key.

直接来看代码示例吧:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import os
#os.environ["OPENAI_API_KEY"] = "" //我的key已经设置为环境变量了,这里不需要再设置。
os.environ["OPENAI_API_BASE"] = "https://api.openai-proxy.org/v1" //因为我们不是直接用的opeanai的api所以这里需要设置一下api的代理地址.
#需要引入的模型
from langchain_openai import OpenAIEmbeddings
#设置我们需要用到的模型
embeddings_model = OpenAIEmbeddings(model="text-embedding-3-large")
#调用embed_documents方法,传入需要嵌入的文档
embeddings =embeddings_model.embed_documents(
    [
        "Hi there!",
        "Oh, hello!",
        "What's your name?",
        "My friends call me World",
        "Hello World!"
    ]
)
print(len(embeddings)), print(len(embeddings[0]))
##输入结果:
#  5 
#  3072

我们这个文本有5个句子,所以生成了5个向量,我们打印了第一个向量,有3072个维度。2个单词的句子,最终转换为3072维的向量,这就是embedding的魅力所在。

文本嵌入-embed_query-单个文本的嵌入

1
2
3
4
5
6
import os
os.environ["OPENAI_API_BASE"] = "https://api.openai-proxy.org/v1"
from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings(model="text-embedding-3-large")
embedded_query = embeddings_model.embed_query("What was the name mentioned in the conversation?")
print(embedded_query[:5])

我们可以把embed_query看成是embed_document的单条特殊情况。之所以会有这样的2种方法,是因为一些嵌入提供商针对文档(待搜索的内容) 和查询(搜索查询本身)提供不同的嵌入方法。 另外Embeddings类还有对应的异步方法aembed_documents和aembed_query。

当然,langchain已经支持的嵌入模型还有好多种,具体可以看一下langchain的文档, https://python.langchain.com.cn/docs/modules/data_connection/text_embedding/integrations/aleph_alpha