핵심 요약
RAG 시스템을 실제 서비스로 배포하기 위해서는 외부에서 접근 가능한 API 구축이 필수적이다. 이 과정은 FastAPI를 활용하여 문서 업로드 및 인덱싱을 처리하는 Ingestion 파이프라인과 질문에 답변하는 Query 파이프라인을 구축하는 과정을 포함한다. LangChain으로 로직을 구성하고 FAISS를 벡터 DB로 활용하며, Swagger UI를 통해 엔드포인트를 실시간으로 테스트한다. 최종적으로 사용자는 자신의 PDF나 TXT 파일을 업로드하고 이에 대해 LLM과 대화할 수 있는 API 서버를 완성하게 된다.
배경
Python 가상환경 설정 방법, OpenAI API 키 발급, 기본적인 REST API 및 HTTP 메서드 이해, LangChain 기초 지식
대상 독자
RAG 시스템을 API 형태로 배포하고자 하는 AI 엔지니어 및 백엔드 개발자
의미 / 영향
이 가이드는 LLM 애플리케이션을 단순한 실험용 스크립트에서 실제 서비스 가능한 API 형태로 전환하는 구체적인 방법론을 제시한다. 이는 기업 내부 문서 기반의 지식 관리 시스템이나 특화된 Q&A 서비스를 구축하려는 팀에게 실질적인 구현 템플릿을 제공한다.
섹션별 상세

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 함수
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 쿼리 함수
@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 엔드포인트


실무 Takeaway
- FastAPI의 Swagger UI를 활용하면 프론트엔드 구현 없이도 RAG API 엔드포인트를 즉시 테스트하고 파이프라인의 동작을 검증할 수 있다.
- LangChain의 LCEL을 사용하면 리트리버, 프롬프트, LLM을 파이프 연산자로 연결하여 가독성이 높고 유지보수가 쉬운 RAG 체인을 구축한다.
- FAISS의 로컬 저장 기능을 활용하면 별도의 클라우드 벡터 데이터베이스 없이도 인덱싱된 데이터를 로컬 디스크에서 안정적으로 관리한다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.