일단 하고 보는 사람

나중보단 지금에 집중하되, 지금보단 나중에 완벽해지자💪🏻

LLM

[Language Model] gpt 사용하기: Model I/O로 무엇을 할 수 있는지❓❓

JanginTech 2025. 2. 5. 17:59

언어 모델을 호출할 때 입력되는 텍스트를 '프롬프트'라고 한다.

 

https://honge1122.tistory.com/106

 

[LangChain] Chat 모델 API 호출하기

우선 랭체인 말고 파이썬 소스코드를 통해 API 호출을 해보려고 했는데,  openai.error.RateLimitError 에러가 떴다.  1. ⚠️RateLimitError?OpenAI API를 사용할 때 발생하는 오류로, 현재 할당량을 초과했음

honge1122.tistory.com

예전에 언어 모델 호출 실습으로 썼던 코드를 다시 가져와보겠다.

 

 

User라는 role로 gpt-3.5-turbo 모델을 호출해서 텍스트에 대한 결과를 요청하고 있다.

 

간단한 애플리케이션이면 위처럼 사용해도 큰 문제는 없지만 실제로 언어 모델을 활용한 애플리케이션을 개발할 때는 문제가 되는 경우가 많다고 한다.

 

 

언어 모델에서 얻을 수 있는 결과는 입력되는 프롬프트의 작성 방식에 따라 달라진다.

예를 들어, 해당 코드의 content에 대한 결과가 'yyyy/mm/dd'식으로 출력될지 'yyyy년 mm월 dd일'로 출력될지는 예측할 수 없다. 원하는 방식을 설정해주어야 한다(출력되는 결과를 고정한다).

 

혹은, 더 긴 답변을 원한다면 모델을 바꿔야 한다.

언어 모델은 많고, 각 모델별 결과 비교를 원할 수도 있다. 위처럼 사용하게 되면 거의 모든 소스코드를 다시 짜야한다.

 

 

 

Model I/O는 랭체인의 가장 기본 모듈

Model I/O 모듈 단독 사용도 가능하지만 실제 애플리케이션을 개발할 때 이거 하나로만 모든 걸 개발하는 건 현실적으로 어렵다. 예를 들어, Model I/O의 하위 모듈인 Prompts 모듈은 프롬프트 최적화를 위해 쓰이며, 이 외에도 Chains 모듈에도 쓰인다. 언어 모델은 거의 모든 모듈에서 사용된다는 의미다.

 

 

Model I/O 구성 서브 모듈 3가지

1. Language models

2. Prompts

3. Output parsers

 

 

하나씩 코드를 통해 이해해 보겠다.

 

Language Model 사용하기

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage


chat = ChatOpenAI (
    model = "gpt-3.5-turbo"
)

result = chat (
    [
        HumanMessage(content="안녕하세요!")
    ]
)

print(result.content)

 

모듈을 가져오고 호출할 모델을 지정하여 클라이언트를 만들어 chat에 저장했다.

 

ChatOpenAI는 Chat 모델 호출 시 사용한다.

HumanMessage는 사람의 메시지가 있다는 걸 의미한다.

 

 

 

PromptTemplate 사용하기

from langchain import PromptTemplate

prompt = PromptTemplate (
    template = "{idol}는 어느 엔터테인먼트 소속 아이돌인가요?",

    input_variables = [
        "idol"
    ]
)

print(prompt.format(idol="엔시티 위시"))
print(prompt.format(idol="아이유"))

 

Promptlemplate 사용 단계

1. Promptlemplate 준비

2. 준비한 Promptlemplate 사용

 

코드에선 Promptlemplate을 초기화하고 {idol}라는 변수를 포함한 프롬프트를 prompt에 저장했다.

 

 

 

 

 

이제 결합해서 사용해 보자

 

Language Model과 PromptTemplate 결합해서 사용해 보기

from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

chat = ChatOpenAI (                 # 클라이언트 생성(언어모델 지정 및 호출)
    model = "gpt-3.5-turbo"     
)

prompt = PromptTemplate (           # PromptTemplate 생성
    template = "{idol}는 어느 엔터테인먼트 소속 아이돌인가요?",     # 프롬프트 작성

    input_variables = [
        "idol"
    ]
)

result = chat (                     # 실행
    [
        HumanMessage(content = prompt.format(idol="엔시티 위시"))
    ]
)

print(result.content)

 

gpt 모델을 ChatOpenAI로 초기화, PromptTemplate 초기화해서 {idol}에 '엔시티 위시'를 입력하여 포맷을 통해 프롬프트를 생성한다.

위 터미널 캡쳐본은 PromptTemplate를 사용해 변수와 프롬프트를 조합하여 실행한 결과다.

이처럼 랭체인에서는 여러 개의 모듈을 조합하여 애플리케이션을 만들 수 있다.

 

 

추가로, PromptTemplate 초기화 방법도 종류가 있다.

 

1. 클래스 초기화

언어 모델과 프롬프트템플릿 결합 실습 코드에서 사용했던 위 코드와 같이, 클래스를 초기화하는 방법이 있다.

prompt = PromptTemplate (           # PromptTemplate 생성
    template = "{idol}는 어느 엔터테인먼트 소속 아이돌인가요?",     # 프롬프트 작성

    input_variables = [
        "idol"
    ]
)

 

2. 템플릿에서 직접 초기화

prompt = PromptTemplate.from_template("{idol}는 어느 엔터테인먼트 소속 아이돌인가요?")

프롬프트에 들어갈 변수를 지정하지 않고 템플릿에서 직접 초기화할 수도 있다.

 

 

3. JSON 파일에 저장한 프롬프트 읽어오기

우선 JSON 파일부터 만들자.

from langchain.prompts import PromptTemplate 

prompt = PromptTemplate.from_template("{idol}는 어느 엔터테인먼트 소속 아이돌인가요?",
                                      input_variables = ["idol"])
prompt_json = prompt.save("prompt.json")

json 파일 생성됨

이 JSON을 통해 PromptTemplate를 만들 수 있다.

 

from langchain.prompts import load_prompt

loaded_prompt = load_prompt("prompt.json")      #JSON에서 PromptTemplate 로드하기

print(loaded_prompt.format(idol="NCT WISH"))    #PromptTemplate로 문장 생성

 

이처럼 PromptTemplate를 JSON 파일로 저장하면 다양하게 활용할 수 있다.

실습을 한 번밖에 안 해봤지만 기능에 따른 프롬포트를 저장해 놓은 뒤 필요에 따라 꺼내 쓸 수 있다. 

 

 

Output parsers를 통한 결과 구조화하기

from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import \
    CommaSeparatedListOutputParser
from langchain.schema import HumanMessage

output_parser = CommaSeparatedListOutputParser()

chat = ChatOpenAI(model="gpt-3.5-turbo")


result = chat (                  # 실행
    [
        HumanMessage(content = "sm엔터테인먼트 소속 보이그룹 3개를 알려주세요"),
        HumanMessage(content = output_parser.get_format_instructions())
            # output_parser.get_format_instructions()로 chat에 지시사항 추가
    ]
)

output = output_parser.parse(result.content)

for o in output :
    print("보이그룹 => " + o)

 

CommaSeparatedListOutputParser는 응답 결과를 목록 형식으로 출력해 준다.

CommaSeparatedListOutputParser는 NCT, EXO, WayV <- 와 같이 쉼표(,)로 구분된 값의 목록을 반환하는데 

output_parser.parse를 통해 그 결괏값이 배열 ["NCT", "EXO", "WayV"]로 반환된 것이다. 

 

이처럼 랭체인의 Output parsers를 활용하여 원하는 데이터 구조에 맞게 자유롭게 파싱 할 수 있다.