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

2024-08-28 01:04

本文主要是介绍【大模型LLMs】文本分块Chunking调研LangChain实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【大模型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, RecursiveCharacterTextSplitterdef 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_listdef 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:returnchunking_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:returnchunking_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 HuggingFaceBgeEmbeddingsdef 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_listdef 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)

在这里插入图片描述

这篇关于【大模型LLMs】文本分块Chunking调研LangChain实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113289

相关文章

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.