【AI大模型】Embedding模型解析 文本向量知识库的构建和相似度检索

🚀 作者 :“大数据小禅”

🚀 文章简介 :本专栏后续将持续更新大模型相关文章,从开发到微调到应用,需要下载好的模型包可私。

🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬


目录导航

      • 1 什么是Embedding
        • 2 为什么使用Embedding
        • 3 数据向量化的处理流程
        • 4 Embedding实战

1 什么是Embedding

  • 在大模型中,"embedding"指的是将某种类型的输入数据(如文本、图像、声音等)转换成一个稠密的数值向量的过程。
  • 这些向量通常包含较多维度,每一个维度代表输入数据的某种抽象特征或属性。
  • Embedding 的目的是将实际的输入转化为一种格式,使得计算机能够更有效地处理和学习
    在这里插入图片描述
  • 文本Embedding
    在自然语言处理(NLP)中,文本embedding是一个常见的概念。是将文字或短语转换成数值向量的过程。这些向量捕捉了单词的语义特征,例如意义、上下文关系等。比如,使用词嵌入技术(如Word2Vec、GloVe或BERT),模型可以将具有相似意义的词映射到向量空间中的相近位置。
    - 图像Embedding
    对于图像,embedding过程通常涉及使用卷积神经网络(CNN)等模型来提取图像中的特征,并将这些特征转换为一个高维向量。这样的向量可以代表图像的内容、风格、色彩等信息,从而用于图像识别、分类或检索任务。
    - 声音Embedding
    在声音处理领域,embedding通常指的是将音频信号转换为一个表示其特征的向量,这包括音调、节奏、音色等。通过这样的转换,可以进行声音识别、音乐生成等任务。
2 为什么使用Embedding
  • Embedding的主要优势是能够将实体转换为计算机易于处理的数值形式,同时减少信息的维度和复杂度。
  • 有助于提高处理效率,而且也使得不同实体之间的比较(如计算相似度)变得可行。
  • embedding通常通过大量数据的训练而得到,能够捕捉到复杂的模式和深层次的关系,这是传统方法难以实现的
3 数据向量化的处理流程

1. 收集
这一步骤是数据收集阶段,涉及到从不同的来源(如数据库、网站、文档等)收集需要分析的文本数据。这些数据可以是文章、评论、报告等形式。重点是确定数据源,并确保数据的相关性和质量。

2. 切块
对于大型文档,直接处理可能会因为模型的输入限制(如Token数量限制)而变得不可行。在这种情况下,需要将大文档分割成更小的部分。这些部分应该尽可能保持语义的完整性,例如按段落或章节切分。切块的目的是确保每块文本的大小适合模型处理,同时尽量减少上下文信息的丢失。

3. 嵌入
在切块后,每个文本块将被转换为数值向量,即通过OpenAI的embedding API进行嵌入。这一步涉及调用API,将文本数据发送到OpenAI的服务器,服务器会返回文本的向量表示。这些向量捕捉了文本的深层语义特征,使得文本之间的比较、搜索和分析变得可能。

4. 结果存储
嵌入向量生成后,需要将它们存储起来以便于后续的检索和分析。对于大型数据集,推荐使用专门的向量数据库(如Faiss、Annoy、Elasticsearch等),这些数据库优化了向量的存储和相似性搜索操作。存储不仅要保证数据的可检索性,也要考虑查询效率和存储成本

4 Embedding实战
  • 演示是通过OPENAI的embedding进行,根据最新的api测试
  • 在这里插入图片描述
  • 测试代码如下
response = openai.embeddings.create(
    input="abc s da d asd a da d ",
    model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
)
print("测试数据:",response.data[0].embedding)
  • 文本转化向量
    在这里插入图片描述
    - 如何计算两个向量的相似度?
    余弦相似度是一种用来衡量两个向量方向上的相似性的方法。在文本分析中,它常用于比较两段文本的语义相似性。当我们使用向量化模型(如OpenAI的text-embedding-ada-002模型)将文本转化为向量后,每个向量的维度表示某种语义特征,向量中的值反映了相应特征的强度。

余弦相似度的计算公式为:
在这里插入图片描述
其中, v e c 1 ⋅ v e c 2 \mathbf{vec1} \cdot \mathbf{vec2} vec1vec2 表示两个向量的点积, ∣ v e c 1 ∣ |\mathbf{vec1}| vec1 ∣ v e c 2 ∣ |\mathbf{vec2}| vec2 分别是这两个向量的欧几里得范数(即向量的长度)。
这个比例的本质是测量两个向量之间夹角的余弦值,范围从-1到1:
当余弦值为1时,表示两个向量方向完全相同。
当余弦值为0时,表示两个向量正交,即在高维空间中不相关。
当余弦值为-1时,表示两个向量方向完全相反。
在文本相似度测量中,如果两个文本的向量化表示在方向上更接近,它们的余弦相似度就更高,这意味着它们在语义上更相似。因此,通过计算向量之间的余弦相似度,我们可以有效地评估两段文本的相似性。这种方法适用于处理高维空间中的数据,如自然语言处理中的文本数据。

  • 整体实战代码 文本检索匹配
import time
from typing import List
import os
import pandas as pd
# 导入 tiktoken 库。Tiktoken 是 OpenAI 开发的一个库,用于从模型生成的文本中计算 token 数量。
import tiktoken
from openai import OpenAI
import numpy as np
os.environ['OPENAI_API_KEY']='sk-api-0REliWJkobjeqQlObLN0T3BlbkFJ0j4bHtDhEEQGEAboNYah'

openai = OpenAI()

def embed_text(text):
    """ 使用OpenAI API将文本向量化 """
    response =openai.embeddings.create(
        input=text,
        model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
    )
    return response.data[0].embedding

def cosine_similarity(vec1, vec2):
    """ 计算两个向量之间的余弦相似度 """
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))


def find_top_similar_texts(input_text, text_list, top_n=3):
    """ 找出与输入文本最相似的top_n个文本 """
    input_vec = embed_text(input_text)
    similarities = []
    for text in text_list:
        text_vec = embed_text(text)
        similarity = cosine_similarity(input_vec, text_vec)
        similarities.append((text, similarity))

    # 按相似度排序并返回最高的top_n个结果
    similarities.sort(key=lambda x: x[1], reverse=True)
    return similarities[:top_n]

# 示例文本库
text_corpus = [
    "The quick brown fox jumps over the lazy dog.",
    "A fast brown fox leaps over a sleepy dog.",
    "Exploring the mountains of the moon.",
    "Data science involves the analysis of large amounts of data.",
    "The capital of France is Paris.",
    "Programming in Python is fun and versatile."
]

# 输入文本
input_text = "Python is"

# 执行查找
top_similar_texts = find_top_similar_texts(input_text, text_corpus)

# 打印结果
for text, similarity in top_similar_texts:
    print(f"Text: {text}\nSimilarity: {similarity:.2f}\n")

#
# # 示例文本
# text1 = "The quick brown fox jumps over the lazy dog."
# text2 = "A fast brown fox leaps over a sleepy dog."
# text3 = "Exploring the mountains of the moon."
#
# # 向量化文本
# vec1 = embed_text(text1)
# vec2 = embed_text(text2)
# vec3 = embed_text(text3)
#
# # 计算相似度
# similarity12 = cosine_similarity(vec1, vec2)
# similarity13 = cosine_similarity(vec1, vec3)
#
# print(f"Similarity between text 1 and text 2: {similarity12:.2f}")
# print(f"Similarity between text 1 and text 3: {similarity13:.2f}")

response = openai.embeddings.create(
    input="abc s da d asd a da d ",
    model="text-embedding-ada-002"  # 选择一个合适的模型,如ada
)
print("测试数据:",response.data[0].embedding)
  • 结果
    在这里插入图片描述
  • 最终检索到匹配度前三的文本向量 后续会使用到向量数据库 完成知识库的搭建
  • 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 有问题可以咨询主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Sora等AI视频大模型赚钱的48种方式

不废话,直接上干货! \1. 定制视频创作服务:为寻找在社交媒体平台上脱颖而出的企业和个人提供定制视频制作服务,或用于个人使用。根据特定主题或行业量身定制视频,例如旅行、教育或产品营销。 \2. **教育内容包&#…

element-plus:踩坑日记

el-table Q:有fixed属性时,无数据时,可能出现底部边框消失的bug 现象: 解决方法: .el-table__empty-block {border-bottom: 1px solid var(--el-table-border-color); } el-collapse 折叠面板 Q:标题上…

Linux_应用篇(07) 系统信息与系统资源

在应用程序当中,有时往往需要去获取到一些系统相关的信息,譬如时间、日期、以及其它一些系统相关信息,本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取系统信息, 譬如获取系统时间、日期以及设置系统时间、日期等&#x…

Python——基于共享单车使用量数据的可视化分析(1)

目录 🧾 1、数据集(部分数据) ✏️ 2、导入数据集与必要模块 1️⃣ 2.1 导入库以及字体包 2️⃣ 2.2 读取数据集 3️⃣ 2.3 查看数据集基本信息 ⌨️ 3、数据预处理 1️⃣ 3.1删除无关字段 2️⃣ 3.2对各字段进行中文标识 3️⃣ 3.3…

Kubernetes——Kubectl详解

目录 前言 一、陈述式资源管理方法 二、Kubectl命令操作 1.查 1.1kubectl version——查看版本信息 1.2kubectl api-resources——查看资源对象简写 1.3kubectl cluster-info——查看集群信息 1.4配置Kubectl补全 1.5journalctl -u kubelet -f——查看日志 1.6kubec…

电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台

随着企业的快速发展,招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求,建立一个公平、公开、公正的采购环境至关重要。在这个背景下,我们开发了一款电子招标采购软件,以最大限度地控制采购成本&#…

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

【linux-uboot移植-mmc及tftp启动-IMX6ULL】

目录 1. uboot简介2. 移植前的基本介绍:2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…

VMware 安装Windows 7 SP1

1.下载镜像 迅雷:ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 2.安装过程 自定义名字,点击【浏览】自定义安装路径 点击【浏览】,选择下载镜像的路径 结束啦~ Win…

Pytorch深度学习实践笔记4

🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:pytorch深度学习 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

力扣Hot100-73矩阵置零(标记数组)

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行,目前西藏、陕西准考证打印入口已开通,各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

【话题】你眼中的IT行业现状与未来趋势

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 引言一、IT行业的现状1.1 云计算与大数据1.2 人工智能与机器学习1.3 物联网与5G通信1.4 区块链技术 二、IT行业未来发展趋势2.1 边缘计算与智能设备2.2 深度学习与自然语…

话题:如何让大模型变得更聪明?

随着人工智能(AI)技术的迅速发展,大模型(如GPT-4、BERT、Transformer等)在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而,如何让大模型变得更聪明,进一步提升其性能和应用效果&a…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说,资源条件总是有限的,为了实现战略目标,则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点,如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数,根据农作物的生长需求自动控制温室中电器设备的启停,从而达到植物生…

caffe在ARM鲲鹏920-openEuler2309上的环境搭建

caffe 配置环境 caffe cpu-only openblas protobuf 编译caffe需要3.6~3.10版本,否则会报错 dnf install只能安装3.19版本 需要从源码编译,这里选择了3.9版本 protobuf的github仓 从源码编译安装 caffe-gpu mode caffe的gpu模式需要用到cuda make…

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户&#x…

【Django】从零开始学Django(持续更新中)

pip install Djangopython manage.py startapp index运行: 成功!!! 在templates中新建index.html文件:

在做题中学习(61):连续数组

525. 连续数组 - 力扣(LeetCode) 思路:前缀和 哈希表 转化:将 0 ——> -1 转变为:找到和为0的最长子数组 细节: 1.哈希表存什么 前缀和 , 长度 2.什么时候存入哈希表 先处理前一个&…