文本分块
2.13 版本引入
在 AI 搜索中处理大型文本文档时,通常需要将它们拆分成更小的片段,因为大多数嵌入模型都有词元长度限制。这个过程称为文本分块,通过确保每个嵌入表示一个符合模型限制的聚焦内容片段,有助于保持向量搜索结果的质量和相关性。
要将长文本拆分成片段,您可以使用 text_chunking
处理器作为 text_embedding
或 sparse_encoding
处理器的预处理步骤,以获取每个分块片段的嵌入。有关处理器参数的更多信息,请参阅文本分块处理器。在开始之前,请按照预训练模型文档中概述的步骤注册一个嵌入模型。以下示例通过将文本拆分成片段,然后使用 text_embedding
处理器生成嵌入。
步骤 1:创建管道
以下示例请求创建了一个摄取管道,将 passage_text
字段中的文本转换为分块片段,这些片段将存储在 passage_chunk
字段中。passage_chunk
字段中的文本随后被转换为文本嵌入,嵌入则存储在 passage_embedding
字段中
PUT _ingest/pipeline/text-chunking-embedding-ingest-pipeline
{
"description": "A text chunking and embedding ingest pipeline",
"processors": [
{
"text_chunking": {
"algorithm": {
"fixed_token_length": {
"token_limit": 10,
"overlap_rate": 0.2,
"tokenizer": "standard"
}
},
"field_map": {
"passage_text": "passage_chunk"
}
}
},
{
"text_embedding": {
"model_id": "LMLPWY4BROvhdbtgETaI",
"field_map": {
"passage_chunk": "passage_chunk_embedding"
}
}
}
]
}
步骤 2:创建用于摄取的索引
为了使用摄取管道,您需要创建一个向量索引。passage_chunk_embedding
字段必须是 nested
类型。knn.dimension
字段必须包含您模型的维度数
PUT testindex
{
"settings": {
"index": {
"knn": true
}
},
"mappings": {
"properties": {
"text": {
"type": "text"
},
"passage_chunk_embedding": {
"type": "nested",
"properties": {
"knn": {
"type": "knn_vector",
"dimension": 768
}
}
}
}
}
}
步骤 3:将文档摄取到索引中
要将文档摄取到上一步创建的索引中,请发送以下请求
POST testindex/_doc?pipeline=text-chunking-embedding-ingest-pipeline
{
"passage_text": "This is an example document to be chunked. The document contains a single paragraph, two sentences and 24 tokens by standard tokenizer in OpenSearch."
}
步骤 4:搜索索引
您可以使用 nested
查询对索引执行向量搜索。我们建议将 score_mode
设置为 max
,其中文档分数设置为所有片段嵌入中的最高分数
GET testindex/_search
{
"query": {
"nested": {
"score_mode": "max",
"path": "passage_chunk_embedding",
"query": {
"neural": {
"passage_chunk_embedding.knn": {
"query_text": "document",
"model_id": "-tHZeI4BdQKclr136Wl7"
}
}
}
}
}
}
后续步骤
- 浏览我们的教程,了解如何构建 AI 搜索应用程序。