DOCS/docs/guide/functional-programing/함수형프로그래밍과 디티털로빙.md
hwangsae91 31979ecc5c test repo -> docs repo
일부 가이드 및 개요 설명은 별도의 repo에 기록
2025-07-01 23:46:38 +09:00

4.0 KiB

tags, date
tags date
agent, langgraph, 감정반응, 벡터DB, GPT, 존재에이전트, 함수형프로그래밍 2025-06-17

요약

LangGraph 기반 상태 머신을 사용하여 감정 인식, 기억 저장, 윤리 판단, GPT 반응 생성을 통합한 존재형 에이전트를 설계한다. 모든 핵심 로직은 함수형 프로그래밍 원칙(순수 함수, 불변성, 고차 함수 조합)을 따르도록 구현한다. 감정 상태는 입력 이벤트에 따라 갱신되며, 기억은 벡터화되어 저장되고 윤리 필터를 통과한 후 GPT가 반응을 생성한다. 전체 응답 과정은 투명하게 기록·로그화되어 에이전트의 지속성과 일관성을 유지한다.

세 문장 요약

  1. 감정·기억·윤리·생성 로직을 순수 함수로 분리하여 테스트 가능성을 높였다.
  2. LangGraph 노드는 이러한 순수 함수들을 고차 함수로 조합해 상태 머신을 구성한다.
  3. 모든 상태는 불변 데이터 구조를 사용해 예측 가능성과 동시성 안전성을 확보한다.

1. 전체 아키텍처 구성

graph TD
  A[사용자 입력] --> B(EmotionNode)
  B --> C(MemoryNode)
  C --> D(EthicsNode)
  D --> E(GenerateResponse)
  E --> F(LoggerNode)

2. LangGraph 워크플로우 노드 설계

노드 이름 기능 설명 함수형 특징
EmotionNode 감정 상태 갱신 순수 함수
MemoryNode 입력 기억 벡터화 및 저장 순수 함수 + 불변성
EthicsNode 민감 응답 사전 필터링 순수 함수
GenerateResponse GPT를 통한 반응 생성 고차 함수(프롬프트 합성)
LoggerNode 전체 상태 및 로그 기록 불변 상태 사본 기록

3. 순수 함수 예시 (Python)

from copy import deepcopy

def emotion_engine(emotion, event):
    delta = {'joy': 0, 'stress': 0}
    if '칭찬' in event['text']:
        delta['joy'] += 10
    if '긴급' in event['text']:
        delta['stress'] += 15
    # 순수 함수: 입력 외부 상태 변경 없음
    return {
        'joy': emotion['joy'] + delta['joy'],
        'stress': emotion['stress'] + delta['stress']
    }

def memory_engine(memory, event):
    new_entry = {
        'timestamp': event['timestamp'],
        'content': event['text']
    }
    # 불변성: 기존 리스트 복사 후 새 요소 추가
    return memory + [new_entry]

4. 고차 함수 조합 예시

def update_state(pure_funcs):
    """
    고차 함수: (emotion_fn, memory_fn, ethics_fn) 튜플을 받아
    새로운 상태 계산 함수를 반환한다.
    """
    emotion_fn, memory_fn, ethics_fn = pure_funcs

    def _update(current_state, event):
        new_state = deepcopy(current_state)
        new_state['emotion'] = emotion_fn(current_state['emotion'], event)
        new_state['memory']  = memory_fn(current_state['memory'], event)
        new_state['ethics']  = ethics_fn(current_state['ethics'], event)
        return new_state

    return _update

5. 불변 데이터 구조 채택 이유

  1. 예측 가능성: 동일 입력 → 동일 출력 보장
  2. 디버깅 용이: 상태 스냅샷 비교만으로 오류 원인 추적
  3. 동시성 안전성: 공유 상태 경쟁 조건 제거

6. GPT 감정 반응 생성 예시

def generate_response(state, gpt_call):
    prompt = f'''
감정 상태: {state['emotion']}
사용자 발화: {state['input_text']}

공감과 격려를 담은 한 문장 반응을 생성해 주세요.
'''
    return gpt_call(prompt)

7. 향후 확장 방향

  • 함수 합성 파이프라인: LangGraph 노드를 직접 함수 합성으로 자동 생성
  • Currying: 이벤트별 부분 적용으로 모듈화 수준 상승
  • 모나드 패턴: 오류 전파와 로그 수집을 함수형 모나드로 처리