여러 자료(여기서는 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의 답변 ====
철수가 주말에 주로 하는 행동은 한강에서 자전거를 타는 것이고, 좋아하는 음식은 매운 떡볶이입니다.
답글 남기기