تقسيم الشفرة

يقدم هذا الفصل مُقدمة حول تقسيم نص الشفرة في لانج تشين. إذا كنت بحاجة لتقسيم الشفرة إلى مقاطع شفرة، يجب أن تدرس بعناية محتوى هذا الفصل. يدعم مقسم نص الشفرة تقسيم الشفرة لعدة لغات برمجة.

تثبيت الاعتماديات

%pip install -qU langchain-text-splitters

بعد ذلك، قم بإدخال "Language" enumeration واطلع على اللغات البرمجية المدعومة لتقسيم الشفرة.

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

فيما يلي مثال على استخدام 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='# استدعاء الوظيفة\\\\nhello_world()', metadata={})]

JS

فيما يلي مثال على استخدام مقسم النص الخاص بـ JS لتقسيم شفرة JS.

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

// استدعاء الوظيفة
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='// استدعاء الوظيفة\nhelloWorld();', metadata={})]

Markdown

فيما يلي مثال على تقسيم نص التنسيق.

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}
"""
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='النماذج اللغوية الكبيرة (LLMs) هي نوع من نماذج التعلم الآلي', metadata={}),
     Document(page_content='التي يمكن تدريبها على كميات هائلة من بيانات النص لإنتاج', metadata={}),
     Document(page_content='لغة تشبه لغة الإنسان. في السنوات الأخيرة، حققت النماذج', metadata={}),
     Document(page_content='اللغوية الكبيرة تقدمًا كبيرًا في مجموعة متنوعة من مهام', metadata={}),
     Document(page_content='معالجة اللغة الطبيعية، بما في ذلك ترجمة اللغة، وإنتاج', metadata={}),
     Document(page_content='النصوص، وتحليل المشاعر.', metadata={}),
     Document(page_content='\\subsection{تاريخ LLMs}', metadata={}),
     Document(page_content='تم تطوير أقدم النماذج اللغوية الكبيرة في الثمانينات والتسعينات', metadata={}),
     Document(page_content='من القرن الماضي، لكنها كانت محدودة بكمية البيانات التي يمكن', metadata={}),
     Document(page_content='معالجتها وبالطاقة الحسابية المتاحة في تلك الفترة. في', metadata={}),
     Document(page_content='العقد الأخير، تقدمت التقنيات الحديثة في الأجهزة والبرمجيات،', metadata={}),
     Document(page_content='مما جعل من الممكن تدريب النماذج اللغوية الكبيرة على مجموعات', metadata={}),
     Document(page_content='بيانات ضخمة، مما أدى إلى تحسينات كبيرة في الأداء.', metadata={}),
     Document(page_content='\\subsection{تطبيقات LLMs}', metadata={}),
     Document(page_content='تحتوي النماذج اللغوية الكبيرة على العديد من التطبيقات في', metadata={}),
     Document(page_content='الصناعة، بما في ذلك الروبوتات الدردشة، وإنشاء المحتوى،', metadata={}),
     Document(page_content='والمساعدين الافتراضيين. يمكن أيضًا استخدامها في الأكاديميات', metadata={}),
     Document(page_content='لبحوث في علم اللغات، وعلم النفس، واللغويات الحسابية.', metadata={}),
     Document(page_content='\\end{document}', metadata={})]

HTML

html_text = """
<!DOCTYPE html>
<html>
    <head>
        <title>🌐 لانغ تشين</title>
        <style>
            body {
                font-family: Arial, خط الجنرال;
            }
            h1 {
                color: darkblue;
            }
        </style>
    </head>
    <body>
        <div>
            <h1>🌐 لانغ تشين</h1>
            <p>⚡ بناء التطبيقات مع LLMs من خلال التكامل ⚡</p>
        </div>
        <div>
            كمشروع مفتوح المصدر في مجال يتطور بسرعة، نحن مفتوحون للغاية للمساهمات.
        </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>🌐 لانغ تشين</title>', metadata={}),
     Document(page_content='<style>\n            body {\n                font-family: Arial', metadata={}),
     Document(page_content=', خط الجنرال;\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>🌐 لانغ تشين</h1>', metadata={}),
     Document(page_content='<p>⚡ بناء التطبيقات مع LLMs من خلال التكامل ⚡', 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=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={})
]