AI大模型探索之路-基础篇1:精通Embeddings向量表示法

文章目录
前言
环境准备
一、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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值