ReactFileStructure/부트캠프 과정

랭체인 - 간단한 챗봇 구현부터

명징직조지훈 2024. 10. 29. 10:04

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 메서드는 체인을 실행하고 결과를 반환한다.