⭐ 스타워즈 영화 스크립트 전문가
원조 스타워즈 영화 스크립트를 크롤링하고, 이를 청크(chunk)로 분할하며, 임베딩을 Qdrant 벡터 저장소에 저장한 뒤, 채팅 LLM을 사용하여 스크립트 내용만을 인용하여 사용자 질문에 답변하는 최소한의 검색 증강 생성 (Retrieval-Augmented Generation, RAG) 예제입니다.
🚀 기능
- IMSDb에서 원작 삼부작(original trilogy) 스크립트를 크롤링합니다.
- 텍스트 분할기(text splitter)를 사용하여 스크립트를 검색 가능한 청크로 분할합니다.
- 로컬 Qdrant 컬렉션에 임베딩을 저장하고 인덱싱합니다.
- OpenAI 임베딩 및 채팅 모델을 사용하여 스크립트 컨텍스트만을 이용해 쿼리에 답변합니다.
🧭 빠른 시작 (Quickstart)
전제 조건 (Prerequisites)
- Python 3.12 이상
- OpenAI API 키 (환경 변수에
OPENAI_API_KEY 설정)
- Docker (선택 사항) - 로컬 Qdrant 서버를 실행하려는 경우 권장
설치 (Install)
- 가상 환경(venv)을 생성하고 활성화합니다:
python -m venv .venv
source .venv/bin/activate
- 의존성 패키지를 설치합니다 (pip 사용):
(대안으로 Poetry를 사용할 경우: poetry install)
uv 사용하기 (권장)
uv 개발 도구를 사용하면 몇 가지 명령어만으로 프로젝트 초기화, 필요한 의존성 설치, 앱 실행까지 할 수 있습니다. 아직 설치하지 않았다면 다음 명령어로 uv를 설치하세요:
그런 다음 아래 워크플로우를 사용하여 프로젝트를 설정하고 실행합니다:
uv init
uv add beautifulsoup4 langchain langchain-openai langchain-qdrant langchain-text-splitters qdrant-client
uv run main.py
uv add의 의존성 패키지는 원하는 것으로 대체하거나, 로컬 패키지를 설치하려면 -e .을 사용할 수 있습니다.
Qdrant 시작하기 (선택 사항 — 로컬 사용 시 권장)
Docker를 사용하여 로컬 Qdrant 인스턴스를 실행합니다:
docker run -p 6333:6333 qdrant/qdrant:latest
임베디드/로컬 모드를 선호하는 경우, 스크립트는 ./qdrant_db의 영속성 디렉토리를 사용하려고 시도합니다.
앱 실행 (Run the app)
최초 실행 시 스크립트가 다운로드 및 인덱싱을 수행합니다 (시간이 다소 걸릴 수 있습니다). 인덱싱 완료 후 다음 프롬프트가 표시됩니다:
--- 스타워즈 영화 전문가(The Star Wars Movie Expert)가 질문에 답변할 준비가 되었습니다 ---
질문을 입력하고 Enter를 누르세요. 중지하려면 exit 또는 quit을 입력하세요.
예시: Who says "I am your father"?
⚙️ 설정 (Configuration)
PERSIST_PATH — Qdrant 영속성 디렉터리 경로 (기본값: ./qdrant_db)
COLLECTION_NAME — Qdrant 컬렉션 이름 (star-wars-scripts)
main.py의 star_wars_scripts 리스트를 편집하여 스크립트를 추가하거나 제거하세요.
- 현재 코드는 OpenAI 임베딩(embeddings)과 응답을 위한
ChatOpenAI를 사용합니다. 환경 변수에 OpenAI 자격 증명을 설정하세요.
🛠️ 확장 (Extending)
star_wars_scripts에 항목을 추가하고 스크립트를 다시 실행하여 더 많은 스크립트(다른 영화 또는 프랜차이즈 콘텐츠)를 추가할 수 있습니다.
- 동일한 인터페이스를 따르는 대안으로
OpenAIEmbeddings나 ChatOpenAI를 교체하여 LLM/임베딩을 변경하세요.
- 로컬 영속성 대신 원격 호스트를 가리키도록
QdrantClient를 구성하여 원격 Qdrant 클러스터를 사용하세요.
⚠️ 참고 사항 및 개인 정보 보호 (Notes & Privacy)
- 이 앱은 IMSDb에서 공개 스크립트를 크롤링합니다. 크롤링된 콘텐츠를 사용할 때는 출처의 서비스 약관을 준수해야 합니다.
- 질문에 대한 답변은 수집된(ingested) 스크립트 텍스트만을 기반으로 이루어집니다. 스크립트에 정보가 없는 경우, 어시스턴트는 다음과 같이 답합니다: "There is no information about this in the original Star Wars scripts." (원본 스타워즈 스크립트에는 이 내용이 없습니다.)
📦 프로젝트 (Project)
- Python:
>=3.12
- 의존성은
pyproject.toml에 나열되어 있습니다.
🤝 기여 (Contributing)
기여, 이슈, 기능 요청을 환영합니다. 변경 사항을 설명하는 PR 또는 이슈를 여세요.
📜 라이선스 (License)
MIT
은하계를 멀고 먼 곳까지 탐험하는 즐거움을 누리세요! ✨