이전글 LangChain #1 - 어디에 쓰이는 물건인가 에서는 이전글 LLM, LangChain, LangGraph, RAG, Agent 개념을 간단히 정리했다.
이번 글에서는 개발 환경을 세팅하고. txt 파일을 불러와 문서 내용을 기반으로 답변을 생성하는 구조까지 실습해보려고 한다.
Python 개발 환경 준비
1. pyenv 설치
pyenv는 여러 버전의 Python을 설치하고 전환할 수 있게 해주는 도구이다.
설치 후 쉘 설정 파일(~/. zshrc, ~/. bashrc 등)에 아래 내용을 추가하고 변경 사항을 적용한다.
# 설치 (macOS 기준)
brew update
brew install pyenv
# 쉘 파일안에 추가
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
# 변경된 쉘 파일 적용
source ~/.zshrc
pyenv 설치 확인 후 원하는 버전의 파이썬을 설치한다.
# 설치 확인
pyenv --version
# 설치가능한 파이썬 버전 확인 후 원하는 버전으로 설치
pyenv install --list
pyenv install 3.11.8
# 기본 버전 설정
pyenv global 3.11.8
2.Poetry 설치
poetry는 Python 프로젝트의 패키지 관리 도구이고 자바에서 Maven이나 Gradle처럼 의존성을 선언하고 설치해 주는 역할을 한다.
설치 후 끝나면 쉘 설정 파일(~/. zshrc, ~/. bashrc 등)에 아래 내용을 추가하고 변경 사항을 적용한다.
# 설치 (macOs 기준)
curl -sSL https://install.python-poetry.org | python3 -
# 쉘 파일안에 추가
export PATH="/Users/user/.local/bin:$PATH"
# 변경된 쉘 파일 적용
source ~/.zshrc
# 설치 확인
poetry --version
프로젝트 생성 및 세팅
1. poetry로 프로젝트 생성
# 실습을위해 폴더 하나 생성 후 이동
mkdir edu
cd edu
# chatbot 프로젝트 생성 후 이동
poetry new chatbot
cd chatbot
# python 3.11 버전 적용
poetry env use 3.11
# vscode 실행
code.
code . 실행이 안될 경우 vsocde에서 설정한다.
2. 의존성 추가
이번 실습에서는 다음과 같은 패키지를 사용한다.
- langchain : 프레임워크 기반 체인 구성
- langchain-openai : OpenAI 모델 연동
- python-dotenv : 환경변수 로딩
# pyproject.toml
# 프로젝트 기본 정보 (이름, 버전, 작성자 등)
[tool.poetry]
name = "chatbot"
version = "0.1.0"
description = ""
authors = []
readme = "README.md"
# 의존성 패키지 목록
[tool.poetry.dependencies]
python = "^3.11,<3.13"
langchain = "0.3.1"
langchain-openai = "0.2.1"
python-dotenv = "1.0.1"
# 빌드 시 필요한 도구 정의
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
터미널에서 poetry install 명령어로 의존성 패키지를 설치한다.
# 프로젝트 경로에서 명령어 실행으로 의존성 설치
poetry install
3. 환경변수 설정
OpenAI API 사용을 위해 .env 파일을 만들어 OpenAI API 키를 저장해 둔다.
# .env
OPENAI_API_KEY=sk-xxxxxx
OpenAI API 키 발급 방법
1. https://platform.openai.com 사이트 접속 후 회원가입
2. https://platform.openai.com/account/api-keys 페이지에서 Create new secret key 버튼 클릭으로 API 키 발급
(생성된 키는 다시 볼 수 없으니 꼭 저장해야 한다.)
3. Billing 메뉴에서 결제 카드 등록 및 Usage limits 설정
문서 기반 답변 생성
1. 테스트용 문서 만들기
파일을 읽어와 답변을 생성하기 위해 사용할 파일을 만들어야 한다.
data/policy.txt 파일을 만들고 아래 내용을 복사해 넣는다. (data 폴더가 없을 경우 새로 생성한다.)
환불은 결제일로부터 7일 이내에 요청이 가능합니다.
환불은 상품이 사용되지 않았을 경우에만 처리됩니다.
고객센터를 통해 접수해야 하며, 처리까지는 영업일 기준 3일이 소요됩니다.
2. 테스트 진행
위에서 만든 환불 정책 문서를 기반으로 질문에 답변할 수 있도록 간단히 코드 작성
from dotenv import load_dotenv
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI
# .env 파일에서 OPENAI_API_KEY 불러오기
load_dotenv()
# 문서 내용 불러오기
with open("data/policy.txt", "r", encoding="utf-8") as f:
context = f.read()
# 프롬프트 구성
prompt = PromptTemplate(
input_variables=["context", "question"],
template="""다음은 환불 정책 문서입니다:
{context}
고객 질문: {question}
답변:"""
)
# OpenAI LLM (chat 기반 모델 사용)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 체인 구성 파이프라인 연결
chain = prompt | llm
# 입력값
question = "사용한 상품도 환불이 되나요?"
inputs = {"context": context, "question": question}
# 실행
response = chain.invoke(inputs)
# 출력
print(response)
실행
.py 파일로 코드 작성 후 아래 명령어로 실행할 수 있고 .ipynb 파일로 code, markdown 블록을 구성해 실행할 수 있다.
# 프로젝트 위치에서 실행
poetry run python Test1.py
결과
환불 정책 문서의 '환불은 상품이 사용되지 않았을 경우에만 처리됩니다.' 내용에 따라 답변이 잘 생성된 것을 확인할 수 있다.
AIMessage(
content='죄송하지만, 사용한 상품은 환불이 불가능합니다.
환불 정책에 따라 상품이 사용되지 않았을 경우에만 환불이 처리됩니다.
사용한 상품의 경우에는 환불이 불가능하니 양해 부탁드립니다.
만약 다른 문의사항이 있으시면 언제든지 고객센터로 문의해주시기 바랍니다.
감사합니다.',
additional_kwargs={
'refusal': None
},
response_metadata={
'token_usage': {
'completion_tokens': 139,
'prompt_tokens': 138,
'total_tokens': 277,
'completion_tokens_details': {
'accepted_prediction_tokens': 0,
'audio_tokens': 0,
'reasoning_tokens': 0,
'rejected_prediction_tokens': 0
},
'prompt_tokens_details': {
'audio_tokens': 0,
'cached_tokens': 0
}
},
'model_name': 'gpt-3.5-turbo-0125',
'system_fingerprint': None,
'finish_reason': 'stop',
'logprobs': None
},
id='run-02ba16a5-...-0',
usage_metadata={
'input_tokens': 138,
'output_tokens': 139,
'total_tokens': 277
}
)
이번 실습에서는 policy.txt라는 간단한 정책 문서를 불러와, 프롬프트에 그대로 삽입한 뒤 질문과 함께 LLM에게 전달했다.
그 결과, LLM은 문서의 핵심 내용을 바탕으로 환불 조건, 예외 사항 등을 자연스럽게 요약한 응답을 생성해냈다.
이번 실습은 매우 단순한 구조였지만, LLM + 문서 조합만으로도 꽤 그럴듯한 챗봇 응답을 구현할 수 있다는 가능성을 확인하는 데 충분했다.
다음 글에서는 이렇게 문서를 그대로 넣는 방식의 한계를 짚고, 문서가 길어지거나 많아질 때 어떻게 구조를 개선할 수 있을지에 대해 정리할 예정이다.
'DevLog > LangChain' 카테고리의 다른 글
LangChain #5 – 챗봇 구현 (0) | 2025.04.17 |
---|---|
LangChain #4 – LangChain 도구(tool)란 무엇인가? (1) | 2025.04.15 |
LangChain #3 – 문서 기반 챗봇 구조 이해와 RAG 실습 (0) | 2025.04.15 |
LangChain #1 - 어디에 쓰이는 물건인가 (0) | 2025.04.11 |