趋近智
有效的语义搜索在很大程度上依赖于输入到嵌入 (embedding)模型的数据的质量和格式。原始数据,无论是从网站抓取、从文档提取还是从数据库获取,通常都无法直接用于向量 (vector)化。就像生食材烹饪前需要准备一样,您的数据也需要在有效嵌入和索引前进行清洗和结构化。本节主要介绍数据准备的关键步骤,以及将大量信息分割成可管理、语义相关的块的处理方法。妥善处理这个阶段对于构建能够根据含义获取真正相关结果的搜索系统来说非常重要。
在考虑分割数据之前,我们必须确保数据是干净的。嵌入 (embedding)模型功能强大,但对噪声很敏感。文本中不相关的内容会稀释所得向量 (vector)中捕获的语义含义,导致搜索结果的准确性降低。常见的清洗步骤包括:
<p>、<div>)、CSS样式、JavaScript代码、网站导航栏、页眉、页脚、广告以及不构成内容核心含义的样板文本。这里通常会使用正则表达式或专门的HTML解析库(例如Python中的BeautifulSoup)。数据的大小是为嵌入 (embedding)模型准备数据时的一个主要考量。当前大多数嵌入模型,特别是基于Transformer的模型,都有最大输入序列长度限制,通常以tokens(大致对应于词或子词 (subword))来衡量。例如,许多BERT变体的限制是512个tokens。尝试嵌入远超此限制的文档,将导致错误,或者更常见的是截断——模型会直接忽略超出其限制的文本,从而丢失有价值的信息。
除了这个技术限制,还有重要的语义原因需要分块:
因此,将大型文档分解为更小、更连贯的块是构建语义搜索系统中一种普遍且必要的做法。
分块的目的是创建足够小、适合嵌入 (embedding)模型,同时尽可能保留语义上下文 (context)的文本片段。没有唯一的“最佳”方法;最适合的方法取决于您的数据性质和应用程序的需求。以下是常见的分块技术:
这是最简单的方法:将文本分割成固定长度的片段,长度可以按字符或tokens衡量。
为了减轻固定大小分块中上下文丢失的问题,一种常见的改进方法是在连续块之间引入重叠。
可视化比较有重叠和无重叠的分块。重叠的块(底部)共享部分内容(深蓝色),以在边界处保持上下文。
\n\n)、句子(使用NLTK或spaCy等NLP句子分词 (tokenization)器 (tokenizer)),或由标题或其他标记 (token)指示的逻辑部分。这通常是一种实用且有效的折衷办法,旨在尊重语义边界,同时将块保持在大小限制内。
["\n\n", "\n", ". ", " ", ""])。尝试使用第一个分隔符分割文本。如果任何结果块仍然过大,则将列表中的下一个分隔符递归应用于这些过大的块。继续此过程,直到所有块都低于所需的大小限制。通常与重叠结合使用。最好的分块方法取决于几个因素:
通常会尝试不同的分块方法和参数 (parameter)(块大小、重叠),并使用本章后续讨论的指标评估它们对下游搜索性能的影响。
比较显示,与简单的固定大小方法相比,更具上下文 (context)感知能力的分块方法可能会带来更好的搜索相关性评分。实际结果很大程度上取决于数据和任务。
TextSplitter实现(如RecursiveCharacterTextSplitter, MarkdownTextSplitter等)。NLTK和spaCy等NLP库提供句子分词 (tokenization)功能。总之,准备和分块您的数据不只是一项初步工作;它是构建语义搜索系统中的一个关键设计环节。细致的清洗可以去除噪声,而有效的分块则能确保您的数据符合模型限制,并生成集中、语义有意义的向量。在这里做出的选择直接影响最终搜索结果的粒度和相关性。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造