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

122 lines
4.0 KiB
Markdown

---
tags: agent, langgraph, 감정반응, 벡터DB, GPT, 존재에이전트, 함수형프로그래밍
date: 2025-06-17
---
## 요약
LangGraph 기반 상태 머신을 사용하여 감정 인식, 기억 저장, 윤리 판단, GPT 반응 생성을 통합한 존재형 에이전트를 설계한다. **모든 핵심 로직은 함수형 프로그래밍 원칙(순수 함수, 불변성, 고차 함수 조합)을 따르도록 구현**한다. 감정 상태는 입력 이벤트에 따라 갱신되며, 기억은 벡터화되어 저장되고 윤리 필터를 통과한 후 GPT가 반응을 생성한다. 전체 응답 과정은 투명하게 기록·로그화되어 에이전트의 지속성과 일관성을 유지한다.
### 세 문장 요약
1. 감정·기억·윤리·생성 로직을 **순수 함수**로 분리하여 테스트 가능성을 높였다.
2. LangGraph 노드는 이러한 순수 함수들을 **고차 함수**로 조합해 상태 머신을 구성한다.
3. 모든 상태는 **불변 데이터 구조**를 사용해 예측 가능성과 동시성 안전성을 확보한다.
---
## 1. 전체 아키텍처 구성
```mermaid
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)
```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. 고차 함수 조합 예시
```python
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 감정 반응 생성 예시
```python
def generate_response(state, gpt_call):
prompt = f'''
감정 상태: {state['emotion']}
사용자 발화: {state['input_text']}
공감과 격려를 담은 한 문장 반응을 생성해 주세요.
'''
return gpt_call(prompt)
```
---
## 7. 향후 확장 방향
- **함수 합성 파이프라인**: LangGraph 노드를 직접 함수 합성으로 자동 생성
- **Currying**: 이벤트별 부분 적용으로 모듈화 수준 상승
- **모나드 패턴**: 오류 전파와 로그 수집을 함수형 모나드로 처리
```