向量数据库作为一种新兴的数据存储和检索技术,近年来受到了广泛关注。它能够高效地存储和查询高维向量数据,这使得在文本相似性搜索、推荐系统、图像检索等领域有着广泛的应用前景。

在使用向量数据库进行语义检索之前,文本是怎么一步步变成存储在向量数据库中代表语义信息的向量呢?主要有以下的几个步骤

  1. Chunking (分块):将长文本分割成更小的、更易于处理的片段。
  2. Tokenization (分词):将文本片段分解成一个个独立的词或子词(token)。
  3. Embedding (向量化):将每个 token 转换为一个高维的向量表示,捕捉其语义信息。
  4. Embedding Pooling (向量池化):将一个文本片段中所有 token 的 embedding 聚合成一个代表该片段的向量。
  5. 存储 Embedding 和 Meta 信息:将生成的向量以及相关的元数据存储到向量数据库中。

image.png

Chunk (分块)

当处理较长的文本时,直接进行 embedding 可能会遇到以下问题:

因此,我们需要将长文本分割成更小的块(chunk)。 一个简单的 chunking 方法是按照固定的字符长度进行分割。

def simple_chunk(text, chunk_size=28):
  """
  简单分块方法:按固定字符长度分割文本。
  """
  chunks = [text[i:i + chunk_size] for i in range(0, len(text), chunk_size)]
  return chunks

text = "This is an example sentence Each sentence is converted"
chunks = simple_chunk(text)
print(chunks)

但是这样会导致切分出来的chunk语义不完整等问题,可以按照下面的方案继续优化:

这部分推荐阅读这篇文章:https://github.com/FullStackRetrieval-com/RetrievalTutorials/blob/main/tutorials/LevelsOfTextSplitting/5_Levels_Of_Text_Splitting.ipynb