Langchain과 watsonx.ai로 에이전틱 청킹을 구현하여 LLM 입력을 최적화하세요.

작성자

Shalini Harkar

Lead AI Advocate

에이전트 청킹이란 무엇인가요?

언어 모델이 텍스트를 처리하고 분할하는 방식은 기존의 정적 접근 방식에서 더 우수하고 반응성이 뛰어난 프로세스로 변화하고 있습니다. 고정된 지점에서 대용량 문서를 청킹하는 기존의 고정 크기 청킹과 달리 에이전트 청킹은 AI 기반 기술을 사용하여 동적 프로세스에서 콘텐츠를 분석하고 텍스트를 분할하는 최적의 방법을 결정합니다.

에이전틱 청킹은 AI 기반 텍스트 분할 방법, 재귀 청킹 및 청킹 중첩 방법을 활용합니다. 이러한 방법은 동시에 작동하여 청킹 기능을 다듬고 주목할 만한 아이디어 간 연결을 보존하면서 상황에 맞는 창을 실시간으로 최적화합니다. 에이전트 청킹을 사용하면 각 청크가 메타데이터로 강화되어 검색 정확도와 전반적인 모델 효율성을 높입니다. 이는 데이터 분할이 검색 품질과 답변의 일관성에 직접적인 영향을 미칠 수 있는 RAG 애플리케이션 애플리케이션에서 특히 중요합니다. 의미 있는 컨텍스트가 보다 작은 청크에 보존되므로, 이 접근 방식은 챗봇, 지식 기반 및 생성형 AI 사용 사례에서 매우 중요합니다. Langchain 또는 LlamaIndex와 같은 프레임워크는 검색 효율성을 더욱 향상하여 이 방법의 효과를 크게 높입니다. 

에이전트 청킹의 핵심 요소

1. 적응형 청킹 전략: 효과적인 세분화를 위해 콘텐츠 유형, 쿼리 의도 및 검색 요구 사항에 따라 최상의 청킹 방법을 동적으로 선택합니다.

2. 동적 청크 크기 조정: 고정된 토큰 제한을 고수하는 대신, 의미론적 구조와 컨텍스트를 고려하여 실시간으로 청크 크기를 수정합니다.

3. 컨텍스트 보존 중복: 청크 간 중복을 스마트하게 평가하여 일관성을 그대로 유지하고 필수 정보 손실을 방지하여 검색 효율성을 향상합니다.

 

전문가가 전하는 최신 AI 트렌드

가장 중요하고 흥미로운 AI 뉴스에 대한 선별된 인사이트를 확인하세요. 주간 Think 뉴스레터를 구독하세요. IBM 개인정보 보호정책을 참조하세요.

감사합니다! 구독이 완료되었습니다.

구독은 영어로 제공됩니다. 모든 뉴스레터에는 구독 취소 링크가 있습니다. 여기에서 구독을 관리하거나 취소할 수 있습니다. 자세한 정보는 IBM 개인정보 보호정책을 참조하세요.

기존 방식 대비 에이전틱 청킹의 이점

에이전트 청킹은 기존 청킹에 비해 다음과 같은 이점을 제공합니다.

a. 컨텍스트 유지: 불필요한 중단 없이 중요한 정보를 유지합니다.

b. 스마트 크기 조정: 의미와 중요성에 따라 청크 경계를 조정합니다.

c. 쿼리에 최적화됨: 특정 쿼리와 일치하도록 청크를 지속적으로 정제합니다.

d. 효율적인 검색: 불필요한 파편화를 최소화하여 검색 및 RAG 시스템 아웃풋을 개선합니다.

 

이 튜토리얼에서는 현재 watsonx.ai에서 사용할 수 있는 IBM Granite-3.0-8B-Instruct 모델을 사용하여 에이전틱 청킹 전략을 실험합니다. 전반적인 목표는 효율적인 청킹을 수행하여 RAG를 효과적으로 구현하는 것입니다.

전제조건

watsonx.ai 프로젝트를 생성하려면 IBM Cloud 계정이 필요합니다.

단계

1단계. 환경 설정

여러 툴 중에서 선택할 수 있지만, 이 튜토리얼에서는 Jupyter Notebook을 사용하기 위해 IBM 계정을 설정하는 방법을 안내합니다.

  1. IBM Cloud 계정을 사용하여 watsonx.ai에 로그인합니다.

  2. watsonx.ai 프로젝트를 생성합니다.
    프로젝트 내에서 프로젝트 ID를 가져올 수 있습니다. 관리 탭을 클릭합니다. 그런 다음 일반 페이지의 세부 정보 섹션에서 프로젝트 ID를 복사합니다. 이 튜토리얼에는 이 ID가 필요합니다.

  3. Jupyter Notebook을 만듭니다.

이 단계에서는 이 튜토리얼의 코드를 복사할 수 있는 Notebook 환경이 열립니다. 또는 이 노트북을 로컬 시스템에 다운로드하여 watsonx.ai 프로젝트에 에셋으로 업로드할 수 있습니다. 더 많은 Granite 튜토리얼을 보려면 IBM Granite 커뮤니티를 확인하세요. 이 Jupyter Notebook과 함께 사용된 데이터 세트는 GitHub에서 확인할 수 있습니다.

2단계. watsonx.ai 런타임 인스턴스 및 API 키 설정

  1. watsonx.ai 런타임 서비스 인스턴스를 만듭니다(적절한 지역을 선택하고 무료 인스턴스인 Lite 요금제를 선택합니다).

  2. API 키를 생성합니다.

  3. watsonx.ai 런타임 서비스 인스턴스를 watsonx.ai에서 생성한 프로젝트에 연결합니다.

3단계. 관련 라이브러리 설치, 가져오기 및 자격 증명 설정

이 튜토리얼에는 몇 가지 라이브러리와 모듈이 필요합니다. 다음 항목을 가져와야 합니다. 설치되지 않은 경우, 빠른 PIP 설치로 이 문제를 해결할 수 있습니다.

이 튜토리얼은 Python 3.12.7을 사용하여 구축되었습니다.

!pip install -q langchain langchain-ibm langchain_experimental langchain-text-splitters langchain_chroma transformers bs4 langchain_huggingface sentence-transformers
import getpass
import requests
from bs4 import BeautifulSoup
from langchain_ibm import WatsonxLLM
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import WebBaseLoader
from langchain.schema import SystemMessage, HumanMessage
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.prompts import ChatPromptTemplate
from langchain.vectorstores import Chroma
from langchain.tools import tool
from langchain.agents import AgentExecutor
from langchain.memory import ConversationBufferMemory
from transformers import AutoTokenizer
from ibm_watsonx_ai.foundation_models.utils.enums import EmbeddingTypes
from ibm_watsonx_ai.metanames import GenTextParamsMetaNames as GenParams
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.schema import Document
from langchain.chains.combine_documents import create_stuff_documents_chain



 

자격 증명을 설정하려면 "WATSONX_APIKEY""WATSONX_PROJECT_ID"가 필요합니다. 또한 API 엔드포인트 역할을 하는 URL도 설정합니다.

load_dotenv(os.getcwd()+"/.env", override=True)
credentials = {
    "url": "https://us-south.ml.cloud.ibm.com",
    "apikey": os.getenv("WATSONX_APIKEY", ""),
}
project_id = os.getenv("PROJECT_ID", "")

4단계. 언어 모델 초기화 

이 튜토리얼에서는 유사한 결과를 얻기 위해 IBM의 Granite-3.0-8B-Instruct 모델을 LLM으로 사용할 것을 권장합니다. 물론 원하는 AI 모델을 자유롭게 사용해도 됩니다. watsonx를 통해 사용할 수 있는 파운데이션 모델은 여기에서 확인할 수 있습니다. 

llm = WatsonxLLM(
    model_id="ibm/granite-3-8b-instruct",
    url=credentials.get("url"),
    apikey=credentials.get("apikey"),
    project_id=project_id,
    params={
        GenParams.DECODING_METHOD: "greedy",
        GenParams.TEMPERATURE: 0,
        GenParams.MIN_NEW_TOKENS: 5,
        GenParams.MAX_NEW_TOKENS: 250,
        GenParams.STOP_SEQUENCES: ["Human:", "Observation"],
    },
)

 5단계. 문서 불러오기

이 함수는 머신 러닝에 관한 IBM의 설명서에서 텍스트 콘텐츠를 추출합니다. 이 함수는 원치 않는 HTML 요소(스크립트, 스타일)을 제거하고, 정리되고 읽기 쉬운 텍스트를 반환합니다.

def get_text_from_url(url):
    response = requests.get(url)
    if response.status_code != 200:
        raise ValueError(f"Failed to fetch the page, status code: {response.status_code}")
    soup = BeautifulSoup(response.text, "html.parser")
    for script in soup(["script", "style"]):
        script.decompose()
    return soup.get_text(separator="\n", strip=True)
url = "https://www.ibm.com/kr-ko/think/topics/machine-learning"
web_text = get_text_from_url(url)
web_text

고정 길이 청크 방법을 사용하는 대신 LLM을 사용하여 의미에 따라 텍스트를 분할했습니다. 이 기능은 LLM을 활용하여 텍스트를 주제에 따라 유의미한 청크로 지능적으로 나눕니다.

def agentic_chunking(text):
    """
    Dynamically splits text into meaningful chunks using LLM.
    """
    system_message = SystemMessage(content="You are an AI assistant helping to split text into meaningful chunks based on topics.")
    
    human_message = HumanMessage(content=f"Please divide the following text into semantically different, separate and meaningful chunks:\n\n{text}")

    response = llm.invoke([system_message, human_message]) # LLM returns a string
    return response.split("\n\n") # Split based on meaningful sections
chunks = agentic_chunking(web_text)
chunks

아웃풋 구조를 더 잘 이해할 수 있도록 청크를 인쇄해 보겠습니다.

for i, chunk in enumerate(chunks,1):
    print(f"Chunk {i}:\n{chunk}\n{'-'*40}")

좋습니다! 아웃풋에서 에이전트에 의해 청크가 성공적으로 생성되었습니다.

6단계: 벡터 스토어 생성

이제 텍스트에 대한 에이전트 청킹을 실험했으므로 RAG 구현을 살펴보겠습니다.

이 튜토리얼에서는 에이전트가 생성한 청크를 선택하고 이를 벡터 임베딩으로 변환합니다. 사용할 수 있는 오픈 소스 벡터 스토어는 Chroma DB입니다. langchain_chroma 패키지를 통해 Chroma 기능에 쉽게 액세스할 수 있습니다. Chroma 벡터 데이터베이스를 초기화하고 임베딩 모델을 제공하며 에이전트 청킹으로 생성된 문서를 추가해 보겠습니다.

embeddings_model = HuggingFaceEmbeddings(model_name="ibm-granite/granite-embedding-30m-english")
 

Chroma 벡터 데이터베이스 생성

vector_db = Chroma(
    collection_name="example_collection",
    embedding_function=embeddings_model
)

각 텍스트 청크를 문서 개체로 변환

documents = [Document(page_content=chunk) for chunk in chunks]

벡터 데이터베이스에 문서를 추가합니다.

vector_db.add_documents(documents)

7단계: 프롬프트 템플릿 구조화

이제 LLM을 위한 프롬프트 템플릿을 만들 수 있습니다. 이 템플릿을 사용하면 일관된 프롬프트 구조를 유지하면서 여러 질문을 할 수 있습니다. 또한 벡터 스토어를 검색 툴로 통합하여 RAG 프레임워크를 완성할 수 있습니다.

prompt_template = """<|start_of_role|>user<|end_of_role|>Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}
Question: {input}<|end_of_text|>
<|start_of_role|>assistant<|end_of_role|>"""
qa_chain_prompt = PromptTemplate.from_template(prompt_template)
combine_docs_chain = create_stuff_documents_chain(llm, qa_chain_prompt)
rag_chain = create_retrieval_chain(vector_db.as_retriever(), combine_docs_chain)

8단계: RAG 체인 프롬프트

RAG 워크플로에서 이러한 에이전트 청킹을 사용하여 사용자 쿼리를 시작해 보겠습니다. 첫째, 모델이 내장된 지식을 사용하고 있는지 아니면 RAG 컨텍스트를 실제로 사용하고 있는지 테스트하기 위해 구축한 벡터 스토어에서 추가 컨텍스트 없이 모델을 전략적으로 프롬프트할 수 있습니다. 이제 IBM의 머신 러닝 설명자를 사용하여 질문해 보겠습니다.

output = llm.invoke("What is Model optimization process")
output

분명히 모델은 모델 최적화 프로세스에 대한 정보에 대해 훈련되지 않았으며 외부 툴이나 정보 없이는 올바른 정보를 제공할 수 없습니다. 모델에 할루시네이션이 발생합니다. 이제 이 사례에서 구축한 에이전트 청킹을 사용하여 RAG 체인에 같은 쿼리를 제공해 보겠습니다.

rag_output = rag_chain.invoke({"input": "What is Model optimization process?"})
rag_output['answer']

좋습니다! Granite 모델은 의미론적 일관성을 유지하면서 모델 최적화 프로세스에 대한 올바른 정보를 제공하기 위해 에이전트 RAG 청크를 컨텍스트로 올바르게 사용했습니다.

요약

이 튜토리얼에서는 청킹 프로세스에서 AI 에이전트를 사용하여 더 작은 관련 정보를 생성하고 검색 증강 생성(RAG) 파이프라인을 구축했습니다.

이 방법은 인공 지능과 자연어 처리(NLP)를 사용하여 정보 검색 및 컨텍스트 창 최적화를 개선합니다. 더 나은 결과를 얻기 위해 OpenAI의 GPT 모델과 같은 대규모 언어 모델(LLM)을 활용할 때 데이터 청크를 간소화하여 검색 효율성을 향상시킵니다.

관련 솔루션
IBM AI 에이전트 개발 

IBM watsonx.ai 스튜디오를 사용하여 개발자가 AI 에이전트를 구축, 배포 및 모니터링할 수 있도록 지원합니다.

watsonx.ai 살펴보기
IBM AI 에이전트 및 어시스턴트

기업이 AI 에이전트 및 어시스턴트를 구축, 사용자 지정, 관리할 수 있도록 지원하며, 업계에서 가장 포괄적인 기능 세트 중 하나를 사용하여 획기적인 생산성을 창출하세요. 

AI 에이전트 살펴보기
IBM Granite

개발자 효율성을 높이는 Granite의 소형 개방형 모델을 사용하여 90% 이상의 비용 절감을 달성하세요. 이러한 엔터프라이즈급 모델은 사이버 보안부터 RAG까지 광범위한 엔터프라이즈 작업과 안전 벤치마크에 대해 탁월한 성능을 제공합니다.

Granite 살펴보기
다음 단계 안내

기업이 AI 에이전트 및 어시스턴트를 구축, 사용자 지정 및 관리할 수 있도록 지원하는 업계에서 가장 포괄적인 기능을 통해 복잡한 워크플로를 자동화하고 획기적인 생산성을 창출하세요. 

watsonx.ai 에이전트 개발 살펴보기 watsonx Orchestrate 알아보기