1장. 과정 소개와 LLM 의 이해
기억하지 못하는 LLM
콜센터에 두 번째로 전화했더니 다른 상담원이 받았다고 해 봅시다. 새 상담원은 앞의 통화를 모릅니다. 그래서 상담 기록 메모를 함께 넘겨받아야 "아, 지난번 제주도 문의 주신 분이시죠" 하고 이어 갈 수 있습니다. LLM API 도 이 상담원과 같습니다. 요청마다 처음 보는 사람처럼 대하므로, 앞의 대화를 매번 함께 보내야 합니다.
요청이 거듭될수록 상자 안의 메시지가 늘어납니다. 두 번째 요청에는 첫 질문과 첫 답이, 세 번째 요청에는 그 앞의 것이 모두 함께 갑니다. 여기서 상담 기록 메모가 앞의 메시지들이고, 매번 바뀌는 상담원이 무상태인 LLM API 입니다. 비유와 다른 점은, 메모는 요약해서 넘길 수 있지만 LLM 에게는 우리가 요약하지 않으면 전부를 그대로 보낸다는 것입니다.
대화가 길어지면
| 몇 번째 질문 | 함께 보내는 메시지 | 메시지 수 |
|---|---|---|
| 1 | 시스템, 질문1 | 2 |
| 2 | 시스템, 질문1, 답1, 질문2 | 4 |
| 3 | 시스템, 질문1, 답1, 질문2, 답2, 질문3 | 6 |
| 10 | 시스템과 앞의 질문·답 아홉 쌍, 질문10 | 20 |
질문이 하나 늘 때마다 보내는 메시지가 두 개씩 늘어납니다. 보내는 토큰도 함께 늘어나므로 요금과 시간이 따라 늘고, 언젠가는 컨텍스트 창을 넘습니다. 4장의 메모리 전략(최근 몇 개만 보내기, 앞부분 요약하기)이 이 문제를 푸는 방법입니다.
짧은 예시
대화 기록을 목록에 쌓으며 요청마다 몇 개를 보내는지 셉니다.
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 같은 서비스가 대화를 기억하는 것처럼 보이는 것은 서비스가 뒤에서 기록을 모아 함께 보내 주기 때문입니다. 모델 자체가 기억하는 것이 아닙니다.
- 대화 기록에는 손님의 이름이나 연락처가 섞이기 쉽습니다. 기록을 저장할 때는 개인정보를 어떻게 다룰지 먼저 정합니다.