LangChain 챗봇1장 · 과정 소개와 LLM 의 이해8 / 21← 이전목차다음 →MetaContents

1장. 과정 소개와 LLM 의 이해

메시지와 역할

식당 주방에는 여러 사람의 말이 오갑니다. 아침에 매니저가 "오늘은 짜지 않게, 친절하게"라고 지시하고, 손님이 주문하고, 점원이 대답합니다. 점원은 매니저의 지시를 지키면서 손님에게 답합니다. LLM 과의 대화도 누가 한 말인지 이름표를 붙인 메시지들로 이루어집니다.

시스템, 사용자, 어시스턴트 세 역할을 매니저의 지시, 손님의 주문, 점원의 대답에 견준 비교 그림

세 상자가 세 역할입니다. 시스템(system)은 대화 맨 앞에서 챗봇의 성격과 규칙을 정하고, 사용자(user)는 질문을 하고, 어시스턴트(assistant)는 모델의 답입니다. 여기서 매니저의 지시가 시스템 메시지, 손님의 주문이 사용자 메시지, 점원의 대답이 어시스턴트 메시지입니다. 비유와 다른 점은, 사용자가 "지시를 무시해"라고 하면 LLM 이 가끔 넘어간다는 것입니다. 점원처럼 늘 매니저 편에 서지는 않습니다.

세 역할

역할누가 쓰나예LangChain 의 이름
system챗봇을 만드는 사람너는 구름다리여행의 여행 비서다. 짧게 답한다SystemMessage
user챗봇을 쓰는 사람다음 달에 제주도에 가요HumanMessage
assistant모델좋습니다. 며칠 일정인가요?AIMessage

짧은 예시

OpenAI API 에 보내는 대화는 역할(role)과 내용(content)을 담은 사전의 목록입니다. JSON(JavaScript Object Notation, 자바스크립트 객체 표기법) 글로 바꿔 보면 실제로 보내는 모양이 됩니다.

Python
import json

messages = [
    {"role": "system", "content": "너는 구름다리여행의 여행 비서다. 짧게 답한다."},
    {"role": "user", "content": "다음 달에 제주도에 가요."},
]

# ensure_ascii=False: 한글을 \uXXXX 꼴로 바꾸지 않고 그대로 적는다
print(json.dumps(messages, ensure_ascii=False, indent=2))
출력
[
  {
    "role": "system",
    "content": "너는 구름다리여행의 여행 비서다. 짧게 답한다."
  },
  {
    "role": "user",
    "content": "다음 달에 제주도에 가요."
  }
]

모델의 답은 {"role": "assistant", "content": "…"} 꼴로 돌아옵니다. LangChain 은 이 사전 대신 SystemMessage, HumanMessage, AIMessage 라는 이름의 객체를 씁니다. 실습 5에서 직접 만들어 봅니다.

코드가 의미하는 것

이 코드는 주방에 넘어가는 주문서를 직접 써 본 것입니다. 맨 위에 매니저의 지시를 적고, 그 아래에 손님의 주문을 적고, 실제로 넘길 글 모양으로 옮겨 봅니다.

코드하는 일챗봇에서 뜻하는 것
{"role": "system", "content": "…"}역할과 내용을 짝지은 사전 하나를 만든다매니저의 지시입니다. 챗봇의 성격("여행 비서")과 규칙("짧게 답한다")을 정합니다
{"role": "user", "content": "…"}사용자 역할의 사전을 하나 더 만든다손님의 주문입니다. 모델이 답해야 할 말입니다
messages = [...]두 사전을 차례대로 목록에 담는다대화는 이 목록 하나로 전달됩니다. 목록의 차례가 곧 대화의 차례입니다
json.dumps(..., ensure_ascii=False, indent=2)목록을 JSON 글로 바꾼다API 로 실제로 보내는 모양을 눈으로 확인하는 것입니다. indent=2 는 사람이 읽기 좋게 두 칸씩 들여 쓰는 옵션입니다

결과에서 읽을 것은 두 가지입니다.

  • 보내는 것은 글이 아니라 이름표 붙은 목록입니다. 출력에서 메시지마다 role 과 content 두 칸이 보입니다. 모델은 role 을 보고 누가 한 말인지 압니다.
  • assistant 는 아직 없습니다. 이 목록은 모델에게 보내기 전의 모습이라 어시스턴트 메시지가 없습니다. 모델이 답하면 그 답이 assistant 이름표를 달고 돌아오고, 다음 요청에서는 그 답까지 목록에 넣어 보냅니다. 다음 절에서 이 목록이 어떻게 자라는지 봅니다.

주의할 점

  • 시스템 메시지는 대화 맨 앞에 한 번 둡니다. 챗봇의 말투, 답의 길이, 하지 말아야 할 것을 여기에 적습니다.
  • 시스템 메시지에 비밀번호나 API 키 같은 비밀을 적지 않습니다. 사용자가 꾀어내면 모델이 그대로 말해 버릴 수 있습니다.
← 이전 절1장 · 확률과 온도다음 절 →1장 · 기억하지 못하는 LLM