인공지능/RAG

LangChain (3) OpenAI API 사용법

BangPro 2024. 3. 23. 20:18
728x90

LLM 코드를 실습할때 필요한 실습

실습을 위해 필요한 패키지 설치

!pip install langchain
!pip install openai
!pip install langchain-openai

OpenAI API Key 환경변수 설정

import os

os.environ["OPENAI_API_KEY"] ="Your API Key"

사실 그냥 매번 깡으로 OPENAI_API_KEY 변수에 넣어줘도 되는데 github같은데 올리면 api key 노출됐다고 연락오고 openai에서 해당 키를 막아버림. 매우 귀찮으니까 그냥 환경변수로 설정하자

Langchain 활용해서 GPT 답변받기

GPT-3.5-Turbo-instruct 모델

from langchain_openai import OpenAI
llm = OpenAI()
result = llm.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")
print(result)

OpenAI의 디폴트는 gpt-3.5-turbo-instruct 모델이다. OpenAI()의 invoke메서드를 통해서 답변을 받을 수 있다.

아래와 같이 명시적으로 모델명을 적어줘도 된다. max_token은 답변의 최대 토큰을 설정하는 매개변수이다.

from langchain_openai import OpenAI
llm = OpenAI()
llm = OpenAI(model_name = "gpt-3.5-turbo-instruct", max_tokens = -1)
result = llm.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")
print(result)

instruct 모델의 특징은 답변을 내놓기는 하지만 대화형식이 아니라는 점이다.

GPT-3.5-Turbo 모델

아래 코드로 채팅형식의 답변을 받을수 있다.

from langchain_openai import ChatOpenAI

chatgpt = ChatOpenAI(model_name = "gpt-3.5-turbo", max_tokens = 512)
answer = chatgpt.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")
print(answer.content)
print(answer)

여기서 answer에는 답변 외에도 다양한 매개변수 정보가 들어있는데 .content 메서드를 통해서 답변만 텍스트로 추출할 수 있다.

Temperature 조절

GPT를 비롯한 다양한 모델에는 Temperature 매개변수가 있는데 이는 답변의 일관성 관련있는 매개변수이다.
Temperature가 높으면 더 다양하고 창의적인 답변을 내놓는다.

chatgpt_temp0_1 = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=0,max_tokens=512)
chatgpt_temp0_2 = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=0,max_tokens=512)
chatgpt_temp1_1 = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=1,max_tokens=512)
chatgpt_temp1_2 = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=1,max_tokens=512)

model_list = [chatgpt_temp0_1, chatgpt_temp0_2,chatgpt_temp1_1,chatgpt_temp1_2]

for i in model_list:
    answer = i.invoke("왜 파이썬이 가장 인기있는 프로그래밍 언어야?",max_tokens=128)
    print("-"*100)
    print(">>>",answer.content)

따라서, 신뢰성이 중요한 답변은 Temperature가 낮아야한다.

실시간 응답 출력

Streaming 매개변수를 True로 놓고 StreamingStdOutCallbackHandler라는 걸 사용하면 답변을 스트림으로 받을 수 있다.
즉, 실제 chatgpt를 사용하는 것처럼 답변이 생성되는 모습을 볼 수 있다.

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chatgpt = ChatOpenAI(model_name = "gpt-3.5-turbo",streaming=True,callbacks=[StreamingStdOutCallbackHandler()],temperature = 1)
answer = chatgpt.predict("왜 파이썬이 가장 인기있는 프로그래밍 언어야?")

이 기능을 사용하면 사용자가 답변이 다소 느리더라도 용인하게 되는 경향이 있다고 카더라..

📌ChatGPT API는 기본 OpenAI LLM들과 다른 Input 형식을 갖고 있습니다.

ChatGPT는 대화에 특화된 LLM인만큼, 아래와 같은 2가지 독특한 매개변수를 지닙니다.

(1) SystemMessage: ChatGPT에게 역할을 부여하여, 대화의 맥락을 설정하는 메세지

(2) HumanMessage: 사용자가 ChatGPT에게 대화 또는 요청을 위해 보내는 메세지

위 두가지 형식을 적절히 활용하면, LLM을 더욱 효과적으로 사용할 수 있습니다.

ChatGPT에 역할 부여

역할 부여 X

chatgpt = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=1)
response_langchain = chatgpt.invoke("파이썬의 장점에 대해서 설명해줘.")
print(response_langchain.content)

역할 부여 O

from langchain.chat_models import ChatOpenAI    #from langchain_openai import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage, SystemMessage

chatgpt = ChatOpenAI(model_name = "gpt-3.5-turbo",temperature=1)

messages=[
    SystemMessage(
        content = "너는 20년차 시니어 개발자야. 사용자의 질문에 매우 건방지게 대답해줘."
    ),
    HumanMessage(
        content="파이썬의 장점에 대해서 설명해줘."    
    ),
]
response_langchain = chatgpt.invoke(messages)
print(response_langchain.content)

LLM 응답 캐싱

from langchain.globals import set_llm_cache
from langchain_openai import OpenAI

llm = OpenAI(model_name = "gpt-3.5-turbo-instruct",n=2,best_of=2)

LLM의 응답을 캐싱해서 같은 질문에 더 빨리 답변받을 수 있다.

캐싱 X

%%time
from langchain.cache import InMemoryCache

set_llm_cache(InMemoryCache())

#첫 질문. 아직 캐쉬에 저장 안됨
llm.predict("Tell me a joke")

캐싱 O

%%time
#두번째 같은 질문. 캐쉬에 저장이 되어 답변이 훨씬 빠름
llm.predict("Tell me a joke")

 

Reference

모두의 AI 유튜브 채널[https://www.youtube.com/@AI-km1yn]