10장. MCP 와 Prompt·Context Engineering
컨텍스트 줄이기
회의록을 한 달 치 다 들고 회의에 들어가지 않고, 지난 회의의 요약 한 장과 오늘 안건에 필요한 자료만 들고 갑니다. 컨텍스트도 골라 넣고, 요약하고, 오래된 것은 덜어 냅니다.
네 카드가 컨텍스트를 줄이는 방법입니다. 문서는 다 붙이지 말고 검색으로 몇 조각만 고르고(6~7장), 오래된 대화는 요약 한 단락으로 바꾸고, 최근 몇 턴만 그대로 두고, 도구가 돌려준 긴 결과는 필요한 칸만 남깁니다. 여기서 요약 한 장이 대화 요약, 오늘 안건 자료가 검색한 조각입니다.
방법 견주기
| 방법 | 줄어드는 것 | 잃을 수 있는 것 |
|---|---|---|
| 검색으로 고르기 | 문서 | 검색이 놓친 조각 |
| 오래된 대화 요약 | 대화 기록 | 요약에서 빠진 숫자, 이름 |
| 최근 N 턴만 | 대화 기록 | 오래전에 말한 조건 |
| 도구 결과 다듬기 | 도구 결과 | 지운 칸에 있던 정보 |
최근 대화만 남기기
history = [{"role": "user" if i % 2 == 0 else "assistant", "content": f"{i}번째 말"} for i in range(12)]
def trim(messages, keep_last=4, summary=None):
"""시스템 지시는 늘 두고, 앞부분은 요약 한 줄로, 최근 keep_last 개는 그대로"""
system = [{"role": "system", "content": "당신은 사내 도우미입니다."}]
if summary:
system.append({"role": "system", "content": "앞선 대화 요약: " + summary})
return system + messages[-keep_last:]
short = trim(history, keep_last=4, summary="사용자는 회의실 예약을 묻고 있다.")
print(len(history), "→", len(short), "개 메시지:", [m["content"] for m in short])메시지 12개가 시스템 지시와 요약 2개, 최근 대화 4개로 줄어 6개가 됩니다. 요약은 보통 LLM 에게 따로 한 번 시켜 만듭니다.
코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
"user" if i % 2 == 0 else "assistant" | 짝수 번째는 사용자, 홀수 번째는 모델(assistant, 조수)의 말로 번갈아 정한다 |
[{…} for i in range(12)] | 그 꼴의 메시지 12개를 한 번에 만든다. 연습용 대화 기록이다 |
keep_last=4 | 그대로 남길 최근 메시지 수의 기본값이다 |
summary=None | 요약 글의 기본값이다. 주지 않으면 요약 메시지를 넣지 않는다 |
system.append(…) | 시스템 메시지 목록 끝에 요약 메시지를 하나 더한다 |
messages[-keep_last:] | 목록의 끝에서 keep_last 개를 잘라 온다. 음수 번호는 뒤에서부터 센다 |
system + messages[-keep_last:] | 두 목록을 이어 붙여 새 목록을 만든다. 원래 history 는 그대로 남는다 |
이 코드가 뜻하는 것
회의에 들고 갈 서류철을 꾸리는 일로 읽어 봅니다. 맨 앞에는 늘 회사 규칙 한 장을 넣고, 다음에 지난 회의의 요약 한 장, 뒤에는 최근 회의록 몇 장만 넣습니다. 오래된 회의록은 서류철에서 빼지만 버리지는 않습니다. 여기서 회사 규칙이 시스템 지시, 요약 한 장이 요약 메시지, 최근 회의록이 messages[-keep_last:], 빼 둔 회의록이 원래의 history 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
history = [...] | 주고받은 메시지 12개를 만든다 | 한 달 치 회의록 |
system = [{"role": "system", ...}] | 늘 넣을 시스템 지시를 둔다 | 맨 앞의 회사 규칙 |
if summary: system.append(...) | 요약이 있으면 시스템 메시지로 하나 더한다 | 지난 회의 요약 한 장 |
return system + messages[-keep_last:] | 최근 4개만 붙여 돌려준다 | 최근 회의록 네 장 |
print(len(history), "→", len(short), ...) | 줄기 전과 뒤의 개수, 남은 내용을 찍는다 | 서류철 두께 견주기 |
결과에서 남은 대화는 8번째 말 부터 11번째 말 까지입니다. 0번부터 7번까지의 말은 요약 한 줄이 대신합니다. 이 예의 요약은 사람이 미리 적어 둔 문장이고, 실제로는 LLM 에게 따로 시켜 만듭니다.
주의할 점
- 사용자가 처음에 말한 조건("예산은 30만원 이하")이 요약에서 빠지면 뒤의 답이 틀립니다. 요약에 꼭 남길 것(숫자, 이름, 조건)을 지시에 적습니다.
- 도구 결과를 다듬을 때 숫자 칸을 지우지 않습니다. 모델이 숫자를 지어내는 원인이 됩니다.