大模型知识问答: 文本分块要点总结

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。

针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。

总结链接如下:

《大模型面试宝典》(2024版) 发布!


本文介绍LLM知识问答中文本分块的相关内容。

图片

一、字符切分

Langchain的CharacterTextSplitter,直接按给定的chunk_size(块内最大字符数量)去生硬切分文本块,不考虑文本结构,为了保证文本块之间的上下文联系,基于chunk_overlap(块重叠字符数量)去控制文本块之间的重叠字数,注意,在英文里是按字母数考虑字符数量。当然,也能设置分隔符separator去分割。

图片

图:字符切分

二、句子切分

Llama_index的SentenceSplitter,针对句子层面切分文本块,并且还提供父子节点关系。

三、递归字符切分

Langchain的RecursiveCharacterTextSplitter,默认分割符:[“\n\n”, “\n”, " ", “”](分别代表段落分隔符、换行符、空格、字符),拆分器首先查找两个换行符(段落分隔符)。一旦段落被分割,它就会查看块的大小,如果块太大,那么它会被下一个分隔符分割。如果块仍然太大,那么它将移动到下一个块上,以此类推。因为某些书写系统没有单词边界,例如中文、日语和泰语等,所以可以增加以下分隔符:[‘\n\n’, ‘\n’, ’ ', ‘.’, ‘,’, ‘\u200b’, ‘,’, ‘、’, ‘.’, ‘。’, ‘’]。

图片

图:递归字符切分

四、按文件风格切分

除了简单的平文本文档,对于其他不同格式的文件(比如HTML, Markdown, PDF等),采用不同的方式切分。比如:

- Markdown: 可以按照#来判断标题级别进行切分,也可以标题块下叠加字符切块;

- Python等代码文件: 可以按照class、def等切分出不同块;

- PDF: 用Unstructured库解析PDF文件,除文本外,表格也能很好抽取出来,由于表格向量化不具备较好的语义信息,一般开发者会将抽取出的表格先做总结,将表格总结向量化加入检索池中,若检索到该表格,则将原始表格喂入LLM内。

- 图片: 有好多做法,比如如果图片具有文本信息,可以直接OCR识别后的文字作为该图片的文本块。如果该图片不具备文本信息,可以用多模态大模型对图片生成图片描述或总结,当然也能用图片embedding,如CLIP。这里不太属于文本分块的讨论范畴,后面会再做分享;

- HTML: 按元素级别拆分文本,并给每个文本块添加元素级别的元数据,能将具有相同元数据的元素组合再一起。

五、语义切分

1、基于Embedding

Langchain的SemanticChunker,由Greg Kamradt提出[1],有2种方式:

(1)具有位置奖励的层次聚类: Greg想看句子嵌入的层次聚类会如何。但由于发现他选择按句子进行拆分时,有时会在长句子之后出现短小句子。这些尾随的短小句子可能可以改变一个块的含义,所以他添加了一个位置奖励,如果它们是彼此相邻的句子,则更有可能形成聚类。最终结果还不错,但调整参数很慢且不理想;

(2)在连续句子之间找到语义断点: 这是一种遍历方法。先从第一个句子开始,得到向量,然后将其与句子2进行比较,然后比较2和3等等。如果出现向量距离大的断点,如果它高于阈值,那么认为它是一个新语义部分的开始。最初Greg尝试对每个句子进行向量化,但结果发现噪音太大。所以最终选取了3个句子的组(一个窗口),然后得到一个嵌入,然后删除第一个句子,并添加下一个句子。这样效果会好一点。

作者推崇的第二种办法,我总结其主要步骤如下:

1)按分隔符切分出句子sentence;

2)对每个句子,把其前后的句子一起合并成一个窗口的句子组合(即上下文关联,单个句子扩充至3个句子combined_sentence);

3)将combined_sentence向量化,得到combined_sentence_embedding;

4)计算位置i和位置i+1之间的combined_sentence_embedding的余弦距离distance_to_next,

5)根据余弦距离的分布设置分割阈值,获取断点;

6)基于断点合并句子进文本块中。

图片

图:基于embedding的语义切分

但实际使用还是小心,因为阈值设置不当,容易发送块内字数过多的问题,对后续LLM检索和回答很不利,建议可以根据文档字数,计算number_of_chunks,然后用此参数去调整语义断点的阈值。

2、基于模型

可以用下一句预测(Next Sentence Prediction, NSP)二分类任务的BERT模型,输入前后两个句子,预测句子彼此之间相邻的可能性,若分数低于阈值,说明语义不太相关,可以分割。我们也知道BERT的预训练目标就是MLM(掩码语言建模)和NSP(下一句预测),其中NSP是用[CLS]做二分类预测,所以我们可以直接调用Google的BERT模型 [4]完成基于模型的语义切分方案。

关于利用BERT做文本分割(Text Segmentation)还有很多其他研究,比如:

(1)2020年Google Research提出的《Text segmentation by cross segment attention》:用BERT获取句子表征,然后再输入BiLSTM或Transformer预测每个句子是否为分割边界;

图片

图:《Text segmentation by cross segment attention》

(2)2021年阿里语音实验室在提出的SeqModel模型《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》: 如下图所示,先分句,然后对句子分词,获取token、segment、position embedding后做element-wise求和,再加上发音embedding后喂入BERT编码器,对输出做平均池化,接入softmax输出分类判断每个句子是否为段落边界。为什么加入发音embedding?因为该模型提出的出发点是解决对长会议ASR生成的文本缺乏段落结构的问题。像ASR会出现写转写错误,比如发音相似但含义不同的声学混淆词等。所以把字的发音信息(通过中文发音表查)来增强文本分割模型输入的表征向量(即phone embedding)。

同时,提出了自适应滑窗提升推理速度,就是基于模型预测的段落分割点,去滑动窗口,如下图所示。

图片

图:《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》

以上阿里的SeqModel开源了,我用过SeqModel,说实话一些细节上的体验不是很好,比如带小数点的数字会被误切分。

六、Agent 式切分

我用可以尝试使用LLM做语义切分,其中被讨论最多是腾讯AI Lab在2023年提出的Propositionizer [2],它好处在于能解决文本中指代消解的问题,比如"it", “he”, “she”, “they”, “this”, "that”指代的实体全称是什么,而且分解成比句子还更细粒度且信息稠密的命题(Proposition),加入文本分块。效果如下图所示:

图片

图:在Wikipedia文本上,三种不同细粒度的检索单元(其中,a)段落块不超过100个字,句子by句子的添加进段落块,确保句子不被强行字符分割,最后一个块少于50字,会和历史句子合并,避免过于小的段落块。b)句子块用Python的SpacCy en_core_web_lg模型做分句,c)命题块则使用Propositionizer模型)

作者实现Propositionizer的步骤如下:

1)从英文Wikipedia拉取2021-10-13至今的数据;

2)对GPT-4做指令微调(Proposition定义和1-shot展示),将段落块作为输入,要求LLM输出一系列命题;

3)将获取并过滤后的4.3万对”段落-to-命题“,作为种子集微调Flan-T5-large模型。

可惜的是,开源的Propositionizer受限于训练语料,仅支持英文。

七、其他文本块优化点

在实践中,我们常发现一些问题,比如:

(1)上下文的关联信息跨度大或信息稀疏,导致文本块内信息密度低。 举例:聊天记录,或某文章分点记录各内容时,用户向该文章提问有哪些分点内容或层次结构。

(2)标题信息过短,导致文本块向量化后,标题语义信息被文本块内其他内容给模糊了。 具体:某文本块内包含标题5个字,标题下内容有300字。

(3)用户提问内容涉及跨多个文件做检索和整合回答时,大多数文本分块方法不具备跨文件关联。

为了解决以上问题,也有对应一些优化手段。

1、摘要增强

用较大chunk_size去字符切分文本,然后对大文本块用LLM做总结,作为摘要块加入向量数据库中。能在一定程度解决前面提到的问题1。

2、标题增强

将标题下的相应文本块,都加入标题前缀,并且重复多几次标题。如:block = concat(’#’.join([title]*3), content_under_title)。能解决前面提到的问题2。

3、假设性问题生成

基于给定的文本块,生成假设性问题,将生成的问题和对应文本块加入检索内容中。Langchain有个Hypothetical Queries方法[3]可调用。能解决前面提到问题1中的聊天记录场景下的信息稀疏问题。其实说直白了,不就是QA对的生成吗?往往好的QA对比文本块更容易被检索到。想要往这方面深入扩展,可以参考Ragas的TestsetGenerator(一套用LLM生成QA的Prompts工程)。

4、父文档检索器

其实父文档检索器简单理解是利用不同chunk_size去分块,先将原始文档拆分成较大块,再对较大块拆分成较小块,然后对较小块进行索引向量检索,最后返回的是相似度高的较小块下的父文本较大块。这样的好处是:较小块语义含义更精准,其父文本块又能保留到足够长的上下文信息。能解决前面提到的问题1。Langchain有ParentDocumentRetriever,llama_index有HierarchicalNodeParser。

5、知识图谱

如果你的数据具有丰富的实体和实体间的关系,建议转换成知识图谱。如果不想手动整理图谱,可以用Langchain的LLMGraphTransformer,利用LLM解析和分类文本中的实体和实体间的关系。能解决前面提到的问题3。

参考资料

[1] 5_Levels_Of_Text_Splitting - Greg Kamradt, 代码:https://github.com/FullStackRetrieval-com/RetrievalTutorials/blob/main/tutorials/LevelsOfTextSplitting/5_Levels_Of_Text_Splitting.ipynb

[2] Dense X Retrieval: What Retrieval Granularity Should We Use? 论文: [2312.06648] Dense X Retrieval: What Retrieval Granularity Should We Use? (arxiv.org),代码:https://github.com/chentong0/factoid-wiki

[3] Hypothetical Queries, 文档:MultiVector Retriever | 🦜️🔗 LangChain

[4] Bert - Google, 代码:google-bert/bert-base-uncased ·拥抱脸 (huggingface.co)

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

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

相关文章

C++ 信号量和锁的区别

网上关于信号量和锁的区别&#xff0c;写的比较官方晦涩难懂&#xff0c;对于这个知识点吸收难&#xff0c;通过示例&#xff0c;我们看到信号量&#xff0c;可以控制同一时刻的线程数量&#xff0c;就算同时开启很多线程&#xff0c;依然可以的达到线程数可控 #include <i…

初识c++(命名空间,缺省参数,函数重载)

一、命名空间 1、namespace的意义 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全 局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名 冲突…

世界商用飞机机型大全-使用Java抓取FlightAware后的答案

目录 前言 一、数据说明 1、实时航班飞机机型数据 2、网页结构分析 二、使用Java进行信息抓取 1、定义页面PageVO对象 2、爬取属性定义 3、启动信息抓取组件 三、成果分析 1、商业飞行的飞机机型的种类 2、飞机种类排名前十名 3、航班数排名后十名 4、看中国国产大飞…

你真的会信息收集嘛,4k字渗透测试信息收集10大技巧

前言 在渗透测试中&#xff0c;信息收集是非常关键的一步&#xff0c;它为后续的漏洞发现和利用提供了重要的基础。以下是非常详细的信息收集方式&#xff1a; 一、被动信息收集 被动信息收集是指在不与目标系统直接交互的情况下&#xff0c;通过公开渠道获取目标系统的相关…

基于51单片机的四路抢答器Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中&#xff0c;51单片机充当了核心控制器的角色&#xff0c;通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作&#xff0c…

力扣-贪心算法4

406.根据身高重建队列 406. 根据身高重建队列 题目 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或…

MyBatis的简介与使用

Mybatis JDBC操作数据库的缺点 存在大量的冗余代码。手工创建 Connection、Statement 等&#xff0c;效率低下。手工将结果集封装成实体对象。查询效率低&#xff0c;没有对数据访问进行优化。 Mybatis框架 简介 MyBatis 本是 apache 的一个开源项目 iBatis, 2010年这个项目由…

imx6ull/linux应用编程学习(14) MQTT基础知识

什么是mqtt&#xff1f; 与HTTP 协议一样&#xff0c; MQTT 协议也是应用层协议&#xff0c;工作在 TCP/IP 四层模型中的最上层&#xff08;应用层&#xff09;&#xff0c;构建于 TCP/IP协议上。 MQTT 最大优点在于&#xff0c;可以以极少的代码和有限的带宽&#xff0c;为连接…

网络资源模板--Android Studio 外卖点餐App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 原创外卖点餐&#xff1a;基于Android studio 实现外卖(点)订餐系统 非原创奶茶点餐&#xff1a;网络资源模板--基于 Android Studio 实现的奶茶点餐App报告 一、项目演示 网络资源模板--基于Android …

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 Docker 服务

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 准备…

信息技术课上的纪律秘诀:营造有序学习环境

信息技术课是学生们探索数字世界的乐园&#xff0c;但同时也是课堂纪律管理的挑战场。电脑、网络、游戏等元素可能分散学生的注意力&#xff0c;影响学习效果。本文将分享一些有效的策略&#xff0c;帮助教师在信息技术课上维持课堂纪律&#xff0c;确保教学活动顺利进行。 制…

几何建模基础-样条曲线和样条曲面介绍

1.概念介绍 1.1 样条曲线的来源 样条的英语单词spline来源于可变形的样条工具&#xff0c;那是一种在造船和工程制图时用来画出光滑形状的工具&#xff1a;富有弹性的均匀细木条/金属条/有机玻璃条&#xff0c;它围绕着按指定位置放置的重物或者压铁做弹性弯曲&#xff0c;以…

基于LangChain的RAG开发教程(二)

v1.0官方文档&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文档&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…

植物大战僵尸融合嫁接版 MAC 版本下载安装详细教程

继植物大战僵尸杂交版火了之后&#xff0c;PVZ改版可谓是百花齐放&#xff0c;最近又有一个非常好玩的模式被开发出来了&#xff0c;他们称为《植物大战僵尸融合嫁接版》 该版本并没有对植物卡牌做改动&#xff0c;而是可以将任意两种植物叠放到一起进行融合&#xff0c;产生新…

思路打开!腾讯造了10亿个角色,驱动数据合成!7B模型效果打爆了

世界由形形色色的角色构成&#xff0c;每个角色都拥有独特的知识、经验、兴趣、个性和职业&#xff0c;他们共同制造了丰富多元的知识与文化。 所谓术业有专攻&#xff0c;比如AI科学家专注于构建LLMs,医务工作者们共建庞大的医学知识库&#xff0c;数学家们则偏爱数学公式与定…

数据分析与挖掘实战案例-电商产品评论数据情感分析

数据分析与挖掘实战案例-电商产品评论数据情感分析 文章目录 数据分析与挖掘实战案例-电商产品评论数据情感分析1. 背景与挖掘目标2. 分析方法与过程2.1 评论预处理1. 评论去重2. 数据清洗 2.2 评论分词1. 分词、词性标注、去除停用词2. 提取含名词的评论3. 绘制词云查看分词效…

昇思25天学习打卡营第12天 | LLM原理和实践:MindNLP ChatGLM-6B StreamChat

1. MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 ChatGLM-6B应该是国内第一个发布的可以在消费级显卡上进行推理部署的国产开源大模型&#xff0c;2023年3月就发布了。我在23年6月份的时候就在自己的笔记本电脑上部署测试过&#xff0c;当…

UI自动化测试框架:PO 模式+数据驱动(超详细)

1. PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 PO 模式的设计思想与…

Python学习中进行条件判断(if, else, elif)

条件判断是编程中必不可少的一部分&#xff0c;它让程序可以根据不同的条件执行不同的代码块。在Python中&#xff0c;主要使用if、elif和else语句来实现条件判断。 基本语法 在Python中&#xff0c;条件判断的基本语法如下&#xff1a; if condition:# 当condition为True时…

NCCL 中的一些辅助debug 知识点

1&#xff0c;调试nccl 启动kernel的方法 ncclLaunchKernel cuLaunchKernelEx ncclStrongStreamLaunchKernel cudaLaunchKernel ncclLaunchOneRank cudaLaunchKernel 在 nccl lib 中&#xff0c;不存在使用<<<grid, block,,>>> 这种类似方式启…