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={})
]