LLM Application/LangChain

RAG App 개발 1 - Indexing (인덱싱) 하기

carrotweb 2026. 7. 23. 00:00
728x90
반응형

개발 환경 설정

RAG App를 Jupyter로 개발하기 위해서 VSCode에 Extension으로 Jupyter 설치합니다.

 

Jupyter

Jupyter는 파이썬과 R 언어를 위해 인터렉티브한 컴퓨팅 환경을 제공하기 위해 개발되어 무료로 제공되고 있는 웹 기반의 소프트웨어이다. Jupyter Notebook은 셀이라는 블럭의 집합으로 코드를 작성할 수 있도록 해주며, 각 셀은 따로 수정하고 실행할 수도 있습니다.

 

VSCode에서 Jupyter Notebook 단축키를 사용할 수 있도록 해주는 확장 프로그램입니다. 이 확장 프로그램을 설치하면 Jupyter Notebook에서 사용하던 단축키를 VS Code에서도 동일하게 사용할 수 있습니다.

 

 

RAG App 개발

랭체인 사이트의 튜토리얼을 기반으로 설명하겠습니다.

 

더 자세한 내용 랭체인 사이트를 참고하시기 바랍니다.

(https://python.langchain.com/docs/tutorials/rag/)

 

Q&A App 개발

Indexing (인덱싱) 하기

  1. 텍스트 문서 파일을 텍스트 로더로 로드합니다.
  2. 텍스트 스플리터로 텍스트를 청크 사이즈로 분할합니다.
  3. 임베딩 모델을 생성합니다. (청크를 벡터 값 변환)
  4. 분할된 청크들을 임베딩 모델을 사용하여 벡터로 변환하고 벡터 스토어에 저장합니다.

Indexing (인덱싱) 순서대로 진행하겠습니다.

 

Indexing (인덱싱) – Load (읽기)

1. project3에 data 폴더를 만들고 test.txt 파일을 생성합니다.

데이터인 test.txt 파일은 회사 관련 뉴스입니다.

 

테크빌교육 체더스, 기초학력 부진 해결을 위한 코스웨어 기획전 진행

테크빌교육(대표 이형세)이 운영하는 에듀테크 마켓 플레이스 ‘체더스’가 여름방학을 앞두고 학생의 국·영·수 기초학력 부진 해소를 위한 ‘코스웨어 기획전’을 진행한다고 25일 밝혔다. 

교육부의 ‘2023 국가수준 학업성취도평가’에 따르면 중학생의 기초학력 미달률은 9.1%, 영어 6.0%, 수학 13.0%였으며 고등학생은 국어 8.6%, 영어 8.7%, 수학 16.6%로 집계됐다. 특히 수학의 기초학력 부진이 가장 높아 학습 격차 해소를 위한 지원이 필요한 상황이다. 

이번 기획전에서는 AI 수학 학습 플랫폼 ‘매쓰홀릭 T’, AI 영어 학습 솔루션 ‘원아워’, 국어 문해력 학습 프로그램 ‘리드포스쿨’ 등 기초 학력 향상에 특화된 에듀테크 솔루션을 특별 할인가로 제공한다. 

체더스는 에듀테크 제품 판매에서 나아가 교육 현장에서의 활용도를 높이기 위한 다양한 지원 프로그램도 운영 중이다. 국내외 33종 에듀테크 제품의 무료 체험과 함께 초등과 중·고등으로 세분화된 ‘체더스 부트캠프’, 전국 교사 대상의 웨비나를 연 20회씩 진행하며 에듀테크 도입과 실제 수업 적용 사례를 확산하고 있다. 

최근에는 ‘체더스 디지털 배지’ 시스템을 도입했다. 이 배지는 에듀테크 등급 배지(공교육에서 신뢰할 수 있는 품질과 가치를 제공하는 에듀테크)와 학교 실증 배지(실제 교육 현장에서 활용 돼 교육적·기술적 효과를 입증한 에듀테크)의 2종으로 구성돼 있다. 

올해부터 에듀테크 선도학교 예산 축소에 따라 ‘최저가 보장 이달의 에듀테크 특가전’도 진행하고 있다. 노션(Notion), 굿노트(GoodNotes), 카훗(Kahoot), 카미(Kami), 니어팟(Nearpod) 북크리에이터(Book Creator) 등 해외 주요 에듀테크 솔루션을 최저가로 판매하고 국내 에듀테크 기업들과의 협업으로 할인 혜택도 확대할 계획이다. 

정지혜 체더스사업부 부서장은 "학기말부터 여름방학은 기초학력을 높일 수 있는 중요한 시기”라며 “이번 기획전을 통해 선생님들이 효과가 검증된 솔루션을 활용해 학생들 간의 학습 격차를 해소하는 데 도움이 되길 바란다”고 말했다. 

한편 체더스는 지난 5월 체더스에서 에듀테크 제품을 구매한 학교를 대상으로 ‘간식어택 이벤트’를 진행했다. 그 결과 이벤트에 선정된 8개교에 피자 및 간식 박스를 전달했으며 1등으로 당첨된 의정부신곡초등학교에는 지난 24일 ‘찾아가는 간식차’를 보내 디지털 교육에 앞장서고 있는 교육 현장을 직접 응원했다.

 

2. project3에 QnA1.ipynb 파일을 생성합니다.

 

텍스트 파일을 읽기(LOAD)하기 위해서 langchain-community에 있는Text Loader를 사용하겠습니다.

langchain-community (https://python.langchain.com/api_reference/community/index.html) – Third-party module (서드파티 모듈)

 

Document Loader > Text Loader (https://python.langchain.com/api_reference/community/document_loaders/langchain_ community.document_loaders.text.TextLoader.html)

 

3. project3QnA1.ipynb 파일에 텍스트 문서 로드 코드를 추가합니다.

[Markdown]
일반 텍스트 문서 로드

[Code]
%pip install langchain-community

[Code]
from langchain_community.document_loaders import TextLoader

file_path = "data/test.txt"

# 텍스트 로더 생성
loader = TextLoader(file_path, encoding="utf-8")

# 문서 로드
docs = loader.load()

print(f"문서의 수: {len(docs)}\n")
docs

 

4. 첫번째 [Code]를 실행하여 langchain-community를 설치합니다.

 

5. 일반 텍스트 문서 로드 코드를 실행합니다.

 

 

Indexing (인덱싱) – Split (분할)

 

Splitting Document (https://python.langchain.com/docs/tutorials/rag/#splitting-documents)

 

 

 

Recursive Text Splitter (https://python.langchain.com/docs/how_to/recursive_text_splitter/)

 

1. project3에 QnA1.ipynb 파일에 텍스트 문서 분할 코드를 추가합니다.

[Markdown]
일반 텍스트 문서 분할

[Code]
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=100,
    chunk_overlap=20
)
texts = text_splitter.split_documents(docs)
len(texts)

 

2. 문서 분할 코드를 실행합니다.

 

 

Indexing (인덱싱) – Embed (임베드, 임베딩 모델)

 

OpenAI에서 제공하는 임베딩 서비스입니다.
텍스트를 효율적으로 벡터로 변환합니다. 하지만 비용이 발생합니다.

 

Embed Text (https://python.langchain.com/docs/how_to/embed_text/)

 

Vector embeddings (https://platform.openai.com/docs/guides/embeddings)

 

1. project3에 QnA1.ipynb 파일에 텍스트 문서 임베딩 코드를 추가합니다.

[Markdown]
일반 텍스트 문서 임베딩

[Code]
import os
from langchain_openai import OpenAIEmbeddings

os.environ["OPENAI_API_KEY"] = "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"

embeddings_model = OpenAIEmbeddings(model="text-embedding-3-large")

embeddings = embeddings_model.embed_documents([text.page_content for text in texts])

len(embeddings)

 

2. 텍스트 문서 임베딩 코드를 실행합니다.

 

문서 임베딩 코드를 실행 결과입니다.

 

 

Indexing (인덱싱) – Store (저장)

 

Store 중 대표적인 2개를 소개합니다.

 

Chroma (https://www.trychroma.com/)

임베딩 벡터를 저장하기 위한 오픈소스 소프트웨어로, LLM App 구축을 용이하게 하는 핵심 기능을 수행합니다.

 

Faiss (https://ai.meta.com/tools/faiss/)

Facebook AI Research에 의해 개발된 라이브러리로, 대규모 벡터 데이터셋에서 유사도 검색을 빠르고 효율적으로 수행할 수 있게 해줍니다. 메모리 사용량을 최소화하면서도 검색 속도를 극대화하는 특징이 있습니다.

 

여기서는 Chroma를 Store로 사용하겠습니다.

 

langchain-chroma (https://python.langchain.com/api_reference/chroma/index.html)

 

Vector Stores (https://python.langchain.com/docs/how_to/vectorstores/)

 

1. project3에 QnA1.ipynb 파일에 벡터 스토어 저장 코드를 추가합니다. 벡터 스토어가 저장될 chroma_db 폴더를 생성합니다.

[Markdown]
벡터 스토어 저장

[Code]
%pip install langchain-chroma

[Code]
from langchain_chroma import Chroma

vector_store = Chroma.from_documents(
    documents=texts, # 분할된 Document 객체 리스트
    embedding=embeddings_model, # 사용할 임베딩 모델
    persist_directory="./chroma_db", # 저장될 디렉토리
    collection_name="test_db"
)

 

2. 첫번째 [Code]를 실행하여 langchain-chroma를 설치합니다.

 

3. 벡터 스토어 저장 코드를 실행합니다. chroma_db 폴더에 벡터 스토어가 생성됩니다.

 

4. project3에 QnA1.ipynb 파일에 벡터 스토어 쿼리 코드를 추가합니다.

[Code]
query = "중학생의 수학 기초학력 미달률은?"
docs = vector_store.similarity_search(query)
print(docs[0].page_content)

 

5. 벡터 스토어 쿼리 코드를 실행합니다.

 

 

이어서, Retrieval and Generation (검색과 생성)을 진행하도록 하겠습니다.

728x90
반응형