Skip to content

[Week2] 그래프에 short-term memory 추가#8

Open
qlqlrh wants to merge 7 commits into
mainfrom
qlqlrh/week2-state-memory
Open

[Week2] 그래프에 short-term memory 추가#8
qlqlrh wants to merge 7 commits into
mainfrom
qlqlrh/week2-state-memory

Conversation

@qlqlrh
Copy link
Copy Markdown
Collaborator

@qlqlrh qlqlrh commented May 17, 2026

도메인 & 이번 주 구현 목표

  • 1주차의 YouTube 학습 도메인에서 보험으로 도메인 변경 !!
  • 보험 상담은 사용자가 직전 발화에서 알려준 조건(나이대·가족력·관심 보장)을 계속 이어 받아야 답변 품질이 유지되는 도메인
  • 또 보장·면책처럼 민감한 정보를 외부에서 끌어오기 전, 도구 호출 직전에 사람이 한 번 더 검토할 수 있어야 함

Week 2 목표

  • 1주차 ReAct 그래프(agent ⇄ tools)를 그대로 가져오면서, compile()에 두 줄만 추가해 stateful 시스템으로 전환
    • checkpointer=InMemorySaver()thread_id별 대화 분리·복원
    • interrupt_before=["tools"] → 보험 도구 호출 직전 사용자 검토
  • 도메인을 YouTube → 보험 상담으로 교체하되, 그래프 골격은 동일하게 유지

구현 요약

파일 구조

assignments/qlqlrh/week2/
├── schema.py          # 응답 스키마 (Product/Rider/Coverage + ConsultationResponse)
├── tools.py           # 보험 도메인 도구 3종 (LLM 호출 기반)
├── graph.py           # 1주차 ReAct + checkpointer + interrupt_before
├── run.ipynb          # thread 분리·맥락 누적·HITL 시연 노트북
└── graph.png          # 그래프 시각화 (tools 노드 앞에 __interrupt=before 표시)

그래프 시각화

graph

agent ⇄ tools ReAct 루프는 1주차와 동일.

Tool 3종 (도메인 교체분)

도구 입력 출력
lookup_product 상품명 상품 개요 + 주요 보장 항목
lookup_rider 특약명 보장 내용 + 면책 사항 + 갱신 여부
summarize_coverage 상품명 + 사용자 관심사 리스트 관심사에 맞춰 정리한 보장 요약 + 관련 특약 이름
  • 모두 with_structured_output(method="json_schema", strict=True) 로 반환 스키마 강제

실행 제어 패턴

4가지 옵션(streaming · interrupt · branching · subgraph) 중 interrupt 선택.
왜냐하면, 보험 도메인은 "민감한 외부 정보 조회 전 사용자 검토" 가 자연스럽다고 생각함

agent (도구 호출 결정)
   ↓
⏸  interrupt_before=["tools"] 발동
   ↓
graph.get_state(cfg) 로 현재 state 확인
   ↓
graph.stream(None, cfg) 로 같은 thread 이어서 실행
   ↓
tools 실행 → 결과 ToolMessage 로 누적
   ↓
agent (최종 응답 생성, structured output)

시나리오 결과 요약

① 같은 thread (alice-001) — 맥락 누적 (4턴, 맥락 의존 질문 3개+)

turn 질문 맥락 활용
1 "저는 30대 직장인이고 가족력이 있어요. 어떤 보험을 우선 살펴봐야 할까요?" (초기 프로필 입력)
2 "방금 말한 조건에서 암보험은 어떤가요?" "방금 말한 조건" 을 30대 + 가족력 으로 해석해 답변
3 "그 암보험에 어떤 특약을 붙이는 게 좋을까요?" turn 2 에서 다룬 암보험 + 사용자 프로필을 둘 다 끌어옴
4 "제 또래에서 가장 주의해야 할 면책 사항은 무엇인가요?" 질문에 "30대" 가 안 적혀 있어도 turn 1 의 "30대" 를 잡아 4개 암 특약(암 진단비, 재진단암, 항암치료, 암 수술비)을 병렬 lookup_rider 로 한 번에 호출 후 통합 답변

turn 4 는 도구 호출이 4번이지만 한 superstep 으로 묶여서 interrupt 도 한 번만 발동.

② 다른 thread (bob-001) — 격리 확인

alice-001 과 똑같은 맥락 의존 질문("방금 말한 조건에서 암보험은 어떤가요?")을 던졌을 때

"방금 말한 조건을 제가 확인할 수 없어서, 암보험이 어떤지 바로 판단하긴 어려워요. 나이, 성별, 가입 목적(진단비 중심/치료비 중심), 현재 가입한 보험 여부를 알려주시면 그 조건에 맞춰 비교해서 말씀드릴게요."

  • kind="chat", 도구 호출 0회
  • SystemPrompt 에 추가한 [중요 - 맥락 참조 규칙] 이, 모델이 모호한 참조에서 임의로 추정하지 않고 되묻도록 강제

get_state_history — checkpointer 가 thread 별로 따로 쌓는지

스냅샷 개수 누적 메시지 수
alice-001 24 23
bob-001 3 2

막힌 점 / 다음 주 개선할 점

  1. OpenAI function calling 모드의 structured output 이 가끔 JSON 뒤에 trailing characters 가 붙어 Pydantic 파싱이 실패했었음. method="json_schema", strict=True 로 전환해 해결!
  2. 도구가 LLM 의 사전 지식만으로 답하므로 답변의 사실성을 보장하기 어렵습니다. 3주차에 RAG를 적용하면서 답변 품질 및 정확성을 올려보고 싶습니당

@qlqlrh qlqlrh requested a review from myeolinmalchi May 17, 2026 17:50
@qlqlrh qlqlrh self-assigned this May 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant