2장. 개발 환경 준비
pip 와 패키지
새 주방에 도구를 들일 때는 주방용품 도매상에 주문합니다. "냄비 하나 주세요" 하면 냄비 뚜껑과 손잡이까지 한 상자로 옵니다. 다 들인 뒤에는 무엇을 몇 개 들였는지 장부에 적어 둡니다. 다음에 2호점을 낼 때 장부만 보고 똑같이 주문하면 됩니다. 파이썬에서는 pip 가 주문을, PyPI 가 도매상을, requirements.txt 가 장부를 맡습니다.
pip install 이름 을 실행하면 pip 가 PyPI 에서 그 패키지와 의존성을 함께 받아, 켜 둔 가상환경의 site-packages 폴더에 넣습니다. 마지막 상자의 pip freeze 는 설치된 패키지와 판을 목록으로 적어 줍니다. 여기서 도매상이 PyPI, 냄비와 함께 온 뚜껑이 의존성, 장부가 requirements.txt 입니다. 비유와 다른 점은, pip 는 같은 이름의 다른 판이 이미 있으면 말없이 바꿔 끼우기도 한다는 것입니다. 그래서 판을 목록으로 적어 둡니다.
자주 쓰는 pip 명령
# 이 장에서 쓰는 패키지를 설치한다. 의존성(langchain-core, tiktoken 등)도 함께 받는다
pip install langchain langchain-openai python-dotenv
# 설치된 패키지 목록과 판을 본다
pip list
# 한 패키지의 판, 의존성, 설치 위치를 자세히 본다
pip show langchain-openai
# 설치된 패키지를 "이름==판" 꼴로 requirements.txt 에 적는다. > 는 화면 대신 파일로 보내기
pip freeze > requirements.txt
# 목록 파일에 적힌 패키지를 모두 설치한다. -r = requirement file(목록 파일)
pip install -r requirements.txt
# 패키지를 새 판으로 올린다. -U = upgrade(올리기)
pip install -U langchain-openai| 명령과 옵션 | 원래 말 | 뜻 |
|---|---|---|
pip install 이름 | install(설치하다) | PyPI 에서 받아 가상환경에 설치한다 |
pip list | list(목록) | 설치된 패키지와 판을 늘어놓는다 |
pip show 이름 | show(보여 주다) | 한 패키지의 판, 의존성(Requires), 위치를 보여 준다 |
pip freeze | freeze(얼리다, 지금 모습 그대로 굳히다) | 설치된 것을 이름==판 꼴로 적는다 |
> | redirect(방향 바꾸기) | 화면에 찍을 글을 파일로 보낸다 |
-r 파일 | requirement file | 목록 파일의 패키지를 모두 설치한다 |
-U | upgrade | 이미 있어도 새 판으로 올린다 |
requirements.txt 의 꼴
langchain==1.4.7
langchain-openai==1.7.3
python-dotenv==1.2.4== 는 "꼭 이 판"이라는 뜻입니다. >=1.4 처럼 적으면 "1.4 이상이면 아무 판"이 됩니다. 교안의 실행 결과와 똑같이 맞추고 싶으면 == 로 적습니다. 실습 1에서 지금 설치된 판으로 이 꼴의 파일을 직접 만들어 봅니다.
짧은 예시
importlib.metadata 는 파이썬에 들어 있는 묶음으로, 설치된 패키지의 정보를 코드로 읽습니다. pip show 를 코드로 하는 것과 같습니다.
from importlib.metadata import requires, version
# version(이름): 설치된 패키지의 판을 글자로 돌려준다
print("langchain-openai", version("langchain-openai"))
# requires(이름): 그 패키지가 함께 설치되게 한 의존성 목록. 앞의 네 개만 본다
for req in requires("langchain-openai")[:4]:
print(" 필요:", req)langchain-openai 1.7.3
필요: certifi>=2024.6.2
필요: langchain-core<2.0.0,>=1.7.0
필요: openai>=2.45.0
필요: tiktoken>=0.7.0langchain-openai 하나를 설치했는데 langchain-core, openai, tiktoken 이 함께 따라옵니다. langchain-core<2.0.0,>=1.7.0 은 "1.7.0 이상, 2.0.0 미만"이라는 조건입니다. pip 는 이 조건을 맞추는 판을 골라 줍니다.
코드가 의미하는 것
이 코드는 들여 온 냄비 상자를 열어 판 번호와 함께 온 부품 목록을 읽는 일과 같습니다. 판 읽기와 의존성 읽기, 두 가지 동작입니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
version("langchain-openai") | 설치된 판을 글자로 돌려준다 | 이 PC 의 챗봇이 어느 판의 부품으로 도는지 확인합니다. 교안과 판이 다르면 결과가 달라질 수 있습니다 |
requires("langchain-openai") | 그 패키지가 함께 설치되게 한 패키지와 판의 조건을 돌려준다 | ChatOpenAI 한 줄 뒤에 openai SDK 와 tiktoken 이 숨어 있다는 것을 보여 줍니다 |
[:4] | 목록의 앞 네 개만 자른다 | 의존성 목록이 길어 앞부분만 봅니다. 보지 않은 나머지도 모두 설치되어 있습니다 |
결과에서 읽을 것은 두 가지입니다.
- 하나를 들이면 여럿이 따라옵니다. langchain-core, openai, tiktoken 이 함께 적혔습니다. 뒤의 "ChatOpenAI 로 첫 호출" 절에서 보듯
ChatOpenAI는 안에서 openai SDK 를 대신 불러 줍니다. - 조건은 범위로 적힙니다.
langchain-core<2.0.0,>=1.7.0처럼 판의 범위가 정해져 있어, pip 는 이 범위 안에서 판을 고릅니다. 이 PC 의 langchain-openai 는 1.7.3 입니다.
주의할 점
- 패키지 이름과 불러오는 이름이 다를 때가 있습니다. 설치는
pip install python-dotenv, 코드는import dotenv입니다.langchain-openai는 코드에서langchain_openai처럼 빼기(-) 대신 밑줄(_)을 씁니다. - 가상환경을 켜지 않고
pip install을 하면 컴퓨터 전체의 파이썬에 설치됩니다. 줄 앞에(.venv)가 있는지 먼저 봅니다. - 인터넷의 예제를 따라 패키지를 설치할 때는 이름의 철자를 꼭 확인합니다. 비슷한 이름의 엉뚱한 패키지가 있을 수 있습니다.