当前位置: 首页 > news >正文

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

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

  • 1.向量检索概念
    • 1.1 文本检索的两类方式
    • 1.2 向量的定义
    • 1.3 文本向量(Text Embeddings)
    • 1.4 文本向量如何得到
    • 1.5 向量间相似度计算
    • 1.6 向量数据库功能对比
    • 1.7 open ai发布的两个向量模型
  • 2.向量数据库
    • 1.8 向量检索的优化
  • 3.检索后排序
    • 3.1 后排序原理
    • 3.2 检索后排序代码
  • 4.混合检索(Hybrid Search)
  • 5. RAG-Fusion优化

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("

相关文章:

  • InfluxDB写入测试
  • 贪心算法——c#
  • Ubuntu24.04下管理自己的ssh连接
  • 关于ISP Pipeline LSC(镜头阴影校正)位置的一些想法
  • Java 大视界 -- 基于 Java 的大数据实时流处理中的窗口操作与时间语义详解(135)
  • Elastic Stack 8.16.0 日志收集平台的搭建
  • Java 中的序列化和反序列化是什么?
  • IntelliJ IDEA 快捷键系列:重命名快捷键详解
  • Tailwindcss开启黑夜模式
  • 数据结构-----初始数据结构、及GDB调试
  • python爬虫Scrapy(6)之增量式
  • 2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷
  • OpenGL
  • AIDD-人工智能药物设计-Nat. Comput. Sci. | 利用机器学习引导的对接筛选,实现快速遍历广阔化学空间
  • 商品详情页
  • Spring AI整合DeepSeek、Ollama本地大模型
  • 队列+宽度优先搜索,力扣.662.二叉树最大高度 力扣515.在每个数行中找最大值力扣703.数据流中第k大元素力扣692.前k个高频词
  • Python的types库学习记录
  • todolist docker 小工具
  • 【零基础入门unity游戏开发——进阶篇】unity中配合VideoClip和VideoPlayer组件实现视频播放
  • 网站多久需要维护/线上培训
  • 怎么去投诉做网站的公司/百度指数关键词工具
  • 网站广告推广技巧分享/免费发布活动的平台
  • seo快速排名优化/手机优化大师下载2022
  • 商城微网站建设多少钱/山东泰安网络推广
  • 网站目标/搜索引擎