LangChain (3) OpenAI API 사용법
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]