首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AI 新手村:Embedding

Embedding

随着大型语言模型 (LLM) 的兴起,Embedding 成为了一个备受关注的热词。那什么是 embedding 呢?embedding 中文翻译过来是嵌入,本质上就是一个向量,类似[0.1,0.8,0.6....]这样的形式,在很多文章里,我们可以看到嵌入向量(embedding vector)这样的描述。

Embedding 将所有模型的输入(例如文本或图片)转化为一系列数字向量表示,相似的输入在向量空间中的距离也更接近。近期备受关注的 RAG (Retrieval Augmented Generation) 技术,正是将所有私有知识内容转化为向量,并将用户提出的问题也转化为向量,然后检索出与问题最相似的知识片段,再将这些知识传递给大型模型,使其整合生成完整的答案。

在 embedding 技术广泛应用之前,One-Hot 编码曾是主流方法。如果和我们比较熟悉的 One-Hot 对比起来理解,直观上看,embedding 可以理解为对 One-Hot 编码进行平滑处理的结果,而 One-Hot 编码则类似于对 Embedding 进行最大池化操作。与 One-Hot 的自定义编码方式不同,embedding 其实是在大模型训练过程中,通过对比学习的方式生成的模型输出。这个过程可以看作是 LLM 训练的一个关键组成部分,这也就解释了一个常见问题,在配置本地的大模型客户端的时候,会要求选择 embedding 的模型,这个模型可以和 LLM 保持一个系列,也可以选择其他公司的模型,但一定要保证模型输出的向量维度和 LLM 适配。

Embedding上下游

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

常用的 embedding 模型性能可以通过https://huggingface.co/spaces/mteb/leaderboard 查到。

Embedding 模型的 benchmark实战

使用 OpenAI 原生 SDK

from openai import OpenAI

import os

api_key=os.environ.get("OPENAI_API_KEY")

client = OpenAI(

 api_key= api_key,

 base_url = "https://burn.hair/v1"

)

input = "This is a test document."

query_result = client.embeddings.create(model="text-embedding-3-small", input=input)

print(query_result.data[0].embedding)

使用 LangChain 的 SDK

def get_openai_embedding():

  # 获取当前脚本所在的目录

  current_dir = Path(__file__).resolve().parent

  # 获取上一层目录的路径(项目根目录)

  project_root = current_dir.parent

  # 加载项目根目录中的 .env 文件

  env_path = project_root / '.env'

  load_dotenv(dotenv_path=env_path)

  # 创建并返回 OpenAIEmbeddings 实例

  return OpenAIEmbeddings(

      openai_api_key=os.environ.get("OPENAI_API_KEY"),

      model="text-embedding-3-small",

      base_url='https://burn.hair/v1'

  )

statement = "I am happy"

embedding = get_openai_embedding()

print(embedding.embed_query(statement))

一些开源的模型也可以通过 Hugging Face平台的 SDK 或 API 的方式使用

def generate_embedding(text: str) -> list[float]:

  embedding_url = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"

  response = requests.post(

      embedding_url,

      headers={"Authorization": f"Bearer {config.hg_token}"},

      json={"inputs": text})

  if response.status_code != 200:

      raise ValueError(f"Request failed with status code {response.status_code}: {response.text}")

  return response.json()

a= "i am a boy"

print(generate_embedding(a))

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OvII0k6d-QDh63nrRZ2wTdzw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券