RAG 与知识库面试题图文讲义3781 字

大模型RAG文本分块面试题

·全库 166 / 611

《大模型RAG文本分块面试题》共 8 页、0.4 万字,通篇围绕 LangChain、向量、上下文、数据集 展开,归在「RAG 与知识库」这一层。

覆盖LangChain向量上下文数据集数据库场景

适合手上有一堆资料,要把它变成能问答的知识库的人

目录骨架(2 节)
  1. 一、为什么需要对文本分块?
  2. 二、能不能介绍一下常见的文本分块方法?

原 PDF 已逐页还原成图,共 8 页,这里先放前 3 页。右侧文字由 OCR 按版面重排,可能有个别错字,以图为准;点图可全屏放大。

本讲义目录 · 3 页
  1. 01大模型(LLMs)RAG 版面分析—…
  2. 02’我是一个名为 ChatGLM3-6…
  3. 03在上面例子中,我们并没有采用任何特定…
011 / 3
第 1 页
第 1 页

大模型(LLMs)RAG 版面分析—…

  • 大模型(LLMs)RAG 版面分析——文本分块面
  • 一、为什么需要对文本分块?
  • 二、能不能介绍一下常见的文本分块方法?
  • 2.1 一般的文本分块方法
  • 2.2 正则拆分的文本分块方法
  • 2.3 Spacy Text Splitter 方法
  • 2.4 基于 langchain 的 CharacterTextSplitter 方法
  • 2.5 基于 langchain 的递归字符切分方法
  • 2.6 HTML 文本拆分方法
  • 2.7 Mrrkdown 文本拆分方法
  • 2.8 Python 代码拆分方法
  • 2.9 LaTex 文本拆分方法

一、为什么需要对文本分块?

  • 使用大型语言模型(LLM)时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。 考虑以下场景:你面临一个几百页的文档,其中充满了文字,你希望对其进行摘录和问答式处 理。在这个流程中,最初的一步是提取文档的嵌入向量,但这样做会带来几个问题:
  • 信息丢失的风险:试图一次性提取整个文档的嵌入向量,虽然可以捕捉到整体的上下文,但也 可能会忽略掉许多针对特定主题的重要信息,这可能会导致生成的信息不够精确或者有所缺 失。
  • 分块大小的限制:在使用如 OpenA 这样的模型时,分块大小是一个关键的限制因素。例如, GPT-4 模型有一个 32K 的窗口大小限制。尽管这个限制在大多数情况下不是问题,但从一开始 就考虑到分块大小是很重要的。 因此,恰当地实施文本分块不仅能够提升文本的整体品质和可读性,还能够预防由于信息丢失或不 当分块引起的问题。这就是为何在处理长篇文档时,采用文本分块而非直接处理整个文档至关重要 的原因。

二、能不能介绍一下常见的文本分块方法?

2.1 一般的文本分块方法

如果不借助任何包,直接按限制长度切分方案: text = ”我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发的。我的目标是通过回答用户提出的问题来帮助他们 解决问题。由于我是一个计算机程序,所以我没有实际的存在,只能通过互联网来与用户交

chunks = []

022 / 3
第 2 页
第 2 页

’我是一个名为 ChatGLM3-6…

chunk size = 128

for i in range (0, len (text),chunk_size): chunk = text [ i:i + chunk_size ] chunks. append (chunk) chunks

’我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学 KEG 实验室和智谱 AI 公 司于 2023 年共同训练的语言模型开发的。我的目标是通过回答用户提出的问题来帮助他们解 决问题。由于我是一个计算机程序,所以我没有实际的存在,只能通过互联网’, ’来与用户交流。’

2.2 正则拆分的文本分块方法 •动机:【一般的文本分块方法】能够按长度进行分割,但是对于一些长度偏长的句子,容易从

  • 方法:在中文文本分块的场景中,正则表达式可以用来识别中文标点符号,从而将文本拆分成 单独的句子。这种方法依赖于中文句号、“问号”、“感叹号“等标点符号作为句子结束的标志。
  • 特点:虽然这种基于模式匹配的方法可能不如基于复杂语法和语义分析的方法精确,但它在大 多数情况下足以满足基本的句子分割需求,并且实现起来更为简单直接。

import re

def split_sentences (text): # 使用正则表达式匹配中文句子结束的标点符号 sentence_delimiters = re.compile (u'[。?!;] I\n') sentences = sentence_delimiters.split (text) # 过滤掉空字符串 sentences = [ s.strip ()for s in sentences if

sentences

text =”文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更

小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词 短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。” sentences = split_sentences (text)

print (sentences)

#output

’文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更 小、更易于处理的片段”, ’这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其 他语义单位’, ’这样做有助于更高效地从文本中提取关键信息’

s.strip (]

033 / 3
第 3 页
第 3 页

在上面例子中,我们并没有采用任何特定…

在上面例子中,我们并没有采用任何特定的方式来分割句子。另外,还有许多其他的文本分块技术 可以使用,例如词汇化(tokenizing)、词性标注(POS tagging)等。 2.3 Spacy Text Splitter 方法

•介绍:Spacy 是一个用于执行自然语言处理(NLP)各种任务的库。它具有文本拆分器功能, 能够在进行文本分割的同时,保留分割结果的上下文信息。

import spacy

input_text = “文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切 割成更小、更易于处理的片段。这种分割通常是基于单词的词性和语法结构,例如将文本拆分 为名词短语、动词短语或其他语义单位。这样做有助于更高效地从文本中提取关键信息。”

doc = nlp (input_text) for s in doc.sents: print (s)

’文本分块是自然语言处理(NLP)中的一项关键技术,其作用是将较长的文本切割成更 小、更易于处理的片段。’, ”这种分割通常是基于单词的词性和语法结构,例如将文本拆分为名词短语、动词短语或其 他语义单位。”, “这样做有助于更高效地从文本中提取关键信息。”

2.4 基于 langchain 的 CharacterTextS plitter 方法 使用 CharacterTextSplitter,一般的设置参数为:chunk_size、chunk_overlap、separator 和 strip_whitespace。 from langchain. text_splitter import CharacterTextSplitter text_splitter = CharacterTextSplitter (chunk_size = 35, chunk_overlap=0, separator='’,strip_whitespace=False) text_splitter.create_documents ([ text ])

Document (page_content=’我是一个名为 ChatGLM3-6B 的人工智能助手,是基于清华大学

Document (page_content='KBG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开

Document (page_content=’的。我的目标是通过回答用户提出的问题来帮助他们解决问题。 由于我是一个计’), Document (page_content=’算机程序,所以我没有实际的存在,只能通过互联网来与用户交

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求