Suddivisione del codice
Questo capitolo presenta lo sdoppiatore di testo di codice di LangChain. Se hai bisogno di suddividere il codice in snippet di codice, dovresti studiare attentamente il contenuto di questo capitolo. CodeTextSplitter supporta la suddivisione del codice per diversi linguaggi di programmazione.
Installazione delle dipendenze
%pip install -qU langchain-text-splitters
Successivamente, importa l'enumerazione "Language" e verifica quali linguaggi di programmazione sono supportati per la suddivisione del codice.
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
Ecco un esempio di utilizzo di PythonTextSplitter per suddividere il codice.
PYTHON_CODE = """
def hello_world():
print("Ciao, Mondo!")
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("Ciao, Mondo!")', metadata={}), Document(page_content='# Chiama la funzione\\\\nhello_world()', metadata={})]
JS
Ecco un esempio di utilizzo dello sdoppiatore di testo JS per suddividere il codice JS.
JS_CODE = """
function helloWorld() {
console.log("Ciao, Mondo!");
}
// Chiama la funzione
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("Ciao, Mondo!");\n}', metadata={}),
Document(page_content='// Chiama la funzione\nhelloWorld();', metadata={})]
Markdown
Ecco un esempio di suddivisione del codice markdown.
markdown_text = """
⚡ Costruzione di applicazioni con LLMs attraverso la componibilità ⚡
\`\`\`bash
pip install langchain
\`\`\`
Essendo un progetto open source in un campo in rapida evoluzione, siamo estremamente aperti ai contributi.
"""
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='⚡ Costruzione di applicazioni con LLMs attraverso la componibilità ⚡', metadata={}),
Document(page_content='## Installazione Veloce', metadata={}),
Document(page_content="```bash\n# Speriamo che questo blocco di codice non venga suddiviso", metadata={}),
Document(page_content='pip install langchain', metadata={}),
Document(page_content='```', metadata={}),
Document(page_content='Essendo un progetto open source in un campo in rapida evoluzione, siamo', metadata={}),
Document(page_content='estremamente aperti ai contributi.', metadata={})]
Esempio di suddivisione del testo Latex
latex_text = """ \documentclass{article}
\begin{document}
\maketitle
\section{Introduzione} I modelli di lingua di grandi dimensioni (LLM) sono un tipo di modello di apprendimento automatico che può essere addestrato su vaste quantità di dati testuali per generare linguaggio simile a quello umano. Negli ultimi anni, i LLM hanno fatto progressi significativi in una varietà di compiti di elaborazione del linguaggio naturale, tra cui la traduzione linguistica, la generazione di testo e l'analisi del sentiment.
\subsection{Storia dei LLM} I primi LLM sono stati sviluppati negli anni '80 e '90, ma erano limitati dalla quantità di dati che potevano essere elaborati e dalla potenza computazionale disponibile all'epoca. Tuttavia, nel decennio scorso, i progressi hardware e software hanno reso possibile addestrare LLM su set di dati massicci, portando a miglioramenti significativi delle prestazioni.
\subsection{Applicazioni dei LLM} I LLM hanno molte applicazioni nell'industria, tra cui chatbot, creazione di contenuti e assistenti virtuali. Possono anche essere utilizzati in ambito accademico per la ricerca in linguistica, psicologia e linguistica computazionale.
\end{document} """
latex_splitter = RecursiveCharacterTextSplitter.from_language( language=Language.MARKDOWN, chunk_size=60, chunk_overlap=0 ) latex_docs = splitter.create_documents([latex_text]) latex_docs
[Document(page_content='\documentclass{article}\n\n\x08egin{document}\n\n\maketitle', metadata={}), Document(page_content='\section{Introduzione}', metadata={}), Document(page_content='I modelli di lingua di grandi dimensioni (LLM) sono un tipo', metadata={}), Document(page_content='di modello di apprendimento automatico che può essere', metadata={}), Document(page_content='addestrato su vaste quantità di dati testuali per generare', metadata={}), Document(page_content="linguaggio simile a quello umano. Negli ultimi anni, i LLM", metadata={}), Document(page_content='hanno fatto progressi significativi in una varietà di compiti', metadata={}), Document(page_content='di elaborazione del linguaggio naturale, tra cui la', metadata={}), Document(page_content='traduzione linguistica, la generazione di testo e l'analisi', metadata={}), Document(page_content='del sentiment.', metadata={}), Document(page_content='\subsection{Storia dei LLM}', metadata={}), Document(page_content="I primi LLM sono stati sviluppati negli anni '80 e '90, ma", metadata={}), Document(page_content='erano limitati dalla quantità di dati che potevano essere', metadata={}), Document(page_content='elaborati e dalla potenza computazionale disponibile', metadata={}), Document(page_content='all'epoca. Tuttavia, nel decennio scorso, i progressi', metadata={}), Document(page_content='hardware e software hanno reso possibile addestrare LLM su', metadata={}), Document(page_content='set di dati massicci, portando a miglioramenti significativi', metadata={}), Document(page_content='delle prestazioni.', metadata={}), Document(page_content='\subsection{Applicazioni dei LLM}', metadata={}), Document(page_content='I LLM hanno molte applicazioni nell'industria, tra cui', metadata={}), Document(page_content='chatbot, creazione di contenuti e assistenti virtuali.', metadata={}), Document(page_content='Possono anche essere utilizzati in ambito accademico per la', metadata={}), Document(page_content='ricerca in linguistica, psicologia e linguistica', metadata={}), Document(page_content='computazionale.', 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>⚡ Costruzione di applicazioni con LLMs attraverso la composizione ⚡</p>
</div>
<div>
Come progetto open source in un campo in rapida evoluzione, siamo estremamente aperti alle contribuzioni.
</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>⚡ Costruzione di applicazioni con LLMs attraverso la composizione ⚡', metadata={}),
Document(page_content='</p>\n </div>', metadata={}),
Document(page_content='<div>\n Come progetto open source in un campo in rapida dev', metadata={}),
Document(page_content='eluzione, siamo estremamente aperti alle contribuzioni.', 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={})
]