Разделение кода
В этой главе представлен инструмент разделения кода LangChain. Если вам необходимо разделить код на фрагменты, вам стоит внимательно изучить содержание этой главы. CodeTextSplitter поддерживает разделение кода для нескольких языков программирования.
Установка зависимостей
%pip install -qU langchain-text-splitters
Затем импортируйте перечисление "Language" и посмотрите, какие языки программирования поддерживаются для разделения кода.
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()
"""
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("Привет, Мир!")', metadata={}), Document(page_content='# Вызов функции\\\\nhello_world()', metadata={})]
JS
Вот пример использования текстового разделителя JS для разделения JS-кода.
JS_CODE = """
function helloWorld() {
console.log("Привет, Мир!");
}
// Вызов функции
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("Привет, Мир!");\n}', metadata={}),
Document(page_content='// Вызов функции\nhelloWorld();', metadata={})]
Markdown
Вот пример разделения 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
latex_text = """ \documentclass{article}
\begin{document}
\maketitle
\section{Introduction} Большие языковые модели (LLM) - это тип модели машинного обучения, которая может быть обучена на огромных объемах текстовых данных для генерации человекоподобного языка. В последние годы LLM сделали значительные успехи в различных задачах обработки естественного языка, включая перевод языка, генерацию текста и анализ настроений.
\subsection{История LLM} Самые ранние LLM были разработаны в 1980-1990-х годах, но их ограничивала объем обрабатываемых данных и вычислительная мощность, доступная в то время. Однако в последнее десятилетие благодаря прогрессу в аппаратуре и программном обеспечении стало возможным обучать LLM на огромных наборах данных, что привело к значительным улучшениям в производительности.
\subsection{Применение LLM} LLM имеют множество применений в индустрии, включая чат-ботов, создание контента и виртуальных ассистентов. Они также могут использоваться в академии для исследований в области лингвистики, психологии и компьютерной лингвистики.
\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='Большие языковые модели (LLM) - это тип модели машинного обучения', metadata={}), Document(page_content=', которая может быть обучена на огромных объемах текстовых', metadata={}), Document(page_content='данных для генерации человекоподобного языка. В последние', metadata={}), Document(page_content='годы LLM сделали значительные успехи в различных задачах', metadata={}), Document(page_content='обработки естественного языка, включая перевод языка, генерацию', metadata={}), Document(page_content='текста и анализ настроений.', metadata={}), Document(page_content='\subsection{История LLM}', metadata={}), Document(page_content='Самые ранние LLM были разработаны в 1980-1990-х годах, но их', metadata={}), Document(page_content='ограничивала объем обрабатываемых данных и вычислительная', metadata={}), Document(page_content='мощность, доступная в то время. Однако в последнее десятилетие', metadata={}), Document(page_content='благодаря прогрессу в аппаратуре и программном обеспечении стало', metadata={}), Document(page_content='возможным обучать LLM на огромных наборах данных, что привело к', metadata={}), Document(page_content='значительным улучшениям в производительности.', metadata={}), Document(page_content='\subsection{Применение LLM}', metadata={}), Document(page_content='LLM имеют множество применений в индустрии, включая чат-ботов,', 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>🌐 LangChain</title>
<style>
body {
font-family: Arial, sans-serif;
}
h1 {
color: darkblue;
}
</style>
</head>
<body>
<div>
<h1>🌐 LangChain</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>🌐 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 через композицию ⚡', metadata={}),
Document(page_content='</p>\n </div>', metadata={}),
Document(page_content='<div>\n В качестве проекта с открытым исходным кодом в быстро развивающейся области мы очень открыты для вкладов.', 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={})
]