Trình tách Đoạn Văn Bản Tiêu Đề Markdown

Động lực

Nhiều ứng dụng trò chuyện hoặc Q&A liên quan đến việc chia nhỏ tài liệu đầu vào trước khi nhúng và vector hóa chúng. Sau khi chia nhỏ văn bản, thường cần phân nhóm các đoạn văn cùng chủ đề với nhau.

Ví dụ, một tệp Markdown được tổ chức theo các tiêu đề nhiều cấp như h1, h2 và h3. Chúng ta có thể tổ chức các đoạn văn cùng tiêu đề dựa trên tiêu đề Markdown.

Chương này giới thiệu cách LangChain chia nhỏ nội dung văn bản dựa trên tiêu đề Markdown, sử dụng trình tách MarkdownHeaderTextSplitter.

Ví dụ, nếu chúng ta muốn chia nhỏ Markdown này:

md = '# Foo\\n\\n ## Bar\\n\\nHi this is Jim  \\nHi this is Joe\\n\\n ## Baz\\n\\n Hi this is Molly'

Thiết lập các quy tắc tiêu đề để chia nhỏ, dựa trên tiêu đề cấp 1 và cấp 2:

[("#", "Tiêu đề 1"),("##", "Tiêu đề 2")]

Dưới đây là một ví dụ về việc chia nội dung dựa trên tiêu đề, trong đó trường dữ liệu siêu dữ liệu ghi lại đoạn văn bản hiện tại thuộc về tiêu đề nào:

{'nội dung': 'Hi this is Jim  \nHi this is Joe', 'siêu dữ liệu': {'Tiêu đề 1': 'Foo', 'Tiêu đề 2': 'Bar'}}
{'nội dung': 'Hi this is Molly', 'siêu dữ liệu': {'Tiêu đề 1': 'Foo', 'Tiêu đề 2': 'Baz'}}

Bây giờ hãy xem cách viết mã.

Cài đặt các gói phụ thuộc:

%pip install -qU langchain-text-splitters
from langchain_text_splitters import MarkdownHeaderTextSplitter

Tài liệu API:

  • Tạo một công cụ phân chia văn bản bằng MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n    ## Bar\n\nChào, đây là Jim\n\nChào, đây là Joe\n\n ### Boo \n\n Chào, đây là Lance \n\n ## Baz\n\n Chào, đây là Molly"

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
md_header_splits
[Document(page_content='Chào, đây là Jim  \nChào, đây là Joe', metadata={'Header 1': 'Foo', 'Header 2': 'Bar'}),
     Document(page_content='Chào, đây là Lance', metadata={'Header 1': 'Foo', 'Header 2': 'Bar', 'Header 3': 'Boo'}),
     Document(page_content='Chào, đây là Molly', metadata={'Header 1': 'Foo', 'Header 2': 'Baz'})]
type(md_header_splits[0])
langchain.schema.Document

Trong mỗi nhóm Markdown, chúng ta có thể áp dụng bất kỳ công cụ phân chia văn bản nào.

markdown_document = "# Giới thiệu \n\n    ## Lịch sử \n\n Markdown[9] là ngôn ngữ đánh dấu nhẹ cho việc tạo văn bản được định dạng bằng cách sử dụng trình soạn thảo văn bản thuần. John Gruber đã tạo ra Markdown vào năm 2004 như một ngôn ngữ đánh dấu hấp dẫn đối với người đọc trong dạng mã nguồn của nó.[9] \n\n Markdown được sử dụng rộng rãi trong các blog, tin nhắn tức thì, diễn đàn trực tuyến, phần mềm cộng tác, trang tài liệu và tệp readme. \n\n ## Sự phát triển và đa dạng \n\n Khi sự phổ biến của Markdown tăng nhanh chóng, nhiều bản thực hiện Markdown xuất hiện, chủ yếu được thúc đẩy bởi nhu cầu về\n\n các tính năng bổ sung như bảng, chú thích, danh sách định nghĩa,[ghi chú 1] và Markdown trong các khối HTML. \n\n #### Tiêu chuẩn hóa \n\n Từ năm 2012, một nhóm người, bao gồm Jeff Atwood và John MacFarlane, đã khởi xướng những gì mà Atwood miêu tả là một nỗ lực tiêu chuẩn hóa. \n\n ## Bản thực hiện \n\n Các bản thực hiện của Markdown có sẵn cho hơn một tá ngôn ngữ lập trình."

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)

from langchain.text_splitter import RecursiveCharacterTextSplitter

kích_thước_đoạn = 250
chồng_chéo_đoạn = 30
công_cụ_phân_chia_văn_bản = RecursiveCharacterTextSplitter(
    kích_thước_đoạn=kích_thước_đoạn, chồng_chéo_đoạn=chồng_chéo_đoạn
)

chias = công_cụ_phân_chia_văn_bản.split_documents(md_header_splits)
chias

Kết quả:

[Document(page_content='Markdown[9] là ngôn ngữ đánh dấu nhẹ cho việc tạo văn bản được định dạng bằng cách sử dụng trình soạn thảo văn bản thuần. John Gruber đã tạo ra Markdown vào năm 2004 như một ngôn ngữ đánh dấu hấp dẫn đối với người đọc trong dạng mã nguồn của nó.[9]', metadata={'Header 1': 'Giới thiệu', 'Header 2': 'Lịch sử'}),
     Document(page_content='Markdown được sử dụng rộng rãi trong các blog, tin nhắn tức thì, diễn đàn trực tuyến, phần mềm cộng tác, trang tài liệu và tệp readme.', metadata={'Header 1': 'Giới thiệu', 'Header 2': 'Lịch sử'}),
     Document(page_content='Khi sự phổ biến của Markdown tăng nhanh chóng, nhiều bản thực hiện Markdown xuất hiện, chủ yếu được thúc đẩy bởi nhu cầu về  \ncác tính năng bổ sung như bảng, chú thích, danh sách định nghĩa,[ghi chú 1] và Markdown trong các khối HTML.  \n#### Tiêu chuẩn hóa', metadata={'Header 1': 'Giới thiệu', 'Header 2': 'Sự phát triển và đa dạng'}),
     Document(page_content='#### Tiêu chuẩn hóa  \nTừ năm 2012, một nhóm người, bao gồm Jeff Atwood và John MacFarlane, đã khởi xướng những gì mà Atwood miêu tả là một nỗ lực tiêu chuẩn hóa.', metadata={'Header 1': 'Giới thiệu', 'Header 2': 'Sự phát triển và đa dạng'}),
     Document(page_content='Các bản thực hiện của Markdown có sẵn cho hơn một tá ngôn ngữ lập trình.', metadata={'Header 1': 'Giới thiệu', 'Header 2': 'Bản thực hiện'})]