레시피

흔한 use case를 위한 구체적 패턴. 각 레시피는 전체 흐름을 보여줍니다 — 정책 한 번 설정 → 매 턴 add+search 루프. 응답 생성은 당신의 LLM 플러그인.

라이브 데모

이 시나리오들을 Playground에서 시도해보세요 — 공개 뷰어에 각 레시피가 미리 연결되어 있어 1 클릭으로 대화 가능합니다.

1. AI 튜터 — 학생 학습 누적

각 학생의 마스터한 스킬·약한 부분·학습 선호·목표를 추적하여 다음 세션이 개인화되게 합니다.

from memgen import MemgenClient
import openai

memgen = MemgenClient(api_key="mg-...")

memgen.project.update(
    project_id="<project-id>",
    extraction_policy=(
        "Extract learning context: skill_mastered, skill_struggling, "
        "preference (visual/audio/pace), goal (with deadline). Skip grades and PII."
    ),
    label_taxonomy=[
        {"skill_mastered": "Topics student understands"},
        {"skill_struggling": "Topics student finds hard"},
        {"preference": "How they like to learn"},
        {"goal": "Learning target with deadline"},
    ],
)

def tutor_reply(student_id: str, question: str) -> str:
    ctx = memgen.search(query=question, user_id=student_id, top_k=5)
    notes = "\n".join(f"- {m['memory']}" for m in ctx.results)
    answer = openai.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system",
             "content": f"You are a tutor.\nWhat we know about this student:\n{notes}"},
            {"role": "user", "content": question},
        ],
    ).choices[0].message.content
    memgen.add(messages=[
        {"role": "user", "content": question},
        {"role": "assistant", "content": answer},
    ], user_id=student_id)
    return answer

2. 고객 지원 — 시간을 가로지르는 티켓 연결

각 티켓은 run_id. 고객은 영속 user_id. 과거 티켓 정보가 자동으로 컨텍스트로 떠오릅니다.

memgen.project.update(
    project_id="<project-id>",
    extraction_policy=(
        "Extract: product_issue (with SKU), resolution, customer preferences, "
        "unresolved dissatisfaction. Skip payment cards."
    ),
    label_taxonomy=[
        {"product_issue": "Defect or complaint"},
        {"resolution": "How resolved"},
        {"preference": "Customer preference"},
        {"dissatisfaction": "Unresolved complaint"},
    ],
)

def handle_ticket(customer_id: str, ticket_id: str, message: str) -> str:
    history = memgen.search(query=message, user_id=customer_id, top_k=10)
    response = my_llm.reply(message, context=history.results)
    memgen.add(
        messages=[
            {"role": "user", "content": message},
            {"role": "assistant", "content": response},
        ],
        user_id=customer_id,
        run_id=ticket_id,
        metadata={"channel": "email"},
    )
    return response

3. 회의록 — 결정·액션 아이템 자동 추출

transcript를 넣으면 카테고리화된 결정·액션(담당자 포함)·미해결 질문·리스크가 돌아옵니다.

memgen.project.update(
    project_id="<project-id>",
    extraction_policy=(
        "Extract meeting outcomes: decision (with owner), "
        "action_item (with assignee + deadline), open_question, risk."
    ),
    label_taxonomy=[
        {"decision": "Concrete decisions"},
        {"action_item": "Tasks with owner"},
        {"open_question": "Unresolved follow-ups"},
        {"risk": "Concerns raised"},
    ],
)

def ingest_meeting(meeting_id: str, transcript: str, attendees: list[str]):
    memgen.add(
        messages=[{"role": "user", "content": transcript}],
        run_id=meeting_id,
        agent_id="meeting_recorder",
        metadata={"attendees": attendees, "date": "2026-05-03"},
    )

def my_action_items(person: str):
    return memgen.search(
        query=f"action items for {person}",
        agent_id="meeting_recorder",
        top_k=20,
    )

4. LangChain 에이전트 도구

memgen을 에이전트가 자율 호출할 수 있는 두 도구로 노출: remember_factrecall_facts.

from langchain.tools import StructuredTool
from memgen import MemgenClient

memgen = MemgenClient(api_key="mg-...")

def remember(content: str, user_id: str = "default") -> str:
    memgen.add(messages=[{"role": "user", "content": content}], user_id=user_id)
    return "stored"

def recall(query: str, user_id: str = "default") -> list[str]:
    hits = memgen.search(query=query, user_id=user_id, top_k=5)
    return [m["memory"] for m in hits.results]

tools = [
    StructuredTool.from_function(remember, name="remember_fact",
        description="Store a fact about the user for later recall."),
    StructuredTool.from_function(recall, name="recall_facts",
        description="Retrieve facts about the user matching a query."),
]

5. 모더레이션·검증을 위한 sync extract

저장 전에 무엇이 저장될지 검사가 필요할 때.

r = memgen.extract(
    messages=[{"role": "user", "content": user_input}],
    user_id="alice",
    store=False,
)

if r.importance >= 2 and "payment" not in r.tags:
    memgen.add(messages=[{"role":"user","content": user_input}], user_id="alice")

더 많은 예시를 원하시나요?

위 패턴은 모두 repo의 examples/python/ 에 실행 가능 스크립트로 있습니다.