Split code

텍스트 분할

효율적인 문서 청킹을 위한 다양한 텍스트 분할 전략을 다룬다.

AI
RAG
LangChain
저자

Kwangmin Kim

공개

2024년 12월 31일

CodeTextSplitter를 사용하면 다양한 프로그래밍 언어로 작성된 코드를 분할할 수 있습니다.

이를 위해서는 Language enum을 import하고, 해당하는 프로그래밍 언어를 지정해주면 됩니다.

RecursiveCharacterTextSplitter를 사용하여 텍스트를 분할하는 예제입니다.

from langchain_text_splitters import (
    Language,
    RecursiveCharacterTextSplitter,
)

지원되는 언어의 전체 목록을 가져옵니다.

# 지원되는 언어의 전체 목록을 가져옵니다.
[e.value for e in Language]

RecursiveCharacterTextSplitter 클래스의 get_separators_for_language 메서드를 사용하여 특정 언어에 사용되는 구분자(separators)를 확인할 수 있습니다.

# 주어진 언어에 대해 사용되는 구분자를 확인할 수 있습니다.
RecursiveCharacterTextSplitter.get_separators_for_language(Language.PYTHON)

0.1 Python

RecursiveCharacterTextSplitter 사용한 예제는 다음과 같습니다.

  • RecursiveCharacterTextSplitter를 사용하여 Python 코드를 문서 단위로 분할합니다.
    • language 매개변수에 Language.PYTHON을 지정하여 Python 언어를 사용합니다.
    • chunk_size를 50으로 설정하여 각 문서의 최대 크기를 제한합니다.
    • chunk_overlap을 0으로 설정하여 문서 간의 중복을 허용하지 않습니다.
PYTHON_CODE = """
def hello_world():
    print("Hello, World!")

hello_world()
"""

python_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)

Document 를 생성합니다. 생성된 Document 는 리스트 형태로 반환됩니다.

python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
for doc in python_docs:
    print(doc.page_content, end="\n==================\n")

0.2 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

0.3 TS

다음은 TS 텍스트 분할기를 사용한 예시입니다.

TS_CODE = """
function helloWorld(): void {
  console.log("Hello, World!");
}

helloWorld();
"""

ts_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.TS, chunk_size=60, chunk_overlap=0
)
ts_docs = ts_splitter.create_documents([TS_CODE])
ts_docs

0.4 Markdown

다음은 Markdown 텍스트 분할기를 사용한 예시입니다.

markdown_text = """
# 🦜️🔗 LangChain

⚡ LLM을 활용한 초스피드 애플리케이션 구축 ⚡

## 빠른 설치

```bash
pip install langchain

1 빠르게 발전하는 분야의 오픈 소스 프로젝트 입니다. 많관부 🙏

““”


분할하고 결과를 출력합니다.

```python
md_splitter = RecursiveCharacterTextSplitter.from_language(
    # 마크다운 언어를 사용하여 텍스트 분할기 생성
    language=Language.MARKDOWN,
    # 청크 크기를 60으로 설정
    chunk_size=60,
    # 청크 간 중복되는 부분이 없도록 설정
    chunk_overlap=0,
)
# 마크다운 텍스트를 분할하여 문서 생성
md_docs = md_splitter.create_documents([markdown_text])
# 생성된 문서 출력
md_docs

1.1 Latex

LaTeX는 문서 작성을 위한 마크업 언어로, 수학 기호와 수식을 표현하는 데 널리 사용됩니다.

다음은 LaTeX 텍스트의 예시입니다.

latex_text = """
\documentclass{article}

\begin{document}

\maketitle

\section{Introduction}
% LLM은 방대한 양의 텍스트 데이터로 학습하여 사람과 유사한 언어를 생성할 수 있는 기계 학습 모델의 한 유형입니다.
% 최근 몇 년 동안 LLM은 언어 번역, 텍스트 생성, 감성 분석 등 다양한 자연어 처리 작업에서 상당한 발전을 이루었습니다.

\subsection{History of LLMs}
% 초기 LLM은 1980년대와 1990년대에 개발되었지만, 처리할 수 있는 데이터 양과 당시 사용 가능한 컴퓨팅 능력으로 인해 제한되었습니다.
% 그러나 지난 10년 동안 하드웨어와 소프트웨어의 발전으로 대규모 데이터 세트에 대해 LLM을 학습시킬 수 있게 되었고, 이는 성능의 큰 향상으로 이어졌습니다.

\subsection{Applications of LLMs}
% LLM은 챗봇, 콘텐츠 생성, 가상 어시스턴트 등 산업 분야에서 많은 응용 분야를 가지고 있습니다.
% 또한 언어학, 심리학, 컴퓨터 언어학 연구를 위해 학계에서도 사용될 수 있습니다.

\end{document}
"""

분할하고 결과를 출력합니다.

latex_splitter = RecursiveCharacterTextSplitter.from_language(
    # 마크다운 언어를 사용하여 텍스트를 분할합니다.
    language=Language.LATEX,
    # 각 청크의 크기를 60자로 설정합니다.
    chunk_size=60,
    # 청크 간의 중복되는 문자 수를 0으로 설정합니다.
    chunk_overlap=0,
)
# latex_text를 분할하여 문서 목록을 생성합니다.
latex_docs = latex_splitter.create_documents([latex_text])
# 생성된 문서 목록을 출력합니다.
latex_docs

1.2 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>⚡ Building applications with LLMs through composability ⚡</p>  
        </div>
        <div>
            As an open-source project in a rapidly developing field, we are extremely open to contributions.
        </div>
    </body>
</html>
"""

분할하고 결과를 출력합니다.

html_splitter = RecursiveCharacterTextSplitter.from_language(
    # HTML 언어를 사용하여 텍스트 분할기 생성
    language=Language.HTML,
    # 청크 크기를 60으로 설정
    chunk_size=60,
    # 청크 간 중복되는 부분이 없도록 설정
    chunk_overlap=0,
)
# 주어진 HTML 텍스트를 분할하여 문서 생성
html_docs = html_splitter.create_documents([html_text])
# 생성된 문서 출력
html_docs

1.3 Solidity

Solidity 텍스트 분할기를 사용한 예제는 다음과 같습니다:

  • Solidity 코드를 문자열 형태로 SOL_CODE 변수에 저장합니다.
  • RecursiveCharacterTextSplitter를 사용하여 Solidity 코드를 청크 단위로 분할하는 sol_splitter를 생성합니다.
    • language 매개변수를 Language.SOL로 설정하여 Solidity 언어를 지정합니다.
    • chunk_size를 128로 설정하여 각 청크의 최대 크기를 지정합니다.
    • chunk_overlap을 0으로 설정하여 청크 간의 중복을 없앱니다.
  • sol_splitter.create_documents() 메서드를 사용하여 SOL_CODE를 청크 단위로 분할하고, 분할된 청크를 sol_docs 변수에 저장합니다.
  • sol_docs를 출력하여 분할된 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

1.4 C

C# 텍스트 분할기를 사용한 예제는 다음과 같습니다.

C_CODE = """
using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Enter a number (1-5):");
        int input = Convert.ToInt32(Console.ReadLine());
        for (int i = 1; i <= input; i++)
        {
            if (i % 2 == 0)
            {
                Console.WriteLine($"{i} is even.");
            }
            else
            {
                Console.WriteLine($"{i} is odd.");
            }
        }
        Console.WriteLine("Goodbye!");
    }
}
"""

# 분할하고 결과를 출력합니다.
c_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.CSHARP, chunk_size=128, chunk_overlap=0
)
c_docs = c_splitter.create_documents([C_CODE])
c_docs

Subscribe

Enjoy this blog? Get notified of new posts by email: