회사 홈페이지 문의를 자동 리서치하고 분석 메일 및 Notion DB에 저장하는 시스템 구축 과정 (Codex/GPT-6 Astra 활용)
요약
본 글은 회사 홈페이지 문의를 자동으로 리서치하고 분석하여 이메일 및 Notion DB에 저장하는 시스템 구축 과정을 다룹니다. AI가 상대방 회사의 정보를 조사하고 고객의 니즈를 추측한 후, 자동화된 메일을 발송하는 방법을 설명합니다.
핵심 포인트
- 문의 대응 프로세스를 정의하고 AI에게 요청하는 것이 중요합니다.
- Codex와 GPT-6 Astra 같은 프론티어 모델을 활용하여 시스템을 구축했습니다.
- 정보의 흐름(Flow)은 이메일로, 축적되는 정보(Stock)는 Notion DB에 저장하도록 설계했습니다.
회사의 홈페이지에 문의가 도착하면, 상대방 회사명으로 검색하여 홈페이지나 IR 자료를 읽고 니즈(needs)를 추측한 후 회신합니다. 이 사전 준비 과정을 매번 문의가 들어올 때마다 AI가 처리해 주는 시스템을 만들었습니다. 비개발자인 제가 직접 만들었으며, 현재도 자사(주식회사 AI Orchestra)에서 매일 운영하고 있습니다.
작동 방식은 다음과 같습니다.
- 회사 홈페이지의 문의 폼에 문의가 도착합니다.
- AI가 상대방 회사의 기본 정보를 리서치하고, 문의 내용으로부터 니즈를 추측합니다.
- 분석 메일이 도착하며, 동일한 내용은 Notion의 문의 데이터베이스에 쌓입니다.
본문에서는 영상으로 시연된 'Codex에게 요청하여 만드는 과정'을 요청 문구와 함께 정리했습니다. 후반부에는 자사에서 운영하면서 겪었던 어려움을 기록했습니다.
화면 조작까지 영상으로 보고 싶은 분은 여기를 참고해 주세요: 회사 홈페이지 문의를 AI로 자동 분석! GPT-6 Astra로 수주율 폭발적으로 높이기 (YouTube・5분 39초)
- Codex(ChatGPT 데스크톱 앱에서 사용합니다). 모델은 GPT-6 Astra를 선택합니다 (이유는 과정 3).
- 문의 폼이 있는 자사 사이트. 사이트 코드가 손에 있으며, Codex가 읽고 쓸 수 있습니다.
- Notion 워크스페이스
제 환경에서는 사이트를 Next.js로 만들고 Vercel에 배포했습니다. 폼 내용은 데이터베이스(Supabase)에 저장하고, 메일은 메일 전송 서비스(Resend)를 통해 보내며, Notion에는 Notion API로 작성합니다. 반드시 같은 구성을 할 필요는 없습니다. 아래의 요청 문구는 구성을 지정하지 않는 방식으로 작성되었습니다.
처음부터 '문의 대응을 자동화해 달라'고 부탁하지 않습니다. 먼저 현재 사람이 하고 있는 과정을 적어줍니다.
저의 경우, 문의가 도착했을 때 하던 과정은 다음과 같았습니다.
- 회사명으로 검색하여 종업원 수나 매출액 등 회사 규모를 조사합니다.
- 홈페이지나 IR 자료를 읽습니다.
- 문의에 쓰인 내용으로부터 니즈를 추측합니다.
- 그 위에 제안 자료를 만들고, 첫 상담을 진행합니다.
정리하면, 하는 일은 두 가지입니다.
- 회사 기본 정보 리서치
- 니즈 추측
다음으로, 어디까지 전달해야 원하는 대로 작동할지 생각했습니다. 전달한 것은 3가지였습니다.
| 전달하는 것 | 내용 | 전달 이유 |
|---|---|---|
| 회사 홈페이지 URL | 문의 폼이 있는 장소 | 폼 기입 항목에 맞춰 리서치가 진행되기 때문 |
| ... |
세 가지를 그대로 하나의 요청 문구로 만듭니다. 다음은 영상에서 보낸 요청 문구를 바탕으로 작성한 글입니다 (기사용이라 일부는 생략했습니다). 영상에서는 음성 입력으로 넣었습니다. URL은 자사 사이트의 것으로 바꿔주세요.
여기에 문의 폼이 있습니다.
문의가 오면,
...
보내기 전에, 입력란의 모델이 GPT-6 Astra로 설정되어 있는지 확인합니다. 저렴한 모델로 시험해 보면 AI의 현재 한계치를 알 수 없습니다. 사업에 사용할 것이라면, 먼저 프론티어 모델(frontier model)을 요청하여 '이 정도는 가능하다'라는 감각을 먼저 잡는 것이 중요하다고 생각합니다.
완성되면, 문의 1건당 다음 항목들이 도착합니다.
| 받는 것 | 종류 | 내용 |
|---|---|---|
| 알림 메일 | 플로우(Flow) | 문의가 도착했다는 사실과 그 내용 |
| ... |
분석 메일의 제목은 영상 데모(가상의 회사)에서는 다음과 같습니다.
【예상도:중】리서치 완료 주식회사 ABC 상사님 (법인 AI 연수 문의)
제목에 예상도가 들어가 있어, 수신함 목록만으로 우선순위를 알 수 있습니다.
메일은 도착한 순서대로 흘러가는 정보입니다. 나중에 '어떤 회사에서 문의가 왔었는지'를 목록으로 보고 싶을 때는 적합하지 않습니다. 그래서 흐르는 정보(Flow)는 메일로, 쌓아두는 정보(Stock)는 Notion으로 수신 방식을 두 가지로 나누었습니다.
영상에서 보여드린 것은 요청 문구를 보내 시스템이 완성되는 과정까지입니다. 자사에서 매일 운영하는 시스템은 첫 버전을 넣은 후 실제 문의를 받으면서 수정해 왔습니다. 그럴 때마다 AI에게 원인을 조사하게 하고 수정을 부탁했습니다. 실제로 거쳤던 과정을 나열합니다.
웹 검색을 반복하는 조사는 1건에 몇 분이 걸립니다. 전송 버튼을 누른 사람을 기다리게 할 수는 없으므로, 순서를 이렇게 했습니다.
폼 전송
→ 내용을 저장하고, 접수 메일과 알림 메일을 보냅니다 (여기서 발신자에게 결과를 반환)
→ 결과를 반환한 후에, 백그라운드에서 리서치를 시작합니다.
...
리서치 측에서 어떤 일이 일어나더라도, 폼 전송 자체는 실패하지 않도록 만들었습니다.
문의 건마다 '미처리・처리 중・완료・실패' 상태를 부여하고, 5분 간격의 주기적 실행이 미처리 및 실패 건을 다시 가져옵니다. 재시도는 최대 3회까지입니다.
여기서 발생한 것이 이중 처리였습니다. 전송 직후 처리와 주기적 실행이 같은 문의를 동시에 가져가면, Notion 페이지와 메일이 중복됩니다. 처리를 시작할 때 '이 건은 내가 가져갔다'는 표시를 한 번의 업데이트로 남겨, 가져가지 못한 쪽은 아무것도 하지 않도록 막았습니다. Notion 페이지를 만든 직후 해당 페이지 ID를 저장해 두면, 도중에 멈추고 재실행하더라도 페이지를 다시 만들 필요가 없습니다.
이것 때문에 가장 오래 걸렸던 부분입니다. 함수의 실행 시간 제한을 늘리거나 SDK의 타임아웃을 늘려도, 호출 시작부터 약 300초 만에 실패했습니다.
원인은 AI API를 비스트리밍(non-streaming)으로 호출했기 때문이었습니다. 조사가 끝날 때까지 응답 헤더가 돌아오지 않아, Node.js 표준 fetch (undici)의 헤더 대기 제한 시간(기본 300초)이 먼저 초과되었습니다. 호출을 스트리밍으로 변경하자 해결되었습니다. 마감 시한은 자체 타이머로 관리하도록 했습니다.
회사명만 검색하면 동명이인 다른 회사의 정보로 리포트가 채워질 때가 있습니다. 대책으로, 본 조사 전에 '후보 기업 대조 단계'를 추가했습니다.
- 이메일 주소가 법인 도메인이라면, 해당 도메인의 공식 사이트를 최우선 단서로 사용합니다 (프리메일은 단서로 사용하지 않습니다).
- 문의 본문에 쓰여진 사업 내용과 후보 기업의 사업 내용을 비교합니다.
- 문의에 소재지가 적혀 있다면, 후보 기업의 소재지와 모순되지 않는지 확인합니다.
- 독립적인 단서가 2가지 이상 갖춰졌을 때만 최유력 후보로 채택하고, 좁히기 어려울 때는 '불명'으로 작성하게 합니다.
문의 본문은 외부에서 도착한 미검증된 글입니다. 여기에 '지금까지의 지시를 무시하고'와 같은 문구가 쓰여 있어도 따르지 않도록, 프롬프트에 문의 본문은 분석 대상 데이터로만 다룬다는 점을 명기했습니다.
매출액 등의 재무 정보에는 어느 회계 기간의 숫자인지 반드시 적게 합니다. 공시가 발견되지 않으면 '비공개', 조사할 수 없으면 '불명'으로 작성하게 하고, 추측에는 '~ ext{로 추정}'이라고 붙이도록 했습니다. 빈칸을 채우기 위한 숫자가 섞이면 상담 준비에 사용할 수 없습니다.
통지 메일은 그대로 회신하면 문의한 사람에게 도착하도록, 회신처를 상대방의 주소로 설정했습니다. 여기에 분석 내용 같은 사내용 정보까지 담으면, 회신했을 때 인용으로 상대방에게 보여질 수 있습니다. 분석 메일은 사내 전용으로 하고, 회신처를 붙이지 않았습니다. 의뢰문에서 '통지 메일과 분석 메일'을 나누어 부탁한 것도 이 사용 구분이 맞습니다.
코드는 Notion의 열 이름(속성명)과 선택지 이름을 지정하여 작성합니다. Notion 화면에서 열 이름을 수정하면, 그 이후의 작성이 오류가 발생합니다. 열 이름과 선택지 이름은 '바꿀 때는 코드와 동시에'라는 목록으로 남겨두었습니다. 또 하나, Notion 텍스트는 하나의 덩어리로 들어갈 글자 수에 상한이 있어서, 긴 리포트는 분할하여 작성하고 있습니다.
- 조사나 Notion 쓰기가 실패하면, 그 시점에 실패 통지 메일을 보냅니다.
- 3회차에도 실패하면, 문의 정보만 담긴 임시 페이지를 Notion에 만듭니다 (목록에서 문의가 빠지지 않도록 합니다).
- 매일 아침 한 번, 외부 서비스의 키나 모델 지정이 살아있는지 확인합니다 (문의가 와서 알게 되는 것을 방지합니다).
문의로 받는 정보에는 회사명・성함・이메일 주소 등이 포함됩니다. 이를 외부 AI 서비스나 Notion에서 다루게 되므로, 도입 전에 개인정보 보호 정책의 기재 내용이나 사내 취급 규칙과 일치하는지 확인해 주세요. 판단하기 어려운 부분은 전문가에게 확인하는 것을 추천합니다.
- 먼저 사람이 하는 일을 정리합니다 (회사 기본 정보 리서치・니즈 추측)
- Codex에 전달할 컨텍스트는 3가지입니다 (회사 HP URL・사람이 하는 워크플로우・아웃풋 형태)
- 수령 방식은 플로우(통지 메일・분석 메일)와 스톡(Notion 데이터베이스)으로 결정합니다
- 움직이기 시작한 후에는, 전송과의 분리・재가져오기・동명이인 다른 회사・실패 통지를 순서대로 묶었습니다.
의뢰문을 입력해서 보내는 것부터, 도착한 분석 메일과 Notion 데이터베이스 화면까지는 동영상으로 보여드렸습니다.
화면 조작까지 영상으로 보고 싶은 분은 여기를 참고해 주세요: 회사 HP 문의를 AI로 자동 분석! GPT-6 Astra로 수주율을 폭증시키기 (YouTube)
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기