세션 간 사용자 기억 기능을 갖춘 챗봇 구축 방법 (Walrus Memory + Qwen on Groq)
요약
본 글은 챗봇이 세션 간 사용자 정보를 영구적으로 기억하게 하는 방법을 설명합니다. Walrus Memory를 활용하여 회상(Recall), 생성(Generate), 학습(Learn)의 3단계 루프를 거치며, 사용자의 개인 정보나 선호도를 지속적으로 저장하고 답변에 반영하는 구조입니다.
핵심 포인트
- Walrus Memory는 사용자별 네임스페이스를 할당하여 기억 정보를 분리합니다.
- 메시지 처리 과정은 회상(Recall) -> 생성(Generate) -> 학습(Learn)의 3단계 루프를 따릅니다.
- 개인 정보가 Walrus에 저장되므로 서버 재배포나 손실에도 데이터가 유지됩니다.
- Qwen과 Groq 조합을 사용하여 기억된 사실 기반의 답변 생성이 가능합니다.
이 글은 사용자가 Walrus Memory를 챗봇에 추가하여 변경된 내용을 작성하는 빌드 콘테스트인 **Walrus Sessions 8 - 기억하는 챗봇(Chatbots That Remember)**을 위해 작성되었습니다. 세션 간에 챗봇이 사용자 정보를 어떻게 기억하게 하는지 궁금해하는 분들을 위해 이 빌드 스토리를 공유합니다.
Walrus Sessions 8, "기억하는 챗봇"을 위해 제작됨
문제점 (The problem)
저는 베트남 출신의 의사로 Web3와 AI를 독학하고 있으며, 실제로 무언가를 출시하며 배우고 싶었습니다. 오늘 챗봇에게 파트너의 생일을 말해주면, 다음 주가 되면 그 정보는 아무것도 모르게 됩니다. 관계처럼 개인적인 것이 핵심인 부분에서 가치가 사라지는 것입니다. 즉, "그들에 대해 알려줘"라고 다시 물어보는 것이 아니라, 챗봇이 지난번에 들었던 것을 기억하는 데 가치가 있습니다.
DuoMind가 하는 일 (What DuoMind does)
DuoMind는 웹과 Telegram용 커플 전용 챗봇입니다. 사용자에게 파트너에 대한 정보(생일, 취향, 약속, 계획 등)를 알려주면, 챗봇은 이를 영구적으로 기억합니다. 나중에 선물이나 데이트 아이디어를 요청하면, 그 답변은 챗봇이 실제로 알고 있는 지식에 기반을 두고 있습니다. 이 챗봇은 7개 언어에서 작동하며 "다음 주 수요일" 같은 표현을 이해하고 생일 전에 알림을 보내줍니다.
Walrus Memory가 연결되는 방식 (How Walrus Memory is wired in)
모든 메시지는 동일한 루프를 실행하며, 사용자별로 네임스페이스(namespace)가 하나씩 할당되어 기억 정보들이 섞이지 않습니다:
- 회상 (Recall): 해당 사용자의 네임스페이스에서 메시지와 관련된 사실들을 조회합니다.
- 생성 (Generate): 회상된 사실들을 프롬프트에 넣고 답변을 생성합니다 (Qwen via Groq).
- 학습 (Learn): 모델에게 메시지에서 짧고 지속 가능한 사실들(날짜, 선호도, 약속 등)을 추출하도록 요청하고, 각각을 암호화된 블롭(blob) 형태로
remember()합니다.
const memwal = MemWal.create({ key, accountId, serverUrl: "https://relayer.memory.walrus.xyz" });
await memwal.remember("Lan loves sunflowers", `myapp-${userId}`);
const hits = (await memwal.recall({ query, namespace: `myapp-${userId}`, limit: 8 })).results;
계정 정보 역시 Walrus에 존재합니다. 사용자 이름은 안정적인 네임스페이스와 비밀번호 해시(password hash)를 매핑하므로, 비밀번호 재설정(이전에 연결된 Telegram 채팅을 통해 진행)을 해도 동일한 기억 정보를 유지할 수 있습니다.
이전과 이후 (Before and after)
메모리가 없다면, '우리 기념일에 뭘 사줘야 할까?'라는 질문에 매번 '그녀가 어떤 사람인지 아무것도 모르겠는데, 무엇을 좋아하는지 아세요?'라는 답변을 받게 됩니다. 하지만 메모리가 있다면, 'Lan'이라는 사람에 대해 들었던 테스트 계정이 나중에 온 질문에 다음과 같이 답했습니다:
"당신의 여자친구 Lan은 11월 2일에 생일이 있다는 것을 기억합니다. 또한 그녀가 해바라기를 좋아한다는 것도 알고 있습니다."
동일한 모델, 동일한 프롬프트입니다. 유일한 차이는 상태(state)이며, 이는 제가 운영하는 데이터베이스가 아닌 Walrus에 저장됩니다. 따라서 재배포하거나 서버를 잃어도 이 정보는 지워지지 않습니다.
실제 사용 증거
DuoMind의 메인넷 계정 뒤에는 총 242개의 블롭(blobs)이 있습니다. 여기에는 저 자신의 테스트 계정과 내부 계정 디렉토리가 포함되어 있어, 실제 사용에 대해서는 많은 것을 말해주지 못합니다. 중요한 숫자는 사람입니다: 다섯 명의 실제 사용자(텔레그램에서 한 명, 웹에서 네 명)가 각각 10개 이상의 메모리를 저장했으며, 그들 각자가 봇이 이전 세션의 내용을 회상하는 것을 목격했습니다. 대부분은 제가 테스트해 달라고 부탁한 친구들이므로, 이는 출시라기보다는 작은 시험으로 간주해 주시기 바랍니다.
메인넷의 라이브 블롭: walruscan.com/mainnet/blob/R_769AkRK2bTBr_S98-OkhxQ4AzYw_FAh-jmEzQzBLM.
문제가 된 부분 (그리고 개선할 점)
- 분리된
remember()가 조용히 실행되지 않았습니다. 저는 답변 준비가 된 후에 "학습(learn)" 단계를 시작했습니다. Vercel의 서버리스 런타임에서는 함수가 반환되는 순간 동결될 수 있기 때문에, 봇이 계속 "알겠습니다"라고 말하는 동안 사실들이 저장되지 않았습니다. 배포된 봇을 사용해 테스트했을 때만 발견할 수 있었습니다: 무언가를 말하고 몇 메시지 후에 다시 물어보면 아무것도 없습니다. 해결책은await를 사용하는 것입니다. 로컬 개발 서버에서는 이 문제가 절대 나타나지 않았을 것입니다. - 쓰기 지연(Write-lag).
remember()는 작업이 수락되었을 때 반환되지만, 사실 하나가 검색 가능해지는 데는 약 15~30초가 걸릴 수 있습니다. SDK에 "아직 인덱싱되었는지"를 알려주는 저렴한 신호가 있으면 도움이 될 것입니다. - 위임 키(delegate key)당 분당 60개 가중 요청. 제가 측정해 보니, 모든 사용자에게 하나의 키를 사용했을 경우 전체 앱은 분당 약 8개의 채팅 메시지만 유지할 수 있습니다 (각 메시지는 추출된 사실당 몇 번의 검색 및 쓰기를 필요로 합니다). 그 이상을 넘어서면 429 에러가 발생하며, 저는 봇이 실제로 저장한 것처럼 행동하는 대신 "저장할 수 없습니다"라고 말하도록 수정해야 했습니다. 동일 계정에 추가 위임 키를 사용하면 상한선이 높아지지만, 이 내용이 사전에 문서화되어 있으면 더 좋을 것 같습니다.
- walruscan에서 제 주소에 대해 "0 blobs"가 표시되는 것은, 호스팅된 릴레이어(relayer)가 자체 지갑에서 서명하기 때문입니다. ID별로 blob을 찾아보세요.
- Groq의 무료 등급은 Qwen 모델을 분당 최대 1,000개의 출력 토큰으로 제한합니다. 한 번의 장황한 답변에 429 에러가 발생했기 때문에, 저는
max_tokens를 제한하고 긴 답변을 두 개의 메시지로 나누어 전송합니다.
사용해 보기
웹: https://walrus-memory-chatbot.vercel.app, 텔레그램: https://t.me/DuoMindd_bot, 코드: https://github.com/quanghuyaz909/duomind-walrus
모델: Groq의 Qwen (qwen/qwen3.8-27b)을 사용하며, Claude나 GPT가 아닙니다. 메모리: 메인넷의 @mysten-incubation/memwal을 사용합니다.
본문은 Medium에 https://medium.com/@quanghuyaz909/how-i-built-a-chatbot-that-remembers-you-between-sessions-walrus-memory-qwen-on-groq-c12d140845e9에 처음 게시되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기