Azure

[Azure] RAG Search Landscape 2026 —RAG 대체 뭘로 구현해야해요?! (진심)

rubrub 2026. 9. 4. 02:56

RAG INFRA · VECTOR SEARCH · ENTERPRISE SECURITY

RAG의 검색 엔진은 무엇을 써야 할까?
Azure AI Search부터 Bedrock, pgvector, Elasticsearch까지

RAG를 처음 만들 때는 검색 계층이 단순해 보인다. 문서를 쪼개고, 임베딩하고, Vector DB에 넣고, 질문과 가까운 청크를 몇 개 가져오면 끝. 그런데 실제 금융권 서비스까지 가면 검색 엔진 선택은 곧 보안 모델·권한 체계·메타데이터 설계·운영 비용·장애 대응·평가 방법을 선택하는 일이 된다. 이 글에서는 Azure AI Search, Amazon Bedrock Knowledge Bases와 OpenSearch, PostgreSQL/pgvector, Elasticsearch, 그리고 Google Cloud의 Vector Search/AlloyDB까지 같은 보험 RAG 시나리오에 올려놓고 기술적으로 비교해본다.

먼저 결론부터: 서로 같은 종류의 제품이 아니다 Azure AI Search / OpenSearch / Elasticsearch는 검색 엔진에 가깝고, PostgreSQL + pgvector는 관계형 데이터베이스 안에 vector retrieval을 넣은 구조다. 반면 Amazon Bedrock Knowledge Bases는 ingestion·chunking·embedding·retrieval·reranking을 묶는 managed RAG layer이고 그 아래에 OpenSearch Serverless나 Aurora PostgreSQL 같은 vector store를 둔다. 따라서 “누가 벡터 검색이 더 빠른가?”만 비교하면 애초에 비교 단위가 틀린다.
RAG 검색 제품을 ‘계층’으로 나눠야 한다Managed RAG / Knowledge LayerAmazon Bedrock Knowledge Bases · Azure AI Search Agentic Retrieval · Google Agent Search/RAG EngineSearch EngineAzure AI SearchOpenSearch · ElasticsearchRelational + VectorPostgreSQL + pgvectorAurora · Azure PG · AlloyDBPurpose-built VectorVertex AI Vector SearchPinecone · S3 Vectors 등검색 기능을 깊게 튜닝SQL·JOIN·RLS가 핵심대규모 ANN을 단순하게금융권에서는 “검색 성능” + “권한과 데이터 모델”을 같이 봐야 한다.
Bedrock Knowledge Bases와 pgvector를 한 줄에 놓고 “누가 더 좋은 Vector DB인가?”라고 묻는 순간 비교가 틀어지기 시작한다.

비교에 사용할 하나의 현실적인 보험 RAG 시나리오

추상적으로 비교하면 결국 “각 제품마다 장점이 있습니다”로 끝난다. 그래서 보험 약관 RAG를 하나 가정해보자. 동일한 상품명이라도 가입일자와 개정 시점에 따라 약관이 다르고, 특약마다 보장 조건이 다르며, 고객이 가입한 계약의 상품 코드와 판매 채널까지 알아야 정확한 문서를 찾을 수 있는 상황이다.

# 검색 전에 이미 알고 있는 고객/계약 context
retrieval_context = {
    "tenant_id": "life-korea",
    "product_code": "WL-2024-A",
    "rider_codes": ["CI01", "SURG03"],
    "contract_date": "2024-03-18",
    "sales_channel": "FC",
    "customer_acl_groups": ["policy-holder", "customer-app"],
    "query": "암 진단을 받으면 얼마를 보장받나요?"
}

이 경우 검색은 “암 진단”과 의미가 비슷한 청크를 찾는 것만으로 끝나지 않는다. 상품 코드 → 가입일에 유효한 약관 버전 → 가입 특약 → 사용자 권한을 먼저 만족한 문서 안에서 의미 검색을 해야 한다. 이처럼 structured filter가 강할수록 검색 제품의 차이가 크게 드러난다.

금융 RAG에서 가장 위험한 실수 “Vector top-50을 먼저 뽑고 나중에 상품코드·가입일·권한으로 걸러내자”는 설계다. ANN 후보 50개 안에 정답 약관이 애초에 들어오지 않았다면 사후 필터는 정답을 복구하지 못한다. 특히 권한 필터는 검색 결과를 LLM에 넘긴 뒤 적용하면 보안 사고가 된다.
금융권 도입 사례를 볼 때 한 가지 주의 공개된 고객 사례만으로 “국내 금융권은 Azure AI Search를 더 많이 쓴다”, “Bedrock이 금융권 표준이다”처럼 시장 채택 수준을 단정하기는 어렵다. 각 회사의 내부 아키텍처와 검색 계층은 공개되지 않는 경우가 많고, PoC와 실제 고객 데이터 production 사용도 구분하기 어렵다. 따라서 이 글은 도입 건수보다 공식 문서에서 확인 가능한 보안 통제와 운영 구조를 중심으로 비교한다. 확실히 말할 수 있는 것은 주요 cloud managed service 모두 private networking, workload identity, encryption-at-rest, audit/monitoring을 위한 기본 수단을 제공한다는 점이고, 실제 차이는 retrieval 전에 사용자·문서 권한을 얼마나 강하게 적용할 수 있는가, 그리고 그 통제를 누가 운영하는가에서 드러난다.

RAG 검색 품질은 사실 5단계 문제다

금융권에서 권장하는 Retrieval Pipeline
0. Authorization
ACL · Tenant · 상품 자격
→
1. Hard Filter
가입일 · 상품 · 버전
→
2. Candidate
BM25 + Vector
→
3. Rerank
Semantic/Cross Encoder
→
4. Validate
근거 · 날짜 · 원문

검색 엔진은 주로 1~3단계를 담당한다. 그런데 제품마다 강한 위치가 다르다. Azure AI Search와 Elastic은 2~3단계의 search relevance 기능이 강하고, PostgreSQL은 0~1단계의 relational filtering과 데이터 일관성이 매우 강하다. Bedrock Knowledge Bases는 전체 과정을 managed pipeline으로 단순화하는 데 강하다.

1. Amazon Bedrock Knowledge Bases — AWS의 Managed RAG 계층

Amazon Bedrock Knowledge Bases는 AWS가 제공하는 managed RAG 계층이다. 다만 이 서비스는 Azure AI Search와 정확히 같은 검색 엔진이 아니다. Bedrock Knowledge Bases는 data source를 연결하고 chunking·embedding·vector store·retrieve·rerank를 관리해주는 RAG orchestration layer다.

S3 / SharePointConfluence 등Bedrock Knowledge BaseParse · Chunk · EmbedRetrieve · Filter · RerankAgentic RetrievalOpenSearch ServerlessHybrid search 가능Aurora PostgreSQLpgvector + SQLOther Vector StoresPinecone / Redis 등Foundation ModelGenerate
Bedrock Knowledge Bases는 자체 vector engine 하나라기보다 여러 vector store를 추상화하는 managed RAG 계층에 가깝다.

Managed KB와 Customer-managed KB의 차이

2026년 Bedrock은 Managed Knowledge Base와 Customer-managed Knowledge Base를 구분한다. Managed 쪽은 connector, smart parsing, auto scaling, document ACL awareness, agentic retrieval, observability 같은 기능을 더 많이 제공한다. 반대로 Customer-managed는 Aurora/OpenSearch 같은 underlying vector DB를 직접 선택·운영해 데이터 모델과 index 구성을 더 통제한다.

# Bedrock Knowledge Bases: boto3 Retrieve 개념 예시
response = bedrock_agent_runtime.retrieve(
    knowledgeBaseId=KB_ID,
    retrievalQuery={"text": "암 진단 보장 금액"},
    retrievalConfiguration={
        "vectorSearchConfiguration": {
            "numberOfResults": 30,
            "overrideSearchType": "HYBRID",
            "filter": {
                "andAll": [
                    {"equals": {"key": "product_code", "value": "WL-2024-A"}},
                    {"lessThanOrEquals": {"key": "effective_from", "value": "2024-03-18"}},
                    {"greaterThan": {"key": "effective_to", "value": "2024-03-18"}}
                ]
            },
            "rerankingConfiguration": {
                # Bedrock reranker configuration
            }
        }
    }
)

중요한 제약이 하나 있다. Customer-managed Knowledge Base에서 `HYBRID` search override는 모든 vector store에서 똑같이 가능한 것이 아니다. AWS API 문서상 filterable text field를 둔 OpenSearch Serverless 구성이 hybrid를 지원하는 대표 경로이고, 다른 vector store 구성은 semantic-only인 경우가 있다. 즉 Bedrock이라는 상위 abstraction이 있어도 underlying store 선택이 retrieval behavior를 바꾼다.

Bedrock Managed KB의 ACL: 편하지만 authorization은 아니다

Managed KB는 SharePoint, Confluence, Google Drive 등 connector에서 document ACL을 ingest하고 query-time에 사용자 context로 filtering할 수 있다. 하지만 AWS 공식 문서도 명확히 경고한다. 이 기능은 ACL-aware filtering이지 end-user authentication 자체가 아니다. 애플리케이션이 사용자를 인증하고 검증된 identity context를 Bedrock에 전달해야 한다.

금융권 Insight “Bedrock이 ACL을 알아서 해준다”가 아니라 App AuthN → IAM/Session → Verified User Context → KB ACL filtering의 체인이 모두 맞아야 한다. Search layer의 ACL은 identity proof가 아니므로, API Gateway나 애플리케이션 인증을 생략할 수 없다.
금융권 관점에서 Bedrock의 보안을 보면 공개된 금융권 production 채택 규모를 이 글에서 단정하기는 어렵다. 다만 공식 기능만 놓고 보면 보안 설계의 핵심은 명확하다. IAM service role로 Knowledge Base가 접근할 data source와 vector store 권한을 최소화하고, VPC/PrivateLink로 OpenSearch Serverless 등 backend 경로를 private하게 구성하며, AWS KMS customer-managed key로 managed knowledge base의 ingestion 중 임시 데이터와 indexing/retrieval용 저장 데이터를 암호화할 수 있다. Managed Knowledge Base의 ACL-aware retrieval은 문서 권한을 pre-retrieval 단계에서 반영하고 일부 connector는 실시간 권한 재검증도 지원한다. 다만 AWS가 명시하듯 이 ACL 기능 자체는 사용자를 인증하는 보안 경계가 아니므로, upstream authentication + verified user context가 반드시 먼저 와야 한다.

Bedrock KB의 사용감

빠르게 RAG를 만들 때는 매우 편하다. S3를 연결하고 embedding model과 vector store를 정하면 ingestion pipeline을 상당 부분 줄일 수 있다. 반대로 청킹, metadata normalization, custom reindex strategy, chunk lineage, 특수 reranking을 세밀하게 제어하려는 팀은 추상화가 답답할 수 있다. 금융권처럼 “왜 이 청크가 이 고객에게 검색됐는가?”를 추적하려면 managed convenience와 explainability 사이의 균형을 봐야 한다.

2. Azure AI Search — 검색 엔진 중심의 Managed RAG

Azure AI Search는 원래 엔터프라이즈 검색 서비스였고, 지금은 full-text, vector, hybrid, semantic ranking, integrated vectorization, document-level access control, agentic retrieval까지 RAG 기능이 깊게 들어와 있다. Azure 환경에서 이미 Entra ID, Private Link, Azure OpenAI를 사용하는 조직이라면 인프라와 보안 체계를 일관되게 묶기 쉬운 선택지다.

SEARCH

BM25 + HNSW + RRF

Keyword와 Vector 검색을 한 요청에서 병렬 실행하고 Reciprocal Rank Fusion으로 합친다. 상품 코드·고유명사와 자연어 의미 검색을 함께 가져가기 좋다.

RERANK

Semantic Ranker

1차 retrieval 결과를 의미 기반으로 다시 순위화할 수 있다. Hybrid + semantic ranker 조합이 Azure RAG의 대표적인 강점이다.

INGESTION

Integrated Vectorization

Indexer + Skillset으로 문서 읽기, chunking, embedding, index projection을 서비스 안에서 자동화할 수 있다.

SECURITY

Private + RBAC + CMK

Private Endpoint, Entra/RBAC, Managed Identity, CMK, 문서 권한 필터를 Azure 생태계 안에서 조합하기 쉽다.

Hybrid Search가 실제로 어떻게 동작하나

Azure의 hybrid query는 text query와 vector query를 한 요청에 넣는다. text 쪽은 BM25, vector 쪽은 HNSW 또는 exhaustive kNN을 사용하고 결과를 RRF로 병합한다. 보험처럼 “CI03”, “무배당 2024 종신보험”, “2024-03-01” 같은 exact term과 자연어 질문이 섞인 데이터에는 pure vector보다 훨씬 안정적인 경우가 많다.

# Azure AI Search: Python 개념 예시
results = search_client.search(
    search_text="암 진단 보장 금액",
    vector_queries=[
        VectorizedQuery(
            vector=query_embedding,
            k_nearest_neighbors=50,
            fields="contentVector"
        )
    ],
    filter=(
        "tenant_id eq 'life-korea' and "
        "product_code eq 'WL-2024-A' and "
        "effective_from le 2024-03-18T00:00:00Z and "
        "effective_to gt 2024-03-18T00:00:00Z"
    ),
    vector_filter_mode="preFilter",
    query_type="semantic",
    semantic_configuration_name="policy-semantic",
    top=8
)

금융권에서 정말 중요한 vectorFilterMode

Azure AI Search는 vector filter를 preFilter, postFilter, 그리고 preview인 strictPostFilter로 나눠 제어한다. 금융권의 eligibility·권한·상품 버전 필터라면 기본적으로 preFilter가 안전하다. preFilter는 각 shard의 HNSW traversal 중 조건을 적용해, 조건을 만족하는 문서 안에서 top-k를 찾는다.

Azure Filter Mode 장점 리스크 금융 RAG
preFilter 필터 조건 안에서 top-k 보장에 유리 선택도가 높으면 HNSW 탐색량 증가 권장
postFilter latency 예측이 상대적으로 쉬움 필터 일치 정답을 놓칠 수 있음 신중
strictPostFilter unfiltered global top-k의 부분집합 보장 선택적 필터에서 0건 가능 자격/보장 검색에는 비추천

Integrated Vectorization: 편하지만 ‘통제권’과 맞바꾼다

Azure AI Search의 indexer는 Blob, SQL, Cosmos DB 등의 source에서 문서를 읽고 skillset을 거쳐 chunking과 embedding을 수행한 뒤 index로 보낼 수 있다. 최근에는 Text Split뿐 아니라 Document Layout/Content Understanding 계열로 구조를 보존하는 ingestion도 가능하다. 개발자가 ingestion worker, retry, vectorization queue를 직접 만들지 않아도 된다는 것이 큰 장점이다.

하지만 금융 문서에서 “청킹이 검색 정확도의 절반”이라고 생각하면 얘기가 달라진다. 상품 약관의 조-항-호 구조, 표, 부칙, 개정일, 보장표를 사업 규칙에 맞춰 보존하려면 custom ingestion pipeline이 더 낫다. 특히 chunk-level metadata를 LLM이 생성하거나, 원문 version lineage를 별도 테이블에서 관리하고 싶다면 push indexing 방식이 관리하기 편하다.

Azure 보안: PaaS 중 금융권 설계가 비교적 자연스럽다

  • Inbound: Private Endpoint를 사용해 search endpoint를 VNet 내부 private IP로 노출 가능
  • Outbound: Azure OpenAI 등 Azure 서비스로 shared private link 연결 가능
  • Identity: API key 대신 Entra ID/RBAC + Managed Identity 구성 가능
  • Encryption: 기본 AES-256 service-managed encryption + 추가 CMK layer 구성 가능
  • Document-level security: security trimming field 패턴과 최신 ACL/RBAC permission enforcement 기능 존재
  • Logging: diagnostic logs와 Azure Monitor 연동
주의: Search RBAC와 문서 권한은 다른 문제다 Search Index Data Reader 권한은 “이 애플리케이션이 index를 조회할 수 있는가”를 제어한다. 고객 A가 고객 B의 문서를 못 보게 하는 것은 별도의 document-level permission/filter 문제다. 애플리케이션 인증 → query-time security context → document security trimming까지 연결해야 한다.

2026년의 Azure: Search에서 Agentic Retrieval로

Azure AI Search는 이제 knowledge base를 top-level object로 두고 LLM query planning, sub-query decomposition, parallel retrieval, semantic rerank, answer synthesis를 묶는 agentic retrieval 기능을 제공한다. 최신 기능 중 일부는 preview API에 있으므로 금융 production에서는 기능의 GA 여부와 region·compliance boundary를 따로 확인해야 한다.

Azure AI Search의 사용감

장점: Azure OpenAI, Blob, Managed Identity, Private Link와 연결할 때 전체 경험이 매끄럽고 RAG 검색의 기본기가 이미 많이 들어 있다.
단점: 검색 엔진 내부 튜닝은 Elasticsearch/OpenSearch보다 추상화되어 있고, DB처럼 복잡한 relational join을 retrieval 중 직접 수행할 수 없다. Index schema 변경도 관계형 DB migration만큼 자유롭지 않다.

금융권 관점에서 Azure AI Search를 보면 공개 사례만으로 금융권 채택 수준을 일반화하기보다 보안·운영 특성을 보는 편이 안전하다. 확실한 장점은 Private Endpoint, Entra ID/RBAC, Managed Identity, CMK, Azure Monitor를 Azure control plane 안에서 일관되게 묶기 쉽다는 점이다. 다만 service-level RBAC는 검색 서비스 접근 권한이고 고객·직원별 문서 접근 제어와는 별개다. 따라서 document-level security trimming 또는 permission-aware retrieval을 retrieval 단계에서 강제해야 한다.

3. Amazon OpenSearch Service / Serverless — AWS에서 ‘검색 엔진’을 직접 고른다면

OpenSearch는 Elasticsearch에서 갈라져 나온 Lucene 기반 검색 엔진으로, AWS에서 full-text와 vector를 한 엔진에서 다루고 싶을 때 핵심 선택지다. Bedrock KB의 vector store로도 자주 연결된다.

Vector engine 선택지가 많다

OpenSearch의 `knn_vector`는 HNSW 기반 ANN을 지원하고 Lucene, Faiss, JVector 등 engine에 따라 filtering·memory·index build 특성이 달라진다. dimension도 고차원을 지원하며, neural search pipeline을 통해 Bedrock/SageMaker embedding model과 연결할 수 있다.

PUT /policy-chunks
{
  "settings": {
    "index": { "knn": true }
  },
  "mappings": {
    "properties": {
      "tenant_id":    { "type": "keyword" },
      "product_code": { "type": "keyword" },
      "content":      { "type": "text" },
      "embedding": {
        "type": "knn_vector",
        "dimension": 1536,
        "method": {
          "name": "hnsw",
          "space_type": "cosinesimil",
          "engine": "lucene"
        }
      }
    }
  }
}

Hybrid Search는 Azure와 철학이 조금 다르다

OpenSearch Serverless의 hybrid search는 keyword BM25와 neural/vector query를 함께 실행하고 search pipeline에서 score normalization과 combination을 구성한다. `min_max`, `l2` normalization과 arithmetic/geometric/harmonic mean 같은 조합을 선택할 수 있어 relevance tuning 자유도가 크다. Azure의 RRF처럼 “좋은 기본값”에 가까운 경험보다 더 검색 엔지니어링스럽다.

Filtering은 engine 선택까지 영향을 받는다

OpenSearch의 efficient k-NN filtering은 Lucene HNSW, Faiss HNSW/IVF 등에서 검색 중 필터를 적용한다. 조건의 선택도에 따라 approximate graph traversal과 exact search fallback을 섞기도 한다. 즉 “filter가 있으면 무조건 vector 후보를 뽑은 뒤 거른다”가 아니다.

OpenSearch가 특히 좋은 팀

검색 자체를 하나의 전문 영역으로 보고 analyzer, shard, ranking pipeline, vector engine, filter behavior를 직접 튜닝할 팀. AWS-native이면서 Bedrock과 검색 계층을 느슨하게 분리하고 싶은 팀.

OpenSearch 보안

  • VPC Domain: 인터넷 gateway 없이 VPC 내부 통신 가능
  • Fine-Grained Access Control: cluster/index/document/field 수준 권한
  • Encryption: Serverless collection은 at-rest encryption 필수, KMS CMK 선택 가능
  • PrivateLink: Serverless data/control plane private access 구성 가능
  • Audit: fine-grained access control과 함께 audit log를 CloudWatch Logs로 보낼 수 있음

보안 기능은 강력하지만 IAM policy, data access policy, network policy, fine-grained access control이 겹치면 처음에는 복잡하다. Azure의 “Entra + Private Endpoint + RBAC”에 익숙한 팀이라면 AWS OpenSearch의 여러 security plane이 체감상 더 손이 갈 수 있다.

금융권 관점에서 OpenSearch를 보면 VPC/PrivateLink, KMS, fine-grained access control, document/field-level 권한, audit logging 등 필요한 보안 primitive는 충분하다. 대신 IAM policy, network policy, data access policy, index-level security가 여러 계층에 걸쳐 있어 자유도가 높은 만큼 운영 책임도 커진다.

4. PostgreSQL + pgvector — Vector DB가 아니라 ‘업무 데이터와 검색을 한 SQL에 넣는’ 선택

pgvector는 PostgreSQL에 vector type과 distance operator, HNSW/IVFFlat index를 추가한다. 검색 전문 엔진과 가장 큰 차이는 벡터가 관계형 데이터와 같은 transaction·schema·SQL planner 안에 있다는 점이다. 보험처럼 metadata와 business rule이 retrieval의 핵심이라면 이 특성이 매우 강력하다.

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE policy_chunks (
    chunk_id        bigserial PRIMARY KEY,
    tenant_id       text        NOT NULL,
    product_code    text        NOT NULL,
    rider_code      text,
    effective_from  date        NOT NULL,
    effective_to    date        NOT NULL,
    document_id     uuid        NOT NULL,
    section_path    text,
    content         text        NOT NULL,
    metadata        jsonb       NOT NULL DEFAULT '{}',
    embedding       vector(1536) NOT NULL,
    search_tsv      tsvector GENERATED ALWAYS AS (
        to_tsvector('simple', content)
    ) STORED
);

CREATE INDEX policy_vector_hnsw
ON policy_chunks USING hnsw (embedding vector_cosine_ops);

CREATE INDEX policy_business_filter
ON policy_chunks (tenant_id, product_code, effective_from, effective_to);

CREATE INDEX policy_text_gin
ON policy_chunks USING gin (search_tsv);

HNSW vs IVFFlat

pgvector Index 장점 단점 실무 감각
HNSW 좋은 speed/recall trade-off, training 불필요 build 느림, memory 사용 큼 대부분 production 기본 후보
IVFFlat build 빠르고 memory 적음 training/list/probe tuning 필요, recall 불리 대규모 batch 구축/특정 workload
Exact perfect recall 전체 후보 distance 계산 hard filter 후 후보가 작으면 매우 유용

pgvector의 핵심 함정: ANN + WHERE

pgvector 공식 문서가 강조하는 부분이다. approximate index를 사용할 때 일반적인 filtering은 index scan 이후 조건에 의해 결과가 줄 수 있다. 예를 들어 전체 데이터의 10%만 filter에 맞고 HNSW가 40개 후보를 탐색한다면 평균적으로 실제 filter match가 몇 개 안 남을 수 있다. 최신 pgvector는 iterative index scan을 통해 필요한 결과가 채워질 때까지 더 탐색할 수 있지만, 매우 선택적인 금융 filter는 처음부터 데이터 구조를 설계하는 편이 낫다.

BEGIN;

SET LOCAL hnsw.iterative_scan = strict_order;
SET LOCAL hnsw.ef_search = 120;

SELECT chunk_id, document_id, content,
       1 - (embedding <=> :query_vector) AS similarity
FROM policy_chunks
WHERE tenant_id = :tenant_id
  AND product_code = :product_code
  AND effective_from <= :contract_date
  AND effective_to   >  :contract_date
ORDER BY embedding <=> :query_vector
LIMIT 30;

COMMIT;

상품별 데이터가 충분히 크다면 partial HNSW index나 partitioning도 고려할 수 있다. pgvector 문서는 multitenancy에서 tenant를 공유 ANN index 하나에 섞으면 다른 tenant의 vector가 recall과 speed에 영향을 줄 수 있으므로 partition/separate table을 고려하라고 안내한다. 이건 금융 multi-tenant 플랫폼에서 매우 중요한 포인트다.

PostgreSQL Hybrid Search는 “직접 만들 자유”가 장점이자 단점

PostgreSQL은 `tsvector`/`tsquery` 기반 full-text search를 기본 제공한다. vector score와 text rank를 별도로 계산한 뒤 RRF 또는 weighted fusion을 SQL에서 직접 만들 수 있다. 하지만 Azure/Elastic처럼 ready-made semantic ranker가 따라오는 것은 아니다.

WITH eligible AS MATERIALIZED (
    SELECT *
    FROM policy_chunks
    WHERE tenant_id = :tenant
      AND product_code = :product
      AND effective_from <= :contract_date
      AND effective_to   >  :contract_date
),
vector_rank AS (
    SELECT chunk_id,
           row_number() OVER (
             ORDER BY embedding <=> :qvec
           ) AS r
    FROM eligible
    ORDER BY embedding <=> :qvec
    LIMIT 50
),
text_rank AS (
    SELECT chunk_id,
           row_number() OVER (
             ORDER BY ts_rank_cd(search_tsv, websearch_to_tsquery('simple', :query)) DESC
           ) AS r
    FROM eligible
    WHERE search_tsv @@ websearch_to_tsquery('simple', :query)
    LIMIT 50
)
SELECT e.chunk_id, e.content,
       COALESCE(1.0 / (60 + v.r), 0) +
       COALESCE(1.0 / (60 + t.r), 0) AS rrf_score
FROM eligible e
LEFT JOIN vector_rank v USING (chunk_id)
LEFT JOIN text_rank t   USING (chunk_id)
WHERE v.chunk_id IS NOT NULL OR t.chunk_id IS NOT NULL
ORDER BY rrf_score DESC
LIMIT 20;

금융권에서 pgvector가 유독 강해지는 순간: RLS

PostgreSQL Row-Level Security는 query마다 애플리케이션이 security filter string을 잘 조립하기를 기대하는 대신, DB table 자체에 “이 role/session은 어떤 row를 볼 수 있는가”를 policy로 걸 수 있다.

ALTER TABLE policy_chunks ENABLE ROW LEVEL SECURITY;

CREATE POLICY tenant_isolation
ON policy_chunks
FOR SELECT
USING (
    tenant_id = current_setting('app.tenant_id', true)
);

물론 RLS가 만능은 아니다. connection pool의 session context 설정, table owner/superuser bypass, policy test를 엄격하게 다뤄야 한다. 하지만 authorization과 business filter가 검색의 핵심일수록 “retrieval query와 data permission이 같은 SQL planner 안에 있다”는 건 강력하다.

내가 보험 약관 Retrieval을 pgvector로 설계한다면 먼저 가입정보로 eligible document set을 SQL에서 확정하고, 그 subset이 충분히 작으면 오히려 exact vector search를 쓴다. subset이 크면 상품/tenant partition + HNSW를 사용하고, 1차 후보를 BM25/vector RRF로 30~100개 뽑은 뒤 별도 reranker를 호출한다. 즉 “PostgreSQL을 Vector DB처럼” 쓰는 게 아니라 SQL eligibility engine 안에 semantic retrieval을 넣는다.

Cloud PostgreSQL 선택지

  • Azure Database for PostgreSQL Flexible Server: pgvector + Entra authentication + Private Link + azure_ai extension/Managed Identity 조합
  • Amazon Aurora PostgreSQL: pgvector를 Bedrock Knowledge Base의 vector store로 직접 사용 가능. RDS Data API/Secrets Manager와 연동
  • Google AlloyDB: pgvector compatibility에 Google ScaNN vector index를 추가해 relational + 고성능 vector 검색을 노림
금융권 관점에서 pgvector를 보면 장점은 ‘Vector DB 보안 기능’이 아니라 기존 PostgreSQL의 transaction, schema, RLS, backup, audit 운영체계 안에 retrieval을 넣을 수 있다는 것이다. 특히 고객·계약·상품 eligibility가 SQL로 이미 관리되는 조직이라면 authorization source와 retrieval source를 가까이 둘 수 있다. 반대로 ANN index memory와 query tuning까지 DB 운영팀이 책임져야 하므로 OLTP와 동일 cluster에 무조건 합치는 것은 피해야 한다.

5. Elasticsearch — 검색 품질을 가장 깊게 파고들고 싶을 때

Elasticsearch는 Lucene 기반 full-text search의 역사가 길다. analyzer, BM25, synonym, field boosting, query DSL, aggregation에 vector search가 결합되면서 “검색팀이 정말 검색을 튜닝한다”는 상황에서는 여전히 매우 강력하다.

Dense vector뿐 아니라 sparse semantic도 중요하다

Elastic은 `dense_vector` 기반 kNN뿐 아니라 ELSER라는 learned sparse encoder를 제공한다. sparse retrieval은 query/document를 가중 term space로 확장하기 때문에 keyword search의 explainability와 semantic matching 사이에서 흥미로운 위치를 차지한다. 다만 Elastic 공식 문서상 ELSER는 영어 문서에 특히 권장되고, 비영어에는 E5 같은 multilingual dense model이 더 적합한 경로로 안내된다.

PUT policy-index
{
  "mappings": {
    "properties": {
      "tenant_id":    { "type": "keyword" },
      "product_code": { "type": "keyword" },
      "content":      { "type": "text" },
      "embedding": {
        "type": "dense_vector",
        "dims": 1536,
        "similarity": "cosine",
        "index": true
      }
    }
  }
}

approximate kNN은 HNSW를 사용하며 `num_candidates`가 대표적인 speed/recall knob다. 후보를 더 넓게 보면 recall이 좋아지지만 latency가 늘어난다. quantized vector에서는 oversampling 후 original float vector로 rescore하는 전략도 제공한다.

Elastic의 필터도 위치가 중요하다

Elasticsearch kNN query 내부의 `filter`는 approximate kNN 중 pre-filter로 적용돼 k개의 filter-matching result를 확보하도록 동작한다. 반면 Query DSL tree 바깥의 일반 filter는 post-filter가 될 수 있다. 코드가 비슷해 보여도 결과 의미가 다르기 때문에 금융 eligibility filter는 반드시 retrieval stage 내부에서 적용되는지 확인해야 한다.

POST policy-index/_search
{
  "knn": {
    "field": "embedding",
    "query_vector": [/* embedding */],
    "k": 30,
    "num_candidates": 200,
    "filter": {
      "bool": {
        "must": [
          { "term": { "tenant_id": "life-korea" } },
          { "term": { "product_code": "WL-2024-A" } }
        ]
      }
    }
  }
}

`semantic_text`: 편의성 방향으로도 진화했다

과거 Elastic semantic search는 inference endpoint, ingest pipeline, vector mapping을 직접 맞춰야 했다. 현재 `semantic_text` field는 model에 맞는 mapping과 embedding generation, chunking을 상당 부분 자동화한다. 즉 Elastic도 점점 Azure integrated vectorization이나 managed RAG 제품처럼 개발자 경험을 단순화하고 있다.

Elastic 보안: search 자체의 세밀함은 강하지만 라이선스를 확인해야 한다

role 기반 index 권한에 더해 document-level security와 field-level security를 지원한다. audit logging도 가능하다. 다만 특정 security/ML 기능은 subscription tier에 따라 달라질 수 있으므로 “기술적으로 지원한다”와 “우리 라이선스에서 쓸 수 있다”를 분리해 확인해야 한다.

Elasticsearch의 사용감

장점: 검색 품질을 실험할 수 있는 knob가 많고 BM25·dense·sparse·RRF·rerank를 하나의 search stack에서 다루기 좋다.
단점: shard/segment/memory/index lifecycle까지 이해하기 시작하면 플랫폼 운영 난도가 빠르게 올라간다. 금융권에서 self-managed라면 patching·audit·backup·capacity planning도 모두 책임져야 한다.

금융권 관점에서 Elasticsearch를 보면 document-level/field-level security와 audit 기능을 갖추고 있어 세밀한 검색 권한 모델을 설계할 수 있다. 다만 기능별 subscription 조건과 self-managed/Elastic Cloud 운영 책임이 다르므로, 기능 지원 여부와 실제 계약 라이선스에서 사용 가능한지를 분리해 확인해야 한다.

6. Google Cloud도 보면 그림이 완성된다 — Vector Search 2.0 / Agent Search / AlloyDB

Google Cloud도 단일 “AI Search” 하나가 아니라 계층이 나뉜다. 2026년 Vector Search 2.0은 collection, auto-embedding, vector + full-text hybrid search, built-in semantic reranking을 하나의 retrieval engine으로 묶는 방향으로 진화했고, 상위에는 Agent Search/RAG 계열, 관계형 쪽에는 AlloyDB AI가 있다.

AlloyDB: PostgreSQL을 유지하면서 ScaNN을 추가

AlloyDB AI는 pgvector의 HNSW 호환성을 유지하면서 Google의 ScaNN vector index를 추가한다. 즉 pgvector의 SQL 데이터 모델을 좋아하지만 vector workload를 더 크게 가져가고 싶은 팀에게 흥미로운 선택지다. Private Service Connect와 IAM, Google Cloud security boundary를 함께 설계할 수 있다.

VPC Service Controls는 금융권에서 독특하게 강한 기능

Google Cloud의 VPC Service Controls는 IAM과 별개로 managed service 주변에 service perimeter를 만들어 data exfiltration risk를 줄이는 보안 계층이다. 단순 “private IP”를 넘어 credential이 탈취되더라도 허용되지 않은 perimeter 밖 리소스로 데이터를 복사하는 동작을 막는 것이 목적이다. 대규모 금융 데이터 플랫폼에서는 꽤 매력적인 control이다.

7. 가장 궁금한 비교: 한 표로 보면?

항목 Azure AI Search Bedrock KB OpenSearch PostgreSQL/pgvector Elasticsearch
정체성 Managed search PaaS Managed RAG layer Search engine Relational DB + vector Search engine/platform
Vector HNSW/eKNN Underlying store 의존 HNSW/IVF 등 HNSW/IVFFlat/Exact HNSW/quantized variants
Keyword + Vector 매우 쉬움, RRF store/config 의존 강력, pipeline 조정 직접 SQL/RRF 구현 매우 강력
Reranking Semantic Ranker Bedrock reranker pipeline/model 조합 외부 model 직접 retriever/rerank 기능 풍부
Structured Filter 좋음, preFilter 지원 metadata filter 좋음, engine별 효율 필터 최강, SQL/JOIN 좋음, kNN pre-filter
Document ACL security trimming + native preview 기능 Managed KB ACL-aware FGAC document/field RLS/custom schema DLS/FLS
Ingestion 자동화 높음 매우 높음 중간 낮음, 직접 구현 중~높음
검색 튜닝 자유도 중간 낮~중 높음 SQL 쪽 높음 매우 높음
운영 부담 낮음 가장 낮음 중간 중~높음 중~높음
Cloud Lock-in 높음 높음 중간 낮음 중간
폐쇄망/자체호스팅 PaaS 중심 AWS managed 가능 매우 유연 가능

※ 위 표는 제품의 절대 점수가 아니라 “RAG retrieval layer를 직접 설계하는 관점”의 비교다. Bedrock KB는 underlying vector store에 따라 일부 특성이 달라진다.

8. 보안만 따로 비교하면 금융권의 우선순위가 달라진다

보안은 4층으로 봐야 한다

① NetworkPublic endpoint를 끄고 Private Endpoint/VPC/PSC로 닫을 수 있는가.
② Workload IdentityAPI key 없이 Managed Identity/IAM/Service Account로 서비스간 인증 가능한가.
③ Data Authorizationtenant/document/field/row 권한이 retrieval 전에 강제되는가.
④ Audit & CryptoCMK, key rotation, query/audit log, admin activity를 추적 가능한가.

많은 RAG 설계가 ①과 ②만 보고 “private하니까 안전하다”고 결론낸다. 하지만 실제 정보 유출은 ③에서 발생하기 쉽다. 한 index 안에 영업직원용 문서, 고객용 문서, 내부 underwriting 문서가 섞여 있는데 retrieval이 사용자 권한을 모르고 top-k를 만든다면 private endpoint는 아무 도움이 되지 않는다.

금융권 원칙: LLM에게 전달된 순간 이미 접근이 발생한 것이다. “LLM이 답변에는 노출하지 않도록 prompt로 막는다”는 건 authorization이 아니다. 권한 없는 문서는 retrieval candidate 단계에서 제외돼야 한다.

9. 검색 품질: Vector DB 이름보다 Retrieval Recipe가 더 중요하다

실무에서 Azure AI Search → PostgreSQL로 옮겼다고 갑자기 정확도가 올라가거나, Elasticsearch를 쓴다고 hallucination이 사라지는 일은 없다. RAG 품질은 검색 엔진보다 아래 조합의 영향을 더 크게 받는 경우가 많다.

  • 문서를 어떻게 파싱하고 구조를 보존했는가
  • chunk boundary가 의미 단위를 보존하는가
  • embedding model이 한국어 금융 용어를 얼마나 잘 표현하는가
  • metadata가 실제 업무 규칙을 표현하는가
  • keyword와 vector를 어떻게 fusion하는가
  • top-k를 얼마나 넓게 잡고 reranker가 몇 개를 다시 보는가
  • query rewrite가 약어, 상품코드, 동의어를 잘 처리하는가
  • gold set이 실제 현업 질문을 반영하는가

논문 관점: 왜 Hybrid + Rerank가 계속 살아남나

RAG 원 논문은 parametric memory와 non-parametric memory를 결합하는 틀을 제시했고, HNSW는 대규모 approximate nearest neighbor search의 기반이 됐다. 이후 BEIR 같은 heterogeneous retrieval benchmark는 어떤 단일 dense retriever도 모든 도메인에서 압도적이지 않다는 사실을 보여주는 방향의 연구를 강화했다. ColBERT 계열은 하나의 문서를 단일 vector 하나로 압축하기보다 token-level late interaction으로 더 세밀한 matching을 수행한다.

실무적인 메시지는 단순하다. “Dense vector 하나가 검색의 최종형”이 아니다. exact lexical signal, sparse semantic, dense vector, structured filter, reranking이 서로 다른 오류를 보완한다. 그래서 Azure·Elastic·OpenSearch가 모두 hybrid를 중요한 1급 기능으로 두는 것이다.

10. 사용감: 개발자가 실제로 느끼는 차이

상황 가장 편한 선택 왜?
Azure 기반 사내 문서 챗봇을 빨리 출시 Azure AI Search Blob/AOAI/Managed Identity/Private Link와 자연스러운 연결
AWS 기반, ingestion부터 최대한 managed Bedrock Managed KB connector·parsing·retrieval·agentic 기능을 서비스가 관리
검색 relevance를 전문적으로 튜닝 Elasticsearch / OpenSearch analyzer, ranking, vector engine, sparse/dense 조합 자유도
보험 약관 + 가입정보 + 날짜/상품 필터가 핵심 PostgreSQL/pgvector 또는 Azure AI Search preFilter structured eligibility가 semantic similarity보다 먼저이기 때문
폐쇄망/온프레미스 portability PostgreSQL / OpenSearch / Elasticsearch cloud-specific managed service 의존을 줄일 수 있음

11. 비용은 단순히 “Vector DB 가격”으로 보면 안 된다

가격표의 월 비용만 비교하면 pgvector가 싸고 managed search가 비싸 보일 수 있다. 하지만 실제 TCO에는 검색 cluster의 replica, ingestion compute, embedding API, semantic reranker, network egress, backup, monitoring, 운영 인력이 모두 들어간다.

Managed Search인프라는 비싸 보이지만 운영 코드·retry·index lifecycle이 줄어든다.
PostgreSQL기존 DB에 vector를 합치면 경제적이지만 ANN memory가 OLTP workload를 침범하지 않게 sizing해야 한다.
Elastic/OpenSearchvector HNSW가 page cache/RAM을 많이 쓰므로 문서 수·dimension·replica가 비용을 좌우한다.
Reranker검색 index보다 top-N reranking model 호출 비용이 커지는 경우도 있다.

12. 금융권이라면 제품보다 먼저 결정할 Architecture Decision

Decision 1 — “문서 검색”인가, “업무 규칙이 들어간 검색”인가?

단순 사내 규정·매뉴얼 검색이면 Azure AI Search나 Bedrock KB 같은 managed service가 생산성이 높다. 반대로 “이 계약이 이 약관의 적용 대상인가?”를 판단해야 한다면 PostgreSQL처럼 업무 데이터와 가까운 곳이 유리해진다.

Decision 2 — Authorization source of truth는 어디인가?

Entra group, IAM identity, SharePoint ACL, DB row ownership 등 어느 시스템이 최종 권한을 갖는지 먼저 정한다. 그 다음 Search index가 그 permission을 복제할지, query-time에 원본을 검증할지 선택한다.

Decision 3 — Index는 원본 데이터인가, 파생 캐시인가?

금융 시스템에서 검색 index를 source of truth로 만들면 reconciliation과 감사가 어려워진다. 원본 문서/계약 DB가 source of truth이고 vector/search index는 재생성 가능한 derived serving layer로 보는 편이 운영상 안전하다.

Decision 4 — Approximate search가 정말 필요한가?

사용자 계약 정보로 먼저 3,000개 청크까지 좁혀진다면 HNSW를 쓸 이유가 크지 않을 수 있다. exact cosine search는 recall 100%이고 운영 knob가 줄어든다. “Vector DB를 쓰니까 ANN”이 아니라 후보 집합 크기와 latency SLO로 판단해야 한다.

내가 금융권 RAG에서 가장 중요하게 보는 원칙:
Authorization → Eligibility → Retrieval → Rerank → Generation 순서를 바꾸지 않는다. 검색 engine의 semantic score가 아무리 높아도 권한·상품·기간 조건보다 우선할 수 없다.

13. 그래서 무엇을 고를까 — 현실적인 추천

A. Azure 생태계와 통합이 중요한 경우

Azure AI Search + Azure OpenAI는 우선 검토할 만한 조합이다. Hybrid + semantic ranker + preFilter + Private Endpoint + Managed Identity를 기본선으로 두고, ingestion은 처음부터 custom pipeline 여부를 검토한다.

B. AWS에서 ingestion·retrieval을 최대한 Managed로 가져가고 싶은 경우

Amazon Bedrock Managed Knowledge Bases는 우선 검토할 만하다. 다만 document ACL은 application authentication을 대체하지 않는다는 점을 architecture review에 명시한다. 검색을 더 세밀하게 통제해야 하면 Customer-managed KB + OpenSearch/Aurora로 내려간다.

C. 보험 약관처럼 metadata·가입정보·기간 조건이 검색의 핵심인 경우

PostgreSQL/pgvector를 진지하게 검토할 가치가 크다. 특히 product/version/date/tenant 조건이 semantic retrieval보다 강한 경우. 단, ANN filtered recall과 index memory를 benchmark하고 외부 reranker를 붙인다.

D. 검색 relevance 자체를 깊게 튜닝해야 하는 경우

Elasticsearch 또는 OpenSearch. lexical analyzer, sparse/dense retrieval, score fusion, shard/index 전략을 직접 실험할 수 있는 자유도가 크다.

14. 벤치마크는 이렇게 해야 공정하다

제품 비교 POC에서 가장 흔한 오류는 Azure는 hybrid+semantic ranker를 켜고 pgvector는 pure cosine top-5만 돌린 뒤 “Azure가 정확하다”고 결론내는 것이다. 또는 반대로 PostgreSQL은 정교한 metadata filter를 쓰고 Azure에는 filter 없이 vector only를 보내는 식이다.

평가축 반드시 측정할 것
Retrieval Quality Recall@k, nDCG@k, MRR, answer-support coverage
Filter Correctness 권한/상품/날짜 조건 위반 0건, selective filter에서 결과 누락률
Latency P50/P95/P99 retrieval, rerank 포함 end-to-end TTFT
Ingestion documents/s, reindex time, failed chunk retry, schema migration
Operations backup/restore, scale-out, index rebuild, monitoring, 장애 시 복구시간
Security public path 존재 여부, secretless auth, CMK, auditability, document authorization
Bedrock은 managed RAG 계층, Azure AI Search는 managed search/retrieval 플랫폼, OpenSearch·Elasticsearch는 검색 엔진, PostgreSQL/pgvector는 relational data model 안에 vector retrieval을 넣는 방식이다. 금융권에서는 제품 이름보다 어디에서 identity를 검증하고, 어느 단계에서 document eligibility를 확정하며, 검색 index를 source of truth가 아닌 재생성 가능한 serving layer로 유지할 수 있는가가 더 중요한 아키텍처 결정이다.

공식 문서 / 논문

※ 이 글은 2026년 9월 기준 공식 문서의 현재 기능을 토대로 작성했다. Preview 기능, region 지원, 보안/규정 준수 범위, 라이선스와 가격은 변경될 수 있으므로 실제 금융 production 도입 전에는 해당 리전의 GA 상태와 계약 조건을 다시 확인해야 한다. 특히 검색 성능 비교는 동일한 embedding·chunking·filter·candidate size·reranking 조건에서 자체 gold set으로 검증해야 한다.

※  근데 정말, 다른 금융권 분들 혹시 계시면 뭘로 구현하고 계신지 제발 알려주세요!!! 너무 궁금함. (특히 Azure 사용하시는 현업분들!!!!)