1.向量 #
向量是数学中一个非常重要的概念,它不仅仅是一个数字,而是同时包含大小和方向的量。 向量是现代AI大模型的"通用语言"和"思维载体"。
1.1 一维向量 #
想象一下,如果我告诉你"向前走5步",这个指令包含了两个信息:
- 方向:向前
- 大小:5步
这就是向量的本质!向量同时表示"多大"和"往哪个方向"。
1.2 二维向量 #
在坐标系中,我们通常用有序数对来表示向量:
# 导入数学库用于数学运算
import math
# 导入类型注解 Tuple
from typing import Tuple
# 定义函数,计算二维向量 (x, y) 的长度
def vector_length(x: float, y: float) -> float:
# 调用 math.hypot 计算两数的欧几里得长度
return math.hypot(x, y)
# 定义函数,计算二维向量 (x, y) 与 x 轴的夹角(以角度为单位)
def vector_direction(x: float, y: float) -> float:
# 使用 atan2 计算夹角,再用 degrees 转换为角度
return math.degrees(math.atan2(y, x))
# 定义函数,计算从点 a 到点 b 的向量
def vector_from_points(a: Tuple[float, float], b: Tuple[float, float]) -> Tuple[float, float]:
# 返回 b 点减去 a 点得到的向量 (x2-x1, y2-y1)
return b[0] - a[0], b[1] - a[1]
# 定义一个二维向量 v
v = (3, 4)
# 打印向量 v 的长度,保留两位小数
print(f"向量 {v} 的长度: {vector_length(*v):.2f}")
# 定义一个用于计算方向角的二维向量 v_dir
v_dir = (1, 1)
# 打印向量 v_dir 与 x 轴的夹角,保留两位小数,并加上度数符号
print(f"向量 {v_dir} 的方向角: {vector_direction(*v_dir):.2f}°")
# 定义点 A 的坐标
point_a = (2, 1)
# 定义点 B 的坐标
point_b = (5, 5)
# 计算从点 A 到点 B 的向量
ab = vector_from_points(point_a, point_b)
# 打印该向量
print(f"从点 {point_a} 到点 {point_b} 的向量: {ab}")
# 打印该向量的长度,保留两位小数
print(f"该向量的长度: {vector_length(*ab):.2f}")1.3 三维向量 #
在坐标系中,我们通常用有序数对来表示向量:
- 三维向量:(x, y, z)
2.什么是向量嵌入 #
向量Embeddings(嵌入)是一种将离散对象(如文字、图片、声音等)映射到连续向量空间的技术。
简单来说,它是将难以直接计算的信息"嵌入"到一个数学空间中,使计算机能够处理这些信息。
2.1 简单理解 #
想象一下,如果我们要描述不同的水果:
- 苹果:红色、圆形、甜的
- 香蕉:黄色、弯曲、甜的
- 柠檬:黄色、椭圆形、酸的
我们可以用数字来表示这些特征:
- 颜色:红色=1,黄色=2
- 形状:圆形=1,弯曲=2,椭圆形=3
- 味道:甜=1,酸=2
那么这些水果就可以表示为:
- 苹果:[1,1,1]
- 香蕉:[2,2,1]
- 柠檬:[2,3,2]
这些数字列表就是简单的"嵌入"。计算机可以通过这些数字来理解水果之间的关系,比如香蕉和柠檬都是黄色的,所以它们的第一个数字相同。
3.向量数据库 #
3.1 什么是向量数据库? #
向量数据库是一种特殊的数据库,它不像我们平常用的表格那样存储数据,而是把信息变成一串数字(也就是"向量"),然后存储起来。
想象一下,如果我们要描述不同的水果,普通数据库可能会这样记录:
- 名字:苹果
- 颜色:红色
- 形状:圆形
- 味道:甜
但向量数据库会把“苹果”这个概念变成一串数字,比如:[1, 1, 1]。这串数字就代表了苹果的各种特征。
3.2 向量数据库有什么用? #
最重要的用途就是可以快速找到相似的东西!比如:
- 你拍了一张照片,想找类似的图片
- 你写了一段话,想找相似的文章
- 你听了一首歌,想找风格相近的音乐
3.3 向量数据库是怎么工作的? #
- 转换:首先,把文字、图片等信息转换成数字向量
- 存储:把这些向量存储在数据库中
- 搜索:当你要找东西时,也把你的问题转成向量
- 比较:计算你的问题向量和数据库中所有向量的相似度
- 返回结果:把最相似的结果返回给你