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 适配。
对于我们输入大模型的 prompt,首先会被拆分成独立的 token,然后每一个 token会通过一个 embedding 模型得到对应的 embedding,每个 embedding 是一个高维的向量,比如 OpenAI 的 text-embedding-3-small
模型生成的就是 1536 维的向量,不同模型生成 embedding 的方式和维度都不相同,但是每个 embedding 向量都包含了对应 token 的语法和语义的特征。
常用的 embedding 模型性能可以通过 查到。
实战
使用 OpenAI 原生 SDK
代码语言:python代码运行次数:0运行复制from openai import OpenAI
import os
api_key=os.environ.get("OPENAI_API_KEY")
client = OpenAI(
api_key= api_key,
base_url = "/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
代码语言:python代码运行次数:0运行复制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='/v1'
)
statement = "I am happy"
embedding = get_openai_embedding()
print(embedding.embed_query(statement))
一些开源的模型也可以通过 Hugging Face平台的 SDK 或 API 的方式使用
代码语言:python代码运行次数:0运行复制def generate_embedding(text: str) -> list[float]:
embedding_url = ";
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))
发布评论