안녕하세요!
오늘은 여러분의 이해를 돕기 위한 간단한 연습을 함께 해보려고 합니다.
모델의 입력과 출력(IO)와 프롬프트 템플릿의 기본 개념만으로도 상당히 흥미로운 응용 프로그램을 만들 수 있다는 것을 이미 배우셨을 것입니다. 이러한 기본 지식을 활용하여 실제로 어떻게 응용할 수 있는지 살펴보겠습니다.
이번 연습에서는 여러분이 이미 학습한 아이디어를 활용하여 간단한 함수를 구현해볼 것입니다. 여기서 챗 모델과 내부 생성을 위한 프롬프트 템플릿을 사용할 것입니다. 이 두 가지는 매우 간단하지만 강력한 기능을 제공합니다.
사용자는 최종적으로 여행_아이디어
라는 간단한 함수를 호출하게 됩니다.
예시:
여행_아이디어("낚시", 10000)
이렇게 함수를 호출하면, 세계 최고의 낚시 여행 일정을 제공하게 됩니다.
필요한 라이브러리를 임포트하세요.
openai
라이브러리가 필요할 것입니다.API 키를 설정하세요.
함수를 구현하세요.
여행_아이디어
이며, 매개변수로 관심사
와 예산
을 받습니다.프롬프트 템플릿을 작성하세요.
import openai
# API 키 설정
openai.api_key = "YOUR_API_KEY"
def 여행_아이디어(관심사, 예산):
# 프롬프트 템플릿 생성
프롬프트 = f"""
당신은 전문 여행 기획자입니다.
관심사는 {관심사}이고, 예산은 ${예산}인 고객에게 맞는 여행 일정을 제안해 주세요.
일정은 상세하게 작성해 주세요.
"""
# 모델 호출
응답 = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": 프롬프트}]
)
# 결과 반환
일정표 = 응답['choices'][0]['message']['content']
return 일정표
# 함수 사용 예시
print(여행_아이디어("낚시", 10000))
환경 변수 사용:
import os
openai.api_key = os.getenv("OPENAI_API_KEY")
터미널에서 다음과 같이 환경 변수를 설정합니다:
export OPENAI_API_KEY='YOUR_API_KEY'
이렇게 함수를 구현하면, 사용자가 관심사와 예산을 입력하여 개인화된 여행 일정을 받을 수 있습니다.
우리는 사용자의 관심사와 예산을 입력받아 그에 맞는 여행 일정이나 아이디어를 출력하는 간단한 프로그램을 만들려고 합니다. 이를 위해 OpenAI의 ChatGPT 모델과 LangChain 라이브러리를 사용합니다.
OpenAI의 API를 사용하기 위해서는 API 키가 필요합니다. 이번에는 API 키를 코드 내에 직접 작성하지 않고, .env
파일에 저장하여 환경 변수로 불러오겠습니다. 이렇게 하면 보안이 강화되고, 코드 관리도 용이해집니다.
.env
파일 설정프로젝트 폴더에 .env
파일을 생성합니다.
파일에 다음과 같이 API 키를 작성합니다:
OPENAI_API_KEY=your_openai_api_key_here
your_openai_api_key_here
부분을 실제 API 키로 대체하세요.환경 변수를 사용하기 위해 python-dotenv
라이브러리를 사용하겠습니다. 이 라이브러리가 없으면 다음 명령어로 설치하세요:
pip install python-dotenv
코드에서 환경 변수를 불러오기 위해 다음을 추가합니다:
from dotenv import load_dotenv
import os
# .env 파일의 환경 변수 로드
load_dotenv()
# 환경 변수에서 API 키 가져오기
openai_api_key = os.getenv('OPENAI_API_KEY')
프로젝트에 필요한 라이브러리를 임포트합니다.
# OpenAI와 LangChain 라이브러리 임포트
from langchain import OpenAI
# 프롬프트 템플릿 관련 라이브러리 임포트
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
프롬프트 템플릿을 사용하여 시스템 메시지와 사용자 메시지를 정의합니다.
시스템 메시지는 모델에게 역할과 지침을 제공합니다.
# 시스템 메시지 템플릿 정의
system_template = (
"당신은 여행 계획을 도와주는 여행사 직원입니다. "
"사용자의 관심사는 {interests}이며, 예산은 {budget}입니다."
)
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
{interests}
와 {budget}
은 이후에 사용자로부터 입력받아 채워질 변수입니다.사용자가 모델에게 요청하는 메시지를 정의합니다.
# 인간 메시지 템플릿 정의
human_template = "저에게 맞는 여행 일정을 추천해 주세요."
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
시스템 메시지와 인간 메시지를 합쳐서 채팅 프롬프트 템플릿을 만듭니다.
# 채팅 프롬프트 템플릿 생성
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
사용자의 관심사와 예산을 변수로 설정하고, 이를 프롬프트에 적용합니다.
# 예시 변수 설정
interests = "등산과 자연 탐험"
budget = "$1000"
# 프롬프트 포맷팅
formatted_prompt = chat_prompt.format(interests=interests, budget=budget)
OpenAI의 채팅 모델을 초기화하고, 앞서 만든 프롬프트를 사용하여 응답을 생성합니다.
# OpenAI 모델 초기화
llm = OpenAI(
openai_api_key=openai_api_key,
model_name="gpt-3.5-turbo" # 또는 "gpt-4"를 사용할 수 있습니다.
)
# 응답 생성
response = llm(formatted_prompt)
모델이 생성한 응답을 출력합니다.
# 결과 출력
print(response)
모든 코드를 한데 모으면 다음과 같습니다.
from langchain.chat_models import ChatOpenAI
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
from dotenv import load_dotenv
import os
# .env 파일의 환경 변수 로드
load_dotenv()
# 환경 변수에서 API 키 가져오기
openai_api_key = os.getenv('OPENAI_API_KEY')
def generate_travel_itinerary(interests, budget):
# 시스템 메시지 템플릿 정의
system_template = (
"당신은 여행 계획을 도와주는 여행사 직원입니다. "
"사용자의 관심사는 {interests}이며, 예산은 {budget}입니다."
)
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
# 인간 메시지 템플릿 정의
human_template = "저에게 맞는 여행 일정을 추천해 주세요."
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
# 채팅 프롬프트 템플릿 생성
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# 메시지 포맷팅
formatted_messages = chat_prompt.format_messages(interests=interests, budget=budget)
# OpenAI 모델 초기화
llm = ChatOpenAI(
openai_api_key=openai_api_key,
model_name="gpt-4"
)
# 응답 생성
response = llm(formatted_messages)
return response.content # 또는 response[0].content
# 함수 사용 예시
if __name__ == "__main__":
# 사용자로부터 입력받기
interests = input("여행지를 입력하세요: ")
budget = input("예산을 입력하세요: ")
itinerary = generate_travel_itinerary(interests, budget)
print("\n=== 추천 여행 일정 ===")
print(itinerary)
코드를 실행하면 사용자로부터 관심사와 예산을 입력받고, 그에 맞는 여행 일정을 출력합니다.
예시 실행 결과:
여행지를 입력하세요: 역사와 문화 탐방
예산을 입력하세요: $2000
=== 추천 여행 일정 ===
안녕하세요! $2000 예산으로 역사와 문화 탐방을 즐길 수 있는 여행 일정을 추천해 드리겠습니다.
**1일차:**
- **오전:** 현지의 역사적인 도시로 이동하여 체크인.
- **오후:** 도시 중심부의 유명한 박물관 방문.
- **저녁:** 전통 음식 체험.
**2일차:**
- **오전:** 역사적인 건축물 투어 참여.
- **오후:** 문화 예술 공연 관람.
- **저녁:** 지역 주민들과의 교류 프로그램.
**3일차:**
- **오전:** 인근 유적지로 당일치기 여행.
- **오후:** 기념품 쇼핑 및 자유 시간.
- **저녁:** 귀가 준비.
**총 예상 비용:** 약 $1900 (교통비, 숙박비, 식비 및 활동비 포함)
즐거운 여행 되세요!
오류 수정
코드 실행 중 오타나 변수 이름 오류가 발생할 수 있습니다. 예를 들어, messege
대신 message
로 수정해야 할 수도 있습니다.
자동 완성 기능 활용
코드를 작성할 때 IDE의 자동 완성 기능을 활용하면 오타를 줄일 수 있습니다.
예산 및 관심사 변경
다른 예산이나 관심사를 테스트해 볼 수 있습니다.
interests = "해변 휴양과 수상 스포츠"
budget = "$1500"
모델 버전 업그레이드
더 발전된 응답을 원한다면 gpt-4
모델을 사용할 수 있습니다.
llm = OpenAI(openai_api_key=openai_api_key, model_name="gpt-4")
이번 프로젝트를 통해 다음과 같은 과정을 거쳤습니다.
.env
파일에 저장하고 코드에서 불러옴.사용자 입력 기능 개선
입력받은 예산이 숫자인지, 관심사가 빈 문자열이 아닌지 확인하는 검증 로직을 추가할 수 있습니다.
예외 처리
API 호출 실패나 입력 오류에 대비한 예외 처리를 추가하면 더욱 견고한 프로그램이 됩니다.
if not openai_api_key:
raise ValueError("OpenAI API 키가 설정되지 않았습니다.")
GUI 또는 웹 인터페이스 추가
사용자 경험을 향상시키기 위해 그래픽 사용자 인터페이스(GUI)나 웹 인터페이스를 추가할 수 있습니다.
데이터베이스 연동
실제 여행지 정보나 가격 데이터를 활용하기 위해 데이터베이스와 연동할 수 있습니다.
다국어 지원
다양한 언어로 여행 일정을 제공하도록 확장할 수 있습니다.
이렇게 해서 사용자의 관심사와 예산에 맞는 여행 일정을 제공하는 프로그램을 완성했습니다. LangChain과 OpenAI의 강력한 기능을 활용하여 더 복잡하고 유용한 응용 프로그램을 개발할 수 있으니, 이를 기반으로 더 많은 실험과 개발을 해보시기 바랍니다.