Chia nhỏ mã nguồn

Chương này giới thiệu công cụ tách đoạn mã nguồn của LangChain. Nếu bạn cần chia mã nguồn thành các đoạn mã, bạn nên nghiên cứu kỹ nội dung của chương này. CodeTextSplitter hỗ trợ chia nhỏ mã nguồn cho nhiều ngôn ngữ lập trình.

Cài đặt Các Phụ Thuộc

%pip install -qU langchain-text-splitters

Tiếp theo, nhập liệt kê "Language" và xem các ngôn ngữ lập trình được hỗ trợ để chia nhỏ mã nguồn.

from langchain_text_splitters import (
    Language,
    RecursiveCharacterTextSplitter,
)
[e.value for e in Language]
['cpp',
     'go',
     'java',
     'js',
     'php',
     'proto',
     'python',
     'rst',
     'ruby',
     'rust',
     'scala',
     'swift',
     'markdown',
     'latex',
     'html',
     'sol',]
RecursiveCharacterTextSplitter.get_separators_for_language(Language.PYTHON)
['\\nclass ', '\\ndef ', '\\n\\tdef ', '\\n\\n', '\\n', ' ', '']

Python

Dưới đây là một ví dụ về việc sử dụng PythonTextSplitter để chia nhỏ mã nguồn.

PYTHON_CODE = """
def hello_world():
    print("Xin chào, Thế giới!")

hello_world()
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
    [Document(page_content='def hello_world():\\\\n    print("Xin chào, Thế giới!")', metadata={}),     Document(page_content='# Gọi hàm\\\\nhello_world()', metadata={})]

JS

Dưới đây là một ví dụ về việc sử dụng trình tách đoạn JS để chia nhỏ mã JS.

JS_CODE = """
function helloWorld() {
  console.log("Xin chào, Thế giới!");
}

// Gọi hàm
helloWorld();
"""

js_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.JS, chunk_size=60, chunk_overlap=0
)
js_docs = js_splitter.create_documents([JS_CODE])
js_docs
[Document(page_content='function helloWorld() {\n  console.log("Xin chào, Thế giới!");\n}', metadata={}),
     Document(page_content='// Gọi hàm\nhelloWorld();', metadata={})]

Markdown

Dưới đây là một ví dụ về việc chia nhỏ mã nguồn markdown.

markdown_text = """

⚡ Xây dựng ứng dụng với LLMs thông qua tính kết hợp ⚡


\`\`\`bash
pip install langchain
\`\`\`

Là một dự án mã nguồn mở trong lĩnh vực phát triển nhanh chóng, chúng tôi rất mở lòng với các đóng góp.
"""
md_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.MARKDOWN, chunk_size=60, chunk_overlap=0
)
md_docs = md_splitter.create_documents([markdown_text])
md_docs
[Document(page_content='# ?️? LangChain', metadata={}),
     Document(page_content='⚡ Xây dựng ứng dụng với LLMs thông qua tính kết hợp ⚡', metadata={}),
     Document(page_content='## Cài đặt Nhanh', metadata={}),
     Document(page_content="```bash\n# Hy vọng đoạn mã này không bị chia nhỏ", metadata={}),
     Document(page_content='pip install langchain', metadata={}),
     Document(page_content='```', metadata={}),
     Document(page_content='Là một dự án mã nguồn mở trong lĩnh vực phát triển nhanh chóng, chúng tôi', metadata={}),
     Document(page_content='rất mở lòng với các đóng góp.', metadata={})]

Latex

Ví dụ về việc chia văn bản Latex

latex_text = """
\documentclass{article}

\begin{document}

\maketitle

\section{Giới thiệu}
Các mô hình ngôn ngữ lớn (LLMs) là một loại mô hình học máy có thể được huấn luyện trên lượng lớn dữ liệu văn bản để tạo ra ngôn ngữ giống con người. Trong những năm gần đây, LLMs đã có những tiến bộ đáng kể trong nhiều nhiệm vụ xử lý ngôn ngữ tự nhiên, bao gồm dịch ngôn ngữ, tạo văn bản và phân tích tâm trạng.

\subsection{Lịch sử của LLMs}
Những mô hình LLMs sớm nhất được phát triển vào những năm 1980 và 1990, nhưng chúng bị hạn chế bởi lượng dữ liệu có thể xử lý và sức mạnh tính toán có sẵn vào thời điểm đó. Trong thập kỷ qua, tuy nhiên, các tiến bộ trong phần cứng và phần mềm đã làm cho việc huấn luyện LLMs trên các bộ dữ liệu vô cùng lớn trở nên khả thi, dẫn đến những cải thiện đáng kể về hiệu suất.

\subsection{Ứng dụng của LLMs}
LLMs có rất nhiều ứng dụng trong công nghiệp, bao gồm trò chuyện cùng bot, tạo nội dung và trợ lý ảo. Chúng cũng có thể được sử dụng trong lĩnh vực học thuật để nghiên cứu về ngôn ngữ học, tâm lý học và ngôn ngữ học tính toán.
\end{document}
"""
latex_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.MARKDOWN, chunk_size=60, chunk_overlap=0
)
latex_docs = latex_splitter.create_documents([latex_text])
latex_docs
[Document(page_content='\\documentclass{article}\n\n\x08egin{document}\n\n\\maketitle', metadata={}),
     Document(page_content='\\section{Introduction}', metadata={}),
     Document(page_content='Các mô hình ngôn ngữ lớn (LLMs) là một loại mô hình học máy', metadata={}),
     Document(page_content='có thể được huấn luyện trên lượng lớn dữ liệu văn bản để', metadata={}),
     Document(page_content='tạo ra ngôn ngữ giống con người. Trong những năm gần đây, LLMs', metadata={}),
     Document(page_content='đã có những tiến bộ đáng kể trong nhiều nhiệm vụ xử lý ngôn', metadata={}),
     Document(page_content='ngữ tự nhiên, bao gồm dịch ngôn ngữ, tạo văn bản và phân', metadata={}),
     Document(page_content='tích tâm trạng.', metadata={}),
     Document(page_content='\\subsection{History of LLMs}', metadata={}),
     Document(page_content='Những mô hình LLMs sớm nhất được phát triển vào những năm', metadata={}),
     Document(page_content='1980 và 1990, nhưng chúng bị hạn chế bởi lượng dữ liệu có', metadata={}),
     Document(page_content='thể xử lý và sức mạnh tính toán có sẵn vào thời điểm', metadata={}),
     Document(page_content='đó. Trong thập kỷ qua, tuy nhiên, các tiến bộ trong phần cứng', metadata={}),
     Document(page_content='và phần mềm đã làm cho việc huấn luyện LLMs trên các bộ dữ', metadata={}),
     Document(page_content='liệu vô cùng lớn trở nên khả thi, dẫn đến những cải thiện', metadata={}),
     Document(page_content='đáng kể về hiệu suất.', metadata={}),
     Document(page_content='\\subsection{Applications of LLMs}', metadata={}),
     Document(page_content='LLMs có rất nhiều ứng dụng trong công nghiệp, bao gồm trò', metadata={}),
     Document(page_content='chuyện cùng bot, tạo nội dung và trợ lý ảo. Chúng cũng có', metadata={}),
     Document(page_content='thể được sử dụng trong lĩnh vực học thuật để nghiên cứu về', metadata={}),
     Document(page_content='ngôn ngữ học, tâm lý học và ngôn ngữ học tính toán.', metadata={}),
     Document(page_content='\\end{document}', metadata={})]

HTML

html_text = """
<!DOCTYPE html>
<html>
    <head>
        <title>🌐 LangChain</title>
        <style>
            body {
                font-family: Arial, sans-serif;
            }
            h1 {
                color: darkblue;
            }
        </style>
    </head>
    <body>
        <div>
            <h1>🌐 LangChain</h1>
            <p>⚡ Xây dựng ứng dụng với LLMs thông qua tính kết hợp ⚡</p>
        </div>
        <div>
            Là một dự án mã nguồn mở trong lĩnh vực đang phát triển nhanh chóng, chúng tôi rất mở và chào đón sự đóng góp.
        </div>
    </body>
</html>
"""
html_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.HTML, chunk_size=60, chunk_overlap=0
)
html_docs = html_splitter.create_documents([html_text])
html_docs
[Document(page_content='<!DOCTYPE html>\n<html>', metadata={}),
     Document(page_content='<head>\n        <title>🌐 LangChain</title>', metadata={}),
     Document(page_content='<style>\n            body {\n                font-family: Arial', metadata={}),
     Document(page_content=', sans-serif;\n            }\n            h1 {', metadata={}),
     Document(page_content='color: darkblue;\n            }\n        </style>\n    </head', metadata={}),
     Document(page_content='>', metadata={}),
     Document(page_content='<body>', metadata={}),
     Document(page_content='<div>\n            <h1>🌐 LangChain</h1>', metadata={}),
     Document(page_content='<p>⚡ Xây dựng ứng dụng với LLMs thông qua tính kết hợp ⚡', metadata={}),
     Document(page_content='</p>\n        </div>', metadata={}),
     Document(page_content='<div>\n            Là một dự án mã nguồn mở trong lĩnh vực đang phát', metadata={}),
     Document(page_content='triển nhanh chóng, chúng tôi rất mở và chào đón sự đóng góp.', metadata={}),
     Document(page_content='</div>\n    </body>\n</html>', metadata={})]

Solidity

SOL_CODE = """
pragma solidity ^0.8.20;
contract HelloWorld {
   function add(uint a, uint b) pure public returns(uint) {
       return a + b;
   }
}
"""

sol_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.SOL, chunk_size=128, chunk_overlap=0
)
sol_docs = sol_splitter.create_documents([SOL_CODE])
sol_docs
[
    Document(page_content='pragma solidity ^0.8.20;', metadata={}),
    Document(page_content='contract HelloWorld {\n   function add(uint a, uint b) pure public returns(uint) {\n       return a + b;\n   }\n}', metadata={})
]