본문으로 건너뛰기
Analytics Vidhya조회 1

FastAPI를 활용한 RAG API 구축 및 배포 가이드

FastAPI, LangChain, FAISS를 결합하여 사용자가 업로드한 PDF/TXT 문서를 기반으로 답변을 생성하는 RAG 시스템을 API 형태로 구현하는 과정을 다룬다.

섹션별 상세

01
FastAPI는 파이썬 기반 웹 프레임워크로 REST API 구축을 지원하며 Swagger UI를 통한 자동 문서화 기능을 갖추고 있어 별도의 프론트엔드 없이 엔드포인트 테스트가 가능하다.
HTTP 메서드와 각 메서드가 수행하는 작업을 정의한 표이다.
ChartGET(데이터 조회), POST(리소스 생성), PUT(전체 업데이트), PATCH(부분 업데이트), DELETE(삭제) 등 REST API 설계의 기초가 되는 HTTP 메서드들의 역할을 명확히 정의한다.
02
RAG(Retrieval-Augmented Generation)는 LLM이 학습하지 않은 특정 지식에 접근할 수 있도록 검색과 생성을 결합한 기법으로 작동한다.
03
Ingestion 파이프라인은 문서를 불러와 RecursiveCharacterTextSplitter로 500자 단위로 분할하고 OpenAI 임베딩을 통해 벡터로 변환하여 FAISS 인덱스에 저장한다.
python
def ingest_document(file_path: str, filename: str = "") -> int:
    # 1. Load
    loader = PyPDFLoader(file_path) if file_path.endswith(".pdf") else TextLoader(file_path)
    documents = loader.load()
    
    # 2. Chunk
    splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
    chunks = splitter.split_documents(documents)
    
    # 3. Embed and Store
    global _vectorstore
    if _vectorstore is None:
        _vectorstore = FAISS.from_documents(chunks, embeddings)
    else:
        _vectorstore.add_documents(chunks)
    
    # 4. Persist to disk
    _vectorstore.save_local(FAISS_INDEX_PATH)
    return len(chunks)

문서를 불러와 청크로 나누고 임베딩하여 FAISS 벡터 DB에 저장하는 Ingestion 함수

04
Query 파이프라인은 사용자의 질문을 벡터로 변환하여 FAISS에서 유사한 청크 4개를 검색한 뒤 gpt-4.1-mini 모델에 전달하여 답변을 생성하는 체인으로 구성된다.
python
def query_rag(question: str, top_k: int = 4) -> dict:
    vs = _load_vectorstore()
    retriever = vs.as_retriever(search_kwargs={"k": top_k})
    
    prompt = PromptTemplate.from_template("""Context: {context}
Question: {question}
Answer:""")
    llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0)
    
    # LCEL chain
    retrieve = RunnableParallel({"context": retriever | _format_docs, "question": RunnablePassthrough()})
    answer_chain = prompt | llm | StrOutputParser()
    
    retrieved = retrieve.invoke(question)
    answer = answer_chain.invoke(retrieved)
    return {"answer": answer, "sources": [doc.metadata.get("source") for doc in retrieved["context"]]}

질문과 유사한 문서를 검색하고 LLM을 통해 답변을 생성하는 RAG 쿼리 함수

05
FastAPI 엔드포인트는 서버 상태를 확인하는 /health, 문서를 업로드하는 /ingest, 질의응답을 수행하는 /query로 이루어지며 Pydantic으로 데이터 형식을 엄격하게 정의한다.
python
@app.post("/query", response_model=QueryResponse)
def query(request: QueryRequest):
    if not request.question.strip():
        raise HTTPException(status_code=400, detail="Question cannot be empty.")
    try:
        result = query_rag(request.question, request.top_k)
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
    return QueryResponse(answer=result["answer"], sources=result["sources"])

사용자의 질문을 받아 RAG 파이프라인을 실행하는 FastAPI POST 엔드포인트

FastAPI가 자동 생성한 RAG API의 Swagger UI 화면이다.
Screenshot구현된 /health, /ingest, /query 엔드포인트 목록을 보여주며, 개발자가 웹 브라우저에서 직접 API를 테스트할 수 있는 인터페이스를 제공함을 확인시켜 준다.
06
HTTP 상태 코드를 활용하여 성공(200), 클라이언트 오류(400, 422), 서버 오류(500)를 구분함으로써 API의 안정성과 디버깅 편의성을 확보한다.
/ingest API 호출에 대한 서버의 JSON 응답 예시이다.
Screenshot파일 업로드 성공 메시지와 함께 인덱싱된 청크의 개수(49개)를 반환하는 실제 응답 구조를 보여주며, HTTP 상태 코드 200(OK)이 반환됨을 나타낸다.

용어 해설

검색 증강 생성(RAG)
외부 데이터베이스에서 질문과 관련된 정보를 검색한 뒤, 그 내용을 LLM에 전달하여 답변을 생성하게 하는 기법이다. 모델의 학습 데이터에 없는 최신 정보나 특정 도메인 지식을 활용할 수 있게 하여 답변의 정확도를 높이고 환각 현상을 줄인다.
패스트API(FastAPI)
파이썬 3.8+의 표준 타입 힌트를 바탕으로 한 현대적이고 빠른 웹 프레임워크이다. 비동기 프로그래밍을 지원하며, 작성된 코드를 기반으로 Swagger UI와 같은 대화형 API 문서를 자동으로 생성하여 개발 효율성을 극대화한다.
페이스(FAISS)
Meta(Facebook)에서 개발한 고밀도 벡터의 효율적인 유사도 검색 및 클러스터링을 위한 라이브러리이다. 수백만 개의 텍스트 임베딩 중에서 질문과 가장 유사한 조각을 빠르게 찾아내는 벡터 데이터베이스 역할을 수행한다.
랭체인 표현 언어(LCEL)
LangChain 컴포넌트들을 체인 형태로 쉽게 연결하기 위해 설계된 선언적 언어이다. 파이프(|) 연산자를 사용하여 리트리버, 프롬프트, 모델, 출력 파서를 하나의 워크플로우로 묶어 복잡한 AI 로직을 간결하게 구현한다.
엔드포인트(Endpoint)
API 서버가 외부 클라이언트와 통신하기 위해 노출하는 특정 URL 경로이다. 각 엔드포인트는 GET, POST 등의 HTTP 메서드와 결합하여 데이터 조회, 생성, 삭제 등의 고유한 기능을 수행한다.

기술

  • FastAPI
  • LangChain
  • FAISS
  • OpenAI API
  • Uvicorn
  • Python
  • Pydantic

활용 사례

  • 사내 문서 기반 Q&A 챗봇
  • PDF 분석 및 요약 API 서비스
  • 로컬 지식 베이스 검색 시스템

언급된 리소스

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 03. 02.수집 2026. 03. 02.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.