LangChain으로 LLM RAG 챗봇 구축 II

2024. 4. 15. 20:36python/intermediate

1단계: LangChain에 익숙해지기

 

챗봇을 설계하고 개발하기 전에 LangChain을 사용하는 방법을 알아야 합니다. 이 섹션에서는 병원 시스템 챗봇의 예비 버전을 구축하여 LangChain의 주요 구성 요소와 기능을 알아봅니다. 이는 완전한 챗봇을 구축하는 데 필요한 모든 도구를 제공합니다.

선호하는 코드 편집기를 사용하여 새 Python 프로젝트를 만들고 해당 종속성에 대한 가상 환경을 만들어야 합니다. Python 3.10 이상이 설치되어 있는지 확인하십시오. 가상 환경을 활성화하고 다음 라이브러리를 설치하십시오.

 
[ ]:
!conda create -n langchain python=3.12 -y
# !source ../.bashrc
# !conda init
!conda activate langchain
 
 
 
[ ]:
!python -m pip install langchain==0.1.0 openai==1.7.2 langchain-openai==0.0.2 langchain-community==0.0.12 langchainhub==0.1.14
 
 
 

또한 환경 변수를 관리하는 데 도움이 되는 python-dotenv 설치를 원할 것입니다 .

 
[ ]:
!python -m pip install python-dotenv
 
 
 

Python-dotenv는 .env파일의 환경 변수를 Python 환경으로 로드하며, 챗봇을 개발할 때 이 기능이 편리하다는 것을 알게 될 것입니다. 그러나 결국에는 환경 변수를 처리할 수 있는 Docker를 사용하여 챗봇을 배포하게 되며 더 이상 Python-dotenv가 필요하지 않게 됩니다.

아직 다운로드하지 않은 경우 이 튜토리얼에 대한 reviews.csv자료나 GitHub 리포지토리 에서 다운로드해야 합니다.

다음으로, 프로젝트 디렉터리를 열고 다음 폴더와 파일을 추가합니다.

 

reviews.csv의 파일은 방금 무료소스코드의 source_code_step_1의 data/에 있는 다운로드한 파일이며 표시되는 나머지 파일은 비어 있어야 합니다.

이제 LangChain으로 첫 번째 챗봇 구축을 시작할 준비가 되었습니다!

 

채팅 모델

 

LangChain의 핵심 구성 요소가 LLM 이라고 짐작하셨을 것입니다. LangChain은 OpenAI, Cohere, HuggingFace, Anthropic, Together AI 등과 같은 LLM 제공업체와 작업하기 위한 모듈식 인터페이스를 제공합니다. 대부분의 경우 LangChain과 함께 LLM 사용을 시작하려면 LLM 공급자의 API 키만 있으면 됩니다. LangChain은 또한 자신의 컴퓨터에서 호스팅되는 LLM 또는 기타 언어 모델을 지원합니다.

이 튜토리얼에서는 OpenAI를 사용하게 되지만, 훌륭한 오픈 소스 및 비공개 소스 제공업체가 많이 있다는 점을 명심하세요. 언제든지 다양한 공급자를 테스트하고 애플리케이션의 요구 사항과 비용 제약에 따라 최적화할 수 있습니다. 계속 진행하기 전에 OpenAI 계정에 가입했고 유효한 API 키가 있는지 확인하세요 .

OpenAI API 키가 있으면 .env 파일에 추가하세요.

 

OPENAI_API_KEY=<YOUR-OPENAI-API-KEY>

 

LangChain에서 LLM 개체와 직접 상호 작용할 수 있지만 보다 일반적인 추상화는 채팅 모델 입니다. 채팅 모델은 내부적으로 LLM을 사용하지만 대화용으로 설계되었으며 원시 텍스트가 아닌 채팅 메시지와 인터페이스합니다.

채팅 메시지를 사용하여 보내는 메시지 종류에 대한 추가 세부 정보를 LLM에 제공합니다. 모든 메시지에는 role및 content속성이 있습니다. role은 메시지를 보내는 사람이 누구인지 LLM에게 알려주며 content 는 메시지 자체입니다. 가장 일반적으로 사용되는 메시지는 다음과 같습니다.

  • HumanMessage: 언어 모델과 상호작용하는 사용자의 메시지입니다.
  • AIMessage: 언어 모델의 메시지입니다.
  • SystemMessage: 언어 모델의 작동 방식을 알려주는 메시지입니다. 모든 공급자가 SystemMessage를 제공하지 않습니다.

FunctionMessage 및 ToolMessage 같은 다른 메시지 유형도 있지만 이에 대한 자세한 내용은 에이전트를 구축할 때 배우게 됩니다.

LangChain에서 채팅 모델을 시작하는 것은 간단합니다. OpenAI 채팅 모델을 인스턴스화하려면 langchain_intro를 항해하고 다음 코드를 chatbot.py에 추가하세요.

 
[ ]:
import dotenv
from langchain_openai import ChatOpenAI
 
dotenv.load_dotenv()
 
chat_model = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
 
 
 

먼저 dotenv 및 ChatOpenAI를 임포트합니다. 그런 다음 .env에서 환경 변수를 읽고 저장하는 dotenv.load_dotenv()를 호출합니다. 기본적으로 dotenv.load_dotenv()은 .env가 현재 작업 디렉터리에 있다고 가정 하지만 .env가 다른 곳에 있는 경우 다른 디렉터리로 경로를 전달할 수 있습니다.

그런 다음 GPT 3.5 Turbo를 기본 LLM으로 사용하여 ChatOpenAI 모델을 인스턴스화하고 temperature를 0으로 설정합니다. OpenAI는 다양한 가격대, 기능 및 성능을 갖춘 다양한 모델을 제공합니다. GPT 3.5 터보는 많은 사용 사례에서 잘 작동하고 GPT 4 이상과 같은 최신 모델보다 저렴하기 때문에 시작하기에 좋은 모델입니다.

참고 temperature=0 설정이 GPT 모델의 결정적 응답을 보장한다는 것은 일반적인 오해입니다. 응답 temperature=0은 결정론적에 더 가깝지만 동일한 요청에 대해 동일한 응답을 받는다는 보장은 없습니다. 이로 인해 GPT 모델은 이 튜토리얼 전체의 예에서 볼 수 있는 것과 약간 다른 결과를 출력할 수 있습니다.

chat_model를 사용하려면 프로젝트 디렉터리를 열고 Python 인터프리터를 시작한 후 다음 코드를 실행하세요.

 
[ ]:
!pip install chromadb
 
 
 
[ ]:
from langchain.schema.messages import HumanMessage, SystemMessage
from langchain_intro.chatbot import chat_model
 
messages = [
SystemMessage(
content="""You're an assistant knowledgeable about
healthcare. Only answer healthcare-related questions."""
),
HumanMessage(content="What is Medicaid managed care?"),
]
 
chat_model.invoke(messages)
 
 
 

이 블록에서는 채팅 모델과 마찬가지로 HumanMessage 및 SystemMessage 가져옵니다. 그런 다음 SystemMessage 및 HumanMessage를 사용하여 목록을 정의 하고 chat_model.invoke()를 사용 하여 chat_model를 실행합니다. chat_model는 내부적으로 gpt-3.5-turbo-0125를 제공하는 OpenAI 엔드포인트에 요청을 하고 결과는 AIMessage에 돌려줍니다.

참고: 이 튜토리얼의 여러 줄 코드를 복사하여 표준 Python REPL에 붙여넣는 것이 약간 번거로울 수 있습니다. 더 나은 경험을 위해 IPython, bpython 또는 ptpython과 같은 대체 Python REPL을 가상 환경에 설치하고 이들과 REPL 상호 작용을 실행할 수 있습니다.

보시다시피 채팅 모델은 HumanMessage에서 제공된 Medicaid Managed Care란 무엇입니까?라고 대답했습니다. 이 맥락에서 SystemMessage와 같이 채팅 모델이 무엇을 했는지 궁금할 것입니다. 다음 질문을 하면 어떤 일이 발생하는지 주목하세요.

 
[ ]:
messages = [
SystemMessage(
content="""You're an assistant knowledgeable about
healthcare. Only answer healthcare-related questions."""
),
HumanMessage(content="How do I change a tire?"),
]
 
chat_model.invoke(messages)
 
 
 

앞에서 설명한 것처럼 SystemMessage 모델이 어떻게 행동할지 알려줍니다. 이 경우에는 건강 관리 관련 질문에만 답변 하도록 모델에 지시했습니다. 이것이 타이어 교체 방법을 알려주기를 거부하는 이유입니다. 텍스트 지침을 통해 LLM이 사용자와 어떻게 관련되는지 제어하는 ​​기능은 강력하며 이는 프롬프트 엔지니어링을 통해 맞춤형 챗봇을 생성하기 위한 기반입니다 .

채팅 메시지는 훌륭한 추상화이며 LLM에 올바른 종류의 메시지를 제공하는 데 유용하지만 원시 문자열을 채팅 모델에 전달할 수도 있습니다.

 
[ ]:
chat_model.invoke("What is blood pressure?")
 
 
 

이 코드 블록에서는 What is blood Pressure? 문자열을 chat_model.invoke()에 직접 전달합니다. 여기 SystemMessage없이 LLM의 동작을 제어하려면 문자열 입력에 지침을 포함할 수 있습니다.

참고 : 이 예에서는 .invoke()를 사용했지만 LangChain에는 LLM과 상호 작용하는 다른 방법이 있습니다. 예를 들어 .stream()은 한 번에 하나의 토큰으로 응답을 반환하고 .batch()는 LLM이 한 번의 호출로 응답하는 메시지 목록을 받아들입니다.

각 메서드에는 유사한 비동기 메서드도 있습니다. 예를 들어 ainvoke()와 비동기적으로 .invoke()를 실행할 수 있습니다.

다음에는 SystemMessage에서 했던 것처럼 모델의 응답을 안내하는 모듈식 방법을 배워 챗봇을 더 쉽게 맞춤설정할 수 있습니다.