تقسیم کد

در این فصل به معرفی تقسیم‌کننده متن کد LangChain می‌پردازیم. اگر نیاز دارید کد را به قسمت‌های کوچک‌تر تقسیم کنید، باید مطلب این فصل را به دقت مطالعه نمایید. کد تقسیم‌کننده‌ی متن به چندین زبان برنامه‌نویسی را پشتیبانی می‌کند.

نصب وابستگی‌ها

%pip install -qU langchain-text-splitters

سپس، شما باید شما باید از شاخص زبان وارد شده و ببینید کدام زبان‌های برنامه‌نویسی برای تقسیم کد پشتیبانی می‌شود.

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', ' ', '']

پایتون

در ادامه، مثالی از استفاده از تقسیم‌کننده‌ی PythonTextSplitter برای تقسیم کد آورده شده است.

PYTHON_CODE = """
def hello_world():
    print("Hello, World!")

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("Hello, World!")', metadata={}),     Document(page_content='# Call the function\\\\nhello_world()', metadata={})]

جاوااسکریپت

در ادامه، مثالی از استفاده از تقسیم‌کننده متن JS برای تقسیم کد JS آورده شده است.

JS_CODE = """
function helloWorld() {
  console.log("Hello, World!");
}

// Call the function
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("Hello, World!");\n}', metadata={}),
     Document(page_content='// Call the function\nhelloWorld();', metadata={})]

مارک‌دان

در ادامه، یک مثال از تقسیم کد مارک‌دان آورده شده است.

markdown_text = """

⚡ ساخت برنامه‌ها با استفاده از LLMs از طریق ترکیب‌پذیری ⚡


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

به عنوان یک پروژهٔ منبع باز در یک زمینهٔ به سرعت در حال توسعه، ما به شدت به مشارکت‌ها باز است.
"""
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='⚡ ساخت برنامه‌ها با استفاده از LLMs از طریق ترکیب‌پذیری ⚡', metadata={}),
     Document(page_content='## نصب سریع', metadata={}),
     Document(page_content="```bash\n# امیدواریم این بلوک کد تقسیم نشود", metadata={}),
     Document(page_content='pip install langchain', metadata={}),
     Document(page_content='```', metadata={}),
     Document(page_content='به عنوان یک پروژهٔ منبع باز در یک زمینهٔ به سرعت در حال توسعه، ما', metadata={}),
     Document(page_content='به شدت به مشارکت‌ها باز است.', metadata={})]
latex_text = """
\documentclass{article}

\begin{document}

\maketitle

\section{Introduction}
مدل‌های زبان بزرگ (LLMs) نوعی از مدل یادگیری ماشین هستند که می‌توانند بر روی مقادیر گسترده‌ای از داده‌های متنی آموزش ببینند تا زبان شبیه به زبان انسان ایجاد کنند. در سال‌های اخیر، مدل‌های زبان بزرگ پیشرفت‌های قابل توجهی را در انواع وظایف پردازش زبان طبیعی اعم از ترجمه زبانی، تولید متن و تجزیه و تحلیل احساسات داشته‌اند.

\subsection{تاریخچه LLMs}
اولین مدل‌های زبان بزرگ در دهه‌های ۱۹۸۰ و ۱۹۹۰ توسعه یافتند، اما محدودیت‌هایی از جمله مقدار داده‌ای که می‌توانست پردازش کند و قدرت محاسباتی موجود در آن زمان را داشتند. اما در دهه گذشته، پیشرفت‌هایی در سخت‌افزار و نرم‌افزار آن امکان آموزش مدل‌های زبان بزرگ بر روی مجموعه داده‌های بزرگ را فراهم کرده و منجر به بهبود‌های قابل توجه در عملکرد شده‌است.

\subsection{کاربردهای LLMs}
مدل‌های زبان بزرگ کاربردهای زیادی در صنعت دارند اعم از چت‌بات‌ها، ایجاد محتوا و دستیاران مجازی. آن‌ها همچنین می‌توانند در دانشگاه برای تحقیقات در زبان‌شناسی، روان‌شناسی و زبان‌شناسی محاسباتی استفاده شوند.

\end{document}
"""

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>⚡ ایجاد برنامه های کاربردی با LLMs از طریق ترکیب\u200cپذیری ⚡</p>
        </div>
        <div>
            به عنوان یک پروژه منبع باز در یک حوزه به سرعت در حال توسعه، ما به شدت باز هستیم به مشارکت های دیگران.
        </div>
    </body>
</html>
"""
html_splitter = RecursiveCharacterTextSplitter.from_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>⚡ ایجاد برنامه های کاربردی با LLMs از طریق ترکیب\u200cپذیری ⚡', metadata={}),
     Document(page_content='</p>\n        </div>', metadata={}),
     Document(page_content='<div>\n            به عنوان یک پروژه منبع باز در یک حوزه به سرعت در حال توسعه، م', metadata={}),
     Document(page_content='ا به شدت باز هستیم به مشارکت های دیگران.', 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=زبان.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={})
]