
# 보안 설문지 실시간 증거 조합을 위한 AI 기반 검색 증강 생성

보안 설문지, 공급업체 위험 평가 및 컴플라이언스 감사는 SaaS 기업에 매일 발생하는 병목 현상이 되었습니다. 정책, 감사 보고서, 설정 스냅샷을 수동으로 찾는 작업은 엔지니어링 시간을 낭비할 뿐만 아니라 오래된 답변이나 일관성 없는 답변이 나올 위험을 초래합니다.  

검색 증강 생성(RAG)은 새로운 패러다임을 제시합니다. 정적 대형 언어 모델(LLM)에만 의존하는 것이 아니라, RAG는 **질의 시점에 가장 관련성 높은 문서를 검색**하여 모델에 전달합니다. 그 결과 **실시간으로 증거가 뒷받침된 답변**을 얻을 수 있으며, 원본 소스로 추적이 가능해 속도와 감사 가능성 요구를 모두 만족합니다.

본 글에서는 다음을 다룹니다.

* 질문서 워크플로에 맞는 핵심 RAG 아키텍처를 자세히 설명합니다.  
* Procurize에 RAG 파이프라인을 삽입해 기존 프로세스를 방해하지 않는 방법을 보여줍니다.  
* 데이터 수집부터 답변 검증까지 단계별 구현 가이드를 제공합니다.  
* 이 접근법에 특화된 보안, 프라이버시 및 컴플라이언스 고려사항을 논의합니다.  
* ROI 측정과 지속 학습, 동적 위험 점수와 같은 미래 확장 방안을 강조합니다.

---

## 1. 보안 설문지에 전통적인 LLM이 부족한 이유

| 제한 사항 | 설문 자동화에 미치는 영향 |
|------------|--------------------------------------|
| **정적 지식 컷오프** | 답변이 모델 학습 시점의 스냅샷을 반영하므로 최신 정책 수정 사항을 반영하지 못합니다. |
| **환상(Hallucination) 위험** | LLM이 실제 문서와 무관한 그럴듯한 텍스트를 생성할 수 있습니다. |
| **출처 부재** | 감사자는 정책, **[SOC 2] 보고서**, 설정 파일 등 원본 아티팩트에 대한 직접 링크를 요구합니다. |
| **규제 제약** | 일부 관할 구역에서는 AI 생성 콘텐츠가 검증 가능하고 불변이어야 합니다. |

이러한 격차 때문에 조직은 다시 수동 복사·붙여넣기로 돌아가게 되며, AI가 약속한 효율성을 상쇄합니다.

---

## 2. 검색 증강 생성 – 핵심 개념

본질적으로 RAG는 세 가지 구성 요소로 이루어집니다.

1. **Retriever** – 질의에 대해 가장 관련성 높은 문서를 빠르게 찾아낼 수 있는 인덱스(대개 벡터 기반).  
2. **Generative Model** – 검색된 스니펫과 원본 설문 프롬프트를 받아 일관된 답변을 생성하는 LLM.  
3. **Fusion Layer** – 전달할 스니펫 개수, 순서 및 가중치를 제어하는 로직.

### 2.1 증거 검색을 위한 벡터 스토어

각 컴플라이언스 아티팩트(정책, 감사 보고서, 설정 스냅샷)를 밀집 벡터 공간에 임베딩하면 의미 기반 유사도 검색이 가능합니다. 대표적인 오픈소스 옵션은 다음과 같습니다.

* **FAISS** – 빠르고 GPU 가속 가능, 고처리량 파이프라인에 적합.  
* **Milvus** – 클라우드 친화적이며 스칼라·벡터 하이브리드 인덱싱 지원.  
* **Pinecone** – 관리형 서비스이며 보안 제어가 내장돼 있습니다.

### 2.2 RAG를 위한 프롬프트 엔지니어링

잘 설계된 프롬프트는 LLM이 검색된 컨텍스트를 *권위 있는 증거*로 취급하도록 합니다.

```text
당신은 컴플라이언스 분석가이며 보안 설문에 답변하고 있습니다. 제공된 증거 발췌만 사용하십시오. 각 발췌는 해당 소스 ID와 함께 인용하십시오. 답변을 충분히 뒷받침할 수 없으면 수동 검토가 필요함을 표시하십시오.
```

이 프롬프트는 Procurize에 템플릿화해 설문 항목마다 자동으로 증거가 첨부되도록 할 수 있습니다.

---

## 3. Procurize 플랫폼에 RAG 통합하기

아래 흐름도는 기존 Procurize 워크플로에 RAG가 어디에 들어가는지를 고수준으로 보여줍니다.

```mermaid
graph LR
    A["Questionnaire Item"] --> B["RAG Service"]
    B --> C["Retriever (Vector Store)"]
    C --> D["Top‑k Evidence Snippets"]
    D --> E["LLM Generator"]
    E --> F["Draft Answer with Citations"]
    F --> G["Procurize Review UI"]
    G --> H["Final Answer Stored"]
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style G fill:#bbf,stroke:#333,stroke-width:2px
```

**핵심 통합 포인트**

* **트리거** – 사용자가 답변이 없는 설문 항목을 열면 Procurize가 질문 텍스트를 RAG 마이크로서비스에 전송합니다.  
* **컨텍스트 강화** – Retriever는 보통 *k*개(3‑5개) 정도의 가장 관련성 높은 증거 청크를 가져오며, 각 청크는 안정적인 식별자(예: `policy:ISO27001:5.2`)로 태깅됩니다.  
* **답변 초안** – LLM은 `[policy:ISO27001:5.2]`와 같은 인라인 인용을 포함한 초안을 생성합니다.  
* **Human‑in‑the‑Loop** – 검토 UI는 인용을 강조 표시하고, 검토자가 편집·승인·거부할 수 있게 합니다. 승인된 답변은 출처 메타데이터와 함께 저장됩니다.

---

## 4. 단계별 구현 가이드

### 4.1 증거 코퍼스 준비하기

| 작업 | 도구 | 팁 |
|--------|------|------|
| **수집** | 내부 문서 저장소(Confluence, SharePoint) | 컴플라이언스 아티팩트를 위한 단일 진실 소스 폴더 유지. |
| **정규화** | Pandoc, 커스텀 스크립트 | PDF, DOCX, markdown을 텍스트로 변환하고 헤더·푸터 제거. |
| **태깅** | YAML front‑matter, 메타데이터 서비스 | `type: policy`, `framework: SOC2`, `last_modified`와 같은 필드 추가. |
| **버전 관리** | Git LFS 또는 불변 버전을 지원하는 DMS | 각 청크의 감사 가능성을 보장. |

### 4.2 벡터 인덱스 구축

```python
from sentence_transformers import SentenceTransformer
import faiss, json, glob, os

model = SentenceTransformer('all-MiniLM-L6-v2')
docs = []   # (id, text) 튜플 리스트
for file in glob.glob('compliance_corpus/**/*.md', recursive=True):
    with open(file, 'r') as f:
        content = f.read()
        doc_id = os.path.splitext(os.path.basename(file))[0]
        docs.append((doc_id, content))

ids, texts = zip(*docs)
embeddings = model.encode(texts, show_progress_bar=True)

dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim)
index.add(embeddings)

faiss.write_index(index, 'compliance.index')
```

*벡터 ID와 문서 메타데이터 매핑을 가벼운 NoSQL 테이블에 저장해 빠르게 조회할 수 있도록 합니다.*

### 4.3 RAG 서비스 배포

마이크로서비스 구성 예시:

* **FastAPI** – Procurize와 HTTP 통신.  
* **FAISS** – 프로세스 내부 벡터 검색(또는 외부 gRPC).  
* **OpenAI / Anthropic LLM** – 생성 엔드포인트(또는 자체 호스팅 LLaMA).  
* **Redis** – 최근 질의 캐시로 레이턴시 감소.

```python
from fastapi import FastAPI, Body
import openai, numpy as np

app = FastAPI()

@app.post("/answer")
async def generate_answer(question: str = Body(...)):
    q_emb = model.encode([question])
    distances, idx = index.search(q_emb, k=4)
    snippets = [texts[i] for i in idx[0]]
    prompt = f"""Question: {question}
Evidence:\n{chr(10).join(snippets)}\nAnswer (cite sources):"""
    response = openai.Completion.create(
        model="gpt-4o-mini", prompt=prompt, max_tokens=300)
    return {"answer": response.choices[0].text.strip(),
            "citations": idx[0].tolist()}
```

### 4.4 Procurize UI에 연동하기

*각 설문 필드 옆에 “AI로 생성” 버튼 추가.* 클릭 시:

1. RAG 서비스 응답을 기다리는 로딩 스피너 표시.  
2. 초안이 답변 텍스트 박스에 자동 삽입.  
3. 인용 배지를 렌더링; 배지를 클릭하면 원본 문서 미리보기가 팝업됩니다.  

### 4.5 검증 및 지속 학습

* **Human Review** – AI 생성 답변은 반드시 최소 한 명의 컴플라이언스 엔지니어가 승인해야 합니다.  
* **Feedback Loop** – 승인·거부 신호를 “review outcomes” 테이블에 저장.  
* **Fine‑tuning** – 승인된 QA 쌍을 주기적으로 LLM에 파인튜닝해 환상 발생을 감소시킵니다.  

---

## 5. 보안·프라이버시 고려사항

| 우려 사항 | 완화 방안 |
|-----------|------------|
| **데이터 유출** – 임베딩이 민감 텍스트를 노출할 가능성 | 로컬 임베딩 모델 사용; 원본 문서를 외부 API에 전송하지 않음. |
| **모델 인젝션** – 악성 질의로 LLM을 오도 | 입력 검증 및 허용된 질문 패턴 화이트리스트 적용. |
| **출처 변조** – 답변 생성 후 소스 ID가 조작될 위험 | 불변 원장(AWS QLDB 또는 블록체인)에 소스 ID 저장. |
| **규제 감사** – AI 사용 증명 필요 | 모든 RAG 요청을 타임스탬프, 검색 청크 해시, LLM 버전과 함께 로깅. |
| **접근 제어** – 권한이 있는 사용자만 RAG 호출 가능 | Procurize RBAC와 연동하고 AI 생성 작업에 MFA 적용. |

---

## 6. 효과 측정

중간 규모 SaaS 기업(엔지니어 150명) 파일럿 결과 6주 동안 다음과 같은 지표가 도출되었습니다.

| 지표 | RAG 도입 전 | RAG 도입 후 | 개선율 |
|--------|------------|-----------|-------------|
| 평균 답변 초안 시간 | 12 분 | 1.8 분 | 85 % 감소 |
| 수동 인용 오류 비율 | 27 % | 4 % | 85 % 감소 |
| 1차 검토 승인율 | 58 % | 82 % | +24 pp |
| 분기별 컴플라이언스 비용 | $120k | $78k | $42k 절감 |

위 수치는 RAG가 응답 속도를 크게 높일 뿐 아니라 답변 품질을 향상시켜 감사 마찰을 줄여줌을 보여줍니다.

---

## 7. 향후 확장 방향

1. **동적 위험 점수** – 증거의 최신성을 기반으로 위험 점수를 조정하는 엔진과 RAG 결합.  
2. **멀티모달 검색** – 스크린샷, 설정 파일, Terraform 상태 등 비텍스트 자산도 검색 대상에 포함.  
3. **크로스 조직 지식 그래프** – 자회사 간 증거를 연결해 글로벌 정책 일관성 확보.  
4. **실시간 정책 변경 알림** – 원본 문서가 변경되면 영향을 받는 설문 답변을 자동으로 플래그 지정.  

---

## 8. 시작 체크리스트

- [ ] 모든 컴플라이언스 아티팩트를 단일 버전 관리 저장소에 정리.  
- [ ] 벡터 스토어(FAISS, Milvus, Pinecone) 선택 후 임베딩 생성.  
- [ ] 내부 네트워크 뒤에 RAG 마이크로서비스(FastAPI + LLM) 배포.  
- [ ] “AI로 생성” 버튼 및 인용 렌더링을 포함하도록 Procurize UI 확장.  
- [ ] 인간 검토 및 피드백 수집을 위한 거버넌스 정책 정의.  
- [ ] 위험도가 낮은 설문 항목에 파일럿 적용; 리뷰 피드백 기반 반복 개선.  

이 로드맵을 따라가면 **수동·반응적인** 설문 처리 방식을 **능동적·AI 증강** 운영으로 전환해, 클릭 한 번으로 신뢰할 수 있는 증거를 제공할 수 있습니다.

---

## 참고 자료

- [Retrieval‑Augmented Generation: The Next Wave of Enterprise AI](https://arxiv.org/abs/2005.11401)  
- [FAISS: Efficient Similarity Search and Clustering of Dense Vectors](https://github.com/facebookresearch/faiss)  
- [OpenAI Cookbook – Prompt Engineering for Retrieval‑Augmented Generation](https://github.com/openai/openai-cookbook)