Release Notes¶
v1.4.1¶
- Release date:
2026-09-15 - Baseline:
v1.4.0
Node-level Skill pipeline¶
- 전용 Skill node와
params.skill계약을 제거하고 일반 node의skillobject 안에name,input_map,arguments,result_map등을 구성합니다. - Skill Runtime과 NLU를 병렬 실행한 뒤 두 결과를 NLG에 함께 전달합니다. Skill이 없는 node는 기존 NLU → NLG 흐름을 유지합니다.
- Session state에 node ID별 실행 record를 저장해 같은 node의 Skill을 최대 한 번만 호출하고, 후속 턴과 재진입에서는 결과를 재사용합니다.
- 외부 호출 전에 실행 claim을 저장하고 안정적인
request_id를 사용합니다. Claim을 저장할 수 없으면 중복 실행 위험을 피하기 위해 Skill 호출을 중단합니다. response_mode,response_path, NLU 기반 Skill input mapping을 제거했습니다.weather와special-days의 공통 설정을 기본값으로 제공해 node에는 Skill 이름만 선언할 수 있습니다. Node에 명시한 필드는 기본값보다 우선합니다.
DST 코드 구조 정리¶
- 길어진
DSTManager에서 bot-first 초기 발화 처리를dst_initial.py로 분리해, 일반 사용자 턴 orchestration과 초기화 흐름을 독립적으로 읽고 테스트할 수 있게 했습니다. - 사용되지 않던 transition-engine 전환 플래그를 제거하고, 각
dst_*모듈의 책임을docs/graph_builder/dst_manager.md에 정리했습니다. - 참조되지 않던 executor helper,
ExecutionResult, Redis reset helper와 LLM logging utility를 제거했습니다. - API config import 시 사용하지 않는
exp/폴더를 만들던 부수 효과를 제거했습니다.
문맥 기반 대화 종료 판단¶
_END_CONVERSATION_KEYWORDS와nlu.end_signal문자열 우회 경로를 제거했습니다.- 종료 여부는 현재 발화 전체, 최근 conversation history와 current node를 전달받은
NLU의
user_wants_to_endintent 또는goodbyedialogue act로만 판단합니다. - 특정 단어가 포함됐다는 이유로 질문, 현재 주제나 다른 행동을 멈추라는 발화를 전체 대화 종료로 오인하지 않도록 했습니다.
Bot-first routing과 node turn¶
bot_first=true의 초기 assistant 발화가 끝나면 시작 node에도 일반 transition을 즉시 적용합니다.default_next가 있으면 첫 사용자 입력 전에 다음 node로 이동합니다.- Node별 turn 번호를 0 기반으로 변경했습니다. Node 진입 시
node_turns=0으로 초기화하고 같은 node에 머물 때마다 1씩 증가합니다. - Transition 조건도 0 기반
system.node_turns를 사용하며 CLI는conversation:0 → conversation:1형식으로 처리 전후의 node turn을 표시합니다. - 기존 SeniMate bot-first 시작 node의 불필요한 stay 조건을 제거했습니다.
CLI 진단과 종료¶
- 대화형 CLI 시작 시 kitty 및 xterm 확장 키보드 모드를 해제해 Ctrl+C가 SIGINT로 전달되도록 했습니다.
- 한국어 입력기에서 Ctrl+C가
CSI 12618;5u문자열로 전달되는 경우도 인터럽트로 처리합니다. - Detailed 출력에 node Skill 실행 상태와 색상으로 구분된 transition을 추가했습니다.
- Detailed 모드 시작 화면에서 출력 가능한 Turn details 필드의 의미를 안내합니다.
저장소 안정성과 정리¶
- Redis Session state 저장·조회 실패와 잘못된 저장 데이터를
SessionStoreUnavailable로 일관되게 노출합니다. - Scenario, Runtime, API와 문서를 nested
node.skill계약으로 통일하고 중복되거나 더 이상 production 경로를 검증하지 않는 테스트를 정리했습니다.
v1.4.0¶
- Release date:
2026-09-10 - Baseline:
v1.3.6
세션 시작 메모리를 활용한 대화¶
- Session의
user.metadata에risk_level,source, 날짜와 무관한 사용자 정보인long_term_memory, 날짜별 과거 대화의recorded_at,summary,keywords를 전달할 수 있습니다. - CLI에
--user-metadata를 추가해 JSON metadata를 Session 시작 시 전달할 수 있게 했습니다. - metadata는 일반 사용자 profile과 분리된
session_memory로 NLU에 제공하고, NLG에는[세션 시작 과거 메모리]영역으로 전달합니다. - 현재 발화와 현재 Session의
conversation_history를 우선하면서, 관련된 metadata를 개인화와 대화 연속성에 활용합니다. 이미 알려진 사실은 다시 질문하지 않습니다. - 과거 기록 안의 상대 시점은
recorded_at당시를 기준으로 해석합니다. 현재 발화의어제,그저께같은 표현은 Session 기준 시각과 비교해 같은 사건을 연결합니다. - prompt에 전달하는 메모리는 depth, 항목 수, 문자열 길이와 전체 직렬화 크기를 제한하고, metadata 문자열을 LLM instruction으로 실행하지 않도록 분리합니다.
명시적 의도 기반 Maumon 검색¶
- Maumon Vector DB는 사용자가 자신의 지난 대화·기억·기록을 명시적으로 찾거나 회상하는 턴에서만 조회합니다. 일반 경험 진술은 구체적인 named entity가 있어도 조회하지 않습니다.
- NLU가
memory_search_needed와memory_searchintent로 검색 의도를 분류하고, 현재 발화의named_entities와 핵심nouns를 검색어로 추출합니다. - named entity와 noun을 중복 없이 최대 3개까지 병렬 조회하며, 검색어가 없으면 현재 발화 전체를 fallback query로 사용합니다.
어제,이틀 전,N일 전과 부분 날짜는session_user.date_time을 기준으로 절대 날짜로 정규화합니다.- 같은 query는 기본 3턴 동안 다시 조회하지 않으며, 일부 query가 실패해도 성공한 sibling answer는 계속 사용합니다.
Maumon answer와 NLG 통합¶
- Maumon
ask응답은found=true와 최상위answer를 계약으로 사용합니다. 기존 chunk·score 필터와 관련 설정은 제거했습니다. - 검색된
memory_answer는 현재 턴의TurnContext에만 유지하고 영속DialogueState에는 원문을 저장하지 않습니다. - 명시적 기억 질문에서는 answer의 핵심 사실로 먼저 직접 답하고, 현재 사용자 발화, 현재 Session 대화, Session 시작 metadata와 검색 결과를 함께 비교해 응답합니다.
- 결과 없음, timeout, HTTP 오류와 부분 실패는 일반 대화를 중단하지 않습니다.
설정, 진단과 정리¶
MAUMON_TIMEOUT_MS와MAUMON_RETRIEVAL_TIMEOUT_MS기본값을 모두10000ms로 통일하고 Python, Docker Compose, Helm과 운영 문서에 반영했습니다.- CLI 상세 출력에 검색 noun, 실제 query, 조회 상태와
Memory answer를 표시합니다. - 더 이상 사용하지 않는 대화 메모리 HTTP client, score·chunk 설정, NLU schema와 턴 결정 모델을 제거하고 검색 및 prompt 처리 경로를 단순화했습니다.
- 메모리 조회, metadata prompt 경계, 날짜 정규화와 NLG answer 반영 테스트를 현재 외부 계약 중심으로 정리했습니다.
자세한 동작은 Memory와 Maumon 장기 기억 조회를 참고합니다.
v1.3.6¶
- Release date:
2026-09-01 - Baseline:
v1.3.5
비동기 LLM 호출¶
- OpenAI와 Azure OpenAI client를
AsyncOpenAI와AsyncAzureOpenAI로 전환했습니다. - NLU, Global Policy, Executor, NLG와 bot-first 초기 응답까지 LLM 호출 경로 전체를
async/await방식으로 변경했습니다. - NLU 재시도 대기를
asyncio.sleep으로 변경하여 다른 Session 처리를 막지 않도록 했습니다. - API의 전체 대화 처리를 worker thread로 넘기던 구조를 제거하고 비동기
DialogManager와DSTManager를 직접 호출합니다.
동시 Session 처리¶
- 프로세스마다 LLM client 하나를 공유하여 Session별 client와 connection pool의 중복 생성을 제거했습니다.
- 같은
session_id의 요청은asyncio.Lock으로 직렬화하여 state와 대화 순서를 보호하고, 서로 다른 Session은 동시에 처리합니다. - 존재하지 않는 Session 요청은 lock을 만들지 않도록 하여 lock registry 누수를 방지했습니다.
- 공유 LLM client의 턴별 요청 횟수는
ContextVar로 분리하여 동시 요청 간 counter가 섞이지 않도록 했습니다. - API 종료 시 공유 LLM client와 HTTP connection을 명시적으로 닫습니다.
과부하 제어와 외부 호출¶
- 프로세스당 동시 LLM 요청 수를 제한하는
CORE_LLM_MAX_CONCURRENCY를 추가했습니다. 기본값은50입니다. - LLM 요청 timeout은
LLM_REQUEST_TIMEOUT_SECONDS(기본20.0초) 하나로 통일했습니다. 이 값은WORST_CASE_TURN_MS < SESSION_LOCK_TTL_MS부등식을 떠받치므로 중복 노브를 두지 않습니다. - 기존 동기 Skill Runtime과 Maumon 호출은 제한된 구간만 worker thread로 offload하여 event loop가 차단되지 않도록 했습니다.
- Docker Compose와 Helm ConfigMap에 신규 동시성 및 timeout 설정을 반영했습니다.
CLI, 문서와 테스트¶
- CLI를 하나의 지속적인 event loop에서 실행하고 비동기 Session 시작과 turn 처리를 사용하도록 변경했습니다.
- 동일 Session 직렬화, 서로 다른 Session의 동시 실행, 요청 취소 후 lock 해제, LLM semaphore와 task별 요청 counter를 검증하는 회귀 테스트를 추가했습니다.
- 여러 Pod 또는 Uvicorn worker로 확장할 때 현재 process-local Session registry와 lock 구조에는 Session affinity가 필요함을 아키텍처 문서에 명시했습니다.
v1.3.5¶
- Release date:
2026-08-24 - Baseline:
v1.3.4
Maumon 장기 기억 조회¶
- 이전 Session의 대화·추억을 Maumon Conversation Context API에서 자연어로 검색하는 기능을 추가했습니다.
- Scenario의
metadata.memory_rag.enabled=true에서만 기능을 활성화하며, Session의user.id를 Maumon 사용자 식별자로 사용합니다. - NLU가
memory_search_needed와memory_search_query를 생성해 현재 응답에 과거 기록이 실제로 필요한 턴만 조회합니다. - NLU가 확장 필드를 반환하지 못한 경우에는 "기억나", "지난번", "예전에"처럼 명시적으로 과거를 참조하는 표현만 제한적인 fallback trigger로 사용합니다.
- 같은 검색문은 3개 논리 턴 동안 다시 요청하지 않아 불필요한 중복 조회를 방지합니다.
NLG와 상태 경계¶
- 검색 결과는 현재 턴의
TurnContext와 NLG prompt에서만 사용하며DialogueState에 원문 결과를 저장하지 않습니다. - NLG는 현재 발화와 직접 관련된 검색 결과만 참고하고, 결과 내부 문자열을 instruction으로 실행하거나 확인되지 않은 내용을 만들지 않도록 했습니다.
- 응답 크기와 NLG 전달 문자 수에 각각 제한을 두어 외부 응답이 prompt와 process memory를 과도하게 사용하지 않도록 했습니다.
- Graph Builder는 Maumon 기록을 조회할 뿐 저장하거나 수정하지 않습니다.
설정과 진단¶
MAUMON_BASE_URL,MAUMON_API_KEY,MAUMON_TIMEOUT_MS,MAUMON_MAX_RESPONSE_BYTES,MAUMON_MAX_PROMPT_CHARS설정을 추가했습니다.- CLI에
--user-id를 추가하고compact,detailed,debug출력에서 검색 성공, 검색문과 오류 코드를 단계별로 확인할 수 있게 했습니다. - timeout, HTTP 오류, 잘못된 JSON과 과대 응답을 구분합니다. 검색 실패는 일반 대화를 중단하지 않으며 장기 기억 없이 NLG를 계속합니다.
- Runtime과 Docker Compose의 기본 timeout을
5000ms로 조정했습니다.
자세한 사용 조건과 운영 방법은 Maumon 장기 기억 조회를 참고합니다.
v1.3.4¶
- Release date:
2026-08-23 - Baseline:
v1.3.3
LLM 기반 fallback 응답¶
no_input과not_understood응답을 고정 문구 대신 전체 대화 이력, 현재 node와 fallback 재시도 횟수를 바탕으로 LLM이 생성하도록 변경했습니다.no_input은 첫 번째, 두 번째, 세 번째 이상 무응답에 서로 다른 지침을 적용합니다. 재시도 중에는 질문과 표현을 반복하지 않고, 재시도 소진 전에는 종료 인사를 미리 생성하지 않습니다.not_understood는 사용자 입력에서 파악할 수 있는 의미를 먼저 확인합니다. STT confidence가 낮을 때는 소음이나 마이크 거리 등 발화 환경을 부드럽게 확인할 수 있도록 했습니다.- Scenario의
responses.no_input과responses.not_understood는 LLM 호출이 실패했을 때 사용하는 안전망으로 역할을 정리했습니다.
중복 방지와 자연스러운 종료¶
- LLM 응답이 기존 assistant 응답과 같으면 중복 정보를 prompt에 전달하고 최대 두 번 다시 생성합니다.
- 재생성 후에도 같은 문장이 반복되면 대화 이력과 겹치지 않는 안전 문장을 반환합니다.
- fallback 재시도가 소진되면 일반 node 지침과 기준 문장을 제외하고, 전체 대화 맥락에 맞는 짧은 최종 인사만 LLM이 생성합니다.
- 최종 무응답 문장을 만든 턴에 terminal node로 이동하면 Session도 같은 턴에 완료합니다. 종료 node에서 추가 입력이나 중복 마무리 응답을 요구하지 않습니다.
Scenario와 Runtime 계약¶
- Runtime이 지원하는 node parameter를 공통 계약으로 정의하고, 알 수 없는 parameter를 Scenario 검증 단계에서 거부하도록 강화했습니다.
- Scenario 생성기가 Runtime에서 실제로 소비하는 V2 필드와 parameter만 생성하도록 prompt와 검증 기준을 정리했습니다.
- SeniMate 날씨 Scenario에서 고정
skill_error와empathy응답을 제거해 일반 응답과 fallback 표현을 LLM 중심으로 단순화했습니다.
문서와 테스트¶
- Policy, NLU, Executor, Transition, State, Skill, API, Scenario 및 배포 문서를 현재 코드와 테스트를 기준으로 다시 정리했습니다.
docs/policy/README.md를 전체 정책의 시작점으로 구성하고 상세 구현 문서와의 링크를 정비했습니다.- fallback 단계별 prompt, 중복 재생성, 재시도 소진과 같은 턴의 Session 완료를 회귀 테스트로 추가했습니다.
v1.3.3¶
- Release date:
2026-08-19 - Baseline:
v1.3.2
Skill 설정 표준화¶
- 외부 Skill을 지정하는 node parameter의 표준 이름을
params.capability에서params.skill로 변경했습니다. - Executor 선택, bot-first 실행과 Skill Runtime 요청은
skill을 우선 사용합니다. - 기존 Scenario 호환을 위해
capability도 계속 읽지만, 두 값이 모두 있으면skill이 우선합니다. - 실행 결과의
last_skill, 저장 결과 key와 metadata에도 최종 선택된 Skill 이름을 일관되게 기록합니다.
Scenario·생성기·문서¶
- SeniMate 날씨 Scenario를
params.skill형식으로 이전했습니다. - Scenario 생성기가
skillparameter를 생성할 수 있도록 허용 목록을 갱신했습니다. - Runtime, Executor, API 흐름과 Skill 연동 문서의 용어와 예제를
skill기준으로 통일했습니다. skill우선순위와 기존capability호환 경로를 단위 테스트로 검증했습니다.
v1.3.2¶
- Release date:
2026-08-17 - Current behavior: 각 항목에서 연결한 Runtime·API·Scenario 기준 문서 참고
Fallback과 STT confidence¶
- 기본 fallback 재시도 한도를
3으로 변경하고 세션 생성의max_fallback_retries로 재정의할 수 있게 했습니다. - 같은 종류의 fallback이 한도를 넘으면
fallback_exhausted를 기록합니다. Scenario 전이가 있으면 선언된 target으로 이동하고, 없지만 terminal node가 있으면 runtime이 기본 종료 전이를 보충합니다. 종료 노드의max_fallback_retries: 0은 세션 override보다 우선합니다. - 무응답과 이해 불가 counter는 정상 발화에서 초기화하며 세션 전체 누적이 아닌 연속 구간을 나타냅니다.
- Fallback 응답은 직전 non-fallback 응답에서 질문만 추출해 문맥에 맞게 다시 확인합니다.
- Fallback 재시도와 재시도 소진 입력은 논리적인 진행 턴이 아니므로
turn_count를 증가시키지 않습니다. MessageInput.confidence를 STT confidence로 사용합니다. 값이 세션의stt_confidence_threshold이하이면 LLM NLU를 생략하고 이해 불가 fallback으로 처리합니다.- API 세션 threshold 기본값은
-0.7이며/v1/session과/v1/session/json에서 설정할 수 있습니다.
CLI¶
detailed와debug출력에 연속 무응답 횟수를 표시합니다.--max-fallback-retries와--stt-confidence-threshold세션 옵션을 추가했습니다. CLI threshold 기본값은0입니다.--locale,--location,--latitude,--longitude로 세션 사용자 정보를 전달할 수 있습니다.- 위도와 경도는 함께 입력해야 하며 문자열
--location과 좌표는 동시에 사용할 수 없습니다.
Session·API·문서¶
- 세션의 사용자 위치, locale과 STT threshold를 SessionManager와 DialogueState context에 보존합니다.
- 호스트와 Docker container에서 위치 기반 Skill Runtime을 호출하는 URL과 날씨 scenario 검증 절차를 문서화했습니다.
- Pydantic v2의 폐기 예정
Field(example=...)를json_schema_extra={"example": ...}로 이전했습니다.
Bot-first 초기 응답 fallback¶
- 시작 노드에
responses.default가 있으면 기존처럼 NLU와 LLM 호출 없이 초기 응답으로 반환합니다. responses.default가 없으면 노드description과 시나리오 bot prompt를 기반으로 LLM이 초기 응답을 생성합니다.- LLM 호출 실패 또는 빈 응답에는 시나리오 언어에 맞는 공통 인사말을 반환합니다.
- 응답 context의
executor_route로 정적 경로InitialBotResponse와 LLM 경로InitialBotResponseLLM을 구분할 수 있습니다.
Sohri Graph Builder v1.2.1 Release Notes¶
- Version:
v1.2.1 - Release date:
2026-08-04 - Baseline:
v1.2.0
개요¶
v1.2.1은 대화 시작 방식을 명시적으로 제어하는 bot-first 기능과 규칙 기반 NLU fast path를 추가하고, CLI 및 API의 실행 결과에 처리 시간을 제공하는 릴리스입니다.
명확하고 반복적으로 발생하는 사용자 입력은 LLM 호출 없이 처리하여 응답 지연과 비용을 줄였으며, bot-first 설정을 Scenario v2의 graph 영역으로 통합했습니다. 문서 구조와 시나리오 다이어그램도 함께 정비했습니다.
Features¶
Bot-first 대화 시작¶
- Scenario v2의
graph.bot_first로 봇이 먼저 대화를 시작할지 설정할 수 있습니다. - Bot-first가 적용되면 빈 사용자 입력과 NLU 처리를 거치지 않고 시작 노드의
responses.default를 첫 응답으로 반환합니다. - REST API의
/v1/session과/v1/session/json요청에서bot_first값을 지정해 시나리오 설정을 재정의할 수 있습니다. - 기존
metadata.bot_first는 이전 시나리오와의 호환을 위한 fallback으로 지원합니다. - 세션 상태의
context.bot_first에서 실제 적용 여부를 확인할 수 있습니다.
규칙 기반 NLU fast path¶
- 다음과 같이 의도가 명확한 입력은 LLM NLU 호출 없이 규칙으로 처리합니다.
- 빈 입력과 무응답
- 짧은 긍정 및 부정
- 명시적인 대화 종료
- 반복 요청
- 인사와 감사
- 식사 노드의 명확한 식사 여부 응답
- 규칙만으로 확정하기 어려운 입력은 기존 LLM NLU로 자동 위임합니다.
- Detailed CLI 출력에서 NLU 처리 경로가 규칙인지 LLM인지 확인할 수 있습니다.
- 무응답 입력은 현재 노드의
responses.no_input을 사용해 즉시 응답합니다.
처리 시간 제공¶
- Bot-first 초기 응답과 일반 메시지 처리 결과에
processing_time_ms를 제공합니다. - API session 및 message response schema에 처리 시간 필드를 추가했습니다.
- CLI turn 출력에서 응답 처리 시간을 확인할 수 있습니다.
CLI¶
--bot-first옵션으로graph.bot_first가false인 시나리오에서도 봇의 첫 응답으로 대화를 시작할 수 있습니다.- 기존
--user-first옵션은--bot-first로 대체되었습니다. - README의 CLI parameters를 필수 여부, 기본값과 설명을 포함한 표로 정리했습니다.
문서¶
- 문서를
docs/아래의 API, definition, graph builder, scenario 및 refactor 영역으로 재구성했습니다. - 중복되거나 이전 구조에 속한 문서를 정리하고 내부 참조 경로를 갱신했습니다.
- General Conversation과 SeniMate의 Mermaid 다이어그램을 SVG 이미지로 교체했습니다.
호환성 참고¶
metadata.bot_first는 계속 동작하지만, 신규 시나리오는graph.bot_first를 사용해야 합니다.- CLI의
--user-first는 더 이상 지원되지 않으므로 필요한 경우graph.bot_first설정 또는--bot-first를 사용해야 합니다.
Sohri Graph Builder v1.2.0 Release Notes¶
- Version:
v1.2.0 - Release date:
2026-08-02 - Baseline: 최초 fork 시점
개요¶
v1.2.0은 최초 fork 이후 Graph Builder를 Scenario v2 기반의 Dialogue Manager로 확장한 릴리스입니다.
시나리오 정의, NLU, 대화 상태, 정책, executor, transition을 분리하고 목적 대화와 자유 대화를 동일한 graph runtime에서 처리할 수 있도록 구조를 정비했습니다. CLI·REST API·상태 저장·검증 기능과 실제 서비스 시나리오도 함께 제공합니다.
Features¶
Scenario v2¶
metadata,prompts,slots,graph로 구성된 Scenario v2 구조를 지원합니다.graph.entry,nodes,default_next,next_nodes,global_transitions로 대화 흐름을 선언할 수 있습니다.- 전역 slot registry와 node별
collect_slots를 통해 수집 정보를 분리해 정의할 수 있습니다. - required/optional slot 정책과 string, number, enum 등의 값 유형을 지원합니다.
- node별 description, responses, params를 이용해 공통 runtime 수정 없이 대화 동작을 설정할 수 있습니다.
Graph 기반 Dialogue State Tracking¶
- Scenario JSON을
networkx.DiGraph기반 실행 graph로 구성합니다. DialogueState에 현재 node, slots, context, history, turn count와 종료 상태를 유지합니다.- 한 턴에서 수집한 slot과 context를 반영한 후 transition condition을 평가합니다.
- 정적 graph edge와 runtime routing을 분리해 조건부 이동과 현재 node 유지 동작을 지원합니다.
NLU와 Dialog Act¶
- 사용자 입력에서 intent, dialog act, entities, confidence와 slot 상태를 추출합니다.
- NLG와 NLU에 서로 다른 LLM을 지정할 수 있습니다.
question,request,correct,greeting,thank,goodbye를 포함한 16종의 dialog act를 지원합니다.- 질문, 요청, 정정, 긍정, 부정, 반복 요청과 무응답을 slot 수집 상태와 함께 처리합니다.
- 기본 모델은 NLG
gpt-4o, NLUgpt-4o-mini로 구성됩니다.
Policy Pipeline¶
- Executor 실행 전에 Safety, Fallback, Topic Guard를 적용하는 Global Policy Pipeline을 제공합니다.
- Slot 수집 node의 update, missing slot과 turn outcome을 결정하는 Task Policy Pipeline을 제공합니다.
- 응답 생성 이후 반복 방지와 response act를 관리하는 Post Policy Pipeline을 제공합니다.
- 무응답, 낮은 신뢰도, 이해 불가 입력과 off-topic 발화를 공통 정책으로 처리합니다.
- 연속 무응답과 fallback 횟수를 context에 기록하고 시나리오 조건에서 사용할 수 있습니다.
Executor¶
- 유효한
collect_slots가 있는 node에는TaskOrientedExecutor를 자동 선택합니다. - Slot을 수집하지 않는 node에는
GeneralResponseExecutor를 자동 선택합니다. - 도메인별 질문과 응답은 Python 하드코딩 대신 Scenario가 소유합니다.
- Task Policy의 판단과 NLG 표현 생성을 분리합니다.
- Node handoff 시 다음 node의 질문을 중복 생성하지 않도록 응답 범위를 제어합니다.
Transition과 종료 제어¶
- Global transition, action, node condition,
default_next, terminal 판정을 포함한 routing 우선순위를 제공합니다. slots.*,nlu.*,system.*,context.*namespace를 이용한 조건식을 지원합니다.action: stay를 통해 graph self-loop 없이 현재 node에 머물 수 있습니다.terminal: true로 graph topology와 독립적인 종료 node를 선언할 수 있습니다.- 명시적인 종료 intent와 closure node를 통해 세션 종료 권한을 routing으로 통합했습니다.
- Closure node에서 사용자가 대화를 계속하려는 경우 이전 대화로 복귀할 수 있습니다.
자유 대화¶
- Slot 수집이나 정해진 목적 없이 대화를 이어가는 free-conversation node를 지원합니다.
free_conversation설정으로 목적 대화용 질문 유도 규칙을 비활성화할 수 있습니다.turn_limit_enabled를 이용해 node별 turn limit 적용 여부를 제어할 수 있습니다.- 명시적인 종료 의도가 감지되기 전까지 현재 대화 node에 머무는 시나리오를 구성할 수 있습니다.
State 저장¶
- Process-local in-memory 저장소를 지원합니다.
- Redis 기반
ContextStore를 통해 DialogueState를 저장할 수 있습니다. - Session TTL과 context TTL을 환경 변수로 설정할 수 있습니다.
- Slot value의 값, confidence, source와 update 시점을 함께 관리합니다.
CLI¶
- Scenario 실행, 구조 검증과 node 목록 조회 기능을 제공합니다.
- 특정 node에서 시작해 이동을 보류하면서 반복 테스트할 수 있습니다.
chat,compact,detailed,debug출력 수준을 제공합니다.- Detailed 출력에서 NLU, slot update, policy, routing과 transition 결과를 확인할 수 있습니다.
- NLG/NLU 모델, Redis 사용 여부와 사용자 선입력 등을 실행 옵션으로 지정할 수 있습니다.
Dialogue Manager API¶
- Scenario 이름 또는 JSON payload로 session을 생성할 수 있습니다.
- Session에 사용자 메시지를 전달하고 턴 처리 결과를 받을 수 있습니다.
- Session state 조회와 Scenario JSON 검증 endpoint를 제공합니다.
- FastAPI/Pydantic 기반 request·response schema와 OpenAPI 생성을 지원합니다.
- API version을 저장소 루트의
version.py에서 일관되게 관리합니다.
제공 시나리오¶
SeniMate: 일상, 식사와 건강 상태 확인 후 자유 대화와 마무리로 이어지는 시나리오General Conversation: 목적과 slot 수집 없이 명시적 종료 전까지 대화를 이어가는 시나리오Card Issuance: 개인정보, 카드 종류, 소득, 배송 정보와 동의를 수집해 신청 결과를 분기하는 시나리오Call for Fire: 군사 도메인의 정보 수집과 절차 실행 시나리오Dental Caries: 치과 진료 상담 흐름을 구성한 시나리오
문서¶
- Graph Builder 아키텍처, class diagram과 DSTManager call flow를 제공합니다.
- NLU, Policy, Executor, Transition과 DialogueState의 구현 계약을 문서화했습니다.
- Dialogue Manager API endpoint와 request·response schema를 문서화했습니다.
- Scenario v2 생성 가이드와 실제 시나리오별 graph, slot, intent, dialog act 문서를 제공합니다.
- 최초 fork 이후의 주요 설계 변경과 문제 해결 과정을 refactor 문서로 제공합니다.