목차
오늘은 LangChain을 이용해서 llama 3.1의 부족한 부분을 보완하는 기능을 구현해 보도록 하겠습니다. 물론, LangChain의 개념과 특징에 대해서도 당연히 정리해 보도록 하겠습니다.
LangChain과 Llama 3.1
Meta의 Llama 3.1이 발표된 후 우리는 Ollama를 통해 설치는 물론, UI 개선을 위해 Open WebUI 방식과 Python의 Flask 모듈을 이용한 방식들에 대해 알아봤습니다. (해당 글은 본문 맨 아래에 각각 링크를 두도록 하겠습니다. 필요하신 분은 참고하세요.)
개인 PC에 설치했던 라마는 Ollama를 이용하건, 직접 이용하건 콘솔을 이용하여 대화하는 방법이 일반적이었어요, 때문에 이러한 불편함을 개선하기 위해 UI 변경을 통해 개선했다면, 오늘은 라마의 부족한 부분을 수정 보완하는 방법 중 LangChain을 활용하는 방법에 대해 정리해 보겠습니다.
우선 LangChain에 대해 정리합니다.
LangChain (랭체인)의 의미와 주요 기능
랭체인은 자연어 처리(NLP) 작업을 쉽게 수행할 수 있도록 도와주는 프레임워크입니다. 주로 GPT-3, GPT-4와 같은 대형 언어 모델을 기반으로 한 응용 프로그램을 구축하는 데 사용됩니다. 랭체인은 여러 가지 구성 요소를 제공하여 다양한 언어 모델을 연결하고 활용할 수 있게 해줍니다.
주요 기능으로는 다음과 같은 것들이 있습니다.
- 체인(Chains): 여러 가지 NLP 작업을 순차적으로 수행할 수 있도록 작업을 체인처럼 연결합니다. 예를 들어, 문장을 요약하고, 요약된 내용을 바탕으로 질문을 생성한 후, 생성된 질문에 대해 답변을 제공하는 등의 일련의 작업을 수행할 수 있습니다.
- 프로프트 템플릿(Prompt Templates): 특정 작업을 위해 템플릿화된 프로프트를 사용하여 일관된 형식으로 언어 모델을 호출할 수 있게 합니다.
- 메모리(Memory): 언어 모델이 이전 대화나 컨텍스트를 기억하고 유지하도록 하여 더 자연스러운 대화 흐름을 제공합니다.
- 에이전트(Agents): 복잡한 작업을 자동으로 처리할 수 있는 에이전트를 생성할 수 있습니다. 에이전트는 주어진 목표를 달성하기 위해 여러 가지 액션을 취할 수 있습니다.
LangChain을 이용한 언어 모델 후 처리
랭체인을 활용하면 단순한 대화를 넘어서는 복잡한 워크플로우나 특정 작업을 자동화할 수 있는 기능을 추가할 수 있습니다. 몇 가지 예를 들어 설명하겠습니다.
- 멀티스텝 워크플로우 자동화
- 예시: 사용자가 여행 계획을 세우고 싶어하는 경우, 챗GPT와의 대화에서 여행지 추천, 항공권 검색, 호텔 예약, 그리고 일정 작성까지 다양한 단계를 거쳐야 합니다. 랭체인을 사용하면 이러한 단계를 자동화하여 사용자가 한 번의 요청으로 모든 작업을 완료할 수 있도록 도와줄 수 있습니다. 예를 들어, ‘여행 일정 짜기’라는 명령을 주면 랭체인이 각 단계를 자동으로 실행합니다.
- 복합 작업 수행
- 예시: 고객 서비스에서는 사용자의 문의에 답변하는 것뿐만 아니라, 사용자의 계정 정보를 검색하고, 특정 절차를 진행하며, 문제를 해결하는 등의 복합적인 작업이 필요할 수 있습니다. 랭체인을 사용하면 이런 다양한 작업을 하나의 대화 흐름 안에서 처리할 수 있습니다.
- 맞춤형 데이터 처리
- 예시: 어떤 기업이 대규모 문서 데이터베이스를 가지고 있고, 이 데이터를 기반으로 특정 정보를 추출하거나 요약하는 작업을 자동화하고 싶어한다고 가정해봅시다. 랭체인을 사용하면 이 데이터를 처리하고, 필요한 정보를 자동으로 추출하거나 요약하는 챗봇을 만들 수 있습니다.
- 메모리 기능을 통한 지속적 컨텍스트 유지
- 예시: 사용자가 이전 대화에서 이야기했던 내용을 기억하여 다음 대화에서도 관련된 정보를 제공할 수 있습니다. 예를 들어, 사용자가 다이어트 관련 상담을 받다가 며칠 뒤 다시 대화를 시작하면, 랭체인은 이전 대화 내용을 기억하여 연속적인 상담을 제공할 수 있습니다.
- 에이전트 기능 활용
- 예시: 랭체인의 에이전트 기능을 사용하면 특정 목표를 달성하기 위해 다양한 작업을 순차적으로 수행하는 프로그램을 만들 수 있습니다. 예를 들어, 금융 시장 분석기를 구축하여 실시간 데이터를 수집하고 분석한 후, 사용자가 요청한 특정 주식에 대해 투자를 추천하는 서비스를 제공할 수 있습니다.
LangChain을 이용한 Llama 3.1 기능 보완
Llama 3.1 8B의 한계
일단 개인 PC에 설치한 Llama 3.1 8B 버전과 대화한 내용을 보시죠. 라마와 대화 화면이 좀 다르죠? Python으로 직접 구현한 화면입니다. 관심 있으신 이전 글 “Llama3.1 (Ollama)과 Python Flask로 나만의 웹UI 만들기“를 참고하세요.
위 그림에서 바탕색이 파란 부분은 사용자(나)고, 붉은색 부분이 라마의 대답입니다. 먼저 제가 인사를 했고, 라마는 뭐 어쩌고저쩌고 합니다. 또, 라마 3.1에 대해 제가 설명을 요청했고, 라마가 대답합니다. 설명 요청에 대한 전체 대답은 아래 그림과 같습니다.
이제, 저는 라마가 대답한 마지막 문장을 한글로 번역해 달라고 요청했습니다. 다음의 문장을 한글로 번역해 주면 정확한 대답이 되겠죠.
However, I can try to provide more general information about large language models like LLaMA or help with anything else you’d like to know!
위 그림을 보면 한글 번역 요청에 대한 라마의 대답은 전혀 엉뚱합니다. 영어로 라마 3.1에 대한 이야기를 하고 있었는데, 느닷없이 NASA가 나옵니다.
이것은 현재 Llama 3.1 8B 버전은 대화 중 이전 대화 내용을 기억하지 못한다는 것을 알 수 있죠. 단순히 1:1로 요청과 답변을 할 뿐 이전 대화 내용의 맥락을 계속해서 이해하거나 대화의 흐름을 확인하고 그에 따라 대응하는 것이 아니라는 것이죠.
랭체인을 이용한 라마3.1 8B 기능 보완
앞서 [LangChain을 이용한 언어 모델 후 처리] 단락에서 이야기 했던 “메모리 기능을 통한 지속적 컨텍스트 유지” 부분을 랭체인으로 구현하여 라마 3.1의 단점으로 지적했던 이전 문장을 기억하고 이에 대해 사용자 요청을 처리하는 과정을 보여 드립니다.
우선 파이썬 랭체인 모듈을 설치합니다.
pip install langchain
이 블로그의 라마 3.1과 관련한 앞선 글들을 계속 이어오셨다면 현재 라마 설치 환경에 대해 알고 계실 것 입니다 만, 다시 한번 설명하자면, Ollama를 이용하여 라마 3.1 8B를 PC에 설치하고 실행하고 있으므로, 라마 3.1은 실제로는 Ollama 안에 있다고 봐야 합니다. 결국 우리는 Ollama와 통신을 하여 라마와 연결해야 한다는 거예요.
llama3.1 — ollama — Python (langchain 모듈)
그러면 Ollama에서 공개한 통신 포트는 11434 이므로, URL과 model은 다음과 같이 정의할 수 있을 거예요
endpoint: str = “http://localhost:11434/api/chat” # URL을 /chat으로 설정
model: str = “llama3.1:8b”
다음은 ollama와 통신하기 위해 LLM 클래스를 정의합니다. 우선 다음과 같이 랭체인 관련 필요한 모듈을 import 합니다.
from langchain import LLMChain, PromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.llms.base import LLM
OllamaLLM 클래스는 LLM 기반 클래스를 상속받아 기능을 구현합니다.
다음은 대화의 문맥을 유지하기 위해 메모리를 설정하고, 라마3.1과 대화할 프롬프트 구조(템플릿)를 설정합니다. 인공지능에게 역할을 부여하는 것은 인공지능 언어 모델과 대화에 있어서 내가 원하는 대답을 이끌어 낼 수 있는 작은 방법 중 하나 입니다.
계속해서, “LLMChain”을 설정합니다. 여기에서 위에서 정의한 OllamaLLM 클래스와 프롬프트 템플릿, 그리고 정의한 메모리를 결합하여 LLM 체인을 구성합니다.
이제 대화, 요청과 대답을 연속적으로 받는 부분을 구성해 봅니다. 간단하게 연속해서 3번 요청과 대답을 받는 구조로, 마지막 3번째 요청에서 2번째 대답의 마지막 문장을 한글로 번역해 줄 것을 요청합니다. 이에 대한 대답으로 앞에서 문제되었던 라마 3.1의 문제가 해결될 수 있는지 확인해 봅니다.
이제, 간단하게 작성해 본 코드를 실행하여 결과를 확인해 보겠습니다. 다음 그림은 터미널에서 출력된 화면입니다.
첫 번째 질문 “Hello, how are you?” 에 대해 붉은색 박스와 같이 라마 3.1은 어울리는 대답을 합니다.
다음 두 번째 질문 인 “Can you tell me more about the Llama 3.1 model?“에 대해서도 어울리는 대답을 하고, 그 대답의 마지막 문장은 아래와 같습니다.
What would you like to know about the Llama 3.1 model?
마지막 요청은 바로 이전에 대답했던 내용의 마지막 문장은 한글로 번역해 달라는 것이었습니다. 위 그림으로 보면 요청 사항과 대답을 다시 한번 보여 주고 한글로 번역된 대답 역시 정확한 답변이라는 것을 보여 줍니다.
“Llama 3.1 모델에 대해 무엇을 알고 싶으신가요?”
라마와 콘솔을 통해 직접 대화했을 때는 전혀 엉뚱한 대답을 했는데, 랭체인을 이용했을 때의 대답은 위 그림과 같이 정확하게 한글로 번역한 대답을 해 주는 것을 확인할 수 있었습니다.
자, 오늘은 랭체인이라는 기술을 활용하여 인공지능 언어 모델의 기능을 커스터마이징 하는 방안에 대해 이야기하고, 간단한 파이썬 코드로 구현해 보았습니다. 이러한 기술들을 이용하면 챗GPT나 라마 등을 이용하여 나만의 솔루션이나 플랫폼을 설계해 볼 수 있지 않을까요?
관련 이전 글: