Skip to main content
Glama
VarunJaiswal05

policy-rag-mcp-server

정책 문서 Q&A 어시스턴트 — RAG + MCP 서버 (LangChain, Azure AI Foundry, PostgreSQL/pgvector, Docker, Langfuse)

실제 호주 공공 정책 문서(퀸즐랜드 주정부 재무/ICT 정책 및 ATO 연방 세무 가이드)를 대상으로 하는 질의응답 어시스턴트로, RAG(Retrieval-Augmented Generation) 파이프라인으로 구축되었으며 MCP(Model Context Protocol) 서버로 노출됩니다. 즉, 일회성 스크립트가 아니라 호출 가능한 도구로서 Claude Desktop 또는 기타 MCP 호환 클라이언트에 연결됩니다. PDF 수집부터 도구 자체에 이르는 전체 파이프라인은 Docker로 컨테이너화되어 실행되며, Langfuse 추적을 통해 엔드투엔드로 계측됩니다.


목표

최근 여러 채용 공고(Queensland Treasury, Warren and Mahoney, McCosker, CI&T, Datacom)에서 확인된 특정 AI 엔지니어 역량 격차를 해소하기 위해 구축되었습니다 — MCP를 통한 에이전트 도구화, LangChain 기반 오케스트레이션, 실제 벡터 데이터베이스(임베디드/장난감 수준 저장소가 아닌), 컨테이너화, 명명된 클라우드 네이티브 AI 플랫폼(특히 "OpenAI API 키"가 아닌 Azure AI Foundry), 그리고 LLMOps 관측 가능성. 자격증을 모으는 대신, 이 여섯 가지를 모두 실무에서 입증하는 하나의 실제 작동하는 엔드투엔드 시스템을 만드는 것이 목표였습니다 — 자매 프로젝트인 lead-scoring-databricks-pipeline과 동일한 접근 방식입니다.

애플리케이션 자체는 현실적인 엔터프라이즈 사용 사례를 반영합니다: "직원들이 자체 정책 문서에 대해 자연어 질문을 하고, 모든 답변이 실제 출처 페이지로 추적 가능하도록 하는 것" — 특히 정부 인접 직무와 주제적으로 관련이 있습니다.


Related MCP server: AusLaw MCP

사용된 데이터셋

공식 .gov.au 도메인에서 직접 수집한 실제 PDF 문서 8개(총 162페이지) — 제3자 미러 없음:

  • FAH_Volume_1_Introduction_2025.pdf — 퀸즐랜드 재무 책임 핸드북(Financial Accountability Handbook), Vol. 1

  • Overview-of-Queensland-Financial-Accountability-Framework-as-at-Jan-2020.pdf

  • ict-as-a-service_decision_framework-overview_v1_0_0.pdf

  • paf-policy-overview.pdf / paf-supporting-guidelines.pdf — 퀸즐랜드 프로젝트 보증 프레임워크(민관 파트너십 포함)

  • n75057 [DE-81739] - 2026 Tax Time toolkit for small business_DIGITAL.pdf — ATO

  • n75127 [DE-73758] - Residency for tax purposes - factsheet_DIGITAL.pdf — ATO

  • tr2023-001.pdf — ATO 조세 판례 2023/1

코퍼스는 의도적으로 두 클러스터(퀸즐랜드 주정부 정책과 호주 연방 세무 가이드)로 분할되어, 검색이 단일 명백한 키워드에 단순히 매칭되는 것이 아니라 주정부 vs. 연방 출처, 그리고 공식 판례와 관련 주제의 평이한 요약문을 진정으로 구분해야 합니다. 초기 11개 문서(344페이지)는 이 8개(162페이지)로 줄여, 실제 검색 문제가 될 만큼 충분히 크면서도 반복 작업이 빠르도록 유지했습니다.


아키텍처 및 파이프라인

flowchart LR
    subgraph Ingestion["Ingestion (run once, re-run on doc changes)"]
        A[Policy PDFs] --> B[Chunking\nLangChain RecursiveCharacterTextSplitter]
        B --> C[Embed\nAzure text-embedding-3-small]
        C --> D[(PostgreSQL + pgvector\nvia Docker)]
    end

    subgraph Query["Query time"]
        E[MCP Client\ne.g. Claude Desktop] --> F[MCP Server\nPython, containerized]
        F --> G[LangChain RAG chain]
        G --> D
        G --> H[Azure AI Foundry\ngpt-5-mini]
        H --> G --> F --> E
    end

    G -. traces .-> I[Langfuse\nobservability]

수집(Ingestion): 각 PDF는 LangChain의 PyPDFLoader로 페이지별로 로드되고(이후 인용을 위해 소스 파일명 + 페이지 번호를 메타데이터로 보존), 그 다음 RecursiveCharacterTextSplitter1000자 / 150자 오버랩으로 분할됩니다 — 실제 코퍼스에서 두 방식을 직접 비교한 후 더 작은 500/50 분할보다 선택되었습니다(950 vs. 521 청크). 더 큰 청크 크기는 절차적이고 구조적으로 밀도 높은 정책 문서에 더 적합하며, 검색된 조각당 모델에 더 많은 주변 맥락을 제공합니다. 결과적으로 생성된 521개 청크 각각은 Azure의 text-embedding-3-small로 임베딩되어 Docker에서 실행되는 PostgreSQL 데이터베이스에 기록되며, pgvector 확장을 통해 별도의 전용 벡터 저장소가 아닌 관계형 데이터베이스 내부에서 직접 벡터 유사도 검색이 가능합니다 — 많은 실제 조직이 이미 운영 중인 Postgres 인스턴스에 벡터 검색을 추가하므로, 더 프로덕션에 신뢰할 수 있는 패턴입니다.

쿼리 시점: 질문은 동일한 모델로 임베딩되고, PostgreSQL은 벡터 유사도 기준 상위 4개 유사 청크를 반환하며, 해당 청크들은 gpt-5-mini오직 검색된 맥락에서만 답변하도록 지시하는 프롬프트에 "채워집니다" — 또는 자체 일반 지식에 의존하는 대신 "모르겠습니다"라고 말하도록 합니다. 답변은 참조한 모든 청크의 정확한 출처 문서와 페이지 번호와 함께 반환되므로, 모든 답변은 독립적으로 검증 가능합니다.

인터페이스: RAG 체인은 공식 Python MCP SDK를 사용하여 MCP 서버로 래핑되며, 두 가지 도구를 노출합니다 — query_policy_docs(핵심 Q&A 기능)와 list_indexed_documents(클라이언트가 질문하기 전에 실제로 어떤 내용이 포함되어 있는지 확인 가능). RAG 로직과 MCP 프로토콜 계층은 의도적으로 별도 파일로 유지되어, 기본 기능을 건드리지 않고 나중에 다른 인터페이스 뒤에서 재사용할 수 있습니다. 서버는 Docker로 컨테이너화됩니다. MCP의 stdio 전송은 서버가 클라이언트의 stdin/stdout에 직접 연결되어야 하므로, 항상 실행되는 PostgreSQL 컨테이너와 달리 연결당 온디맨드로 생성되는 단기 컨테이너(docker compose run --rm -i)로 실행됩니다.

관측 가능성: 모든 쿼리는 Langfuse로 엔드투엔드 추적됩니다 — 질문당 하나의 연결된 추적 아래 검색과 생성이 중첩되어, 정확한 프롬프트, 검색된 청크, 지연 시간, 토큰 비용을 보여줍니다.


사용된 모델

두 모델 모두 Azure AI Foundry를 통해 배포됩니다(클래식 "Azure OpenAI" 리소스 유형보다 의도적으로 선택 — Foundry가 여러 대상 채용 공고에 명시적으로 언급되어 있기 때문):

  • gpt-5-mini — 생성, temperature=0으로 검색된 텍스트에 기반한 충실하고 문자 그대로의 답변을 위해 창의적인 답변이 아닌 답변을 생성합니다.

  • text-embedding-3-small — 임베딩, 문서 코퍼스와 들어오는 질문 모두에 사용됩니다.

이 Foundry 리소스는 Azure의 최신 통합 v1 API 표면(.../openai/v1)을 사용하므로, 통합은 Azure 전용 AzureChatOpenAI / AzureOpenAIEmbeddings 클래스 대신 LangChain의 일반 ChatOpenAI / OpenAIEmbeddings 클래스를 base_url + api_key + model과 함께 사용합니다. Azure 전용 클래스는 이전 날짜 기반 API 버전 엔드포인트 체계를 대상으로 하며 이 리소스에 대해 404를 반환합니다.


결과 및 인사이트

라이브 시스템을 통해 실행된 5개의 실제 테스트 질문으로 수동 평가:

  1. "Financial Accountability Handbook은 기관이 무엇을 하도록 돕기 위해 설계되었나요?" → 정확하고 거의 그대로 인용된 근거 기반 답변과 정확한 인용.

  2. "ICT-as-a-service 의사결정 프레임워크는 기관이 무엇을 결정하도록 돕나요?" → 정확하며 실제 뉘앙스(배포/서비스 모델, 위험 평가)를 포착.

  3. "프랑스의 수도는 무엇인가요?" (의도적으로 범위 밖) → 모델의 자체 일반 지식을 사용하는 대신 "모르겠습니다"라고 올바르게 답변 — 핵심 환각 방지 테스트.

  4. "퀸즐랜드 PPP 정책에 따른 민관 파트너십이란 무엇인가요?" → "모르겠습니다"라고 답변. 소스 PDF의 추출된 텍스트를 직접 검사하여 독립적으로 검증: 문서는 실제로 23페이지 어디에서도 이 용어를 평이한 언어로 정의하지 않음 — 검색 실패나 조작된 답변이 아니라 실제로 방어 가능한 코퍼스 격차를 올바르게 식별한 것.

  5. "소기업 Tax Time 툴킷이 언급하는 기록 보관 의무는 무엇인가요?" → 정확하고 구체적인 세부 사항, 정확한 인용.

5/5 합리적 동작 — 3개의 정확한 근거 기반 답변과 2개의 정확한 거부(하나는 진정한 범위 밖, 하나는 환각 대신 실제 코퍼스 격차를 올바르게 인식). "검색이 올바른 청크를 놓쳤다"와 "코퍼스에 실제로 답변이 없다"를 구분하는 것은 실제 RAG 평가 기술이며, 이번 라운드에서는 두 실패 모드가 모두 올바르게 처리되는 것을 입증했습니다 — 단순히 눈으로 확인한 통과/실패가 아닙니다.

실제 MCP 클라이언트(Claude Desktop)에 대해 엔드투엔드로 검증되었으며, .venv를 통한 로컬 실행과 Docker를 통한 완전 컨테이너화 모두에서, 모든 쿼리가 Langfuse에서 추적되었습니다.


설정 및 사용법

요구 사항: Docker Desktop, Python 3.13, gpt-5-minitext-embedding-3-small이 배포된 Azure AI Foundry 리소스, 그리고 (선택 사항) 추적을 위한 무료 Langfuse Cloud 계정.

  1. .env.example.env로 복사하고 자체 Azure, Postgres 및 (선택 사항) Langfuse 자격 증명을 입력합니다.

  2. 벡터 저장소 시작: docker compose up -d postgres

  3. 문서 수집(일회성 또는 문서 세트가 변경될 때마다):

    pip install -r requirements-ingest.txt
    python embed_and_store.py
  4. CLI에서 직접 어시스턴트 실행: python rag_chain.py

  5. 또는 MCP 도구로 연결: 서버 이미지 빌드(docker compose build mcp-server), 그런 다음 MCP 클라이언트의 구성(예: Claude Desktop의 claude_desktop_config.json)에 추가:

    "policy-rag": {
      "command": "docker",
      "args": ["compose", "-f", "<path-to-repo>/docker-compose.yml", "run", "--rm", "-i", "mcp-server"]
    }

결론

파이프라인은 엔드투엔드로 완전히 작동합니다: 실제 정부 PDF가 청크화, 임베딩되어 실제 벡터 데이터베이스에 저장됩니다. 검색과 생성은 근거 기반이며 코퍼스 범위를 벗어난 답변을 올바르게 거부합니다. 전체 기능은 표준 준수 MCP 도구로 노출되어 실제 MCP 클라이언트에 대해 라이브로 검증되었습니다. 서버는 컨테이너화되어 이식 가능합니다. 모든 쿼리는 비용, 지연 시간, 전체 맥락과 함께 관측 가능성을 위해 추적됩니다. 대상 역량 격차로 명명된 모든 계층 — MCP, LangChain, 실제 벡터 데이터베이스, Docker, Azure AI Foundry, LLMOps 추적 — 은 튜토리얼 전용 구현이 아닌 작동하고 테스트된 코드로 입증되었습니다.


작성자 정보

Varun Vikas Jaiswal 2026


키워드

RAG, Retrieval-Augmented Generation, LangChain, MCP, Model Context Protocol, Azure AI Foundry, Azure OpenAI, pgvector, PostgreSQL, vector database, vector similarity search, Docker, Docker Compose, Langfuse, LLMOps, observability, Python, AI Engineer

F
license - not found
Not graded
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables users to search and retrieve Australian legislation and case law with full-text content extraction. Provides structured results with citation metadata and OCR support for archival PDFs.
    12
    23
    33
    Apache 2.0
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables local indexing and semantic search of PDF documents (like AGLC4 style guide) with OCR support, allowing LLM tools to query PDF content and retrieve relevant text snippets with context.

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/VarunJaiswal05/policy-rag-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server