OpenAI와 LangChain을 활용한 관심사와 예산 기반 여행 일정 생성 프로그램 구현 가이드

GoGoComputer·2024년 10월 6일
0

LangChain Basics

목록 보기
7/40

안녕하세요!

오늘은 여러분의 이해를 돕기 위한 간단한 연습을 함께 해보려고 합니다.

모델의 입력과 출력(IO)와 프롬프트 템플릿의 기본 개념만으로도 상당히 흥미로운 응용 프로그램을 만들 수 있다는 것을 이미 배우셨을 것입니다. 이러한 기본 지식을 활용하여 실제로 어떻게 응용할 수 있는지 살펴보겠습니다.


연습 목표:

이번 연습에서는 여러분이 이미 학습한 아이디어를 활용하여 간단한 함수를 구현해볼 것입니다. 여기서 챗 모델내부 생성을 위한 프롬프트 템플릿을 사용할 것입니다. 이 두 가지는 매우 간단하지만 강력한 기능을 제공합니다.

사용자는 최종적으로 여행_아이디어라는 간단한 함수를 호출하게 됩니다.

  • 이 함수는 사용자의 관심사(예: 낚시, 스포츠 경기, 자연 등)와 예산(예: $10,000 또는 $500)을 입력받습니다.
  • 그런 다음, 입력받은 관심사와 예산에 맞는 여행 아이디어나 일정표를 생성하여 반환합니다.

예시:

여행_아이디어("낚시", 10000)

이렇게 함수를 호출하면, 세계 최고의 낚시 여행 일정을 제공하게 됩니다.


무엇을 해야 할까요?

  1. 필요한 라이브러리를 임포트하세요.

    • 예를 들어, openai 라이브러리가 필요할 것입니다.
  2. API 키를 설정하세요.

    • OpenAI API를 사용하기 위해서는 API 키가 필요합니다.
    • 보안을 위해 코드에 직접 키를 입력하기보다는 환경 변수를 사용하는 것이 좋습니다.
  3. 함수를 구현하세요.

    • 함수 이름은 여행_아이디어이며, 매개변수로 관심사예산을 받습니다.
    • 함수 내부에서 챗 모델프롬프트 템플릿을 사용하여 여행 아이디어를 생성합니다.
    • 생성된 여행 아이디어나 일정표를 반환합니다.
  4. 프롬프트 템플릿을 작성하세요.

    • 사용자 입력을 포함하여 모델이 원하는 출력을 생성할 수 있도록 프롬프트를 설계합니다.

예시 코드 구조:

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))

추가 고려사항:

  • 에러 핸들링: 예산이 너무 낮거나 높은 경우, 또는 관심사가 모호한 경우에 대한 처리를 추가할 수 있습니다.
  • 출력 형식 지정: 반환되는 일정표의 형식을 더 정교하게 지정하고 싶다면, 프롬프트에 원하는 형식을 명시하세요.
  • 다국어 지원: 필요에 따라 출력 언어를 지정할 수 있습니다.

API 키 설정 방법:

  • 환경 변수 사용:

    import os
    openai.api_key = os.getenv("OPENAI_API_KEY")
  • 터미널에서 다음과 같이 환경 변수를 설정합니다:

    export OPENAI_API_KEY='YOUR_API_KEY'

이렇게 함수를 구현하면, 사용자가 관심사와 예산을 입력하여 개인화된 여행 일정을 받을 수 있습니다.


프로젝트 개요

우리는 사용자의 관심사예산을 입력받아 그에 맞는 여행 일정이나 아이디어를 출력하는 간단한 프로그램을 만들려고 합니다. 이를 위해 OpenAI의 ChatGPT 모델과 LangChain 라이브러리를 사용합니다.


1. API 키 설정

OpenAI의 API를 사용하기 위해서는 API 키가 필요합니다. 이번에는 API 키를 코드 내에 직접 작성하지 않고, .env 파일에 저장하여 환경 변수로 불러오겠습니다. 이렇게 하면 보안이 강화되고, 코드 관리도 용이해집니다.

.env 파일 설정

  1. 프로젝트 폴더에 .env 파일을 생성합니다.

  2. 파일에 다음과 같이 API 키를 작성합니다:

    OPENAI_API_KEY=your_openai_api_key_here
    • your_openai_api_key_here 부분을 실제 API 키로 대체하세요.

Python에서 환경 변수 불러오기

환경 변수를 사용하기 위해 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')

2. 필요한 라이브러리 임포트

프로젝트에 필요한 라이브러리를 임포트합니다.

# OpenAI와 LangChain 라이브러리 임포트
from langchain import OpenAI

# 프롬프트 템플릿 관련 라이브러리 임포트
from langchain.prompts import (
    ChatPromptTemplate, 
    SystemMessagePromptTemplate, 
    HumanMessagePromptTemplate
)
  • OpenAI: OpenAI의 언어 모델을 사용하기 위한 라이브러리입니다.
  • langchain.prompts: 프롬프트 템플릿을 만들기 위한 라이브러리입니다.

3. 시스템 및 인간 프롬프트 템플릿 정의

프롬프트 템플릿을 사용하여 시스템 메시지와 사용자 메시지를 정의합니다.

시스템 메시지 프롬프트 템플릿

시스템 메시지는 모델에게 역할과 지침을 제공합니다.

# 시스템 메시지 템플릿 정의
system_template = (
    "당신은 여행 계획을 도와주는 여행사 직원입니다. "
    "사용자의 관심사는 {interests}이며, 예산은 {budget}입니다."
)
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
  • {interests}{budget}은 이후에 사용자로부터 입력받아 채워질 변수입니다.

인간 메시지 프롬프트 템플릿

사용자가 모델에게 요청하는 메시지를 정의합니다.

# 인간 메시지 템플릿 정의
human_template = "저에게 맞는 여행 일정을 추천해 주세요."
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

4. 채팅 프롬프트 템플릿 컴파일

시스템 메시지와 인간 메시지를 합쳐서 채팅 프롬프트 템플릿을 만듭니다.

# 채팅 프롬프트 템플릿 생성
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

5. 변수 설정 및 프롬프트 포맷팅

사용자의 관심사예산을 변수로 설정하고, 이를 프롬프트에 적용합니다.

# 예시 변수 설정
interests = "등산과 자연 탐험"
budget = "$1000"

# 프롬프트 포맷팅
formatted_prompt = chat_prompt.format(interests=interests, budget=budget)
  • 실제로는 이 부분을 함수의 매개변수로 받아서 동적으로 처리할 수 있습니다.

6. OpenAI 모델 초기화 및 응답 생성

OpenAI의 채팅 모델을 초기화하고, 앞서 만든 프롬프트를 사용하여 응답을 생성합니다.

# OpenAI 모델 초기화
llm = OpenAI(
    openai_api_key=openai_api_key,
    model_name="gpt-3.5-turbo"  # 또는 "gpt-4"를 사용할 수 있습니다.
)

# 응답 생성
response = llm(formatted_prompt)

7. 결과 출력

모델이 생성한 응답을 출력합니다.

# 결과 출력
print(response)

8. 전체 코드 정리

모든 코드를 한데 모으면 다음과 같습니다.

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)

9. 코드 실행 및 결과 확인

코드를 실행하면 사용자로부터 관심사와 예산을 입력받고, 그에 맞는 여행 일정을 출력합니다.

예시 실행 결과:

여행지를 입력하세요: 역사와 문화 탐방
예산을 입력하세요: $2000

=== 추천 여행 일정 ===
안녕하세요! $2000 예산으로 역사와 문화 탐방을 즐길 수 있는 여행 일정을 추천해 드리겠습니다.

**1일차:**
- **오전:** 현지의 역사적인 도시로 이동하여 체크인.
- **오후:** 도시 중심부의 유명한 박물관 방문.
- **저녁:** 전통 음식 체험.

**2일차:**
- **오전:** 역사적인 건축물 투어 참여.
- **오후:** 문화 예술 공연 관람.
- **저녁:** 지역 주민들과의 교류 프로그램.

**3일차:**
- **오전:** 인근 유적지로 당일치기 여행.
- **오후:** 기념품 쇼핑 및 자유 시간.
- **저녁:** 귀가 준비.

**총 예상 비용:** 약 $1900 (교통비, 숙박비, 식비 및 활동비 포함)

즐거운 여행 되세요!

10. 추가 사항 및 조언

  • 오류 수정

    코드 실행 중 오타변수 이름 오류가 발생할 수 있습니다. 예를 들어, messege 대신 message로 수정해야 할 수도 있습니다.

  • 자동 완성 기능 활용

    코드를 작성할 때 IDE의 자동 완성 기능을 활용하면 오타를 줄일 수 있습니다.

  • 예산 및 관심사 변경

    다른 예산이나 관심사를 테스트해 볼 수 있습니다.

    interests = "해변 휴양과 수상 스포츠"
    budget = "$1500"
  • 모델 버전 업그레이드

    더 발전된 응답을 원한다면 gpt-4 모델을 사용할 수 있습니다.

    llm = OpenAI(openai_api_key=openai_api_key, model_name="gpt-4")

결론

이번 프로젝트를 통해 다음과 같은 과정을 거쳤습니다.

  1. API 키 설정: OpenAI API 키를 .env 파일에 저장하고 코드에서 불러옴.
  2. 라이브러리 임포트: 필요한 라이브러리를 코드에 포함.
  3. 프롬프트 템플릿 정의: 시스템과 인간의 프롬프트를 설정하여 모델의 역할과 사용자 요청을 명확히 함.
  4. 프롬프트 컴파일 및 변수 적용: 프롬프트에 사용자의 관심사와 예산을 적용.
  5. 모델 초기화 및 응답 생성: OpenAI의 언어 모델을 사용하여 응답 생성.
  6. 결과 출력 및 테스트: 생성된 여행 일정을 출력하고 다양한 시나리오로 테스트.

다음 단계

  • 사용자 입력 기능 개선

    입력받은 예산이 숫자인지, 관심사가 빈 문자열이 아닌지 확인하는 검증 로직을 추가할 수 있습니다.

  • 예외 처리

    API 호출 실패나 입력 오류에 대비한 예외 처리를 추가하면 더욱 견고한 프로그램이 됩니다.

    if not openai_api_key:
        raise ValueError("OpenAI API 키가 설정되지 않았습니다.")
  • GUI 또는 웹 인터페이스 추가

    사용자 경험을 향상시키기 위해 그래픽 사용자 인터페이스(GUI)나 웹 인터페이스를 추가할 수 있습니다.

  • 데이터베이스 연동

    실제 여행지 정보나 가격 데이터를 활용하기 위해 데이터베이스와 연동할 수 있습니다.

  • 다국어 지원

    다양한 언어로 여행 일정을 제공하도록 확장할 수 있습니다.


마무리

이렇게 해서 사용자의 관심사와 예산에 맞는 여행 일정을 제공하는 프로그램을 완성했습니다. LangChain과 OpenAI의 강력한 기능을 활용하여 더 복잡하고 유용한 응용 프로그램을 개발할 수 있으니, 이를 기반으로 더 많은 실험과 개발을 해보시기 바랍니다.

profile
IT를 좋아합니다.

0개의 댓글