7 Embedding文本向量化

Embedding文本向量化是一种将非结构化文本转化为低维、连续数值向量的技术,旨在通过数学方式捕捉文本的语义、语法或特征信息,从而让机器更高效地处理语言任务。其核心思想源于流形假设(Manifold Hypothesis),即认为高维原始数据(如文本)实际隐含于低维流形中,通过映射到低维空间可实现语义可分性。

7.1 基础知识

原始文本到模型可输入向量的转化需要经过一下3个过程:

文本(原始形式)——> 分词(Token)——>Token索引化——>向量嵌入(Embedding)

7.1.1 分词(Tokenization)

  • 基于单词的分词(Word-level)

    将文本按空格或标点切分为完整单词(如英文)或独立词汇(如中文“苹果”)。优点是语义完整,但词表规模庞大且易出现未登录词问题

  • 基于字符的分词(Character-level)

    以单个字符为最小单元(如中文“苹”和“果”)。词表规模小(仅需数千字符),但丢失词汇边界信息,导致模型难以捕捉长距离语义

  • 基于子词的分词(Subword-level)

    平衡前两者,通过算法(如BPE、WordPiece)将罕见词拆分为更小单元。例如,“unbelievable”在BERT中被拆为[“un”, “##believable”],其中“##”表示该子词属于前续词。这种方法既能处理未登录词问题,又保留部分语义信息。

7.1.2 Token索引化

通过分词,将词转化为唯一整数索引,可以得到一张词表。以BERT为例,BERT的词表通常包含约30,522个子词,覆盖高频词汇和常见组合,并且添加了一些特殊Token,其词表形式如下:

{"[PAD]": 0, "我": 1, "吃了": 2, "苹果": 3, "[CLS]":4,"[SEP]":5}

7.1.3 向量嵌入

BERT的嵌入层包含一个可学习的Embedding矩阵,尺寸为[Vocab Size × Hidden Size](如30,522×768),该矩阵通过预训练(如掩码语言模型任务)学习每个Token的语义表示。原始文本在分词且索引化后,根据Token索引化后的ID从Embedding矩阵中提取向量,并与位置(Position Embeddings)、段落(Segment Embeddings)嵌入相加,得到最终输入表示。例如:

·输入Token ID=2(“苹果”)会从矩阵中取出对应的768维向量。

BERT模型的最大输入长度(token上限)通常为512个token,超出部分会被丢弃。常见扩展方法如下:

  • 滑动窗口分割:将长文本划分为多个512-token的片段分别处理(如使用stride参数覆盖上下文),但可能丢失全局信息。
  • 专用模型:如BigBird和Longformer通过稀疏注意力机制支持更长序列(例如4096 tokens),但需重新预训练且与BERT架构不同。
  • BELT方法:基于现有BERT模型,通过分段处理与池化技术间接支持长文本,保留预训练权重的同时提升处理能力。

7.2 langchain的向量嵌入

安装阿里云百炼的客户端依赖:

pip install -q langchain_community
pip install -q dashscope

输入一句话为什么得到固定长度的一维向量?

因为BERT在输入序列的起始位置强制添加特殊标记[CLS],其对应的最后一层隐藏状态被用作整个句子的综合表示。

def qen_embedding():os.environ.setdefault("DASHSCOPE_API_KEY", load_key("DASHSCOPE_API_KEY"))from langchain_community.embeddings import DashScopeEmbeddingsembedding_model = DashScopeEmbeddings(model="text-embedding-v1")text = "This is a test query."query_result = embedding_model.embed_query(text)print(len(query_result))   # 获得一个1536维度的向量,不同模型的向量长度可能不同
------------------------------------------------
1536

7.3 余弦相似度计算

安装依赖:

pip install -q scikit-learn
pip install numpy

text1与text2的语义相似度较高,所以余弦相似度大,得分越高。

def cosine_similarity():os.environ.setdefault("DASHSCOPE_API_KEY", load_key("DASHSCOPE_API_KEY"))from langchain_community.embeddings import DashScopeEmbeddingsembedding_model = DashScopeEmbeddings(model="text-embedding-v1")text1 = "我喜欢吃苹果"text2 = "我喜欢吃香蕉"text3 = "太阳从东边升起"import numpy as npembedding1 = np.array(embedding_model.embed_query(text1)).reshape(1, -1)embedding2 = np.array(embedding_model.embed_query(text2)).reshape(1, -1)embedding3 = np.array(embedding_model.embed_query(text3)).reshape(1, -1)from sklearn.metrics.pairwise import cosine_similaritysimilarity12 = cosine_similarity(embedding1, embedding2)[0][0]similarity13 = cosine_similarity(embedding1, embedding3)[0][0]print(f"\"{text1}\" 与 \"{text2}\" 相似度:{similarity12:.4f}")print(f"\"{text1}\" 与 \"{text3}\" 相似度:{similarity13:.4f}")
-----------------------------------------------------------------------------------------------
"我喜欢吃苹果""我喜欢吃香蕉" 相似度:0.6128
"我喜欢吃苹果""太阳从东边升起" 相似度:0.0797

7.4 向量数据持久化

既然已经实现了文本向量化转换,自然需要一款工具来完成向量数据的持久化存储,并支持向量相似度检索。这类工具被统称为向量数据库

在 LangChain 框架中,集成了丰富的向量数据库组件,具体集成列表可查阅官网文档《LangChain 集成的 Vector Store》。接下来,以 Redis为例,演示向量数据的核心操作流程。

注意: 默认的 Redis 社区版不支持向量数据存储,需额外安装redisearch模块才能启用向量存储功能

通过 Docker 容器部署集成redisearch模块的 Redis 服务,具体部署指令如下:

docker run -p 6379:6379 redis/redis-stack-server:latest

持久化案例展示如下,未来对于用户提出的任何问题,都可以在向量数据库中快速检索出和用户问题语义最接近的文本。但是这里需要注意,这里只是检索出可能认为最相关的文本,并不能完全保证用户提出的问题,最终的答案就是这个最相关的文本。基于LangChain框架的良好设计,未来如果想要切换到其他的向量数据库,只需要修改
vector_store的实现类即可,业务代码几乎不需要改动。

def qwen_embedding_save():os.environ.setdefault("DASHSCOPE_API_KEY", load_key("DASHSCOPE_API_KEY"))embedding_model = DashScopeEmbeddings(model="text-embedding-v1")from langchain_redis import RedisConfig, RedisVectorStoreredis_config = RedisConfig(index_name="my_index",redis_url="redis://127.17.0.2:6379/0",distance_metric="COSINE",embedding_dimensions=1536)vector_store = RedisVectorStore(embeddings=embedding_model, config=redis_config)vector_store.add_texts(["我喜欢吃苹果", "我不喜欢吃香蕉", "太阳从东边升起"])retireval_result = vector_store.similarity_search("我喜欢吃什么?", k=3<

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DMDRS部署实施手册(ORACLE=》DM)

DMDRS部署实施手册&#xff08;ORACLE》DM&#xff09; 1 同步说明2 DMDRS安装3 数据库准备3.1 源端准备3.1.1 开启归档日志和附加日志3.1.2 关闭回收站3.1.3 创建同步用户 3.2 目标准备3.2.1 创建同步用户 4 DMDRS配置4.1 源端配置4.2 目标配置 5 DMDRS启动5.1 启动源端服务5.…

十(1)作业:sqli-labs重点关卡

参考文章&#xff1a;详细sqli-labs&#xff08;1-65&#xff09;通关讲解-CSDN博客 第1关&#xff1a; 输入 &#xff1a; ?id3 输入 &#xff1a; ?id2 当输入的数字不同&#xff0c;页面的响应也不同&#xff0c;说明&#xff0c;输入的内容被带入到数据库里查询了 输…

Python 爬虫入门 Day 7 - 复盘 + 实战挑战日

Python 第二阶段 - 爬虫入门 &#x1f3af; 本周知识回顾 网络请求与网页结构基础 HTML解析入门&#xff08;使用 BeautifulSoup&#xff09; 实现爬虫多页抓取与翻页逻辑 模拟登录爬虫与 Session 维持 使用 XPath 进行网页解析&#xff08;lxml XPath&#xff09; 反爬虫应对…

WebRTC(七):媒体能力协商

目的 在 WebRTC 中&#xff0c;每个浏览器或终端支持的音视频编解码器、分辨率、码率、帧率等可能不同。媒体能力协商的目的就是&#xff1a; 确保双方能“听得懂”对方发的媒体流&#xff1b;明确谁发送、谁接收、怎么发送&#xff1b;保障连接的互操作性和兼容性。 P2P的基…

可信启动方案设计

安全之安全(security)博客目录导读 目录 一、引言 二、关键数据(Critical Data) 三、度量槽(Measurement Slot) 四、可信启动后端 1、事件日志(Event Log) 2、离散型 TPM(Discrete TPM) 3、RSE(运行时安全引擎) 五、平台接口 平台接口的职责: 1、函数:b…

✨通义万相2.1深度解析:AI视频生成引擎FLF2V-14B全流程指南(命令行参数+模型架构+数据流)

&#x1f31f; 从零详解&#xff1a;如何用AI模型生成视频&#xff1f;命令行、模型结构、数据流全解析&#xff01; 本文通过一个实际案例&#xff0c;详细解析使用AI模型生成视频的整个流程。从命令行参数解读到模型结构&#xff0c;再到数据在模型间的流动&#xff0c;一步步…

在 TypeScript 前端中使用 Umi-Request 调用 Java 接口的完整指南

下面我将详细介绍如何在基于 TypeScript 的前端项目中使用 umi-request 调用 IntelliJ IDEA 中开发的 Java 接口&#xff0c;包括完整的实现方案和代码示例。 整体方案设计 一、Java 后端接口准备 1. 创建 Spring Boot 控制器 // src/main/java/com/example/demo/controller…

GO Gin Web框架面试题及参考答案

目录 Gin 与 net/http 有哪些主要区别?为什么选择 Gin? 如何使用 Gin 启动一个 HTTP 服务并设置默认路由? Gin 的默认路由和自定义路由器组是如何工作的? 如何在 Gin 中绑定请求参数(Query、Form、JSON、XML)? 如何在 Gin 中使用中间件?中间件执行顺序是怎样的? …

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗?

For Each item In products<tr><td>item.Id</td><td>item.Name</td><td>item.Price.ToString("C")</td></tr>Next为什么要用<tr> ? 在Blazor的Razor语法中&#xff0c;使用<tr>是为了在VB.NET代码块中…

css语法中的选择器与属性详解:嵌套声明、集体声明、全局声明、混合选择器

嵌套声明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>嵌套声明</title> <!-- 这里p span 的含义是p标签下面的span标签 所以有嵌套关系--><style>p span {font-weight:…

Linux 系统中,/usr/bin/ 和/bin/的区别?

在 Linux 系统中&#xff0c;/bin/ 和 /usr/bin/ 都是存放可执行程序&#xff08;命令&#xff09;的目录&#xff0c;但它们在历史定位、用途、挂载策略和系统设计上有一定区别。 ✅ 快速对比总结 项目/bin//usr/bin/全称含义binary&#xff08;核心二进制&#xff09;user b…

苍穹外卖--WebSocket、来单提醒、客户催单

WebSocket 1.介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传送。 HTTP协议和WebSocket协议对比&#xff1a; ①Http是短连接 ②W…

Linux 信号(Signal)与信号量(Semaphore)区别

特性信号 (Signal)信号量 (Semaphore)本质软件中断进程间同步机制用途通知进程发生了某个事件控制对共享资源的访问通信方向单向 (内核→进程 或 进程→进程)多进程共享数据类型整数信号编号内核维护的计数器持久性瞬时,不排队持久,直到显式释放实现层次内核实现内核或用户空…

华为OD机考-观看文艺汇演问题-区间问题(JAVA 2025B卷)

import java.util.*; /*** version Ver 1.0* date 2025/6/20* description 观看文艺汇演*/ public class WatchMovie {public static void main(String[] args) {Scanner sc new Scanner(System.in);int num Integer.parseInt(sc.nextLine());List<Movie> movies new …

DeepSeek今天喝什么随机奶茶推荐器

用DeepSeek生成了一个随机奶茶推荐器-今天喝什么&#xff0c;效果非常棒&#xff01;UI界面美观。 提示词prompt如下 用html5帮我生成一个今天喝什么的网页 点击按钮随机生成奶茶品牌等&#xff0c;要包括中国常见的知名的奶茶品牌 如果不满意还可以随机再次生成 ui界面要好看 …

【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台

实物图 核心硬件配置 1、控制器芯片‌ 采用国产TL63104控制芯片‌&#xff0c;支持2.5GT/s、5GT/s、8GT/s、16GT/s、32GT/s的PCIe传输速率&#xff0c;支持968Lanes。支持6个x16的group和1个x8的group&#xff0c;每个group支持1至8个端口。x16group支持x16、x8、x4、x2端口…

GPIO-LED驱动

一、LED引脚说明 寄存器地址地图&#xff1a; 原理图&#xff1a; 关于MOS管的说明&#xff1a; 总结&#xff1a;当GPIO0_B5这个引脚输出高电平的时候&#xff0c;对应的N-MOS管导通—LED点亮 当GPIO0_B5这个引脚输出低电平的时候&#xff0c;对应的N-MOS管截止---LED熄灭 二…

Gartner《Generative AI Use - Case Comparison for Legal Departments》

概述 这篇文章由 Gartner, Inc. 出品,聚焦于生成式人工智能(GenAI)在法律部门中的应用情况,通过对 16 个较为突出的 GenAI 法律技术应用场景进行分析,从商业价值和可行性两个维度进行评估,旨在为法律总顾问等提供战略对话依据,以便更好地做出技术投资决策,推动法律部门…

Vue 中 filter 过滤的语法详解与注意事项

Vue 中 filter 过滤的语法详解与注意事项 在 Vue.js 中,"过滤"通常指两种不同概念:模板过滤器(Vue 2 特性)和数组过滤(数据过滤)。由于 Vue 3 已移除模板过滤器,我将重点介绍更实用且通用的数组过滤语法和注意事项。 一、数组过滤核心语法(推荐方式) 1. …

webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html

6 从loader本质看各种语言处理 语法糖&#xff1f; 6.1 loader的本质 loader本质是一个方法&#xff0c;接收要处理的资源的内容&#xff0c;处理完毕后给出内容&#xff0c;作为打包结果。 所有的loader&#xff08;例如babel-loader, url-loader等&#xff09;export出一个方…