【AI大模型应用开发】【补充知识】文本向量化与向量相似度(含Python代码)

在上篇文章【AI大模型应用开发】3. RAG初探 - 动手实现一个最简单的RAG应用 中,我们动手实现了一个RAG基本流程。里面涉及到向量数据库和向量检索。对于没接触过的人可能比较懵。本文介绍下文本向量化的概念,以及向量检索的原理,只是简单介绍,不会深入,所以不用担心看不懂 ,想要详细研究的,可以去搜相关论文,涉及到机器学习和模型训练等。

0. 文本向量

0.1 什么是文本向量

文本向量(Text Vector)是一种将文本数据转换为数值向量的技术,以便于机器学习和数据分析。通过将文本数据转换为数值向量,我们可以使用机器学习算法对文本数据进行处理和分析。

0.2 文本向量是怎么得到的

(1)构建 相关(正立)与不相关(负例)的句子对儿样本

(2)训练 双塔式模型 ,让正例间的距离小,负例间的距离大

参考:arxiv.org/pdf/1908.10…

image.png

1. 获取文本向量

前面已经说了文本向量是怎么得到的,其实也是训练了一个模型。使用这个训练的模型,给一个输入,就可以得到该输入的向量。 这里我们可以使用OpenAI开放的文本向量化接口embeddings.create来获取某个文本的向量值。

python
复制代码
from openai import OpenAI
import os
# 加载环境变量
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # 读取本地 .env 文件,里面定义了 OPENAI_API_KEY

client = OpenAI()

def get_embeddings(texts, model="text-embedding-3-small"):
    '''封装 OpenAI 的 Embedding 模型接口'''
    data = client.embeddings.create(input=texts, model=model).data
    return [x.embedding for x in data]

可以测试一下这个接口,看下这个接口输出的向量长什么样:

python
复制代码
test_query = ["测试文本"]
vec = get_embeddings(test_query)[0]
print(vec[:10])
print(len(vec))

输出结果如下:

在这里插入图片描述 可以看到 “测试文本” 这四个字对应的输出是一个 1536 维的向量,这就是 “测试文本” 的向量表示。

注意相同的文本 使用 不同的向量化模型 获取的向量化结果是不同的 ,所以请保证你的RAG应用中使用的是同样的向量化模型和方式。

2. 向量间相似度计算

通过上面文本向量化,我们可以将一段文本转换成一串多维的数字,也就是数学上的向量。

2.1 向量间的距离

对于向量,相似度计算很简单,就是计算两个向量之间的距离。

在这里插入图片描述

2.2 向量距离计算 Python代码
python
复制代码
import numpy as np
from numpy import dot
from numpy.linalg import norm

def cos_sim(a, b):
    '''余弦距离 -- 越大越相似'''
    return dot(a, b)/(norm(a)*norm(b))


def l2(a, b):
    '''欧式距离 -- 越小越相似'''
    x = np.asarray(a)-np.asarray(b)
    return norm(x)

3. 向量相似度示例代码

python
复制代码
# 能支持跨语言
query = "global conflicts"

documents = [
    "联合国就苏丹达尔富尔地区大规模暴力事件发出警告",
    "土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判",
    "日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤",
    "国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营",
    "我国首次在空间站开展舱外辐射生物学暴露实验",
]

query_vec = get_embeddings([query])[0] # 计算自身的向量
doc_vecs = get_embeddings(documents) # 计算示例句子的向量

print("Cosine distance:")
print(cos_sim(query_vec, query_vec)) # 首先打印自身与自身的余弦距离
for vec in doc_vecs:
    print(cos_sim(query_vec, vec)) # 打印自身与示例句子的余弦距离

print("\nEuclidean distance:")
print(l2(query_vec, query_vec))  # 首先打印自身与自身的欧式距离
for vec in doc_vecs:
    print(l2(query_vec, vec)) # 打印自身与示例句子的欧式距离

运行结果如下:

image.png

可以看出,余弦距离越大表示相似度越高。欧式距离约小,表示相似度越高。

如果你对AI大模型应用感兴趣,这套大模型学习资料一定对你有用。

1.大模型应用学习大纲

AI大模型应用所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

2.从入门到精通全套视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
在这里插入图片描述
在这里插入图片描述

3.技术文档和电子书

整理了行业内PDF书籍、行业报告、文档,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

请添加图片描述

朋友们如果有需要全套资料包,可以点下面卡片获取,无偿分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值