【大模型LLMs】文本分块Chunking调研LangChain实战

news2024/12/25 22:09:26

【大模型LLMs】文本分块Chunking调研&LangChain实战

  • Chunking策略类型
    • 1. 基于规则的文本分块
    • 2. 基于语义Embedding分块
    • 3. 基于端到端模型的分块
    • 4. 基于大模型的分块
  • Chunking工具使用(LangChain)
    • 1. 固定大小分块(字符&token)
    • 2. 语义分块

总结目前主流的文本分块chunking方法,给出LangChain实现各类chunking方法的示例

Chunking策略类型

1. 基于规则的文本分块

  • 固定大小分块: 按照固定大小的字符数目/token数目以及特定的分隔符对文本进行切分,是最常见的分块方式,简单直接,不依赖NLP能力,成本低易于使用
    • chunk_size: 块大小
    • chunk_overlap: 重叠字符数目,允许不同块之间存在重复内容,以保证语义上下文的一致性和连贯性
    • tokenizer: 分词模型(非必需,直接用原字符分块则无需tokenizer)
  • 内容感知分块: 考虑文本本身的 语法/句法结构(显式的分隔符) 进行分块
    • 依赖显式的分隔符进行切块: 常用的标点符号、空格字符、换行符等
    • 依赖各类工具库: NLTK、spaCy等
  • 结构感知分块: 主要针对MarkdownHTML等具有明确结构格式的文档,对文本进行解析
  • 递归分块: 递归分块首先尝试按照一定的标准(如段落或标题)分割文本,如果分割后的文本块仍然过大,就会在这些块上重复进行分割过程,直到所有块的大小都符合要求

2. 基于语义Embedding分块

本质是基于滑动窗口的思想,依次计算相邻的两句话之间的语义相似度,满足阈值的视为表示同样的语义/主题,会划分到同一个块中,不满足阈值的则进行切分。

  • 文本表征: 基于BERT、OpenAI的Embedding model等预训练模型对所有文本进行embedding,获得文本的语义特征向量
  • 语义分析: 通过余弦相似度等方式计算两句话之间的语义关系
  • 分块决策: 判断两句话之间是否需要分块,一般基于语义相似度,超过阈值则划分至同一个块,反之则切分;尽量保证每个分块的语义独立和完整

3. 基于端到端模型的分块

  • NSP: 使用BERT模型的 下一句预测任务(Next Sentence Prediction,NSP) 判断两句话之间是否需要切分
  • Cross-Segment: 采用跨片段的注意力机制来分析文本。首先利用BERT模型获取句子的向量表示,然后将连续多个句子的向量表示输入到另一个BERT或者LSTM模型中,一次性预测每个句子是否为分块的边界
    在这里插入图片描述
  • SeqModel:在Cross-Segment基础上,增强了上下文表示,并通过自适应滑动窗口的思想提高模型速度。相比Cross-Segment,SeqModel 可以同时处理更多句子,通过自注意力机制建模更长上下文和句子间的依赖关系
    在这里插入图片描述

4. 基于大模型的分块

基本等效于single-document的summarization extraction任务,参考LLMs-based Summarization方法,通过知识蒸馏或提示工程的方式,让LLMs抽取文本中的要点

  • 基于知识蒸馏的方法: 一般采用teacher-student架构,由GPT4类参数规模较大的LLMs作为teacher,从全文中抽取摘要作为“标准答案”,作为训练语料微调Llama2-7B类参数规模较小的LLMs(student)
  • 基于CoT的方法: 设置预制问题/Plan规划等,让大模型按照要求给出回复

Chunking工具使用(LangChain)

1. 固定大小分块(字符&token)

from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter

def get_document_text(doc_path_list: list[str]) -> list[str]:
    text_list = []
    for doc_path in doc_path_list:
        with open(doc_path, 'r', encoding='utf-8') as f:
            text = f.read()
        text_list.append(text)
    return text_list

def character_chunking(text_list: list[str], character_type: str="char"):
    if character_type == "char":
        # 字符级
        text_splitter = CharacterTextSplitter(
            chunk_size=512, 
            chunk_overlap=128, 
            separator="\n", 
            strip_whitespace=True
        )
    elif character_type == "token":
        # token级别
        text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
            model_name="gpt-4",
            chunk_size=512, 
            chunk_overlap=128, 
            separator="\n", 
            strip_whitespace=True
        )
    else:
        return
    
    chunking_res_list = text_splitter.create_documents(text_list)
    for chunking_res in chunking_res_list:
        print(chunking_res)
        print("*"*100)

def recursive_character_chunking(text_list: list[str], character_type: str="char"):
    if character_type == "char":
        # 字符级
        text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=512, 
            chunk_overlap=128, 
            separators=["\n\n", "\n", "。", ".", "?", "?", "!", "!"], 
            strip_whitespace=True
        )
    elif character_type == "token":
        # token级别
        text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
            model_name="gpt-4",
            chunk_size=512, 
            chunk_overlap=128, 
            separators=["\n\n", "\n", "。", ".", "?", "?", "!", "!"], 
            strip_whitespace=True
        )
    else:
        return

    chunking_res_list = text_splitter.create_documents(text_list)
    for chunking_res in chunking_res_list:
        print(chunking_res)
        print("*"*100)

if __name__ == "__main__":
    doc_path_list = [
        '../data/chunking_test.txt'
    ]
    text_list = get_document_text(doc_path_list)
    # character_chunking(text_list)
    recursive_character_chunking(text_list, character_type="token")

在这里插入图片描述

2. 语义分块

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_community.embeddings import HuggingFaceBgeEmbeddings

def get_document_text(doc_path_list: list[str]) -> list[str]:
    text_list = []
    for doc_path in doc_path_list:
        with open(doc_path, 'r', encoding='utf-8') as f:
            text = f.read()
        text_list.append(text)
    return text_list

def semantic_chunking(text_list: list[str]): 
    # embeddings = OpenAIEmbeddings()  # 使用openai模型
    embeddings = HuggingFaceBgeEmbeddings(  
        model_name = '../../../model/bge-base-zh-v1.5'
    ) # 使用huggingface的bge embeddings模型
    text_splitter = SemanticChunker(
        embeddings = embeddings,
        breakpoint_threshold_type = "percentile",  # 百分位数
        breakpoint_threshold_amount = 30,  # 百分比
        sentence_split_regex = r"(?<=[。?!])\s+"  # 正则,用于分句
    )
    chunking_res_list = text_splitter.create_documents(text_list)
    for chunking_res in chunking_res_list:
        print(chunking_res)
        print("*"*100)

if __name__ == "__main__":
    doc_path_list = [
        '../data/chunking_test.txt'
    ]
    text_list = get_document_text(doc_path_list)
    semantic_chunking(text_list)

在这里插入图片描述

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

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

相关文章

IC-Light还原细节的节点 DetailTransfer使用时报错-comfyui

&#x1f388;问题描述 今天在调试一个工作流节点的时候&#xff0c;遇到一个问题&#xff1a; Error occurred when executing DetailTransfer: The size of tensor a (848) must match the size of tensor b (853) at non-singleton dimension 2 File "F:\ComfyUI-aki\…

Volvo EDI 项目测试流程详解

近期知行帮助多个供应商成功对接Volvo EDI&#xff0c;这些案例中&#xff0c;供应商收到Volvo发来的EDI需求是基本一致的&#xff1a; 传输协议选择OFTP报文标准选择EDIFACT业务单据包括&#xff1a;DELFOR交付预测以及DESADV发货通知 扩展阅读&#xff1a;汽车EDI&#xff…

车规级CAN总线外围电路设计方案

目录 1、共模电感 1.1、电感值 1.2、泄漏电感 1.3、直流电阻 1.4、CMC的模式转换特性 2、终端分立电阻 3、总线电容 4、ESD保护二极管 在汽车领域&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题一直备受瞩目。相较于传统汽车&#xff0c;新能源汽车的EMC挑战更…

如何使用ssm实现社区智慧养老监护管理平台+vue

TOC ssm270社区智慧养老监护管理平台vue 系统概述 1.1 研究背景 智慧养老是面向居家老人、社区及养老机构的传感网系统与信息平台&#xff0c;并在此基础上提供实时、快捷、高效、低成本的&#xff0c;物联化、互联化、智能化的养老服务。 随着科技进步&#xff0c;新型养…

无法启动此程序,因为计算机中丢失dll,整理了7种解决方法!

当电脑出现“无法启动此程序&#xff0c;因为计算机中丢失dll”的错误弹窗时&#xff0c;这通常意味着系统中的DLL文件出现了缺失或错误。DLL文件是动态链接库文件&#xff0c;它们在软件运行中起着至关重要的作用。 造成dll文件缺失和错误的原因有很多&#xff0c;大部分问题都…

git clone 别人的项目上传到自己的Gitee或者github仓库

git clone别人的项目 git clone https://github.com/wohuweixiya/yft-design.git 进入该项目内&#xff0c;删除原有的.git信息 rm -r .git 初始化.git git init 将本地代码添加到仓库 git add . git commit -m "提交仓库说明" Github上新建一个和这个clone下来…

【快速选择算法】解决TopK问题中前K小的数字问题

目录 1.前言2.题目简介3.求解思路4.示例代码 1.前言 在一个数组中找到这个数组前K小的数字有三种方式&#xff1a; 排序 O(N*logN)堆排序&#xff1a;建立一个k个大小的大堆(如果是找前K大的数字的话用小堆) O(N*logK)快速选择算法&#xff1a;原地交换数字&#xff0c;使得该…

数据结构---单链表(常见的复杂操作)

目录 一、单链表 1.1.查找中间元素 1.2.查找倒数第K个节点 1.3.链表倒置 1.4.冒泡排序 1.5.选择排序 1.6.环&#xff0c;确认有环单链表的环入口和环大小 二、总结 一、单链表 1.1.查找中间元素 定义两个指针&#xff0c;分别指向第一个元素&#xff0c;第一个指针每次向后…

开源的工作流系统突出优点总结

当前&#xff0c;想要实现高效率的办公&#xff0c;可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品&#xff0c;低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点&#xff0c;在推动企业流程化办公的过程…

在线生成书法字帖,想练习什么字就练习什么字

有没有想练习一个字的时候发现找不到字帖的情况&#xff0c;现在推荐一款在线生成字帖的网站 可选择对应格子类型&#xff0c;生成你想练习的字 在线生成字帖

【简历】25届北京某211JAVA简历:外卖项目要点像玩一样

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份北京某211大学的java简历。上来第一要点还是要先确定求职层次&#xff0c;那211同学就不要想了&#xff0c;就一个目标&#xf…

mysql 死锁 锁表的解决方法

查看那个表锁了 SHOW OPEN TABLES where In_use > 0; show processlist SELECT * FROM information_schema.INNODB_TRX; 查看锁的进程 kill 掉进程id (trx_mysql_thread_id)

CAD中命令和系统变量

屏幕去除菜单全屏显示&#xff1a; ThisDrawing.SendCommand ("CLEANSCREENON ") 恢复原始&#xff1a;ThisDrawing.SendCommand ("CLEANSCREENOFF ") CAD中系统变量决定图形的基本设置。 第一个系统变量&#xff1a;uscicon vba代码如下&#xff1a; …

Flink CDC读取Mysql时,Decimal类型数据异常,变成了字符串(源码解析及解决方案)

1. 问题说明 使用Flink CDC 读取mysql数据时,当表字段为decimal时,读取的数据变成了字符串。 如下示例: 环境: Flink 1.18.0 Flink CDC 3.1.1 mysql 8 mysql的数据如下: 使用Flink CDC读取后的数据如下: 为了方便看,复制出来就是: {“id”:1,“price”:“AZA=”,…

时尚新潮流来袭!Kolors 一键试衣,畅享轻松购物

时尚新潮流来袭&#xff01;Kolors 一键试衣&#xff0c;畅享轻松购物 解决他们的烦恼话不多说&#xff0c;三键拿下Kolors 优点小结 时尚新潮流&#xff1a;虚拟试衣&#xff0c;开启便捷购物之旅&#x1f380; &#x1f31f; 你还在为网购试衣服不合适而烦恼吗&#xff1f;现…

OSI和TCP/IP参考模型、协议与端口、DNS解析类型、数据封装

目录 1.OSI和TCP/IP参考模型 1.1 为什么要进行网络分层&#xff1f; 1.2 TCP/IP和OSI参考模型 1.3 TCP/IP参考模型对应协议 2.对应协议和端口 3.基于IP的封装 4.DNS解析类型 5.数据封装与解封过程分析 5.1 封装 1.OSI和TCP/IP参考模型 1.1 为什么要进行网络分层&am…

人工智能如何将人机交互提升到新水平

随着人工智能模型在语音识别和合成、文本处理和多模态性方面的卓越表现&#xff0c;终极语音用户界面可能很快就会无处不在。欢迎来到雲闪世界。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 那是一个典型的星期五下午&#xff0c;我们刚刚结束了一个…

JNPF V5.0震撼升级,工作流开发全面重塑!

随着企业数字化转型的不断深入&#xff0c;低代码开发平台因其高效、便捷的特性&#xff0c;逐渐成为企业信息化建设的宠儿。作为低代码领域的佼佼者&#xff0c;JNPF低代码开发平台在V5.0版本中&#xff0c;对工作流开发进行了全面的重塑&#xff0c;旨在为企业提供更加灵活、…

【UE 编译】UE C++工程的编译流程、与C++编译的区别

目录 0 引言1 前置知识1.1 模块1.1.1 模块的定义与结构1.1.2. 模块类型1.1.3. 模块的描述文件&#xff1a;Build.cs1.1.4. 模块的编译与链接1.1.5. 模块的动态加载与卸载1.1.6. 模块的依赖与插件1.1.7. 模块的优点 1.2 插件1.2.1 UE插件的结构1.2.2 插件的类型 1.3 ProjectName…

FL Studio 24.1.1.4285官方中文版全新发布,最新功能解析

【功能强大&#xff1a;一站式音乐制作平台】 说到功能&#xff0c;这款软件简直就是全能战士。从录音、编曲到混音、母带处理&#xff0c;FL Studio几乎能涵盖音乐制作的方方面面。而且它还支持多种插件格式&#xff0c;让你的音乐作品更加丰富多彩。 【兼容性强&#xff1a;…