LangChain: 대화를 위한 ConversationChain

LLMChain

앞에서 LangChain의 LLMChain을 살펴봤습니다. PromptTemplate, LLM, OutputParser를 연결해서 편리하게 사용할 수 있는 기능이었죠. 그림으로 표현해봅시다.

  • 사용자가 질문을 던집니다.
  • 질문은 PromptTemplate을 통과하며 최종 프롬프트가 됩니다.
  • 최종 프롬프트는 LLM(완성형 또는 대화형)에 전달되고, LLM에서 Output을 출력합니다.
  • 출력은 OutputParser를 거쳐 최종 응답이 되고, 사용자에게 전달됩니다

이 Chain은 한 번 입력을 받아서 한 번 출력하는 형태의 Chain입니다. LLMChain은 여러 개를 연결해서 더 복잡한 구조의 Chain을 만들 수 있지만, 기본적으로 대화용은 아닙니다. 챗봇과 같이 대화에 사용할 수 있는 Chain으로 ConversationChain이 있습니다.

ConversationChain

ChatGPT와 달리 REST API로 이용하는 LLM에는 대화를 기억하는 기능이 없습니다. 따라서 이전 대화 내용을 바탕으로 계속 대화를 이어가기 위해서는 대화하고 있는 내용을 저장해뒀다가 매번 프롬프트를 만들 때 추가해줘야 합니다. 그래야 LLM이 지금까지의 대화 내용을 기억하고 있는 것처럼 대답할 수 있죠. 이렇게 이전 대화를 기억하도록 하는 LangChain의 기능을 Memory라고 했습니다. 대화를 위한 ConversationChain을 만들 때는 이 Memory가 필요합니다. 그림으로 보면 다음과 같습니다.

  • 사용자가 질문을 던집니다.
  • 질문은 Memory에 저장된 이전 대화 내용과 함께 PromptTemplate에 전달되고, PromptTemplate를 거쳐 최종 프롬프트가 됩니다.
  • 최종 프롬프트는 대화형 LLM에 전달되고, 대화형 LLM에서 Output을 출력합니다.
  • Output은 사용자의 Query와 함께 Memory에 저장되고, OutputParser에도 전달됩니다.
  • OutputParser를 거쳐 최종 응답이 사용자에게 전달됩니다.

코드를 보겠습니다.

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

llm = ChatOpenAI(temperature=0.0)

memory = ConversationBufferMemory()

conversation = ConversationChain(
    llm=llm, 
    memory = memory
)
conversation.predict(input="안녕, 나는 토니 스타크라고 해.")

### 결과(응답)
'안녕, 토니 스타크! 반가워요. 저는 OpenAI의 인공지능입니다. 무엇을 도와드릴까요?'

위 코드에서는 간단한 대화를 위해 PromptTemplate과 OutputParser를 생략했습니다. 이 경우 프롬프트에는 대화를 위한 기본 SystemMessage, 대화를 계속해 나가면서 누적된 대화 내용, 그리고 사용자의 새로운 질문이 들어가게 됩니다. OutputParser가 없으니 출력은 LLM의 대답이 그대로 문자열로 나옵니다.

댓글 남기기