RAG 파이프라인이 올바른 문서를 성공적으로 검색했습니다. 하지만 해당 문서는 검색 결과 목록의 7번째 자리에 위치해 있습니다. LLM은 상위 5개 문서만 읽도록 설정되어 있습니다. 결국 LLM이 생성하는 답변은 엉뚱한 SOP(표준작업지침서)를 바탕으로 작성됩니다. 어휘와 구조는 매우 유사하지만, 규제 요구사항은 완전히 다른 문서입니다.
이것이 바로 ‘리랭킹(Reranking)’ 문제입니다. “일탈 처리(deviation handling)“라는 문구가 200개의 문서에 등장하고, “CAPA 효과성(CAPA effectiveness)“이 모든 품질 시스템 절차서에 명시되어 있는 생명과학 품질 관리 분야에서, 리랭킹은 기본 검색 파이프라인이 구축된 후 실행할 수 있는 가장 높은 ROI(투자 대비 효과)를 지닌 개선책입니다.
품질 문서에서 벡터 검색이 실패하는 이유
임베딩 기반 검색을 구동하는 바이인코더(Bi-encoder) 모델은 질의(Query)와 각 문서를 별도로 인코딩합니다. 각각이 하나의 벡터로 압축되며, 이렇게 압축된 표현 간의 유사도를 계산합니다.
이 방식은 빠릅니다. 수백만 건의 문서로 확장 가능합니다. 그리고 GxP 말뭉치(Corpus)에서 60~70% 수준의 정밀도(Precision)를 달성합니다.
그러나 이것만으로는 충분하지 않습니다. 그 이유는 다음과 같습니다:
어휘 중복(Vocabulary overlap): SOP, 일탈(Deviation), CAPA, 변경 관리(Change Control) 문서는 방대한 전문 용어를 공유합니다. “조사(Investigation)“라는 단어는 일탈 SOP, CAPA 절차서, 불만 처리 지침, 기준일탈(OOS) 조사 가이드 등에 두루 등장합니다. 바이인코더는 임베딩 유사도만으로는 이들을 정밀하게 구분하지 못합니다.
부정어 인식 불가(Negation blindness): “Grade A 클린룸에는 적용되지 않음(Not for Grade A cleanrooms)“과 “Grade A 클린룸 적용(for Grade A cleanrooms)“은 거의 동일한 임베딩 벡터를 생성합니다. 전자는 적용 범위 제외 규정이고, 후자는 필수 준수 요구사항입니다. 잘못된 문서를 전달받은 LLM은 존재하지도 않는 컴플라이언스 의무를 지어내는 환각(Hallucination)을 일으키게 됩니다.
섹션 세부 특이성(Section specificity): SOP-QA-015의 §5.1.2와 §5.1.3은 단 한 문장만 다를 수 있습니다. 하나는 주의 기준(Alert limits)을 설명하고, 다른 하나는 조치 기준(Action limits)을 설명합니다. 두 섹션 간의 임베딩 거리는 무시할 수 있을 정도로 작지만, 이를 혼동했을 때 발생하는 규제적 파장은 결코 사소하지 않습니다.
메타데이터 인식 한계(Metadata blindness): 더블린 공장의 SOP와 싱가포르 공장의 SOP에 포함된 동일한 텍스트라도 유효일자, 승인된 개정판(Revision), 사이트별 별첨(Annex) 규정이 서로 다를 수 있습니다. 하지만 벡터 자체는 동일합니다.
비규제 분야에서는 70% 수준의 정밀도도 대체로 수용 가능하며, LLM이 문맥을 통해 적절히 판단할 수 있습니다. 그러나 엄격한 인용 추적성이 요구되는 GxP 환경에서는 95% 이상의 정밀도가 반드시 필요합니다. 리랭킹은 바로 이 격차를 좁혀주는 핵심 기술입니다.
리랭킹의 작동 원리
리랭커는 질의와 후보 문서를 하나의 쌍(Pair)으로 함께 입력받아 관련도 점수(Relevance score)를 출력합니다. 바이인코더와 달리, 리랭커는 질문의 모든 토큰과 문서의 모든 토큰을 나란히 놓고 동시에 참조합니다. 단순한 벡터 유사도를 넘어 토큰 간의 상호작용(Interaction)을 포착합니다.
채용의 2단계 전형에 비유할 수 있습니다:
5,000 resumes → Keyword screen → 200 candidates → Human reads each → Top 10
RAG 역시 동일한 메커니즘으로 동작합니다:
Millions of chunks → Bi-encoder (fast, shallow) → Top 100 → Reranker (slow, deep) → Top 5 → LLM
바이인코더는 속도를 위해 설계되었습니다. 리랭커는 정확도를 위해 설계되었습니다. 결과적으로 LLM은 엄선된 상위 5개의 최적 문서만을 전달받게 됩니다.
리랭커 분류 체계(Taxonomy)
모든 리랭커가 동일한 방식으로 동작하는 것은 아닙니다. 로컬 RTX 4090 환경을 기준으로 한 구체적인 모델과 성능 특성을 포함하여 4가지 주요 계열을 정리했습니다:
크로스 인코더 리랭커 (Cross-Encoder Rerankers)
프로덕션 환경의 실질적인 주력 모델입니다. 트랜스포머 모델이 [query, document]를 하나로 결합된 단일 입력으로 받아 스칼라 관련도 점수를 출력합니다. 질의와 문서의 모든 토큰 전반에 걸쳐 완전한 셀프 어텐션(Full self-attention)을 수행합니다.
| 모델 | VRAM | 지연 시간 (100개 문서) | 비고 |
|---|---|---|---|
BAAI/bge-reranker-v2-m3 |
2.3 GB | 110 ms | 기본 권장 모델. 다국어 지원. 최대 8,192 토큰 지원. |
mixedbread-ai/mxbai-rerank-base-v1 |
1.1 GB | 60 ms | 최고 속도. 배치 처리에 적합. |
BAAI/bge-reranker-large |
1.3 GB | 80 ms | BGE 계열 중 최고 정확도. |
cross-encoder/ms-marco-MiniLM-L-6-v2 |
0.1 GB | ~0.5 ms/pair | 베이스라인. 초경량. |
크로스 인코더는 **결정론적(Deterministic)**입니다. 즉, 동일한 입력에 대해 언제나 동일한 점수를 산출합니다. 이는 GxP 환경에서 대단히 중요한 강점입니다. 샘플링이나 무작위 변동성이 없으며, 시스템이 어떤 근거로 판단을 내렸는지에 대한 모호성이 전혀 존재하지 않습니다.
ColBERTv2 (후기 상호작용, Late Interaction)
ColBERT는 질의와 패시지(Passage)를 독립적으로 인코딩하지만(바이인코더와 유사), 점수 계산 시점에 MaxSim 연산을 활용하여 미세한 **토큰 수준(Token-level)**의 상호작용을 계산합니다. 속도와 품질 간의 트레이드오프에서 바이인코더와 크로스 인코더의 중간 지점에 위치합니다.
| 모델 | VRAM | 지연 시간 (100개 문서) | 비고 |
|---|---|---|---|
colbert-ir/colbertv2.0 |
3 GB | 80 ms | 토큰 수준 세분성. 사전 계산 가능한 임베딩. |
토큰 수준의 기여도(Attribution) 분석은 긴 SOP 문서를 다룰 때 독보적인 가치를 발휘합니다. 동일하게 검색된 청크 안에 §4.2.1과 §4.2.2가 함께 포함되어 있더라도, ColBERT는 §4.2.1만 관련이 있고 §4.2.2는 관련이 없음을 정확히 식별해낼 수 있습니다. 또한 단일 모델로 검색기(Retriever)와 리랭커(Reranker) 역할을 동시에 수행할 수 있습니다.
LLM 기반 리랭킹 (LLM-Based Reranking)
로컬 LLM을 관련도 판정관(Judge)으로 활용하는 방식입니다. 크게 두 가지 접근법이 있습니다:
포인트와이즈(Pointwise): LLM이 각 (query, passage) 쌍을 0~10점 척도로 평가합니다. 후보 문서당 한 번씩 LLM을 호출하므로 속도는 느리지만 도메인 추론 능력을 온전히 활용할 수 있습니다.
리스트와이즈(Listwise): LLM이 5~10개의 후보 문서 윈도우를 한 번에 전달받아 정렬된 순위 목록을 출력합니다. 문서당 처리 속도는 더 빠르지만, 후보군 규모가 클 경우 윈도우 병합(Window merging) 절차가 필요합니다.
| 유형 | 모델 | VRAM | 지연 시간 (10개 문서) | 비고 |
|---|---|---|---|---|
| Pointwise | 평가관으로서의 Qwen2.5 7B | 5 GB | 800 ms | 중요 질의를 위한 최종 정밀도 검문소. |
| Listwise | Qwen2.5 7B 리스트와이즈 | 5 GB | 300 ms | 순위 결정 논리가 중요한 경우. |
LLM 리랭킹은 크로스 인코더 리랭킹보다 50~100배 느립니다. 따라서 크로스 인코더 점수 매기기를 대체하는 용도가 아니라, 오류 허용도가 극히 낮은 고위험 질의에서 마지막 10개 후보를 5개로 압축하는 최종 선별 단계에 한정하여 적용해야 합니다.
DSPy 최적화 리랭킹 (DSPy-Optimized Reranking)
dspy.Module로 정의하고 라벨링된 데이터를 기반으로 최적화한 리랭커입니다. 컴파일된 결과물은 버전 관리되는 동결된 아티팩트(Frozen artifact)가 됩니다. 리랭킹 로직이 더 이상 수작업으로 미세 조정한 프롬프트가 아니라 검증 가능하고 재현 가능한 정식 프로그램이 되므로, GxP 관점에서 가장 적합한 접근법입니다.
class GxPReranker(dspy.Module):
def __init__(self, top_k=5):
super().__init__()
self.top_k = top_k
self.cross_reranker = FlagReranker("BAAI/bge-reranker-v2-m3", use_fp16=True)
self.query_rewriter = dspy.ChainOfThought("query -> rewritten_query")
def forward(self, query, passages):
rewritten = self.query_rewriter(query=query).rewritten_query
pairs = [[rewritten, p["text"]] for p in passages]
scores = self.cross_reranker.compute_score(pairs, normalize=True)
scored = sorted(zip(passages, scores), key=lambda x: x[1], reverse=True)
return dspy.Prediction(
context=[p for p, _ in scored[:self.top_k]],
scores=[s for _, s in scored[:self.top_k]],
)
라벨링된 골든 세트(Golden set)를 바탕으로 BootstrapFewShot을 통해 컴파일하고, 산출된 JSON 아티팩트를 저장한 뒤 모델 레지스트리(Model Registry)에 동결 보관합니다. 소프트웨어를 컴파일하는 패턴과 동일합니다. DSPy가 컴파일러 역할을 하고, 동결된 JSON 파일이 바이너리 실행 파일 역할을 수행합니다.
RTX 4090을 위한 권장 캐스케이드(Cascade)
24 GB VRAM을 갖춘 GPU 환경에서는 다음과 같은 3단계 캐스케이드를 모두 로컬에서 300 ms 이내의 지연 시간으로 완벽하게 구동할 수 있습니다:
Query
→ Bi-encoder retrieval (BGE-base) 100 docs 30 ms 0.5 GB VRAM
→ Cross-encoder rerank (bge-reranker-v2-m3) 10 → 5 120 ms 2.3 GB VRAM
→ LLM generation (Qwen 7B via vLLM) answer ~500 ms 5.0 GB VRAM
Total: ~650 ms 7.8 GB VRAM
이렇게 구성해도 16 GB의 VRAM 여유 공간이 남습니다. 배치 처리, 동시 요청 처리, 또는 더 큰 생성 모델을 구동하기에 충분한 용량입니다.
상위 10개에서 5개로 좁히는 4번째 선택 단계인 LLM 리스트와이즈 리랭킹을 추가할 경우 약 150 ms의 지연 시간과 5 GB의 VRAM이 추가로 소요됩니다. 보유한 SOP 말뭉치에서 크로스 인코더의 nDCG@5 점수가 0.85 미만으로 떨어지는 경우에만 이 단계를 도입하십시오. 일반적으로 크로스 인코더 단독으로도 0.850.88 수준에 도달할 수 있습니다. LLM 리스트와이즈 단계는 이를 0.91 이상으로 끌어올릴 수 있지만, 46%의 성능 향상을 위해 검색 지연 시간이 2배로 증가하게 됩니다.
품질 문서를 위한 고급 전략
계층적 청킹 (토큰 기반이 아닌 구조 기반)
SOP를 단순 토큰 수 기준으로 자르지 마십시오. 문서의 고유 계층 구조에 따라 청킹해야 합니다:
SOP-MFG-010 v4.2
→ Section 4.2
→ Paragraph 4.2.1 (one retrievable unit)
Metadata: {sop_id, version, section, product, site, effective_date}
먼저 섹션(Section) 수준에서 리랭킹을 수행한 뒤, 단락(Paragraph) 단위로 확장하십시오. 이렇게 하면 절차적 맥락(예: 2단계를 모르면 3단계를 이해할 수 없음)을 온전히 보존할 수 있으며, 평면적인 토큰 기반 청킹 대비 nDCG를 약 15% 향상시킬 수 있습니다.
작업자 질의를 위한 HyDE
현장 작업자는 “주사기에 이상한 거품이 있음”과 같이 일상 언어로 질문을 작성합니다. 하지만 SOP에는 “공기 방울 저감 조치: 3회 퍼지 수행 후 육안 검사 프로토콜에 따라 점검”이라고 기술되어 있습니다. 이 둘 사이의 어휘 격차는 대단히 큽니다.
이때 LLM을 활용해 가상의 SOP 단락을 먼저 생성한 후, 생성된 가상 텍스트를 원본 질의와 결합하여 검색을 수행합니다:
class HydeQuery(dspy.Signature):
deviation: str = dspy.InputField()
hypothetical_sop: str = dspy.OutputField()
hyde = dspy.ChainOfThought(HydeQuery)
hypo = hyde(deviation="weird bubbles in syringe").hypothetical_sop
# retrieve with hypo + original query
가상으로 생성된 단락은 작업자 언어와 SOP 규정 언어 사이의 어휘 격차를 메워줍니다. 이를 원본 질의와 결합하여 문서를 검색한 뒤, 일반적인 절차대로 리랭킹을 거칩니다.
메타데이터 인식 점수 산정 (Metadata-Aware Scoring)
크로스 인코더 점수만으로는 GxP 요건을 완전히 충족하기 어렵습니다. 특정 단락이 의미적으로는 완벽히 일치하더라도, 엉뚱한 제조 사이트나 다른 제품, 혹은 이미 효력이 상실된 구버전 개정판의 문서일 수 있기 때문입니다. 따라서 크로스 인코더 점수 위에 메타데이터 신호를 가산해야 합니다:
Final Score = 0.6 × cross_encoder_score
+ 0.3 × metadata_match
+ 0.1 × recency_boost
여기서 metadata_match는 제품(Product)과 제조 사이트(Site)가 일탈 정황과 일치할 때 1.0이 부여되며, recency_boost는 개정 폐기된 이전 버전보다 현재 유효 승인된 최신 개정판에 가중치를 부여합니다.
적응형 Top-K (Adaptive Top-K)
질의 유형에 따라 요구되는 정밀도/재현율 트레이드오프가 달라집니다:
- OOS / OOT 조사: top_k = 3. 잘못된 문서가 포함될 때마다 조사관의 시간을 낭비시키고 근본 원인 분석(RCA)을 왜곡할 위험이 있습니다.
- CAPA 효과성 검색: top_k = 15. 과거 시정 조치 이력을 폭넓게 조망해야 합니다.
- 규제 당국 제출 문서 지원: top_k = 5 및 LLM 리스트와이즈 리랭킹 적용. 응답 지연 시간이 다소 늘어나더라도 최고 수준의 정밀도를 확보해야 합니다.
top_k 값을 코드에 하드코딩하지 말고, 정책 레지스트리(Policy Registry)에서 동적으로 설정할 수 있는 매개변수로 관리하십시오.
점수 격차 감지 (Score Gap Detection)
항상 정해진 top_k 개수만큼만 문서를 반환할 필요는 없습니다. 점수가 [0.98, 0.97, 0.96, 0.95, 0.42]로 나타난다면 4개의 문서만 반환하십시오. 5번째 문서는 노이즈일 가능성이 높습니다. 반면 점수가 [0.82, 0.81, 0.80, 0.79, 0.78]과 같이 고르게 분포되어 명확한 차단 기준이 없다면 5개 문서를 모두 반환합니다. 이러한 적응형 접근 방식은 생성 LLM에 유입되는 컨텍스트 노이즈를 효과적으로 줄여줍니다.
평가 프레임워크
골든 데이터셋 (The Golden Dataset)
QA 도메인 전문가(SME)의 자문을 받아 100~500개의 질의로 구성된 골든 평가 세트를 구축하십시오. 각 데이터 항목은 질의, 메타데이터 필터, 그리고 골든 기준 문서 ID를 포함합니다:
{
"query": "HVAC pressure differential low Grade B cleanroom",
"gold_ids": ["SOP-ENV-003#5.1"],
"meta_filter": {"site": "Dublin"}
}
이 데이터셋은 1석 3조의 역할을 합니다: DSPy 최적화 학습 세트, 지속적인 회귀 테스트 스위트, 그리고 OQ 밸리데이션 객관적 증거 자료로 활용됩니다. 단 하나의 데이터셋으로 세 가지 컴플라이언스 결과물을 달성할 수 있습니다.
핵심 평가지표
nDCG@5 (Normalized Discounted Cumulative Gain, 정규화 할인 누적 이득)는 랭킹 품질을 측정합니다. 정답 문서가 상위 5위 안에 포함되었는지뿐만 아니라, 1위에 위치하는지 5위에 위치하는지까지 엄밀하게 평가합니다.
Safety Recall@5 (안전 재현율)는 정답 문서가 상위 5위 이내에 존재하는지 여부를 측정합니다. GxP 환경에서는 엉뚱한 문서를 포함하는 것보다 올바른 SOP를 아예 누락하는 것이 훨씬 위험합니다. 조사관에게 오도된 신호조차 주지 못하고 완전히 빈손으로 만들 수 있기 때문입니다.
End-to-End Answer Accuracy (엔드투엔드 답변 정확도)는 리랭킹된 컨텍스트를 바탕으로 최종 LLM이 정확하고 인용 가능한 답변을 생성하는지를 측정합니다. 규제 당국이 궁극적으로 가장 면밀히 들여다보는 지표가 바로 이것입니다.
RTX 4090 기준 예상 성능
| 단계 | 지표 | 목표치 |
|---|---|---|
| 바이인코더 단독 (상위 100개) | Recall@100 | > 0.92 |
| 크로스 인코더 리랭킹 후 | nDCG@5 | > 0.85 |
| LLM 리스트와이즈 리랭킹 후 | nDCG@5 | > 0.91 |
크로스 인코더의 nDCG@5가 0.85를 초과한다면 LLM 리스트와이즈 단계는 생략해도 무방합니다. 만약 0.85에 미치지 못한다면 리스트와이즈 단계를 추가하십시오. 지연 시간이 2배로 증가하지만 4~6%의 품질 향상을 기대할 수 있습니다.
GxP 밸리데이션 요구사항
모델 버전 관리 및 변경 관리 (Change Control)
리랭커 모델의 명칭, 버전, 가중치 해시(Hash)를 모델 레지스트리(Model Registry)에 동결하십시오. bge-reranker-v2-m3에서 v2-m4로 교체하는 작업은 엄연한 변경 관리(Change Control) 대상입니다. 비즈니스 요구사항을 문서화하고, 골든 세트 평가를 재수행하며, 밸리데이션 패키지를 갱신하고, IQ/OQ/PQ를 재실행해야 합니다.
결정론성 (Determinism)
크로스 인코더는 본질적으로 결정론적(Deterministic)입니다. 동일한 입력에 대해 매번 동일한 점수를 산출합니다. 반면 LLM 기반 리랭커는 temperature=0.0 및 seed=42로 엄격히 고정하지 않는 한 비결정론적 특성을 보입니다. 밸리데이션 대상 프로덕션 시스템에서는 가급적 크로스 인코더를 프로덕션 경로에 채택하십시오. LLM 리랭킹은 개발 및 최적화 단계 위주로 활용하는 것이 바람직합니다.
감사 추적 (Audit Trail)
모든 리랭킹 판단 결과를 상세히 기록하십시오:
{
"query_hash": "a3f2c...",
"timestamp": "2026-07-27T10:30:00Z",
"user": "investigator@site.com",
"retrieved_ids": ["SOP-001", "SOP-002", "SOP-003"],
"rerank_scores": [0.94, 0.87, 0.72],
"final_ids": ["SOP-001", "SOP-003"],
"model_version": "bge-reranker-v2-m3",
"model_hash": "sha256:..."
}
실사관(Inspector)은 과거에 수행된 특정 질의에 대해 당시의 정확한 랭킹 순위를 그대로 재현할 수 있어야 합니다. 이 로깅 메커니즘은 구현 비용이 거의 들지 않으면서도 실사 및 감사 과정에서 엄청난 위력을 발휘합니다.
온라인 학습 금지 (No Online Learning)
프로덕션 환경에서 크로스 인코더 가중치를 실시간으로 업데이트해서는 안 됩니다. 모든 최적화는 골든 데이터셋을 기반으로 오프라인에서 수행되어야 하며, 컴파일된 아티팩트를 동결한 뒤 이 동결된 버전만을 프로덕션에서 실행해야 합니다. 이는 DSPy의 컴파일-동결-검증(Compile-Freeze-Validate) 사이클과 일맥상통하는 원칙입니다.
밸리데이션 증거 (Validation Evidence)
IQ/OQ 단계에서 가장 강력한 설득력을 갖는 증거는 골든 데이터셋을 대상으로 한 도입 전/후 비교 데이터입니다:
- 리랭커 미적용 파이프라인: Precision@3 = 60%
- 리랭커 적용 파이프라인: Precision@3 = 95%
60%에서 95%로의 수치적 도약은 리랭커가 검색 품질을 혁신적으로 개선하고 환각 위험을 획기적으로 낮췄음을 입증하는 가장 명확한 증거입니다. 이 단 하나의 수치 변화가 모든 정당성을 대변합니다.
아키텍처 내 리랭킹의 위치
리랭킹은 AI 하네스의 계층 2(초기 검색과 생성 계층으로의 전달 사이)에 위치합니다. 리랭킹은 LLM 서브에이전트 내부에서 직접 실행되지 않습니다. LLM이 참조하게 될 컨텍스트를 사전에 엄격히 통제하는 결정론적 전처리 단계입니다.
User Question
│
▼
Query Expansion (HyDE or DSPy rewrite)
│
▼
Hybrid Retrieval (Vector + BM25 + Metadata Filters)
│
▼
Top 100 Candidates
│
▼
Cross-Encoder Rerank ← 현재 위치 (You are here)
│
▼
Metadata & Business Rule Scoring
│
▼
Dynamic Top-K Selection
│
▼
Context Builder → LLM → Answer with Citations
밸리데이션 관점에서 중요한 두 가지 아키텍처적 시사점이 있습니다:
- 통제 대상 구성요소로서 리랭커 모델의 버전을 관리하십시오. 모델을 교체하는 것은 변경 관리(Change Control) 대상이며 재밸리데이션 델타 평가가 요구됩니다.
- 최종 검색된 청크뿐만 아니라 리랭커 점수도 감사 추적에 함께 기록하십시오. 감사관이 “왜 이 CAPA 질의에 이 특정 SOP 섹션이 검색되었는가?“라고 질문했을 때, “벡터 검색이 찾아냈기 때문”이라는 모호한 답변 대신 정량적인 리랭킹 점수를 명확한 근거로 제시할 수 있어야 합니다.
시작하기
처음에는 크로스 인코더 리랭킹부터 시작하십시오. 단 하나의 추가 모델(2.3 GB VRAM)과 단 하나의 추가 처리 단계(질의당 110 ms)만 필요합니다. 정밀도 개선 효과는 즉각적이고 극적입니다.
pip install FlagEmbedding faiss-gpu sentence-transformers
다음 단계로 골든 데이터셋을 구축하십시오. QA 팀과 협력하여 올바른 정답 라벨이 부착된 100개의 실제 질의를 수집합니다. 이는 최적화, 밸리데이션, 회귀 테스트의 확고한 토대가 되며, OQ 증거 패키지의 핵심 뼈대가 됩니다.
보유한 특정 말뭉치에서 크로스 인코더 단독으로 nDCG@5 > 0.85를 달성하지 못할 때만 LLM 리스트와이즈 리랭킹을 추가하십시오. 대부분의 SOP 중심 말뭉치에서는 크로스 인코더만으로도 목표치를 충분히 달성할 수 있습니다. LLM 단계는 필수 조건이 아니라 일종의 안전장치(보험)입니다.
목표는 가장 복잡하고 현란한 검색 파이프라인을 구축하는 것이 아닙니다. 규제 당국이 투명하게 감사할 수 있고, QA 팀이 안심하고 신뢰할 수 있으며, 정확한 답변이 절실한 순간 조사관이 믿고 기댈 수 있는 견고한 파이프라인을 구축하는 것입니다.
Saram Consulting