高级分割方法

使用 LangChain 的 Retrieval Augmented Generation (RAG)

Meri Nova

Machine Learning Engineer

当前分割策略的局限

 

  1. 🤦 分割较为朴素(不感知上下文)

    • 忽略周围文本的上下文
  2. 🖇 基于字符而非token分割

    • 模型按 token 处理文本
    • 有超出上下文窗口的风险

 

SemanticChunker

 

TokenTextSplitter

使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

基于字符数量将文本切成块的分割器。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

基于 token 数量将文本切成块的分割器。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

高亮显示的 token 对齐 chunk_size 和 chunk_overlap 的取值。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

import tiktoken
from langchain_text_splitters import TokenTextSplitter
example_string = "Mary had a little lamb, it's fleece was white as snow."

encoding = tiktoken.encoding_for_model('gpt-4o-mini')
splitter = TokenTextSplitter(encoding_name=encoding.name,
                             chunk_size=10,
                             chunk_overlap=2)

chunks = splitter.split_text(example_string) for i, chunk in enumerate(chunks): print(f"Chunk {i+1}:\n{chunk}\n")
使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

Chunk 1:
Mary had a little lamb, it's fleece

Chunk 2:
 fleece was white as snow.
使用 LangChain 的 Retrieval Augmented Generation (RAG)

按 token 分割

for i, chunk in enumerate(chunks):
    print(f"Chunk {i+1}:\nNo. tokens: {len(encoding.encode(chunk))}\n{chunk}\n")
Chunk 1:
No. tokens: 10
Mary had a little lamb, it's fleece was

Chunk 2:
No. tokens: 6
 fleece was white as snow.
使用 LangChain 的 Retrieval Augmented Generation (RAG)

语义分割

一段包含 RAG 应用的句子和一条关于狗的句子的段落。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

语义分割

该段落按字符或 token 分割,导致上下文丢失。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

语义分割

语义分割器在主题从 RAG 切换到狗时进行分割。

使用 LangChain 的 Retrieval Augmented Generation (RAG)

语义分割

from langchain_openai import OpenAIEmbeddings
from langchain_experimental.text_splitter import SemanticChunker

embeddings = OpenAIEmbeddings(api_key="...", model='text-embedding-3-small')
semantic_splitter = SemanticChunker( embeddings=embeddings,
breakpoint_threshold_type="gradient", breakpoint_threshold_amount=0.8
)
1 https://api.python.langchain.com/en/latest/text_splitter/langchain_experimental.text_splitter. SemanticChunker.html
使用 LangChain 的 Retrieval Augmented Generation (RAG)

语义分割

chunks = semantic_splitter.split_documents(data)
print(chunks[0])
page_content='Retrieval-Augmented Generation for\nKnowledge-Intensive NLP Tasks\ Patrick Lewis,
Ethan Perez,\nAleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich
Küttler,\nMike Lewis, Wen-tau Yih, Tim Rocktäschel, Sebastian Riedel, Douwe Kiela\nFacebook AI
Research; University College London;New York University;\[email protected]\nAbstract\nLarge
pre-trained language models have been shown to store factual knowledge\nin their parameters,
and achieve state-of-the-art results when fine-tuned on down-\nstream NLP tasks. However, their
ability to access and precisely manipulate knowl-\nedge is still limited, and hence on
knowledge-intensive tasks, their performance\nlags behind task-specific architectures.'
metadata={'source': 'rag_paper.pdf', 'page': 0}
使用 LangChain 的 Retrieval Augmented Generation (RAG)

Vamos praticar!

使用 LangChain 的 Retrieval Augmented Generation (RAG)

Preparing Video For Download...