引言:

最近在看ragflow源码,其中有一个较为巧妙地设计:分别将 文字 、 标题 行向量化 之后,直接根据权重,进行加法运算,得到向量融合,增强了文本向量化的表示能力,这里开始讨论一下,为什么这里可以直接对向量进行加法运算,而得到一个增强的表示

加权代码片段:

title_w = 0.1 是标题的权重
tts 是标题进行embedding向量化后的矩阵
cnts 是将内容进行embedding向量化后的矩阵
vects 生成的最终的文档向量

    vects = (title_w * tts + (1 - title_w) *cnts) if len(tts) == len(cnts) else cnts

目的:优化表示

单独使用标题向量可能丢失细节(如标题 “报告” 无法区分是 “营收报告” 还是 “技术报告”);单独使用内容向量可能因信息冗余导致主题模糊(如大段无关描述覆盖核心主题)。通过加权融合,可弥补单一模态的缺陷。

完整embedding代码

async def embedding(docs, mdl, parser_config=None, callback=None):if parser_config is None:parser_config = {}batch_size = 16tts, cnts = [], []for d in docs:tts.append(d.get("docnm_kwd", "Title"))c = "\n".join(d.get("question_kwd", []))if not c:c = d["content_with_weight"]c = re.sub(r"</?(table|td|caption|tr|th)( [^<>]{0,12})?>", " ", c)if not c:c = "None"cnts.append(c)tk_count = 0if len(tts) == len(cnts):vts, c = await trio.to_thread.run_sync(lambda: mdl.encode(tts[0: 1]))tts = np.concatenate([vts for _ in range(len(tts))], axis=0)tk_count += ccnts_ = np.array([])for i in range(0, len(cnts), batch_size):vts, c = await trio.to_thread.run_sync(lambda: mdl.encode([truncate(c, mdl.max_length-10) for c in cnts[i: i + batch_size]]))if len(cnts_) == 0:cnts_ = vtselse:cnts_ = np.concatenate((cnts_, vts), axis=0)tk_count += ccallback(prog=0.7 + 0.2 * (i + 1) / len(cnts), msg="")cnts = cnts_title_w = float(parser_config.get("filename_embd_weight", 0.1))vects = (title_w * tts + (1 - title_w) *cnts) if len(tts) == len(cnts) else cntsassert len(vects) == len(docs)vector_size = 0for i, d in enumerate(docs):v = vects[i].tolist()vector_size = len(v)d["q_%d_vec" % len(v)] = vreturn tk_count, vector_size

问题:为什么可以直接简单地通过加法进行融合?

要理解“向量值的含义”和“加法为何能融合特征”,我们需要从语义向量空间的本质特征融合的数学逻辑两个层面入手,结合具体场景(如文档向量化)解释:

一、向量值的本质:语义空间中的坐标

在自然语言处理(NLP)中,文本向量化(Embedding)的核心是将文本映射到一个高维语义空间中,向量的每个维度对应空间中的一个“语义特征”。==向量值(即每个维度的数值)本质是文本在该特征上的“得分” ==

举个具体例子

假设我们有一个简化的3维语义空间,三个维度分别代表:

  • 维度1:“技术”相关程度(数值越大,文本越可能涉及技术);
  • 维度2:“财务”相关程度(数值越大,文本越可能涉及财务);
  • 维度3:“时间”(数值越大,文本越可能涉及时间描述)。

现在有两个文本:

  1. 标题:“2023年公司技术研发报告”
    其向量可能是 [0.8, 0.2, 0.7](表示:技术相关度80%,财务相关度20%,时间相关度70%)。
  2. 内容:“本年度研发投入5000万元,用于AI算法优化”
    其向量可能是 [0.7, 0.6, 0.3](技术相关度70%,财务相关度60%,时间相关度30%)。

这里的每个数值(如0.8、0.2)并非绝对的“分数”,而是模型通过预训练学习到的相对语义关联程度。向量整体则表示文本在这个语义空间中的“位置”——相似文本会在空间中相邻(向量余弦相似度高)。

二、为什么向量加法可以融合特征?

向量加法能融合特征的前提是:标题向量与内容向量在同一语义空间中(即由同一模型编码,维度相同且每个维度的语义含义一致)。此时,加法操作的本质是将两个向量在同一空间中的坐标按比例叠加,从而合并两者的语义信息。

从数学角度看:线性叠加保留所有特征

假设标题向量为 ( \mathbf{T} = [t_1, t_2, …, t_n] ),内容向量为 ( \mathbf{C} = [c_1, c_2, …, c_n] ),融合后的向量为 ( \mathbf{V} = w*\mathbf{T} + (1-w)*\mathbf{C} )(( w ) 是标题权重)。

每个维度 ( v_i ) 的计算为:
[ v_i = w*t_i + (1-w)*c_i ]

这相当于:

  • 对标题在维度 ( i ) 的语义得分 ( t_i ),按权重 ( w ) 保留;
  • 对内容在维度 ( i ) 的语义得分 ( c_i ),按权重 ( (1-w) ) 保留;
  • 最终 ( v_i ) 是两者的加权和,同时包含标题和内容在该维度的信息。
从语义角度看:互补信息的融合

回到前面的例子,标题和内容的向量各维度得分如下:

维度标题向量 ( \mathbf{T} )内容向量 ( \mathbf{C} )融合后 ( \mathbf{V} )(( w=0.3 ))
技术相关度0.80.7( 0.30.8 + 0.70.7 = 0.24 + 0.49 = 0.73 )
财务相关度0.20.6( 0.30.2 + 0.70.6 = 0.06 + 0.42 = 0.48 )
时间相关度0.70.3( 0.30.7 + 0.70.3 = 0.21 + 0.21 = 0.42 )

融合后的向量 ( \mathbf{V} = [0.73, 0.48, 0.42] ) 同时体现了:

  • 标题的“时间相关度高”(原0.7,融合后0.42);
  • 内容的“财务相关度高”(原0.6,融合后0.48);
  • 两者共同的“技术相关度高”(原0.8和0.7,融合后0.73)。

这比单独使用标题(可能忽略财务细节)或内容(可能弱化时间信息)的向量更全面。

三、为什么必须用同一模型编码?

如果标题和内容用不同模型编码(例如标题用模型A,内容用模型B),它们的向量可能不在同一语义空间(维度不同,或同一维度的语义含义不同)。此时加法无意义。

例如:

  • 模型A的维度1表示“技术相关度”;
  • 模型B的维度1可能表示“长度”(文本字数);
  • 两者的维度1数值无法直接相加(一个是语义得分,一个是字数统计)。

而代码中标题和内容均使用 mdl.encode(同一模型),确保了向量在同一空间中,加法操作才有语义意义。

总结

向量值的本质是文本在高维语义空间中的坐标,每个维度对应一个语义特征的“得分”。同一模型编码的标题和内容向量处于同一空间,加法操作通过线性叠加合并了两者在各维度的得分,从而融合了标题的概括性特征和内容的细节性特征。这就像将两种颜色按比例混合——最终颜色同时保留了两种颜色的成分,且比例由权重参数控制。

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

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

相关文章

限流系列:sentinel

目录 滑动窗口算法 Sentinel 数据模型 示例 大致流程 ​​​​​​​entry ​​​​​​​entryWithPriority ​​​​​​​FlowSlot.entry ​​​​​​​checkFlow ​​​​​​​canPass ​​​​​​​avgUsedTokens ​​​​​​​passQps ​​​​​​​pa…

Java 访问者模式深度重构:从静态类型到动态行为的响应式设计实践

一、访问者模式的本质与核心价值 在软件开发的漫长演进中&#xff0c;设计模式始终是架构师手中的利刃。当我们面对复杂对象结构上的多种操作需求时&#xff0c;访问者模式&#xff08;Visitor Pattern&#xff09;犹如一把精密的手术刀&#xff0c;能够优雅地分离数据结构与作…

UE 5 C++设置物体位置和旋转,初始化虚幻引擎样条线、加载引用虚幻编辑器中的蓝图、设置虚幻编辑器中Actor大小

一、设置物体位置和旋转 UE.cpp文件中代码&#xff1a; Mesh->SetWorldLocationAndRotation(FVector(50.0f, 50.0f, 50.0f),FRotator(0,-90,0)); vs代码编辑器中旋转信息顺序&#xff08;yzx&#xff09;&#xff1a; Pitch、 Yaw、 Roll UE编辑器中旋转信息顺序&#xf…

【文本分类】KG-HTC 知识图谱提升分类准确率

最近看到一篇论文“KG-HTC: Integrating Knowledge Graphs into LLMs for Effective Zero-shot Hierarchical Text Classification”&#xff0c;介绍了文本分类的技巧&#xff0c;这篇文航主要利用了知识图谱大模型的思路&#xff0c;实验效果不错&#xff0c;里面的一些论述也…

三大微调技术对比:Prompt/Prefix/P-Tuning

Prompt Tuning、Prefix Tuning和P - Tuning的区别 概念方面: Prompt Tuning:在输入序列前添加可训练的额外Token以适配下游任务,预训练语言模型参数不变。比如在文本分类中,在句子前加特定Token如“(OPINION)”,让模型理解是对观点进行分类的任务。Prefix Tuning:在每层T…

14.「实用」扣子(coze)教程 | Excel文档自动批量AI文档生成实战,中级开篇

随着AI编程工具及其能力的不断发展&#xff0c;编程将变得越来越简单。 在这个大趋势下&#xff0c;大师兄判断未来的编程将真正成为像office工具一样的办公必备技能。每个人通过 &#xff08;专业知识/资源编程&#xff09;将自己变成一个复合型的人才&#xff0c;大大提高生…

量子-经典协同计算新路径:NISQ 时代混合算法对后量子密码学的适应性探索

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨浪味仙 行业动向&#xff1a;3700字丨10分钟阅读 5 月 20 日&#xff0c;由北京量子院、清华大学、数学工程与先进计算国家重点实验室、南洋理工大学、量子信息前沿科学中心…

CentOS中安装Docker Compose

在CentOS中安装Docker Compose的步骤如下&#xff1a; 步骤 1&#xff1a;确保Docker已安装 Docker Compose依赖Docker环境&#xff0c;请先安装Docker&#xff1a; # 添加Docker官方仓库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://downlo…

电商小程序店铺详情页:头部无限分类与筛选功能实现

电商小程序店铺详情页:头部无限分类与筛选功能实现 一、场景需求与技术选型二、头部无限分类导航三、筛选功能实现:Picker多列选择组件一、场景需求与技术选型 在电商小程序生态中,店铺详情页作为用户浏览商品的核心流量入口,其交互效率与功能完整性直接影响商品转化率。传…

Graph Neural Network(GNN)

我们首先要了解什么是图,图是由节点和边组成的,边的不一样也导致节点的不同(参考化学有机分子中的碳原子) gnn可以处理classification的问题,也就是分类的问题 也可以处理generation的问题 借一部日剧来说明,这个日剧是讲主角寻找杀害他父亲的凶手的,剧中的人物有姓名和特征 …

FallbackHome的启动流程(android11)

首次开机开机动画播完进入Launcher桌面时黑屏进入Launcher,有黑屏不太美观&#xff0c;在重启以后会在进入桌面后会显示android正在启动等一会进入Launcher,这就是系统FallBackHome机制 接下来我们跟着代码看下首次启动系统如何进入FallbackHome的 在SystemServer的startOthe…

【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》

Liu S, Zha J, Sun J, et al. EdgeYOLO: An edge-real-time object detector[C]//2023 42nd Chinese Control Conference (CCC). IEEE, 2023: 7507-7512. CCC-2023 源码&#xff1a;https://github.com/LSH9832/edgeyolo 论文&#xff1a;https://arxiv.org/pdf/2302.07483 …

宫格导航--纯血鸿蒙组件库AUI

摘要&#xff1a; 宫格导航(A_GirdNav)&#xff1a;可设置导航数据&#xff0c;建议导航项超过16个&#xff0c;可设置“更多”图标指向的页面路由。最多显示两行&#xff0c;手机每行最多显示4个图标&#xff0c;折叠屏每行最多6个图标&#xff0c;平板每行最多8个图标。多余图…

调试的按钮

在Debug的时候&#xff0c;会有一些按钮&#xff0c;我们需要知道它们各自的作用。 注&#xff1a;调试器本身并没有一个直接的、可以撤销已执行代码效果的“返回上一步&#xff08;Undo Last Step&#xff09;”或“逆向执行&#xff08;Reverse Debugging&#xff09;”按钮…

人工智能如何协助老师做课题

第一步&#xff1a;在腾讯元宝对话框中输入如何协助老师做课题&#xff0c;通过提问&#xff0c;我们了解了老师做课题的步骤和建议。 第二步&#xff1a;开题报告提问&#xff0c;腾讯元宝对话框中&#xff0c;输入“大单元视域下小学数学教学实践研究课题开题报告。”......…

OpenGL Chan视频学习-5 Vertex Attributes and Layouts in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 一、知识点整理 1.1.OpenGL管线工作流程 为显卡提供绘制的所有数据&#xff0c;并将数据存储在GPU内存使用着色器&…

Linux_编辑器Vim基本使用

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

MyBatis 高级映射功能详解:处理复杂数据库关系

MyBatis 的高级映射功能是其强大特性之一&#xff0c;它允许开发者轻松处理数据库中的复杂关系&#xff0c;如一对一、一对多和多对多关系。本文将深入探讨这些高级映射功能&#xff0c;包括映射配置方法、嵌套查询和关联查询的使用&#xff0c;并通过示例代码进行演示。 1.数据…

Halo:一个强大易用的国产开源建站工具

Halo 是一款国产开源的建站工具&#xff0c;适合快速搭建博客、论坛、知识库、公司官网等多种类型的网站&#xff0c;目前在 GitHub 上已经获得了 35.6k Star。 功能特性 Halo 核心功能与优势包括&#xff1a; 插件架构&#xff1a;Halo 采用可插拔架构&#xff0c;功能模块之…

Java-ArrayList集合的遍历方式详解

Java-ArrayList集合的遍历方式详解 二、ArrayList概述三、ArrayList的遍历方式1. 普通for循环遍历2. 增强for循环遍历3. 迭代器遍历4. ListIterator遍历5. Java 8 Stream API遍历 四、性能对比与分析性能测试结果分析 五、遍历方式的选择建议六、常见遍历陷阱与注意事项1. 并发…