[LLM] langchain을 활용한 챗봇 구현 (1): langsmith, ChatOpenAI, LLMChain, PromptTemplate
LangChain이란?
LLM 기반의 애플리케이션을 구축하기 위한 오픈소스 프레임워크
LangChain을 활용할 경우 재훈련이나 fine tuning 없이 분야별 LLM 애플리케이션을 개발할 수 있음
LangChain 활용 사례
검색, 프롬프트, 임베딩, 유사도 검색, 랭킹
환경 세팅
라이브러리 설치 및 환경변수 설정
LANGCHAIN_API_KEY 입력 > API Keys > Create API Key 생성 후 복사
https://smith.langchain.com/o/4700d6ec-c086-52ed-b6d2-266b15769dc4/settings
# OpenAI 활용을 위한 langchain 라이브러리 설치
!pip install -q langchain langchain_community langchain-openai
#OpenAI API Key 등록
import getpass
import os
# 네모칸 뜨면 OpenAPI API key 입력
os.environ["OPENAI_API_KEY"] = getpass.getpass()
# LangSmith 등록
os.environ['LANGCHAIN_TRACING_V2'] = 'true'
os.environ['LANGCHAIN_ENDPOINT'] = 'https://api.smith.langchain.com'
#SDJ Key
os.environ['LANGCHAIN_API_KEY'] = '본인 LANGCHAIN API 키 입력'
os.environ['LANGCHAIN_PROJECT'] = 'OpenAI_LLM'
print('LangSmith Monitoring stared... ')
# colab 즉 클라우드 환경에서 streamlit 실행 쉽지 않음 > 실행을 위한 라이브러리
!pip install streamlit -q
!pip install pyngrok
모델 로드 및 질의 응답
ChatOpenAI: OpenAI 사의 채팅 전용 Large Language Model
from langchain_openai import ChatOpenAI
# 객체 생성
# 4o에 비해 4o-mini는 답이 심플함
# temperature이 높아질수록 창의적인 대답
model = ChatOpenAI(
temperature=0.1, # 창의성 (0.0 ~ 2.0)
max_tokens=2048, # 최대 토큰 수
model_name="gpt-4o" # 모델명
)
# 질의내용
question = "오늘 저녁 요리 추천해줄래요?"
# 질의 응답
# print(f"[답변]: {model.invoke(question)}\n")
response = model.invoke(question)
print(response)
- temperature: 0.0에서 2.0까지 조정 가능. 0일수록 정밀하고 2일수록 창의적인 답변
- max_tokens: 답변의 최대 토큰수
- model_name: 모델명
model_name에 적용 가능한 모델 list
gpt-3.5-turbo
gpt-3.5-turbo-0301
gpt-3.5-turbo-0613
gpt-3.5-turbo-16k
gpt-3.5-turbo-16k-0613
gpt-3.5-turbo-instruct
gpt-3.5-turbo-instruct-0914
gpt-4
gpt-4-0314
gpt-4-0613
response.__dict__
completion_token: output 토큰
prompt_token: system+질문
total_token: prompt 토큰+ completion 토큰
프롬프트 템플릿
PromptTemplate
사용자가 입력한 값으로 프롬프트 문자열을 완성하는 템플릿
f-string으로 질의응답 방식을 쉽게 구현함
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
#LLM 모델 정의
llm = ChatOpenAI()
# template 정의
# {country}는 변수로, 나중에 변수를 통해 값이 들어갈 자리임
template = "{country}의 수도는 어디인가요?"
# from_template 메소드를 통해 PromptTemplate 객체 생성
prompt = PromptTemplate.from_template(template)
prompt
-template: 사용할 템플릿 문자열
-input_variables: 중괄호 안에 들어갈 변수명을 리스트로 정의
# chain 생성
chain = prompt | llm
chain.invoke({"country": "북한"}).content
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 질문 템플릿 형식 정의
template = '{country}의 수도는 뭐야?'
# 템플릿 완성
prompt = PromptTemplate(template=template, input_variables=['country'])
# 모델과 프롬프트 템플릿이 연결된 체인(Chain)객체 생성
llm_chain = LLMChain(prompt=prompt, llm=llm)
answer = llm_chain.invoke({"country": "일본"})
answer
참고 자료
https://teddylee777.github.io/langchain/langchain-tutorial-01/