LangChain 챗봇2장 · 개발 환경 준비13 / 20← 이전목차다음 →MetaContents

2장. 개발 환경 준비

실습 1 — 가상환경과 패키지 점검하기

지금 코드를 돌리는 파이썬이 과목의 가상환경인지 확인하고, 이 과정에서 쓰는 패키지의 판을 찍은 뒤, 설치된 판을 out_ch02_requirements.txt 로 저장합니다. 모델을 부르지 않으므로 API 키가 없어도 됩니다. 저장한 파일은 프로젝트 1에서 판을 견줄 때 씁니다.

1단계. 지금 쓰는 파이썬 확인하기

Python
import sys
from pathlib import Path

# sys.version: 지금 실행 중인 파이썬의 판. 첫 낱말(3.14.6 같은 숫자)만 잘라 쓴다
print("파이썬 판:", sys.version.split()[0])
# sys.prefix(지금 환경의 폴더)와 sys.base_prefix(원래 파이썬의 폴더)가 다르면 가상환경 안이다
print("가상환경 안인가:", sys.prefix != sys.base_prefix)
# sys.executable: 이 코드를 돌리는 python.exe 의 위치. PC 마다 다른 앞부분은 빼고 끝의 세 부분만 찍는다
print("실행 파일:", "\\".join(Path(sys.executable).parts[-3:]))
출력
파이썬 판: 3.14.6
가상환경 안인가: True
실행 파일: .venv\Scripts\python.exe

코드가 의미하는 것 sys.version, sys.prefix, sys.executable 세 값은 "어느 파이썬이, 어느 패키지 상자를 쓰며 이 코드를 돌리는가"를 알려 줍니다. 패키지를 설치했는데 불러오지 못한다면 다른 파이썬으로 돌렸을 수 있으므로, 이 세 줄을 실습의 맨 앞에 두었습니다.

2단계. 패키지 판 찍기

Python
from importlib.metadata import PackageNotFoundError, version

# 이 과정에서 쓰는 패키지. streamlit 은 7차시에서 설치하므로 지금은 없을 수 있다
PACKAGES = ["langchain", "langchain-core", "langchain-openai", "openai", "python-dotenv", "tiktoken", "streamlit"]

installed = {}
for name in PACKAGES:
    try:
        # version(이름): 설치된 판을 "1.4.7" 같은 글자로 돌려준다
        installed[name] = version(name)
    except PackageNotFoundError:
        # 설치되지 않은 패키지는 이 오류가 난다. None 으로 적어 둔다
        installed[name] = None
    # :17 은 이름을 17칸에 맞춰 줄을 가지런히 한다
    print(f"{name:17} {installed[name] or '설치 안 됨'}")
출력
langchain         1.4.7
langchain-core    1.7.3
langchain-openai  1.7.3
openai            3.42.1
python-dotenv     1.2.4
tiktoken          0.14.0
streamlit         설치 안 됨

코드가 의미하는 것 version(name) 으로 이 과정의 챗봇이 기대는 부품의 판을 하나씩 읽고, 없는 것은 PackageNotFoundError 를 잡아 None 으로 적습니다. 오류로 멈추지 않고 "설치 안 됨"으로 남겨 두는 것은, 7장의 streamlit 처럼 아직 들이지 않은 부품이 있어도 점검을 끝까지 하려는 것입니다.

3단계. 1.x 판인지 확인하기

Python
# LangChain 은 1.0 에서 크게 바뀌었다. 옛 0.x 판의 예제 코드는 지금 판에서 돌지 않는 것이 많다
for name in ["langchain", "langchain-core", "langchain-openai"]:
    # "1.4.7" 을 점으로 나눠 맨 앞 숫자(주 판, major version)만 정수로 바꾼다
    major = int(installed[name].split(".")[0])
    print(f"{name:17} 주 판 {major} →", "좋음" if major >= 1 else "pip install -U 로 올리기")
출력
langchain         주 판 1 → 좋음
langchain-core    주 판 1 → 좋음
langchain-openai  주 판 1 → 좋음

코드가 의미하는 것 split(".")[0] 으로 꺼낸 주 판은 코드의 꼴이 크게 바뀌었는지를 가리는 숫자입니다. LangChain 은 1.0 에서 크게 바뀌어 옛 예제가 지금 판에서 돌지 않을 수 있으므로, 이 점검은 "이 교안의 코드가 그대로 돌 판인가"를 묻는 것입니다.

4단계. requirements 파일로 저장하기

Python
# 설치된 것만 "이름==판" 꼴로 적는다. pip freeze 가 쓰는 꼴과 같다
lines = [f"{name}=={ver}" for name, ver in installed.items() if ver]
Path("out_ch02_requirements.txt").write_text("\n".join(lines) + "\n", encoding="utf-8")
print("저장: out_ch02_requirements.txt")

# 저장한 파일을 다시 읽어 확인한다. rstrip: 끝의 줄바꿈을 떼어 빈 줄이 찍히지 않게 한다
print(Path("out_ch02_requirements.txt").read_text(encoding="utf-8").rstrip())
출력
저장: out_ch02_requirements.txt
langchain==1.4.7
langchain-core==1.7.3
langchain-openai==1.7.3
openai==3.42.1
python-dotenv==1.2.4
tiktoken==0.14.0

코드가 의미하는 것 "이름==판" 꼴로 파일에 적는 것은 지금의 패키지 상자를 장부로 남기는 일입니다. 이 장부가 있으면 다른 PC 에서도 같은 판으로 챗봇의 주방을 다시 차릴 수 있고, 프로젝트 1은 이 파일을 기준 삼아 판이 바뀌지 않았는지 견줍니다. if ver 로 설치 안 된 패키지는 장부에서 뺐습니다.

이 실습이 뜻하는 것

이 실습은 새 주방의 조리대 앞에서 도구 목록을 점검하는 일과 같습니다. 내가 선 조리대가 맞는지 보고(1단계), 들여 놓은 도구를 하나씩 세고(2단계), 옛날 모델의 도구가 섞이지 않았는지 보고(3단계), 장부에 적어 둡니다(4단계). 여기서 조리대가 .venv, 도구가 패키지, 장부가 out_ch02_requirements.txt 입니다. 비유와 다른 점은, 도구는 눈으로 세지만 패키지는 importlib.metadata 로 코드가 대신 센다는 것입니다.

단계출력뜻
1. 파이썬3.14.6, True, .venv\Scripts\python.exe과목의 가상환경 안에 있는 파이썬으로 돌고 있습니다
2. 패키지 판langchain 1.4.7, langchain-openai 1.7.3, openai 3.42.1 등 여섯 개, streamlit 설치 안 됨이 장에 필요한 것은 모두 있고, 7장에서 쓸 streamlit 은 아직 없습니다
3. 주 판세 패키지 모두 주 판 1 → 좋음옛 0.x 판의 코드가 아니라 지금 판의 코드를 써야 합니다
4. 저장"이름==판" 여섯 줄설치 안 된 streamlit 은 빠지고 설치된 여섯 개만 적혔습니다

한 줄로 줄이면, 내가 선 조리대와 들여 놓은 도구를 코드로 확인하고 장부에 적어 둔 실습입니다. 판 숫자는 교안을 만든 PC 의 것이라, 여러분이 설치한 때에 따라 끝자리가 달라도 괜찮습니다. 맨 앞 숫자(주 판)가 같으면 이 교안의 코드가 그대로 돕니다. 1단계에서 False 나 .venv 가 없는 경로가 나오면, 가상환경을 켜거나 VS Code 의 인터프리터를 다시 고른 뒤 처음부터 돌립니다.

코드 설명

  • sys.prefix != sys.base_prefix 는 가상환경인지 가리는 가장 쉬운 방법입니다. 가상환경을 켜지 않으면 두 값이 같은 폴더를 가리킵니다.
  • version(name) 은 pip show 가 보여 주는 판을 코드로 읽습니다. 설치되지 않은 이름이면 PackageNotFoundError 가 나므로 try/except 로 감쌌습니다.
  • installed[name].split(".")[0] 은 "1.4.7" 을 ["1", "4", "7"] 로 나눠 맨 앞의 "1" 을 꺼냅니다. 맨 앞 숫자가 바뀌면 코드의 꼴이 크게 바뀐 판입니다.
  • out_ch02_requirements.txt 는 pip install -r out_ch02_requirements.txt 로 그대로 쓸 수 있는 꼴입니다. 다만 pip freeze 와 달리 2단계의 목록에 적은 패키지만 들어 있습니다.
← 이전 절2장 · 실습 지도다음 절 →2장 · 실습 2 — .env 파일 만들고 읽기