文章目录
前言
环境准备
一、Embedding介绍
二、Word Embedding技术
三、Embedding应用价值
四、Embedding开发实践
4.1本地数据集Embedding
4.2本地知识库检索
前言
随着AI大模型的不断发展,AI大模型应用开发这门技术也越来越重要,很多人都开启了学习AIGC,本文介绍了AI大模型基础之Embedding向量化处理。从本章开始正式启动AI大模型开发学习之旅
环境准备
环境变量:OPENAI_API_KEY :(配置好OpenAI账号的Api Key)
依赖包安装:pip install tiktoken openai pandas matplotlib plotly scikit-learn numpy
数据集准备:https://download.csdn.net/download/xiaobing259/89083028
一、Embedding介绍
1、嵌入/向量化:将对象转化为向量表示,Embedding之间的距离可表示两个对象之间的相似性
2、词嵌入(Word Embedding):将单词、文本转化为向量表示、可以通过向量捕获单词之间的语义关系;词嵌入算法模型:Word2Vec、GloVe和FastText等
3、图像嵌入(Image Embedding):将图片转换为低维向量,这些向量能够捕捉图像的视觉特征,如颜色、纹理、形状等。这样的嵌入通常用于图像识别、分类和检索任务;嵌入方法:卷积神经网络(Convolutional Neural Networks, CNN)
4、图嵌入(Graph Embedding):主要用于图结构的学习,将图中的节点(可能是用户、物品或其他实体)和边(表示节点之间的关系)映射到低维向量空间中。这样的嵌入能够保留节点间的结构和属性信息,常用于社交网络分析、推荐系统、知识图谱等领域;算法:通过DeepWalk、Node2Vec、GraphSAGE等算法来实现
二、Word Embedding技术
1、Word2Vec:是一种基于神经网络的模型,用于将单词映射到向量空间中。Word2Vec包括两种架构:CBOW (Continuous Bag-of-Words) 和 Skip-gram。CBOW 通过上下文预测中心单词,而Skip-gram 通过中心单词预测上下文单词。这些预测任务训练出来的神经网络权重可以用作单词的嵌入。
2、GloVe:全称为 Global Vectors for Word Representation,是一种基于共现矩阵的模型。该模型使用统计方法来计算单词之间的关联性,然后通过奇异值分解(SVD)来生成嵌入。GloVe 的特点是在计算上比Word2Vec 更快,并且可以扩展到更大的数据集。
3、FastText:是由 Facebook AI Research 开发的一种模型,它在 Word2Vec 的基础上添加了一个字符级别的n-gram 特征。这使得 FastText 可以将未知单词的嵌入表示为已知字符级别 n-gram 特征的平均值。FastText 在处理不规则单词和罕见单词时表现出色。
4、OpenAI的Embeddings:这是OpenAI官方发布的Embeddings的API接口。text-embedding-ada-002、text-embedding-3-small、text-embedding-3-large
三、Embedding应用价值
1、准备(仅初始化一次)准备搜索数据/知识库:
收集:提取准备知识库资料;文章、评论等数据。
切块:如果是大文档,则将文档分成短小的多块进行嵌入(避免Token超出)
嵌入:使用OpenAI API对每个部分数据获得embeddings
结果存储:存储embedding(对于大型数据集,可以使用向量数据库)
2、搜索(每次查询一次)给定用户问题,从OpenAI API生成查询的embeddings使用embeddings,查询相关性最近的数据
3、提问(每次查询一次)将问题和最相关的部分插入到发送给GPT的消息中返回GPT的答案
四、Embedding开发实践
4.1本地数据集Embedding
1)导入依赖包
import pandas as pd
import tiktoken
from utils.embedings_utils import get_embedding
2)读取本地数据集
# load & inspect dataset 加载检查数据集
input_datapath = "data/fine_food_reviews_1k.csv"
df = pd.read_csv(input_datapath, index_col=0)
df = df[["Time", "ProductId", "UserId", "Score", "Summary", "Text"]]
df = df.dropna()
#合数据集:新增一个字段combined列,由Title和Content合并而成
df["combined"] = (
"Title: " + df.Summary.str.strip() + "; Content: " + df.Text.str.strip()
)
df.head(2)
3)Embedding参数设置
embedding_model = "text-embedding-3-small"
embedding_encoding = "cl100k_base"
max_tokens = 8000 # the maximum for text-embedding-3-small is 8191
4)获取最新的1000条评论记录
# 取出1000条最新的记录,如果超过了token阀值则移除
top_n = 1000
#按Time字段进行排序
df = df.sort_values("Time").tail(top_n * 2)
#删除Time字段,后面不需要使用到Time
df.drop("Time", axis=1, inplace=True)
encoding = tiktoken.get_encoding(embedding_encoding)
# omit reviews that are too long to embed
#将得到的编码embedding剔除超长的,放入n_tokens列
df["n_tokens"] = df.combined.apply(lambda x: len(encoding.encode(x)))
df = df[df.n_tokens <= max_tokens].tail(top_n)
len(df)
5)embedding处理、再另存到本地文件
#新增一列embedding,存放通过lambda函数,获取到每一个联合列combined的值对应的embedding
#另存到文件fine_food_reviews_with_embeddings_1k.csv,作为知识库备用
df["embedding"] = df.combined.apply(lambda x: get_embedding(x, model=embedding_model))
df.to_csv("data/fine_food_reviews_with_embeddings_1k.csv")
#get_embedding方法补充说明
def get_embedding(text: str, model="text-embedding-3-small", **kwargs) -> List[float]:
# replace newlines, which can negatively affect performance.
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text], model=model, **kwargs)
return response.data[0].embedding
4.2本地知识库检索
通过字符串检索相似度最高的评论
1)读取本地知识库中的embedding字段
import pandas as pd
import numpy as np
from ast import literal_eval
datafile_path = "data/fine_food_reviews_with_embeddings_1k.csv"
#1.读取知识库中的embedding列
df = pd.read_csv(datafile_path)
df["embedding"] = df.embedding.apply(literal_eval).apply(np.array)
2)定义知识库搜索函数
根据文本对知识库进行搜索,获取最大相似度的信息
from utils.embedings_utils import get_embedding,cosine_similarity
#2.定义函数,根据字符,查找评论中相似度最高的3条记录
def search_reviews(df, product_description, n=3, pprint=True):
#1.将查询的字符串,调用embedding模型,进行embedding化
product_embedding = get_embedding(
product_description,
model="text-embedding-3-small"
)
#2.根据查询字符串的embedding值,与embedding列,进行相似度计算,放入到新增列similarity
df["similarity"] = df.embedding.apply(lambda x: cosine_similarity(x, product_embedding))
#3.对similarity列进行排序,取出前3条,输出标题和内容
results = (
df.sort_values("similarity", ascending=False)
.head(n)
.combined.str.replace("Title: ", "")
.str.replace("; Content:", ": ")
)
if pprint:
for r in results:
print(r[:200])
print()
return results
utils.embedings_utils包中定义get_embedding,cosine_similarity
from openai import OpenAI
import numpy as np
import pandas as pd
client = OpenAI(max_retries=5)
def get_embedding(text: str, model="text-embedding-3-small", **kwargs) -> List[float]:
# replace newlines, which can negatively affect performance.
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text], model=model, **kwargs)
return response.data[0].embedding
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
3)函数调用,传入字符串,查找与之相似度最高的3条记录
results = search_reviews(df, "delicious beans", n=3)