【GPT入门】第17课 RAG向量检索分类、原理与优化

发布于:2025-03-14 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.向量检索概念

1.1 文本检索的两类方式

分为两类
基于语法的检索
包括基于关键词的检索、全文检索、索引检索、基于规则的检索等。这些方法主要关注文本的语法结构和字词的匹配,通过对文本进行分词、建立索引等操作,根据用户输入的关键词或规则来查找匹配的文本,不涉及对文本语义的深入理解。
基于语义的检索
包括向量空间模型检索、语义检索等。这类方法利用自然语言处理技术,尝试理解文本的语义内容,考虑文本的上下文、词汇之间的语义关系等,以更准确地找到与用户查询在语义上相关的文本。

本文重点讲解语义检索原理

1.2 向量的定义

在这里插入图片描述
以此类推,我可以用一组坐标 (𝑥0,𝑥1,…,𝑥𝑁−1)
表示一个 𝑁
维空间中的向量, 𝑁
叫向量的维度。

1.3 文本向量(Text Embeddings)

在这里插入图片描述

1.4 文本向量如何得到

构建相关(正立)与不相关(负例)的句子对儿样本
训练双塔式模型,让正例间的距离小,负例间的距离大
例如:
在这里插入图片描述

1.5 向量间相似度计算

在这里插入图片描述
根据距离远近,来计算向量的相似度,从而计算文本相似度。

1.6 向量数据库功能对比

在这里插入图片描述
FAISS: Meta 开源的向量检索引擎 https://github.com/facebookresearch/faiss
Pinecone: 商用向量数据库,只有云服务 https://www.pinecone.io/
Milvus: 开源向量数据库,同时有云服务 https://milvus.io/
Weaviate: 开源向量数据库,同时有云服务 https://weaviate.io/
Qdrant: 开源向量数据库,同时有云服务 https://qdrant.tech/
PGVector: Postgres 的开源向量检索引擎 https://github.com/pgvector/pgvector
RediSearch: Redis 的开源向量检索引擎 https://github.com/RediSearch/RediSearch
ElasticSearch 也支持向量检索 https://www.elastic.co/enterprise-search/vector-search

1.7 open ai发布的两个向量模型

2024 年 1 月 25 日,OpenAI 新发布了两个 Embedding 模型

text-embedding-3-large
text-embedding-3-small
其最大特点是,支持自定义的缩短向量维度,从而在几乎不影响最终效果的情况下降低向量检索与相似度计算的复杂度。

通俗的说:越大越准、越小越快。 官方公布的评测结果:
在这里插入图片描述


import numpy as np
from numpy import dot
from numpy.linalg import norm
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

client = OpenAI()

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


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)


# model = "text-embedding-3-large"
model = "text-embedding-3-small"
dimensions = 128

# query = "国际争端"

# 且能支持跨语言
query = "global conflicts"

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

query_vec = get_embeddings([query], model=model, dimensions=dimensions)[0]
doc_vecs = get_embeddings(documents, model=model, dimensions=dimensions)

print("