AI와 대화 그만: 비즈니스를 위한 자율 RFP 응답 시스템 구축기
Source: Dev.to
(번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.)
TL;DR
- The Problem – RFP(제안 요청서)는 지루하고 반복적이며 수백 페이지에 달하는 기술 문서를 검색해야 합니다.
- The Solution – RFP를 읽고, 기술 답변을 찾아내며, 자동으로 규격에 맞는 응답 초안을 작성하는 다중 에이전트 시스템을 구축했습니다.
- The Code – LangChain 개념을 활용하지만 단순화된 오픈소스 Python 프로젝트이며, 모의 Vector DB를 사용합니다.
- The Result – PDF를 몇 초 만에 초안 제안서로 변환하는 워크플로우를 구현했으며, 며칠 걸리던 작업을 단시간에 처리합니다.
소개
저는 최근 150페이지에 달하는 제안 요청서(RFP) 문서를 바라보고 있었습니다. 그 안에는 제가 이미 수십 번 답변한 질문들이 반복되고 있었습니다:
- “암호화를 어떻게 처리합니까?”
- “가동 시간 SLA는 어떻게 되나요?”
- “API 문서를 설명해 주세요.”
저는 스스로에게 이렇게 물었습니다: 왜 이렇게 수작업으로 입력하고 있는 걸까?
우리는 종종 AI를 채팅 파트너처럼 사용합니다 – 질문을 하면 답을 얻는 식이죠. 하지만 실제 비즈니스 문제에서는 챗봇이 아니라 작업자가 필요하다는 것을 깨달았습니다. 제가 필요로 한 것은 다음과 같은 일을 할 수 있는 것이었습니다:
- 문서를 읽는다.
- 특정 요구 사항을 이해한다.
- 우리 회사 지식 베이스에서 “공식적인” 기술 답변을 찾아본다.
- 전문적인 응답을 작성한다.
이 글에서는 자율형 RFP 응답 시스템을 구축한 과정을 공유합니다 – 에이전트 기반 워크플로우가 지루하지만 높은 가치를 지닌 비즈니스 문제를 어떻게 해결할 수 있는지 보여주는 개념 증명(PoC)입니다.
이 글의 주제
이것은 LLM과 “대화”하는 것이 아니라, AI 에이전트가 협업하여 작업을 완수하는 시스템을 설계하는 것입니다.
대부분의 AI 튜토리얼은 일반적인 “개인 비서”에 초점을 맞춥니다. 저는 기업 환경을 위한 무언가를 만들고 싶었습니다—특히 입찰 관리 프로세스를 자동화하는 것이 목표였습니다.
시스템은 네 개의 에이전트로 구성됩니다:
| Agent | Role |
|---|---|
| Agent A (The Reader) | 복잡한 RFP를 파악합니다. |
| Agent B (The Researcher) | 사실을 찾아냅니다. |
| Agent C (The Writer) | 설득력 있는 텍스트를 초안합니다. |
| Agent D (The Manager) | 규정 준수를 위해 검토합니다. |
기술 스택
- Python 3.10+ – AI 엔지니어링의 공통 언어.
- Custom Agent Classes – 무거운 프레임워크(CrewAI, LangGraph) 없이; 핵심 로직을 보여주는 간단한 파이썬 클래스.
- Mock Vector Database – 임베딩을 위한 OpenAI 키 없이도 RAG를 시뮬레이션하는 키워드 기반 검색.
- Mermaid.js – 아래에 보이는 다이어그램을 위해.
Why Read It?
- Practicality – Every B2B company deals with RFPs.
- Architecture – A step‑by‑step breakdown of a multi‑agent loop.
- Code – Full source access so you can try it yourself.
설계하기
코드를 한 줄도 작성하기 전에 디지털 화이트보드에 흐름을 스케치했습니다. 품질 관리를 위해 “피드백 루프”가 포함된 선형 프로세스가 필요했습니다.
고수준 아키텍처

- 입력 처리 – 원시 파일을 받아들입니다 (여기서는 텍스트 추출로 시뮬레이션).
- “브레인” – 에이전트 간에 상태를 전달하는 중앙 오케스트레이터.
- 피드백 루프 – “컴플라이언스 담당자” 에이전트가 초안을 거부하면 “제안서 작성자”가 다시 시도해야 합니다. 자율 에이전트는 스스로 교정해야 합니다.
시퀀스 다이어그램

시스템을 상태 머신으로 모델링했습니다. “상태”는 현재 처리 중인 요구사항과 그에 연관된 초안을 의미합니다. 각 에이전트가 이 상태를 변형합니다.
요리를 시작해봅시다
이제 코드에 뛰어들어 봅시다. 아래는 핵심 구성 요소들입니다.
1️⃣ 문서 처리기 (“리더”)
class DocumentProcessor:
"""
Simulates PDF parsing – extracts requirements from an RFP.
"""
def __init__(self):
pass
def process_rfp(self, path: str) -> list[str]:
# In a real implementation we’d use PyPDF2 / pdfplumber, etc.
# Here we just return a static list for demo purposes.
return [
"Support 10,000 concurrent users",
"Encrypt all data at rest and in transit",
"Provide 99.9% uptime SLA",
]
PDF 파싱 라이브러리는 notoriously 까다롭기 때문에, 에이전트 상호작용에 집중하기 위해 이 예시는 간단하게 유지했습니다.
2️⃣ 컨텍스트 검색기 (“리서처”)
class ContextRetriever:
"""
Simulates a vector‑database retrieval system (RAG).
"""
def __init__(self):
# Mock knowledge base representing company “facts”
self.knowledge_base = {
"scale": "Our architecture uses Kubernetes auto‑scaling...",
"security": "We implement AES‑256 GCM encryption...",
}
def retrieve(self, query: str) -> str:
# In production this would be a vector similarity search
if "users" in query:
return self.knowledge_base["scale"]
if "encrypt" in query:
return self.knowledge_base["security"]
return "Generic context."
3️⃣ 오케스트레이터 (“보스”)
class RFPOrchestrator:
def run(self, rfp_path: str):
requirements = self.loader.process_rfp(rfp_path)
for req in requirements:
# 1. Retrieve Facts
context = self.retriever.retrieve(req)
# 2. Draft Response
draft = self.drafter.draft_section(req, context)
# 3. Compliance Loop
approved = False
while not approved:
is_valid, feedback = self.compliance.review_draft(draft)
if is_valid:
approved = True
else:
# Self‑correction happens here
draft = self.drafter.revise(draft, feedback)
설정하기
이 실험을 내 컴퓨터에서 실행하고 싶다면, 매우 쉽게 할 수 있도록 만들었습니다.
저장소 복제
git clone https://github.com/aniket-work/autonomous-rfp-agent.git
cd autonomous-rfp-agent
의존성 설치
pip install -r requirements.txt
데모 실행
python main.py
실행해 보자
시스템을 실행했을 때 로그를 보는 것이 매우 만족스러웠습니다—마치 디지털 조립 라인을 보는 듯했어요.
샘플 터미널 출력
[Orchestrator] 🚀 Starting RFP Process for sample_rfp.pdf
[DocumentProcessor] Extracted 5 requirements.
--- Processing Requirement 1: 10,000 concurrent users ---
[ContextRetriever] Searching knowledge base... found 'Kubernetes auto‑scaling'
[ProposalDrafter] Drafting response...
[ComplianceOfficer] Reviewing draft...
[ComplianceOfficer] Draft approved.
자체 교정 작동 예시
[ComplianceOfficer] Warning: Forbidden term 'guarantee 100%' found.
[Orchestrator] Iterating on draft due to feedback...
[ComplianceOfficer] Draft approved.
시스템이 책임 문제(“보장 100% 가동 시간”)를 감지하고 자동으로 수정했습니다. 이것이 에이전트 기반 워크플로우의 힘입니다.
마무리 생각
이 자율 RFP 시스템을 구축하면서 몇 가지를 배웠습니다:
- 구조 > 프롬프트 – 워크플로우(Reader → Researcher → Writer)를 정의하는 것이 LLM에 제공된 정확한 프롬프트보다 더 중요했습니다.
- 비즈니스 로직이 중요 – “Compliance Officer” 에이전트는 단순히 비즈니스 규칙 집합에 불과했지만, 환상을 방지함으로써 막대한 가치를 추가했습니다.
- 에이전트는 업무의 미래 – “채팅”에서 “위임”으로 전환하는 사고 방식의 변화가 엄청난 생산성을 열어줍니다.
이 글이 AI와 단순히 채팅하는 것을 멈추고 자신만의 디지털 인력을 구축하도록 영감을 주길 바랍니다.
태그: ai, python, machinelearning, architecture
여기에 표현된 견해와 의견은 전적으로 저 개인의 것이며, 제 고용주나 제가 소속된 어떤 조직의 견해, 입장, 의견을 대변하지 않습니다. 이 내용은 저의 개인적인 경험과 실험을 기반으로 하며 불완전하거나 부정확할 수 있습니다. 오류나 오해는 의도된 것이 아니며, 진술이 오해되거나 잘못 전달될 경우 미리 사과드립니다.