3 种方式实现文本 embedding

什么是 embedding

embedding 其实就是一种稠密向量的表示形式。在 embedding 大行其道之前 onehot 才是最靓的仔。如果和我们比较熟悉的 oneHot 对比起来理解,顿时会发现 embedding 这个玄里玄乎的概念,实际上 so easy。

直观上看 embedding 相当于是对 oneHot 做了平滑,而 oneHot 相当于是对 embedding 做了 max pooling。

对于我们输入大模型的 promt,首先会被拆分成独立的 token,然后每一个 token会通过查询一个一一映射的表格得到对应的 embedding,每个 embedding 是一个高维的向量,比如 OpenAI 的text-embedding-ada-002 模型生成的就是 1536 维的向量,不同模型生成 embedding 的方式和维度都不相同,但是每个 embedding 向量都包含了对应 token 的语法和语义的特征。

如何实现embedding

使用 OpenAI 原生 SDK,参考链接

from openai import OpenAI
import os

api_key=os.environ.get("OPENAI_API_KEY")
client = OpenAI(
    # This is the default and can be omitted
    # api_key=os.environ.get("OPENAI_API_KEY"),
   api_key= api_key,
   base_url = "https://burn.hair/v1" # 换成代理,一定要加v1
)

input = "This is a test document."
query_result = client.embeddings.create(model="text-embedding-ada-002", input=input)

print(query_result.data[0].embedding)

使用 Azure 的 SDK

from openai import AzureOpenAI
import dotenv
dotenv.load_dotenv()

client = AzureOpenAI(
  api_key = os.environ['AZURE_OPENAI_KEY_E'],
  api_version = "2023-07-01-preview",
  azure_endpoint =os.environ['AZURE_OPENAI_ENDPOINT_E'] 
)

response = client.embeddings.create(
        input = text,
        model= "ada_embedding002"
    )
 
print(response.data[0].embedding)

使用 Langchain 的 SDK

import os
import dotenv
dotenv.load_dotenv()
from langchain_openai import AzureOpenAIEmbeddings
os.environ["AZURE_OPENAI_API_KEY"] = os.environ['AZURE_OPENAI_KEY_E']
os.environ["AZURE_OPENAI_ENDPOINT"] = os.environ['AZURE_OPENAI_ENDPOINT_E']

embeddings = AzureOpenAIEmbeddings(
    azure_deployment=os.environ['AZURE_OPENAI_DEPLOYMNENT_E'],
    openai_api_version="2023-07-01-preview",
)

text = "this is a test document"
query_result = embeddings.embed_query(text)
print(query_result)