コード分割
この章では、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!")
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='# 関数を呼び出す\\\\nhello_world()', metadata={})]
JS
JSのコードを分割するためのJSテキスト分割機能を使用する例です。
JS_CODE = """
function helloWorld() {
console.log("Hello, World!");
}
// 関数を呼び出す
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='// 関数を呼び出す\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_text = """
\documentclass{article}
\begin{document}
\maketitle
\section{Introduction}
大規模言語モデル(LLM)は、人間らしい言語を生成するために大量のテキストデータで訓練できる機械学習モデルの一種です。近年、LLMは言語翻訳、テキスト生成、感情分析など、さまざまな自然言語処理タスクで大きな進歩を遂げています。
\subsection{LLMの歴史}
初期のLLMは1980年代から1990年代に開発されましたが、当時のデータ処理量や利用可能な計算能力に制約がありました。しかし過去10年間で、ハードウェアとソフトウェアの進歩により、巨大なデータセットでLLMを訓練できるようになり、性能が大幅に向上しました。
\subsection{LLMの応用}
LLMには、チャットボット、コンテンツ作成、仮想アシスタントなど、産業界でのさまざまな応用があります。また、言語学、心理学、計算言語学の研究など、学術界でも利用されています。
\end{document}
"""
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>⚡ LLMを使用したアプリケーションの構築 ⚡</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>⚡ LLMを使用したアプリケーションの構築 ⚡', 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={})
]