랭체인 - 간단한 챗봇 구현부터
LangChain 은 자연어 처리와 대화형 인공지능 개발을 위해 만들어진 프레임워크로, 대형 언어 모델을 활용한 애플리케이션을 쉽고 효과적으로 구축할 수 있도록 돕는다.
LLM 을 단순히 입력과 출력으로 사용하는 것을 넘어서 문서 검색, 메모리 관리, 고도화된 워크플로우를 설정해 복잡한 대화형 애플리케이션을 만들 수 있는 것이 LangChain 의 주요 특징이다.
프롬프트 관리 : LangChain 은 LLM 에 명령어를 어떻게 전달할지 설정하는 데 도움을 주는 템플릿 관리 기능을 제공한다.
연결성과 검색 : 다양한 외부 데이터 소스를 검색하고 연결하여 답변을 생성할 수 있는 기능을 지원한다.
메모리 관리 : 대화 히스토리나 문맥을 유지하는 기능을 제공하여, 사용자의 이전 대화를 기억하고 그에 맞게 적절한 답변을 생성할 수 있도록 돕는다.
워크플로우 파이프라인 : LLM 을 기반으로 한 문서 임베딩, 검색, 프롬프트 생성 등의 여러 작업을 파이프라인처럼 순서대로 처리할 수 있다.
벡터 데이터베이스와의 통합 : 문서, 질문, 답변 등을 임베딩한 후 벡터 데이터 베이스에 저장하고 검색할 수 있다.
대형 언어 모델을 기존의 간단한 QnA 시스템을 넘어서, 다양한 데이터 소스를 통합하여 더 유연하고 강력한 애플리케이션으로 확장할 수 있다.
import os
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI # langchain_openai 패키지에서 ChatOpenAI 가져오기
# .env 파일에서 환경 변수 로드
load_dotenv()
# OpenAI API 키 가져오기
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:
raise ValueError("OPENAI_API_KEY 환경 변수가 설정되지 않았습니다.")
# 1. 프롬프트 템플릿 설정
prompt_template = PromptTemplate(
input_variables=["input"], # 'input' 키로 변경
template="You are a helpful assistant. Answer the question: {input}"
)
# 2. ChatOpenAI 설정
llm = ChatOpenAI(model_name="gpt-3.5-turbo", openai_api_key=OPENAI_API_KEY)
# 3. 체인 컴포지션: prompt_template과 llm을 '|' 연산자로 연결
qa_chain = prompt_template | llm
# 4. 챗봇 실행 함수
def chatbot():
print("LangChain 기반 챗봇에 오신 것을 환영합니다! 질문을 입력해 주세요.")
while True:
user_question = input("사용자: ")
if user_question.lower() in ["exit", "quit", "종료"]:
print("챗봇을 종료합니다.")
break
try:
# 'input' 키로 질문 전달
response = qa_chain.invoke({"input": user_question})
print(f"챗봇: {response}")
print(response.content)
except Exception as e:
print(f"오류 발생: {e}")
# 5. 챗봇 실행
if __name__ == "__main__":
chatbot()
라이브러리 임포트
import os : 환경 변수를 읽기 위해 사용했음
from dotenv import load_dotenv : .env 파일에서 환경 변수를 로드하기 위한 함수, API 보안을 위해
form langchain_core.prompts import PromptTemplate : LangChain 의 PromptTemplate 클래스를 가져온다. 이는 AI 모델에 전달할 프롬프트 형식을 정의하는 데 사용된다.
from langchain_openai import ChatOpenAI : LangChain 의 chatOpenAI 클래스를 가져온다 이 클래스는 OpenAI 의 GPT 모델과 상호작용하기 위한 인터페이스를 제공한다.
환경 변수 로드 및 API 키 설정
load_dotenv() : 현재 및 상위 디렉토리에 있는 .env 파일을 찾아 환경변수로 로드한다.
os.getenv("OPEN_API_KEY") : 환경 변수에서 OPENAI_API_KEY 값을 가져온다.
if not OPENAI_API_KEY : 예외 처리
프롬프트 템플릿 설정
PromptTemplate : AI 모델에 전달할 프롬프트를 정의한다. 두 가지 주요 요소
input_variables = ["input"] : 템플릿에서 사용할 변수의 이름을 정의한다. input 이라는 단일 변수의 사용
template=" ~ {input}" : 실제 프롬프트 텍스트, {input} 부분은 나중에 사용자가 입력한 질문으로 대체된다.
OpenAI LLM 설정
ChatOpenAI : OpenAI 의 GPT 모델과 상호 작용하기 위한 LangChain 클래스
모델 지정과 API 키 전달
체인 컴포지션
체인 컴포지션 | 연산자, LangChain 에서는 여러 컴포넌트를 체인 형태로 연결하여 복잡한 워크 플로우를 구성할 수 있다. prompt_template 과 llm 을 파이프 | 연산자로 연결하여 하나의 체인을 만든다.
prompt_template : 사용자 질문을 프롬프트 템플릿에 맞게 포맷팅한다.
llm : 포맷팅된 프롬프트를 OpenAI 모델에 전달하고, 모델의 응답을 받아온다.
qa_chain : 이 두 컴포턴트를 연결한 최종 체인, 전체 프로세스를 담당한다.
챗봇 실행 함수
질문 처리 및 응답 생성
qa_chain.invoke({"input":user_question})
qa_chain 에 사용자 질문을 전달하여 응답을 생성한다.
프롬프트 템플릿에서 input 변수를 사용했으므로, 딕셔너리의 키를 input 으로 설정
invoke 메서드는 체인을 실행하고 결과를 반환한다.