
📅 Sense Stock 개발 일지 (2025-06-18)
n8n 기반 뉴스 요약 자동화 시스템 Sense Stock 구축 중 진행한 작업들을 정리합니다.
오늘은 사용자의 질문 의도 파악을 선행한 후에 역질문을 유도하는 구조에서 → 투자 성향 분석을 통해 질문 의도 정제 구조로 변경했습니다.
❓ 지난번 고민 내용
선택지 설계에 대한 프롬프트 개선
현재는 질문 내용을 바탕으로 GPT가 5가지 선택형 질문을 생성하게 해뒀지만,
사실 나 스스로도 아직 “어떤 질문이 적절한가?”에 대한 기준이 부족하다.
- 단순하게 분기된 선택지를 형식화하면 사용자가 원하지 않는 선택지가 들어갈 수 있고,
- 반대로 너무 많은 옵션을 보여주면 그 자체가 피로감을 줄 수 있다.
결국 이 문제는 프롬프트 설계 문제이기도 하다.
“사용자의 질문 맥락 안에서, 필요한 만큼만 질문을 보조적으로 제시하라”는
명확한 기준을 GPT에게 어떻게 전달할 것인지가 핵심이다.
그래서!
질문 → 성향 선택 → 분석 구조로 바꿨다.
Slack에서 받은 투자 질문에 대해,
AI가 바로 분석하지 않고 먼저 사용자의 ‘투자 관점’을 선택하게 한 뒤 분석하도록 흐름을 재설계했다.
처음엔 단순한 구조였다.
Slack에서 질문을 받으면, 디테일분석/단순요약 버튼을 통해 Webhook으로 전달하고,
GPT가 질문자의 말투와 키워드를 기반으로 성향을 유추한 뒤,
해당 질문을 보완할 수 있는 5가지 역질문을 생성하는 방식이었다.
입력: "중국 관련주는 이제 들어가도 될까?"
↓
GPT 역할:
- 말투, 키워드, 표현 방식 → 투자 성향 해석
- 숨은 의도 파악 → 5가지 역질문 생성
↓
출력:
- 질문자 성향 요약
- 역질문 5개
처음엔 이런 방식이 제법 괜찮다고 생각했다.
그런데 테스트를 거치다 보니, 점점 부정확한 질문이 만들어지는 경우가 생겼다.
AI가 애매한 질문을 받아 해석하려다 오히려 피상적인 질문 구성으로 선택함에 있어서 고민을 하게 됐다. = 피로감
원인은 단순했다.
질문자의 성향(Context)이 AI에게 사전 전달되지 않았기 때문이다.
+ Slack Block Kit UI에 구조적인 면도 고민을 해봤는데,
예를 들어,
질문이
- “~인 것 같아?”
- “어떤 쪽이 더 나아 보여?”
- ....
이렇게 어느 하나는 선택(단일 선택)할 수 있고, 다른건 둘중에 하나를 선택(이분 선택)하는
질문이 같이 들어온다면 → 동적 BlockKit 구성 필요
이 부분도 질문에서 너무 많은 내용을 내포(선택의 다양성)하고 있고, 사용하는데 피로감이 있다.
BlockKit 자체를 GPT에게 생성하게 할 수도 있지만, 구조 안정성 때문에 n8n에서
템플릿화( 고정된 인터페이스 구조 ) 하기로 결정했다.
🔁 그래서 구조를 이렇게 바꿨다
지금은 질문을 받는 즉시 AI에게 넘기지 않는다.
대신, 질문 이후에 사용자의 ‘투자 성향’을 선택하는 단계를 한 번 더 거치게 했다.
🧱 Workflow 구조


Step 1. 변경된 흐름
- 질문 입력 → 사용자가 선택하면 Webhook으로 전달
- Webhook에서 Action_id를 기준으로 분기 처리
- 단순 요약이면 → 바로 AI 요약 진행
- 디테일 분석이면 → 추가 선택지(투자 성향) BlockKit 다시 출력(최대 3개 선택 가능)
- Webhook에서 Action_id를 기준으로 분기 처리
- 사용자가 선택하면 Webhook으로 전달(= 처음 Webhook Node로 다시 전달됨, Step 2 <확인> )
- Webhook에서 선택된 성향과 사용자의 기본 정보 파싱
- n8n에서 이 정보를 AI에게 Context로 전달
- AI는 이 성향에 맞춰 요약 or 역질문 수행
이렇게 하면, 애초에 의미 없는 질문이 생성될 확률이 크게 줄어들게 된다.
AI가 "무슨 말인지 잘 모르겠는데요"라는 식의 회피형 답변을 하는 일도 줄었고.
Step 2. 구조 재정리: 모든 Action은 하나의 Webhook에서 처리
Interactivity Request URL은 딱 하나만 설정 가능!!!
초기에는 Slack의 Interactivity Request URL을 Webhook URL처럼 복수 등록할 수 있다고 착각하고 있었다.
그래서 각 Action 요청마다 다른 Webhook URL을 지정하고,
n8n에서 각각 분기된 Workflow를 구성하면 되겠다고 생각했다.
하지만 실제로는 Interactivity Request URL은 딱 하나만 설정 가능하다.
BlockKit을 사용할 경우, 그 응답은 무조건 Interactivity URL 하나로만 들어온다.
- 따라서 내부에서 action_id 또는 payload 속 값을 기준으로 명확하게 흐름 분기 처리를 설계해야 한다.
https://cord-ai.tistory.com/228
n8n, Slack Block Kit(2)
https://cord-ai.tistory.com/225 n8n, Slack Block Kit📌 Slack Block Kit이란?Slack Block Kit은 메시지를 시각적으로 더 풍부하고 인터랙티브하게 구성할 수 있게 해주는 Slack의 UI 구성 도구입니다.텍스트, 버튼, 드
cord-ai.tistory.com
🧠 Action Type(Switch Node)로 분기 설계
- 모든 BlockKit 인터랙션이 하나의 Webhook으로 들어오다 보니,
n8n 내부에서 Switch Node를 사용해 Action Type을 분기하는 구조로 설계했다. - ❓ 왜 하나의 Webhook으로만 들어올까?
→ Interactivity Request URL은 딱 하나만 설정 가능!!! <확인>
<Switch Node 조건 동작>
Action Type | 전달 내용 |
action_id == simple_click | GPT에게 뉴스 요약 요청(기존 Workflow) |
action_id == detailed_click | 투자 성향 선택 Block 전송 |
action_id == analysis_multi_select | 투자 성향 Text 전달받아서 GPT에게 전달 |

Step 3. 구조 변경에 따른 기술적 고려사항
이 구조를 도입하면서 발생한 문제도 있었다.
기존에는 Slack Trigger로 시작했기 때문에 사용자 ID, 채널 정보 등이 자연스럽게 흐름에 녹아 있었지만,
BlockKit → Webhook Trigger로 넘어가는 순간,
모든 Slack 메타 정보가 사라지는 문제가 발생했다.
그래서 다음과 같은 방식으로 수정했다:
- Slack BlockKit에서 선택한 옵션을 포함한 Webhook Trigger 사용
- Webhook Payload에서 다음 정보들을 파싱(Action Parsing Node)
- action_id
- selected_options[].text → 최대 3개 성향 선택
- user.id, channel.id, channel.name
- 이 정보를 n8n에서 모두 결합해, GPT에 명확한 Prompt로 전달
🧠 설계 인사이트 요약
항목 | 변경 전 | 변경 후 |
질문 흐름 | 질문 → AI 분석 | 질문 → 성향 선택 → 분석 |
질문자의 관점 정보 | 질문만으로 추론 | 선택된 관점 정보를 명시적으로 전달 |
Slack Trigger | 기본 정보 보존됨 | Webhook으로 분리되며 정보 손실 발생 |
사용자 정보 보완 | 필요 없음 | Slack Get User로 보완 필요 |
Respond to Webhook??
Slack Webhook 500 오류 발생
설계하던 중, Slack에서 Block 버튼을 누르면 500 오류가 발생하는 현상이 생겼다.
처음엔 뭔가 잘못 연결된 줄 알았는데, n8n 로그에는 아래와 같은 에러 메시지가 찍혀 있었다:
⚠️ "Insert a Respond to Webhook node to your workflow to respond to the webhook or choose another option for the “Respond” parameter"
알고 보니 이건 n8n에서 Webhook 요청에 적절한 응답을 주지 않았기 때문이었다.
✅ 원인
Slack은 BlockKit 상호작용(버튼 클릭 등)을 보낼 때,
기본적으로 3초 안에 HTTP 응답을 기대한다.
하지만 n8n에서 해당 Webhook 요청에 대한 응답(Response)을 명시적으로 보내지 않으면,
Slack은 “응답이 없었다”고 판단하고 바로 오류 처리(500)를 하게 된다.
문제 | 해결 방법 |
Slack Trigger로 받은 요청을 Webhook 노드로 넘김 | ❌ 구조적 오류 발생 |
Slack Trigger에서 바로 분기 처리 | ✅ Respond to Webhook → 분석 흐름 |
Slack에서 요청한 곳으로 바로 응답 | ✅ Slack Trigger가 받은 요청은 Slack Trigger가 처리해야 함 |
✅ 해결 방법 (슬랙 인터랙션 대응 흐름)
Slack Trigger + Respond to Webhook 조합
❓ 다음 단계에서 고민 중인 점들
- 사용자 성향 데이터의 저장 방식
- 현재는 선택된 투자 성향이 일회성으로만 활용되고 있음
- 향후 Supabase 등 DB를 연동해, 사용자별 성향 히스토리를 저장하고 클러스터링할 수 있을지 실험 예정
- 최초 사용자 흐름 설계 (Form 형태 도입)
- 기존 사용자는 질문 기반 흐름을 따르지만,
처음 접근하는 사용자에겐 기본 성향을 먼저 파악할 수 있는 Form을 제공하고자 함 - 어떤 항목을 어떻게 구성해야 불편 없이 입력할 수 있을지 고민 중
- 기존 사용자는 질문 기반 흐름을 따르지만,
- 성향 선택 후 흐름 다양화
- 현재는 성향 선택 후 AI가 요약 또는 역질문을 수행하는 단일 흐름
- 앞으로는 사용자의 성향 조합에 따라 후속 응답 방식이나 추천 뉴스 유형 등을 유동적으로 바꾸는 구조를 실험해볼 계획
- Slack UI/UX 개선 및 유저 피드백 수집 방식 설계
- BlockKit 인터페이스 개선 외에도, 사용자의 반응을 수집하거나 개선 아이디어를 받을 수 있는 구조 필요
- "이 답변이 도움이 되었나요?" 같은 라이트한 피드백 수집도 고려 중
'Automation Tool > n8n Project' 카테고리의 다른 글
Sense Stock, D+9 (2) | 2025.06.23 |
---|---|
Sense Stock 개발 회고, 첫 번째 (0) | 2025.06.20 |
Sense Stock, D+7 (0) | 2025.06.18 |
Sense Stock, D+6 - 구조화된 질문이 필요한 이유 (4) | 2025.06.12 |
Sense Stock, D+5 (4) | 2025.06.06 |
댓글