LangChain: llms vs. chat_models

랭체인 LangChain

LangChain은 다양한 LLM들을 공통된 인터페이스로 사용할 수 있도록 만든 파이썬/자바스크립트 패키지입니다. LLM 뿐 아니라 프롬프트 템플릿, 출력 파서, 외부 API 호출 기능도 지원하고, 각각의 기능들을 연결(chain)하는 기능도 제공합니다.

각 기능들의 이름은 다음과 같습니다.

  • LLM (Wrappers): 다양한 LLM의 표준 인터페이스를 제공합니다.
  • Prompt Templates: LLM에게 전달할 메시지를 구성하기 쉽게 만들어줍니다.
  • Output Parsers: LLM의 응답을 사용하기 쉽게 변환해줍니다.
  • Indexes: LLM 응답 품질 향상을 위해 외부 정보를 가지고 올 때 사용합니다.
  • LLMChain: 위의 구성 요소들을 연결합니다.

설치는 다음과 같이 합니다.

pip install langchain

간단한 코드를 봅시다. OPENAI_API_KEY라는 환경변수가 지정된 상태입니다.

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.9)
response = llm.predict("이순신은 누구지?")

LLMs, ChatModels

LLM에는 두 가지 유형이 있습니다.

  • LLMs: 문자열(하나의 메시지)을 입력받아 문자열을 반환하는 LLM
  • ChatModels: 메시지 리스트를 입력받아 문자열을 반환하는 LLM

앞에서 봤던 코드에서는 llms를 이용했죠? chat_models도 사용할 수 있습니다.

from langchain.chat_models import ChatOpenAI

chat_model = ChatOpenAI()
response = chat_model.predict("이순신은 누구지?")

앞의 코드랑 다를게 없네요. 같다면 llms와 chat_models를 따로 만들 이유가 없겠죠? 앞에서 LLM을 호출하기 위해 predict를 사용했는데, LLMs와 ChatModels 모두 두 가지 메서드가 있습니다.

  • predict: 문자열을 입력받아 문자열을 반환합니다.
  • predict_messages: 메시지 리스트를 입력받아 하나의 메시지를 반환합니다.

predict_messages를 사용한 코드입니다.

from langchain.schema import HumanMessage

messages = [HumanMessage(content="이순신은 누구지?")]

llm.predict_messages(messages)
chat_model.predict_messages(messages)

ChatModels의 입력인 ChatMessages에는 두 가지 필수 구성 요소가 있는데, OpenAI API에서 봤던 role과 content입니다. OpenAI API에서 role에는 “user”, “assistant”, “system”, “function“이 올 수 있었는데, LangChain에는 이에 해당하는 객체들이 있습니다.

  • HumanMessage: 사용자가 입력한 ChatMessage
  • AIMessage: LLM 응답
  • SystemMessage: 시스템 메시지
  • FunctionMessage: 함수 호출 결과 메시지

이 외에 사용자가 역할을 별도로 지정할 수 있는 ChatMessage 클래스도 있습니다.

predict vs. predict_messages

잠깐, 앞에서 LLMs는 문자열을 입력받아 문자열을 반환한다고 했는데, predict_messages 메소드를 가지고 있고 이 메소드는 메시지 리스트를 입력받는다고요? ChatModels는 메시지 리스트를 입력받는다고 했는데, 문자열을 입력받는 predict 메소드가 있다고요? 네 그렇습니다. 작동은 다음과 같습니다.

  • llm.predict, chat_model.predict: 문자열을 입력받아 문자열 반환. chat_model의 경우 문자열을 입력받으면 하나의 메시지만 있는 리스트를 입력받은 것과 유사합니다.
  • llm.predict_messages: 메시지의 리스트를 입력받는데, 리스트의 각 원소별로 LLM의 응답을 구합니다. 리스트의 메시지들은 서로 관련 없는 별개의 메시지가 됩니다.
  • chat_model.predict_messages: 메시지의 리스트를 입력받는데, 리스트의 원소들은 연속된 대화로 인식됩니다.

따라서 일반적으로 llm.predict 또는 chat_model.predict_messages를 사용하는 것이 좋습니다. 이 때 predict는 문자열을 반환하지만 predict_messages는 AIMessage 객체를 반환합니다. 응답은 객체의 content 속성에 저장됩니다.

다음 글에서는 프롬프트 템플릿에 대해 알아보겠습니다.

댓글 남기기