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

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

기억하지 못하는 LLM

콜센터에 두 번째로 전화했더니 다른 상담원이 받았다고 해 봅시다. 새 상담원은 앞의 통화를 모릅니다. 그래서 상담 기록 메모를 함께 넘겨받아야 "아, 지난번 제주도 문의 주신 분이시죠" 하고 이어 갈 수 있습니다. LLM API 도 이 상담원과 같습니다. 요청마다 처음 보는 사람처럼 대하므로, 앞의 대화를 매번 함께 보내야 합니다.

첫 번째 요청에는 질문 하나, 두 번째 요청에는 앞의 질문과 답과 새 질문, 세 번째 요청에는 그보다 더 많은 메시지를 보내는 흐름도

요청이 거듭될수록 상자 안의 메시지가 늘어납니다. 두 번째 요청에는 첫 질문과 첫 답이, 세 번째 요청에는 그 앞의 것이 모두 함께 갑니다. 여기서 상담 기록 메모가 앞의 메시지들이고, 매번 바뀌는 상담원이 무상태인 LLM API 입니다. 비유와 다른 점은, 메모는 요약해서 넘길 수 있지만 LLM 에게는 우리가 요약하지 않으면 전부를 그대로 보낸다는 것입니다.

대화가 길어지면

몇 번째 질문함께 보내는 메시지메시지 수
1시스템, 질문12
2시스템, 질문1, 답1, 질문24
3시스템, 질문1, 답1, 질문2, 답2, 질문36
10시스템과 앞의 질문·답 아홉 쌍, 질문1020

질문이 하나 늘 때마다 보내는 메시지가 두 개씩 늘어납니다. 보내는 토큰도 함께 늘어나므로 요금과 시간이 따라 늘고, 언젠가는 컨텍스트 창을 넘습니다. 4장의 메모리 전략(최근 몇 개만 보내기, 앞부분 요약하기)이 이 문제를 푸는 방법입니다.

짧은 예시

대화 기록을 목록에 쌓으며 요청마다 몇 개를 보내는지 셉니다.

Python
history = [{"role": "system", "content": "너는 여행 비서다."}]

for k, question in enumerate(["제주도 가요", "2박 3일이요", "일정 정리해 줘"], start=1):
    history.append({"role": "user", "content": question})
    print(f"{k}번째 요청: 메시지 {len(history)}개를 보낸다")
    # 모델의 답(여기서는 자리만 채운 글)도 기록에 쌓아 다음 요청에 함께 보낸다
    history.append({"role": "assistant", "content": f"답{k}"})
출력
1번째 요청: 메시지 2개를 보낸다
2번째 요청: 메시지 4개를 보낸다
3번째 요청: 메시지 6개를 보낸다

이 코드는 답 자리에 "답1" 같은 글만 채웠습니다. 실습 5에서는 LangChain 의 가짜 모델로 답을 받아 같은 일을 하고, 토큰이 얼마나 늘어나는지 셉니다.

코드가 의미하는 것

이 코드는 콜센터의 상담 기록 메모가 통화할 때마다 두꺼워지는 모습을 흉내 낸 것입니다. 메모(history)에 손님 말과 상담원 답을 한 줄씩 덧붙이고, 새 상담원에게 넘길 때마다 메모가 몇 줄인지 셉니다.

코드하는 일챗봇에서 뜻하는 것
history = [{"role": "system", ...}]시스템 메시지 하나로 목록을 시작한다대화 기록의 첫 줄입니다. 매니저의 지시는 대화 내내 맨 앞에 남습니다
history.append({"role": "user", ...})새 질문을 목록 끝에 붙인다손님이 말할 때마다 기록이 한 줄 늘어납니다
len(history)지금 목록의 길이를 센다이번 요청에 함께 보내는 메시지 수입니다. 모델은 기억하지 못하므로 이것을 전부 보내야 합니다
history.append({"role": "assistant", ...})답도 목록 끝에 붙인다다음 요청에서 모델이 앞의 답을 알게 하려면, 답도 기록에 남겨 함께 보내야 합니다
enumerate(..., start=1)질문에 1부터 번호를 붙인다몇 번째 요청인지 찍으려는 것일 뿐 대화 내용과는 상관이 없습니다

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

  • 요청마다 2개씩 늘어납니다. 2, 4, 6 으로 늘었습니다. 질문 하나와 답 하나가 한 쌍으로 쌓이기 때문입니다. 앞의 "대화가 길어지면" 표와 같은 숫자입니다.
  • 기억은 모델이 아니라 우리 코드에 있습니다. 이 코드에서 대화를 기억하는 것은 history 목록입니다. 목록을 비우면 모델은 앞의 대화를 전혀 모릅니다. 4장의 메모리 전략은 이 목록을 어떻게 줄일지 정하는 방법입니다.

주의할 점

  • ChatGPT 같은 서비스가 대화를 기억하는 것처럼 보이는 것은 서비스가 뒤에서 기록을 모아 함께 보내 주기 때문입니다. 모델 자체가 기억하는 것이 아닙니다.
  • 대화 기록에는 손님의 이름이나 연락처가 섞이기 쉽습니다. 기록을 저장할 때는 개인정보를 어떻게 다룰지 먼저 정합니다.
← 이전 절1장 · 메시지와 역할다음 절 →1장 · 환각과 지식 마감일