首页 > 其他分享 >AI大模型应用开发篇之Embeddings向量化

AI大模型应用开发篇之Embeddings向量化

时间:2024-04-05 09:01:42浏览次数:19  
标签:嵌入 Embeddings Embedding AI text df embedding import 量化

文章目录


前言

随着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、准备(仅初始化一次)准备搜索数据/知识库:

  1. 收集:提取准备知识库资料;文章、评论等数据。
  2. 切块:如果是大文档,则将文档分成短小的多块进行嵌入(避免Token超出)
  3. 嵌入:使用OpenAI API对每个部分数据获得embeddings
  4. 结果存储:存储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)

标签:嵌入,Embeddings,Embedding,AI,text,df,embedding,import,量化
From: https://blog.csdn.net/xiaobing259/article/details/137384048

相关文章