파이썬 개발 환경 및 의존성 패키지 설정

여러 자료(여기서는 PDF 문서로 할 예정)를 읽어 벡터 데이터베이스(Vector DB)로 가공하기 위해 필요한 파이썬 개발 환경 및 필수 패키지 설치 단계를 설명합니다.

1. 파이썬 가상환경(venv) 생성 및 활성화

다양한 파이썬 프로젝트를 진행할 때 패키지 버전 충돌을 방지하기 위해, 독립된 가상환경으로 하는 것이 편하다.

% mkdir local-rag-project 
% cd local-rag-project 
% /opt/homebrew/bin/python3 -m venv venv
% source venv/bin/activate
(venv) % 

2. RAG 필수 pip 패키지 설치

# ① Ollama 연동 전용 패키지 설치 : Ollama의 LLM 및 Embeddings 기능을 최신 API 규격으로 제어하는 패키지입니다.
(venv) % pip install langchain-ollama

# ② 벡터 데이터베이스(Chroma) 전용 패키지 설치 : 임베딩 모델이 변환한 숫자 좌표(벡터)들을 하드디스크에 영구 저장하고 빛의 속도로 검색해 주는 벡터 DB 패키지입니다.
(venv) % pip install langchain-chroma

# ③ PDF 문서 로더 및 텍스트 분할 패키지 설치 : PDF 파일을 파이썬으로 읽어오고, AI가 읽기 좋은 형태로 쪼개주는 도구들입니다.
(venv) % pip install pypdf langchain-text-splitters

# ④ 다양한 외부 데이터 및 도구 연동 패키지 설치 : PDF 로더(PyPDFLoader)를 비롯해 각종 문서, 웹페이지, 데이터베이스 등 수백 가지의 외부 도구를 LangChain과 연결해 주는 커넥터 패키지입니다.
(venv) % pip install langchain-community

3. 임베딩(벡터화) 모델 설치

% ollama pull bge-m3
% ollama list  
NAME             ID              SIZE      MODIFIED     
bge-m3:latest    790764642607    1.2 GB    9 hours ago     
qwen3:8b         500a1f067a9f    5.2 GB    10 hours ago

4. 샘플 코드 실행

이제 아래 코드를 실행해보자. 아래 코드는 PDF 파일을 넣기 전에 임의로 PDF 내용이라고 가정하고 raw_documents 값을 넣었습니다.

from langchain_ollama import OllamaLLM
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma
from langchain_text_splitters import CharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

# 1. 백엔드 AI 엔진 설정
llm = OllamaLLM(model="qwen3:8b")
embeddings = OllamaEmbeddings(model="bge-m3")

# 2. 내 비밀 데이터(추후 PDF를 읽어 채울 내용들임)
raw_documents = [
    "철수의 비밀: 철수가 제일 좋아하는 음식은 매운 떡볶이이고, 취미는 주말마다 한강에서 자전거를 타는 것이다.",
    "영희의 비밀: 영희는 고양이를 두 마리 키우고 있으며, 장래희망은 우주비행사가 되는 것이다."
]

# 3. 텍스트 쪼개기 및 벡터 DB 저장
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.create_documents(raw_documents)
db = Chroma.from_documents(docs, embeddings)
retriever = db.as_retriever()

# 4. 최신 규격 프롬프트 템플릿 생성
template = """아래의 제공된 문맥(Context)만을 바탕으로 질문에 답하세요. 
만약 답을 모른다면 모른다고 말하고, 답변을 지어내지 마세요.

Context:
{context}

Question: {question}
Answer:"""
prompt = ChatPromptTemplate.from_template(template)

# 5. 최신 LCEL 파이프라인(Chain) 구성
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 6. 질문 던지기
query = "철수가 주말에 주로 하는 행동과 좋아하는 음식을 알려줘."
response = rag_chain.invoke(query)

print("==== 최신 RAG AI의 답변 ====")
print(response)
(venv) % python3 app.py
==== 최신 RAG AI의 답변 ====
철수가 주말에 주로 하는 행동은 한강에서 자전거를 타는 것이고, 좋아하는 음식은 매운 떡볶이입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다