LangChain과 OpenAI 함수 호출로 구조화된 데이터 얻기

GoGoComputer·2024년 11월 7일
0

LangChain Basics

목록 보기
27/40
post-thumbnail

OpenAI의 함수 호출 기능을 사용하여 구조화된 데이터를 얻는 방법을 자세히 알아보겠습니다. 특히 LangChain 라이브러리를 사용하여 OpenAI의 GPT 모델과 상호 작용하고, 원하는 JSON 스키마에 맞는 데이터를 반환받는 방법을 살펴볼 것입니다.

개요

우리는 다음과 같은 목표를 가지고 있습니다:

  • 유명한 과학자의 이름과 성을 얻는다.
  • 이 정보를 미리 정의한 JSON 스키마에 맞게 구조화된 형태로 반환받는다.
  • OpenAI의 함수 호출 기능과 LangChain을 활용한다.
  • .env 파일에서 API 키를 불러온다.

이제 단계별로 자세히 설명해 드리겠습니다.

1. 필요한 라이브러리 설치

먼저 필요한 파이썬 패키지를 설치해야 합니다. 다음 명령어를 사용하여 설치합니다:

pip install openai langchain python-dotenv
  • openai: OpenAI API와 상호 작용하기 위한 라이브러리입니다.
  • langchain: 언어 모델과 체인을 쉽게 구성하고 관리할 수 있게 해주는 라이브러리입니다.
  • python-dotenv: .env 파일에서 환경 변수를 불러오기 위한 라이브러리입니다.

2. API 키 설정

API 키는 OpenAI의 서비스를 사용하기 위해 필요합니다. 보안을 위해 .env 파일에 API 키를 저장하고 이를 코드에서 불러오는 것이 좋습니다.

.env 파일 생성

프로젝트 루트 디렉토리에 .env 파일을 생성하고 다음과 같이 작성합니다:

OPENAI_API_KEY=your_openai_api_key_here

여기서 your_openai_api_key_here 부분을 실제 API 키로 대체해야 합니다.

코드에서 환경 변수 불러오기

python-dotenv 라이브러리를 사용하여 .env 파일에서 환경 변수를 불러옵니다:

import os
from dotenv import load_dotenv

load_dotenv()  # .env 파일에서 환경 변수를 불러옵니다.

api_key = os.getenv('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY'] = api_key  # OPENAI_API_KEY 환경 변수를 설정합니다.

3. 필요한 모듈 임포트

코드에서 사용할 모듈과 클래스들을 임포트합니다:

from langchain.chains.openai_functions import create_structured_output_chain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
  • create_structured_output_chain: 구조화된 출력을 위한 체인을 생성하는 함수입니다.
  • ChatOpenAI: OpenAI의 채팅 모델을 사용하기 위한 클래스입니다.
  • ChatPromptTemplate: 프롬프트를 템플릿화하여 사용할 수 있게 해주는 클래스입니다.

4. OpenAI 채팅 모델 설정

우리는 GPT-3.5-turbo 모델을 사용할 것입니다. 최신 버전을 사용하기 위해 모델 이름에 버전 정보를 포함합니다.

llm = ChatOpenAI(model='gpt-3.5-turbo-0613')
  • 'gpt-3.5-turbo-0613': 2023년 6월 13일에 업데이트된 버전입니다.
  • 이 모델은 함수 호출 기능을 지원합니다.

5. JSON 스키마 정의

우리가 원하는 출력 형태를 JSON 스키마로 정의합니다. 이 스키마는 OpenAI 모델이 반환해야 하는 데이터의 구조를 명시합니다.

json_schema = {
    "title": "Scientist",
    "description": "Information about a famous scientist",
    "type": "object",
    "properties": {
        "first_name": {
            "title": "First Name",
            "description": "First name of the scientist",
            "type": "string"
        },
        "last_name": {
            "title": "Last Name",
            "description": "Last name of the scientist",
            "type": "string"
        }
    },
    "required": ["first_name", "last_name"]
}
  • title: 데이터의 제목입니다.
  • description: 데이터에 대한 설명입니다.
  • type: 최상위 데이터의 유형입니다. 여기서는 object입니다.
  • properties: 객체 내의 속성들을 정의합니다.
    • first_namelast_name 속성을 정의하고, 각 속성의 제목, 설명, 데이터 유형을 명시합니다.
  • required: 반드시 포함되어야 하는 속성들을 지정합니다.

6. 프롬프트 템플릿 생성

사용자에게 전달할 프롬프트를 템플릿화합니다.

template = 'Name a famous {country} scientist.'
chat_prompt = ChatPromptTemplate.from_template(template)
  • {country} 부분은 나중에 값이 대체될 자리표시자입니다.
  • ChatPromptTemplate.from_template() 메서드를 사용하여 템플릿을 생성합니다.

7. 구조화된 출력 체인 생성

JSON 스키마와 프롬프트, 그리고 언어 모델을 결합하여 구조화된 출력을 생성하는 체인을 만듭니다.

chain = create_structured_output_chain(
    json_schema=json_schema,
    llm=llm,
    prompt=chat_prompt,
    verbose=True  # 체인의 동작 과정을 자세히 볼 수 있습니다.
)
  • create_structured_output_chain 함수는 지정한 JSON 스키마에 맞는 출력을 생성하도록 체인을 구성합니다.
  • verbose=True로 설정하면 체인의 동작 과정을 출력합니다.

8. 체인 실행 및 결과 얻기

이제 체인을 실행하여 결과를 얻습니다.

result = chain.run(country='American')
  • country 인자에 'American'을 전달하여 프롬프트의 {country} 부분을 대체합니다.
  • 체인은 프롬프트를 생성하고, 언어 모델에 요청하여 결과를 받습니다.

9. 결과 확인

결과를 출력하고 타입을 확인합니다.

print(result)
print(type(result))
  • 예상되는 결과는 다음과 같습니다:
{'first_name': 'Albert', 'last_name': 'Einstein'}
<class 'dict'>
  • 결과는 우리가 정의한 JSON 스키마에 맞는 딕셔너리 형태입니다.

10. 추가: Scientist 클래스 사용 (선택 사항)

만약 이 결과를 Scientist 클래스의 인스턴스로 만들고 싶다면 다음과 같이 할 수 있습니다:

class Scientist:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

# Scientist 인스턴스 생성
scientist = Scientist(**result)

# 속성 확인
print(scientist.first_name)  # 출력: Albert
print(scientist.last_name)   # 출력: Einstein
  • **result를 사용하여 딕셔너리의 키-값 쌍을 함수의 인자에 언패킹합니다.
  • 이제 scientist 객체는 first_namelast_name 속성을 갖습니다.

전체 코드

마지막으로, 모든 내용을 포함한 전체 코드를 제공합니다. 이 코드는 실행 가능한 상태이며, .env 파일에서 API 키를 불러옵니다.

import os
from dotenv import load_dotenv

# .env 파일에서 환경 변수 로드
load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY'] = api_key

from langchain.chains.openai_functions import create_structured_output_chain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

# OpenAI 채팅 모델 설정
llm = ChatOpenAI(model='gpt-4o')

# JSON 스키마 정의
json_schema = {
    "title": "Scientist",
    "description": "Information about a famous scientist",
    "type": "object",
    "properties": {
        "first_name": {
            "title": "First Name",
            "description": "First name of the scientist",
            "type": "string"
        },
        "last_name": {
            "title": "Last Name",
            "description": "Last name of the scientist",
            "type": "string"
        }
    },
    "required": ["first_name", "last_name"]
}

# 프롬프트 템플릿 생성
template = 'Name a famous {country} scientist.'
chat_prompt = ChatPromptTemplate.from_template(template)

# 구조화된 출력 체인 생성
chain = create_structured_output_chain(
    json_schema,
    llm,
    chat_prompt,
    verbose=True
)

# 체인 실행 및 결과 얻기
result = chain.run(country='American')

# 결과 출력
print(result) 

실행 방법

  1. 필요한 패키지를 설치합니다:
pip install openai langchain python-dotenv
  1. 프로젝트 루트 디렉토리에 .env 파일을 생성하고, 다음과 같이 API 키를 입력합니다:
OPENAI_API_KEY=your_openai_api_key_here
  1. 코드를 실행합니다.

마무리

이렇게 해서 OpenAI의 함수 호출 기능과 LangChain을 사용하여 구조화된 데이터를 얻는 방법을 알아보았습니다. 이 방법을 통해 언어 모델로부터 더욱 정확하고 일관된 형식의 데이터를 얻을 수 있습니다. 더 복잡한 스키마나 추가 기능도 적용할 수 있으니, 필요에 따라 응용해 보시기 바랍니다.

감사합니다!

profile
IT를 좋아합니다.

0개의 댓글