Dify의 Chatflow와 Workflow를 분리하는 기준: 대화 기억을 업무 확정 상태로 만들지 않기
요약
본 문서는 Dify를 활용하여 대화형 업무 시스템을 설계하는 엔지니어를 위한 가이드입니다. Chatflow는 '대화 기억'에, Workflow는 '확정된 입력 처리'를 담당하도록 분리하고, 실제 업무 DB는 '승인 및 실행 상태'를 관리하는 3단계 구조를 제안합니다. 이를 통해 대화 과정과 확정된 비즈니스 로직 간의 책임 경계를 명확히 합니다.
핵심 포인트
- Chatflow: 청취(듣기)와 대화 변수 유지에 집중
- Workflow: 단발성 태스크 처리 및 입력 값 확정에 사용
- 업무 DB: 최종 승인, 버전 관리, 실행 상태를 담당하여 신뢰성 확보
- 대화 기억과 업무 확정 기록을 분리하는 것이 핵심 설계 원칙
발주 신청을 대화로 받으면 '이전 발언을 기억하는 것'과 '어떤 내용을 승인하고 처리했는지 남기는 것'이 같은 상태 관리처럼 보입니다. 하지만 수량의 재요청이나 통신 단절이 발생하면 이 두 가지 차이가 드러납니다.
본 문서는 Dify로 대화형 업무 시스템을 설계하는 엔지니어를 위한 설계 예시입니다. Chatflow에는 청취(聞き取り), Workflow에는 확정된 입력 처리, 그리고 업무 측 DB에는 승인 및 실행 상태를 갖게 하는 구성을 검토합니다. 제품 사양은 2026년 10월 4일 공식 자료에서 확인했습니다. 업무 구성은 설계안이며, Dify 연결, DB 연동, 본 서비스 운영은 미검증입니다.
Dify의 공식 자료에서는 Workflow는 단발성 태스크(task)로, Chatflow는 대화의 각 턴(turn)에서 실행되는 앱으로 설명하고 있습니다. Chatflow에서는 LLM 노드의 메모리와 대화를 거쳐 유지 및 업데이트할 수 있는 대화 변수(conversation variable)를 사용할 수 있습니다. Dify 핵심 개념 (Key Concepts)
| 관점 | Chatflow | Workflow |
|---|---|---|
| 자연스러운 입력 단위 | 대화의 1턴 | 1회의 태스크 입력 |
| ... | ||
| 대화 변수는 Variable Assigner로 업데이트할 수 있으며, 일반적인 Workflow 변수는 실행 단위의 값입니다. 여기서 대화 변수는 입력 후보를 유지하는 데 사용하고, 업무상의 확정 기록은 별도로 두는 것으로 판단했습니다. 이는 제품의 금지 사항이 아니라, 본 예시에서 설정한 책임 경계(責任分界)입니다. Variable Assigner |
한편, Workflow에서도 Human Input 노드를 통해 일시 중지하여 사람의 입력 후 재개할 수 있습니다. '사람에게 물어볼 때는 반드시 Chatflow'라는 선택은 하지 않습니다. 지속적인 자유 대화가 필요한지, 특정 실행을 승인 대기 상태로 할 것인지에 따라 선택합니다. Human Input API Integration Flow
| 선택지 | 채택하기 쉬운 조건 | 감수해야 하는 제약 |
|---|---|---|
| Chatflow만 | 청취부터 초안 제시까지로 완결되는 경우 | 다음 턴에서 업데이트 처리를 재실행하지 않는 메커니즘이 필요 |
| ... | ||
| 본 예시에서는 세 번째를 채택했습니다. 발언의 수정과 승인 후 실행을 같은 상태 변경으로 취급하고 싶지 않기 때문입니다. 반면, FAQ 답변이나 저장할 필요가 없는 문서 생성이라면 Chatflow만으로 가능한 범위를 먼저 검토합니다. 분리 그 자체를 목적으로 삼지는 않습니다. |
Chatflow의 대화 변수에는 청취 도중의 품목/수량과, 저장 후에 반환된 신청 ID를 갖게 합니다. 신청 DB에는 소유자(所有者), 입력 내용, 버전(版), 승인 대상 버전, 처리 상태를 저장합니다. 소유자와 승인자는 인증된 세션에서 결정하며, LLM이 출력한 식별자를 채택하지 않습니다.
수량을 수정하면 새로운 버전을 저장하고, 이전의 승인을 재사용하지 않는 구성입니다. '예'라는 발언만으로 승인의 의도를 추정하더라도, 그 추정만으로는 쓰기를 허용하지 않습니다. 인증된 승인 조작과 저장된 버전이 일치할 때 비로소 실행 대상으로 삼습니다.
여기서 Workflow는 검증/정제 등의 처리를 담당하고, 업무 업데이트용 자격 정보(資格情報)는 실행 서비스에 집약합니다. 플로우 내의 툴에도 쓰기 권한을 부여한다면, 해당 API 측에서 동일한 인가(認可), 승인, 중복 방지 로직을 강제해야 합니다.
첫 번째 경계는 추출 결과로부터 저장 가능한 입력을 만드는 부분입니다. 다음은 Python 표준 기능만으로 작동하는 검증 함수입니다. 품목 목록은 업무 측에서 전달하고, 불필요한 항목은 거부합니다. 수량 상한 100은 설명용 업무 규칙입니다.
def normalize_request(raw, allowed_items):
if not isinstance(raw, dict) or set(raw) != {
를 전달하고, 반환된 `workflow_run_id`
을 업무의 신청 ID 및 버전에 연관시킵니다. **대화 ID, 플로우 실행 ID, 업무 신청 ID는 용도가 다릅니다.** 실행 ID를 얻을 수 있다면, 실행 상세 API로 상태와 출력을 대조할 수 있습니다. Run Workflow, Get Workflow Run Detail
다음 표는 업무 측 DB에 보관할 독자적인 상태(State) 방안입니다. Dify의 실행 상태와 별도로 관리합니다.
| 상태 | 의미 | 다음 동작 |
|---|---|---|
`pending_review` | 검증되었으나 미승인 | 대상 버전을 확인하고, 승인 또는 반송 처리 |
`ready` | 승인된 버전이 현재 버전과 일치 | 실행 권한을 원자적으로(atomically) 획득 |
`running` | 실행 권한을 획득함 | 동일 신청/버전의 병렬 실행을 거부 |
`succeeded` | 업무 측 반영 결과까지 확인됨 | 저장된 결과를 반환 |
`failed` | 반영되지 않았음을 확인함 | 원인 수정 후, 재실행 조건을 판정 |
`unknown` | 반영 여부를 확인할 수 없음 | 대조(照合)로 진행하고, 쓰기 전송을 중단 |
`cancelled` | 업데이트 전에 중단을 확정 | 재개하려면 새로운 실행 판단이 필요 |
`ready → running`
은 DB의 조건부 업데이트로 획득하며, 신청 ID와 버전의 조합에 하나의 실행 레코드를 만듭니다. 외부 API가 Idempotency Key를 수용한다면, 이 조합에서 만든 동일한 키를 재전송 시에도 사용합니다. 상대방 측이 대응하지 않는다면, 참조 번호에 의한 대조나 수동 확인이 필요합니다. 로컬의 고유 제약 조건만으로는 외부 작업이 단 한 번일 것이라고 보장할 수 없습니다.
화면 연결 끊김은 취소(Cancellation)가 아닙니다. 업무 업데이트 직전에도, 저장된 취소 상태와 승인 대상을 재확인합니다. 그럼에도 불구하고 전송 후 중단된 경우 반영이 완료되었을 가능성이 있으므로, 결과가 불분명하면 `unknown`
으로 이동시킵니다. Dify의 실행이 성공했더라도, 업무 업데이트까지 성공했다고 간주하지 않는 것이 핵심입니다.
- '수량을 2에서 3으로 정정한 후, 이전 버전을 승인'하는 작업을 거부합니다.
- 동일한 승인을 두 개의 처리가 동시에 획득해도, 한쪽만 실행으로 진행됩니다.
- 다른 이용자의 신청 ID/대화 ID를 전달해도, 소유자 검증으로 거부합니다.
- Workflow 실패 시에는 업무 업데이트로 진행하지 않고, 이용자가 확인 가능한 상태를 반환합니다.
- 외부 API가 반영 후에 응답을 잃은 경우,
`unknown`
으로 하여 대조(照合)에 보냅니다. - 업데이트 전의 취소와 업데이트 후의 취소에 따라 남는 기록과 안내가 달라집니다.
이것들은 향후 필요한 결합/장애 주입 테스트이며, 이번에는 실시되지 않았습니다. 로그에는 신청 ID, 버전, 허용된 상관관계 ID, Dify 실행 ID, 처리 단계, 결과 구분을 남깁니다. 입력 전체 내용이나 자격 정보를 남기는 설계는 하지 않습니다. 승인 대기 지연 시간, 결과 불명 건수, 중복 거부 건수를 모니터링하면, 사람이 개입해야 할 장소를 파악할 수 있습니다.
비용 측면에서는, Chatflow의 각 턴에서 무거운 처리를 반복하는 구조를 피합니다. 부족 항목 확인 단계에서 발주 후 처리까지 실행하지 않고, 승인된 입력만 Workflow로 전달합니다. 다만 플로우를 분리한다고 해서 토큰이 줄어드는 것은 아닙니다. 대화 턴 수, 전송 이력, Workflow 재실행 횟수, DB/운영비를 종합하여 비교해야 합니다. 절감률이나 ROI는 미측정입니다.
다음 검증에서는 Dify의 버전과 플로우 정의를 고정하고, 정정, 중복 승인, 통신 단절, 외부 반영 후 응답 누락을 재현할 것입니다. 첫 번째 도달점은 '접수 및 승인된 신청 저장'까지로 하고, 대조와 중복 방지를 확인한 후에 업무 업데이트를 연결할 계획입니다.
이 분리를 통해 목표하는 업무 효과는, 재확인과 이중 처리를 줄이는 것입니다. 평가한다면, 확인에 소요된 시간과, 결과 불명을 해소하기까지의 시간을 도입 전후로 비교합니다. 대화가 성립하는 것뿐만 아니라, 실패 후에 무엇이 확정되고 누가 다음 판단을 할 수 있는지까지 설명할 수 있는 설계를 목표로 합니다.
- Dify Key Concepts
- Variable Assigner
- Human Input API Integration Flow
- Send Chat Message
- Run Workflow
- Get Workflow Run Detail
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기