122 lines
4.0 KiB
Markdown
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**: 이벤트별 부분 적용으로 모듈화 수준 상승
|
|
- **모나드 패턴**: 오류 전파와 로그 수집을 함수형 모나드로 처리
|
|
|
|
``` |