Python AI 에이전트에 메모리를 추가하는 방법
Source: Dev.to
당신의 AI 에이전트는 응답하는 순간 모든 것을 잊어버립니다. 후속 질문을 하면 전혀 컨텍스트가 없습니다. 메모리가 없으면 모든 상호작용이 처음부터 시작됩니다.
아래는 파이썬 40줄 이하로 이를 해결하는 방법입니다 – LangChain도, 프레임워크도 없이, 표준 라이브러리와 OpenAI SDK만 사용합니다.
코드
import json
import os
from pathlib import Path
from openai import OpenAI
MEMORY_FILE = "agent_memory.json"
client = OpenAI() # uses OPENAI_API_KEY env var
def load_memory() -> list[dict]:
"""Load conversation history from disk."""
if Path(MEMORY_FILE).exists():
with open(MEMORY_FILE, "r") as f:
return json.load(f)
return []
def save_memory(messages: list[dict]) -> None:
"""Persist conversation history to disk."""
with open(MEMORY_FILE, "w") as f:
json.dump(messages, f, indent=2)
def chat(user_input: str, messages: list[dict]) -> str:
"""Send a message with full conversation history."""
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
*messages
],
)
reply = response.choices[0].message.content
messages.append({"role": "assistant", "content": reply})
save_memory(messages)
return reply
if __name__ == "__main__":
history = load_memory()
print("Agent ready. Type 'quit' to exit.\n")
while True:
user_input = input("You: ").strip()
if user_input.lower() == "quit":
break
print(f"Agent: {chat(user_input, history)}\n")이 파일을 agent.py 로 저장하고, OPENAI_API_KEY 를 설정한 뒤 실행하세요:
pip install openai
export OPENAI_API_KEY="sk-..."
python agent.py작동 방식
- **
load_memory()**는 로컬 JSON 파일을 확인하고 이전 대화를 로드합니다. 파일이 없으면 빈 리스트로 새로 시작합니다. 이는 에이전트의 장기 메모리이며 재시작 후에도 유지됩니다. - **
save_memory()**는 매 교환 후 전체 메시지 리스트를 디스크에 기록합니다. 형식은 OpenAI의 메시지 스키마와 정확히 일치하므로 변환 단계가 필요 없습니다. - **
chat()**는 사용자의 메시지를 히스토리에 추가하고 전체 대화를 모델에 전송한 뒤, 응답을 다시 히스토리에 추가합니다. 모델은 이전 모든 턴을 보게 되므로 자연스럽게 이전 컨텍스트를 참조할 수 있습니다. - API 호출에서
*messages스프레드를 사용하면 시스템 프롬프트 뒤에 히스토리가 풀어져, 시스템 지시와 대화 흐름을 별도로 유지합니다.
보게 될 내용
You: My name is Sarah and I'm building a CLI tool in Rust.
Agent: Nice to meet you, Sarah! A CLI tool in Rust is a great
choice. What does it do?
You: What language am I using?
Agent: You're using Rust for your CLI tool.
# Restart the script...
You: What's my name?
Agent: Your name is Sarah!에이전트는 JSON 파일이 지속되기 때문에 메시지 간 및 세션 간에 기억합니다.
이것이 중단될 때
Token overflow. 모든 메시지가 모델에 전송됩니다. 약 50번의 교환 후에는 컨텍스트 윈도우를 초과하게 됩니다.
Fix: API 호출 전에messages를 마지막 N개의 항목으로 잘라내거나, 오래된 메시지를 요약합니다.No semantic search. 에이전트는 모든 내용을 순차적으로 기억하지만 주제별로 메모리를 검색할 수 없습니다. 이를 위해서는 임베딩 스토어를 추가해야 하지만, 이는 다른 튜토리얼의 내용입니다.
대부분의 프로토타입 및 개인 도구에 대해, 이 플랫‑파일 접근 방식은 놀라울 정도로 잘 작동합니다. OpenAI SDK 외에 의존성이 전혀 없는 지속적이고 컨텍스트가 있는 대화를 얻을 수 있습니다.
다음 단계
max_history매개변수를 추가하여 토큰 사용량을 제한합니다.- 각 메시지에 타임스탬프를 저장하여 시간 인식 회상을 가능하게 합니다.
- 단기(RAM)와 장기(디스크) 메모리 계층으로 분리합니다.
AI Agent Quick Tips 시리즈의 다른 게시물을 확인하여 재시도 로직, 구조화된 출력, 그리고 인간 승인 게이트와 같은 패턴을 살펴보세요.
메모리, 도구, 오케스트레이션이 즉시 필요한 에이전트를 구축하고 있나요? Nebula는 인프라를 처리해 주어 로직에 집중할 수 있게 합니다.