Podział kodu

Ten rozdział przedstawia podział tekstu kodu w LangChain. Jeśli potrzebujesz podzielić kod na fragmenty, powinieneś dokładnie zapoznać się z treścią tego rozdziału. CodeTextSplitter obsługuje podział kodu dla wielu języków programowania.

Instalacja zależności

%pip install -qU langchain-text-splitters

Następnie zaimportuj wyliczenie "Language" i sprawdź, które języki programowania są obsługiwane w podziale kodu.

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

Oto przykład użycia PythonTextSplitter do podziału kodu.

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='# Wywołanie funkcji\\\\nhello_world()', metadata={})]

JS

Oto przykład użycia podziału tekstu JS do podziału kodu JS.

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

// Wywołanie funkcji
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='// Wywołanie funkcji\nhelloWorld();', metadata={})]

Markdown

Oto przykład podziału kodu Markdown.

markdown_text = """

⚡ Budowanie aplikacji z zastosowaniem LLMs poprzez komponowalność ⚡


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

Jako projekt open source w dynamicznie rozwijającym się obszarze, jesteśmy niezwykle otwarci na wkłady.
"""
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='⚡ Budowanie aplikacji z zastosowaniem LLMs poprzez komponowalność ⚡', metadata={}),
     Document(page_content='## Szybka instalacja', metadata={}),
     Document(page_content="```bash\n# Mam nadzieję, że ten blok kodu nie zostanie podzielony", metadata={}),
     Document(page_content='pip install langchain', metadata={}),
     Document(page_content='```', metadata={}),
     Document(page_content='Jako projekt open source w dynamicznie rozwijającym się obszarze, jesteśmy', metadata={}),
     Document(page_content='niezwykle otwarci na wkłady.', metadata={})]
# Przykład podziału tekstu Latex

latex_text = """ \documentclass{article}

\begin{document}

\maketitle

\section{Wstęp} Duże modele językowe (LLM) to rodzaj modeli uczenia maszynowego, które można szkolić na ogromnych ilościach danych tekstowych, aby generować język zbliżony do ludzkiego. W ostatnich latach LLM zrobiły znaczące postępy w różnych zadaniach przetwarzania języka naturalnego, w tym w tłumaczeniu języka, generowaniu tekstu i analizie sentymentu.

\subsection{Historia LLM} Najwcześniejsze modele LLM zostały opracowane w latach 80. i 90., ale były one ograniczone ilością przetwarzanych danych i dostępną wówczas mocą obliczeniową. W minionym dziesięcioleciu postępy w sprzęcie i oprogramowaniu umożliwiły jednak szkolenie LLM na masowych zbiorach danych, prowadząc do znaczących usprawnień wydajności.

\subsection{Zastosowania LLM} Modele LLM mają wiele zastosowań w przemyśle, w tym w chatbotach, tworzeniu treści i asystentach wirtualnych. Mogą również być stosowane w środowisku akademickim do badań w dziedzinie lingwistyki, psychologii i lingwistyki obliczeniowej.

\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{Wstęp}', metadata={}), Document(page_content='Duże modele językowe (LLM) to rodzaj modeli uczenia', metadata={}), Document(page_content='maszynowego, które można szkolić na ogromnych ilościach', metadata={}), Document(page_content='danych tekstowych, aby generować język zbliżony do', metadata={}), Document(page_content='ludzkiego. W ostatnich latach LLM zrobiły znaczące postępy w', metadata={}), Document(page_content='różnych zadaniach przetwarzania języka naturalnego, w tym w', metadata={}), Document(page_content='tłumaczeniu języka, generowaniu tekstu i analizie sentymentu.', metadata={}), Document(page_content='\subsection{Historia LLM}', metadata={}), Document(page_content='Najwcześniejsze modele LLM zostały opracowane w latach 80. i', metadata={}), Document(page_content='90., ale były one ograniczone ilością przetwarzanych danych i', metadata={}), Document(page_content='dostępną wówczas mocą obliczeniową. W minionym dziesięcioleciu', metadata={}), Document(page_content='postępy w sprzęcie i oprogramowaniu umożliwiły jednak szkolenie', metadata={}), Document(page_content='LLM na masowych zbiorach danych, prowadząc do znaczących', metadata={}), Document(page_content='usprawnień wydajności.', metadata={}), Document(page_content='\subsection{Zastosowania LLM}', metadata={}), Document(page_content='Modele LLM mają wiele zastosowań w przemyśle, w tym w', metadata={}), Document(page_content='chatbotach, tworzeniu treści i asystentach wirtualnych. Mogą', metadata={}), Document(page_content='również być stosowane w środowisku akademickim do badań w', metadata={}), Document(page_content='dziedzinie lingwistyki, psychologii i lingwistyki obliczeniowej.', metadata={}), Document(page_content='\end{document}', metadata={})]

## HTML


```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>⚡ Budowanie aplikacji z LLM poprzez kompozowalność ⚡</p>
        </div>
        <div>
            Jako projekt typu open source w dynamicznie rozwijającym się obszarze, jesteśmy bardzo otwarci na wkłady.
        </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>⚡ Budowanie aplikacji z LLM poprzez kompozowalność ⚡', metadata={}),
     Document(page_content='</p>\n        </div>', metadata={}),
     Document(page_content='<div>\n            Jako projekt typu open source w dynamicznie rozwijają', metadata={}),
     Document(page_content='cym się obszarze, jesteśmy bardzo otwarci na wkłady.', 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={})
]