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

news2024/12/27 13:14:38

🚀 作者 :“大数据小禅”

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

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


目录导航

      • 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)
  • 结果
    在这里插入图片描述
  • 最终检索到匹配度前三的文本向量 后续会使用到向量数据库 完成知识库的搭建
  • 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 有问题可以咨询主页

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S/ hpa分享

在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。 hpa的使用本身还是很简单的 示例如下: 官网示例 apiVersion: apps/v1 k…

【三数之和】python,排序+双指针

暴力搜索3次方的时间复杂度,大抵超时 遇到不会先排序 排序双指针 上题解 照做 class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res[]nlen(nums)#排序降低复杂度nums.sort()k0#留两个位置给双指针i,jfor k in range(n-2):if nums[k]…

shell常见指令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、认识C语言二、操作系统 1.引入库2.读入数据总结 前言 嵌入式学习前期C基础内容总结 一、认识C语言 C语言是一门十分流行的编程语言,由美国贝尔…

Web3的时代:科技变革助力物联网智能化

引言 随着人类社会的不断发展,科技进步已经成为推动社会发展的重要引擎之一。在这个信息化时代,互联网已经深刻改变了人们的生活方式和工作方式,而Web3技术的出现,则为我们带来了全新的科技革命。本文将探讨Web3时代对物联网智能…

HIOKI日置阻抗分析仪IM7583

HIOKI日置阻抗分析仪IM7583 HIOKI日置阻抗分析仪IM7583 HIOKI日置阻抗分析仪IM7583 功率分析仪 PW6001 基本参数 测量线路 单相2线,单相3线,三相3线,三相4线 输入通道数 zui大6ch,电压/电流同时单位是1ch (电压测…

基于MetaGPT构建单智能体

前言 在之前的文章中,我们详细地描述了Agent的概念和组成,在代码案例中体验了Agent的记忆、工具、规划决策模块,并通过几个Agent框架来加强读者对Agent开发设计与应用的理解,接下来我们就要进入智能体Agent的实际开发中&#xff0…

三维模型相互转换(obj文件转inp文件)

三维模型文件根据其含义都是可以进行相互转换的,这里主要介绍obj文件转化为inp文件。 什么是inp文件? inp文件是以.inp为后缀的文本文件,它包括了模型的全部数据信息,ABAQUS求解器分析的对象是inp文件,软件生成的.ca…

AI - 各类AI针对Excel分析对比

一个水果销量表,Excel包含多个年份sheet,需要提取某个品种的水果每年的销量,看看几个AI的分析结果吧 1、文心一言3.5(不支持Excel) 不支持上传Excel文件 2、 通义千问2.5(完成★) 顺利完成…

在windows中使用wsl下的unbuntu环境

1 unbuntu下载编译环境 编译环境安装命令: sudo apt install gdb sudo apt install gcc sudo apt install g 2 使用vscode正常打开项目,在window中打开的项目(官方推荐将项目放在linux中的home目录) 但在windows中也可以使用&a…

电脑卸载linux安装windows后每次开机都出现grub

原因分析 这是因为电脑硬盘中还存在linux系统的引导程序,并且启动顺序还在windows之前,有时候通过bios根本找不到它的存在,以至于每次windows开机出现grub之后都要输入exit退出linux的引导之后才能使得电脑进入windows,这个有时会…

Vue3学习-用 vite@latest 初始化项目后,遇到无法识别 .vue 文件

引入app界面遇到 我的解决方案 1.根目录创建 env.d.ts&#xff0c;添加 declare module "*.vue" {import type { DefineComponent } from "vue"const vueComponent: DefineComponent<{}, {}, any>export default vueComponent }2.在 tsconfig.json…

​​​【收录 Hello 算法】9.3 图的遍历

目录 9.3 图的遍历 9.3.1 广度优先遍历 1. 算法实现 2. 复杂度分析 9.3.2 深度优先遍历 1. 算法实现 2. 复杂度分析 9.3 图的遍历 树代表的是“一对多”的关系&#xff0c;而图则具有更高的自由度&#xff0c;可以表示任意的“多对多”关系。因此&…

C++三剑客之std::any(二) : 源码剖析

目录 1.引言 2.std::any的存储分析 3._Any_big_RTTI与_Any_small_RTTI 4.std::any的构造函数 4.1.从std::any构造 4.2.可变参数模板构造函数 4.3.赋值构造与emplace函数 5.reset函数 6._Cast函数 7.make_any模版函数 8.std::any_cast函数 9.总结 1.引言 C三剑客之s…

开源与闭源AI模型的对决:数据隐私、商业应用与社区参与

引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;模型的发展路径主要分为“开源”和“闭源”两条。这两种模型在数据隐私保护、商业应用以及社区参与与合作方面各有优劣&#xff0c;是创业公司、技术巨头和开发者们必须仔细权衡的重要选择。那么&#xff0c;面对这些…

[面试题]软件测试性能测试的常见指标在Linux系统中,一个文件的访问权限是 755,其含义是什么

1、选出属于黑盒测试方法的选项&#xff08;ABC&#xff09; A.决策表 B.边界值分析 C.正交法 D.分支覆盖 E.语句覆盖 F.条件覆盖 黑盒测试&#xff08;Black-box testing&#xff09;&#xff0c;又称为功能测试或数据驱动测试&#xff0c; 是一种不涉及软件内部结构和内部特…

优化问题基础知识

目录 线性规划(LP)整数线性规划(ILP)混合整数线性规划(MILP)非线性规划(NLP)整数非线性规划(INLP)混合整数非线性规划(MINLP)分组背包问题&#xff08;MCKP&#xff09;启发式算法在线算法长期优化李雅普诺夫算法随机优化块坐标下降法&#xff08;Block Coordinate Descent&…

当前API面临的安全风险,有什么安全措施

在当今信息化高速发展的时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;技术已成为企业数字化转型的基石&#xff0c;它连接着各种服务、传输数据并控制系统&#xff0c;成为现代数字业务环境不可或缺的一部分。然而&#xff0c;随着API的广泛应用&#xff0c;其…

Vue3+ts(day07:pinia)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)

目录 ​编辑 引言 一、RDMA的基本原理 二、RDMA的主要特点 三、RDMA的编程接口 四、RDMA的代码演示 服务器端代码&#xff1a; 客户端代码&#xff1a; 五、总结 引言 RDMA&#xff0c;全称Remote Direct Memory Access&#xff0c;即远程直接内存访问&#xff0c;是…

海山数据库(He3DB)数据仓库发展历史与架构演进:(一)传统数仓

从1990年代Bill Inmon提出数据仓库概念后经过四十多的发展&#xff0c;经历了早期的PC时代、互联网时代、移动互联网时代再到当前的云计算时代&#xff0c;但是数据仓库的构建目标基本没有变化&#xff0c;都是为了支持企业或者用户的决策分析&#xff0c;包括运营报表、企业营…