Divisão de Código

Este capítulo apresenta o divisor de texto de código da LangChain. Se precisar dividir o código em fragmentos de código, deve estudar cuidadosamente o conteúdo deste capítulo. O CodeTextSplitter suporta a divisão de código para várias linguagens de programação.

Instalando Dependências

%pip install -qU langchain-text-splitters

A seguir, importe a enumeração "Language" e veja quais linguagens de programação são suportadas para a divisão de código.

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

Aqui está um exemplo de uso do PythonTextSplitter para dividir código.

PYTHON_CODE = """
def hello_world():
    print("Olá, Mundo!")

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("Olá, Mundo!")', metadata={}),     Document(page_content='# Chame a função\\\\nhello_world()', metadata={})]

JS

Aqui está um exemplo de uso do divisor de texto JS para dividir código JS.

JS_CODE = """
function helloWorld() {
  console.log("Olá, Mundo!");
}

// Chame a função
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("Olá, Mundo!");\n}', metadata={}),
     Document(page_content='// Chame a função\nhelloWorld();', metadata={})]

Markdown

Aqui está um exemplo de divisão de código markdown.

markdown_text = """

⚡ Construindo aplicativos com LLMs por meio de composição ⚡


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

Como um projeto de código aberto em um campo em rápido desenvolvimento, somos extremamente abertos a contribuições.
"""
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='⚡ Construindo aplicativos com LLMs por meio de composição ⚡', metadata={}),
     Document(page_content='## Instalação Rápida', metadata={}),
     Document(page_content="```bash\n# Espero que este bloco de código não seja dividido", metadata={}),
     Document(page_content='pip install langchain', metadata={}),
     Document(page_content='```', metadata={}),
     Document(page_content='Como um projeto de código aberto em um campo em rápido desenvolvimento, nós', metadata={}),
     Document(page_content='somos extremamente abertos a contribuições.', metadata={})]
Exemplo de divisão de texto Latex

latex_text = """ \documentclass{article}

\begin{document}

\maketitle

\section{Introdução} Os grandes modelos de linguagem (GMLs) são um tipo de modelo de aprendizado de máquina que pode ser treinado em vastas quantidades de dados de texto para gerar linguagem semelhante à humana. Nos últimos anos, os GMLs fizeram avanços significativos em uma variedade de tarefas de processamento de linguagem natural, incluindo tradução de idiomas, geração de texto e análise de sentimentos.

\subsection{História dos GMLs} Os primeiros GMLs foram desenvolvidos nas décadas de 1980 e 1990, mas eram limitados pela quantidade de dados que podiam ser processados e pela potência computacional disponível na época. Na última década, no entanto, avanços em hardware e software tornaram possível treinar GMLs em conjuntos massivos de dados, resultando em melhorias significativas de desempenho.

\subsection{Aplicações dos GMLs} Os GMLs têm muitas aplicações na indústria, incluindo chatbots, criação de conteúdo e assistentes virtuais. Eles também podem ser usados na academia para pesquisas em linguística, psicologia e linguística computacional.

\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{Introdução}', metadata={}), Document(page_content='Os grandes modelos de linguagem (GMLs) são um tipo de', metadata={}), Document(page_content='modelo de aprendizado de máquina que pode ser treinado em', metadata={}), Document(page_content='vastas quantidades de dados de texto para gerar linguagem', metadata={}), Document(page_content='semelhante à humana. Nos últimos anos, os GMLs fizeram', metadata={}), Document(page_content='avanços significativos em uma variedade de tarefas de', metadata={}), Document(page_content='processamento de linguagem natural, incluindo tradução de', metadata={}), Document(page_content='idiomas, geração de texto e análise de sentimentos.', metadata={}), Document(page_content='\subsection{História dos GMLs}', metadata={}), Document(page_content='Os primeiros GMLs foram desenvolvidos nas décadas de 1980 e', metadata={}), Document(page_content='1990, mas eram limitados pela quantidade de dados que', metadata={}), Document(page_content='podiam ser processados e pela potência computacional', metadata={}), Document(page_content='disponível na época. Na última década, no entanto, avanços', metadata={}), Document(page_content='em hardware e software tornaram possível treinar GMLs em', metadata={}), Document(page_content='conjuntos massivos de dados, resultando em melhorias', metadata={}), Document(page_content='significativas de desempenho.', metadata={}), Document(page_content='\subsection{Aplicações dos GMLs}', metadata={}), Document(page_content='Os GMLs têm muitas aplicações na indústria, incluindo', metadata={}), Document(page_content='chatbots, criação de conteúdo e assistentes virtuais. Eles', metadata={}), Document(page_content='também podem ser usados na academia para pesquisas em', metadata={}), Document(page_content='linguística, psicologia e linguística computacional.', 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>⚡ Construindo aplicações com LLMs através de composição ⚡</p>
        </div>
        <div>
            Como um projeto de código aberto em um campo em constante desenvolvimento, estamos extremamente abertos a contribuições.
        </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>⚡ Construindo aplicações com LLMs através de composição ⚡', metadata={}),
     Document(page_content='</p>\n        </div>', metadata={}),
     Document(page_content='<div>\n            Como um projeto de código aberto em um ca', metadata={}),
     Document(page_content='mpo em constante desenvolvimento, estamos extremamente abertos a contribuições.', 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={})
]