serviette
무엇인가
serviette는 문서 집합 위에 질의응답 서버를 세우는 Python 패키지다. RAG 파이프라인에서 수집·파싱·임베딩·색인·검색 API를 각각 이어 붙이던 접착 코드 자리를 CLI와 YAML 설정 하나로 대체한다. 엔진은 Pathway Live Data Framework이고 serviette 자신은 그 위의 얇은 계층이며, 파서·분할기·임베더를 자체 구현하지 않고 Pathway의 LLM xpack을 그대로 쓴다.
어떻게 동작하나
동작은 두 프로세스로 나뉜다. indexer가 소스를 실시간으로 감시해 문서를 파싱·분할·임베딩한 뒤 벡터 DB에 쓰고, server가 그 DB를 읽어 답변을 만든다. 소스는 로컬 파일시스템, Google Drive, S3/MinIO, SharePoint이며 PyFilesystem이 여는 FTP·SFTP·WebDAV·ZIP도 같은 설정에 섞을 수 있다. 임베더는 OpenAI, LiteLLM, SentenceTransformers, Gemini, Bedrock 계열이 indexer와 server 양쪽에서 동일하게 동작한다. 벡터 DB 쓰기는 Pathway 네이티브 커넥터를 거치므로 파일 수정과 삭제가 실제 upsert/delete로 반영된다.
무엇과 다른가
일반적인 RAG 구성은 문서를 모아 한 번 색인하고 변경분이 생기면 재색인 작업을 따로 돌린다. serviette는 문서가 파이프라인을 통과하는 구조라 추가·수정·삭제가 초 단위로 벡터 DB에 반영되고 재업로드나 재색인 단계가 없다. 문서가 파이프라인에 쌓이지 않으므로 큰 코퍼스에서도 메모리 사용량이 일정하게 유지된다. 벡터 DB는 DuckDB(내장, 기본값), pgvector, Qdrant, Milvus, ChromaDB, Weaviate, Pinecone, MongoDB Atlas Vector Search 중에서 고르며, DuckDB를 쓰면 외부 서비스 없이 로컬 파일 하나로 끝난다.
어떻게 쓰나
설정은 YAML 한 장이다. `serviette wizard`로 생성하거나 직접 쓰고, `serviette up`이 indexer와 server를 함께 감독한다. 운영에서는 `serviette indexer`와 `serviette server`를 따로 띄운다. server는 `/`에 채팅 UI를, `/api/v1` 아래에 버전이 붙은 REST API를 같은 포트에서 함께 서비스한다. 서버는 상태를 갖지 않아 수평 확장되고, indexer는 설정 한 줄로 워커 프로세스에 샤딩된다. 두 프로세스가 공유하는 것은 벡터 DB뿐이다.
전제와 한계
Pathway 라이선스 키가 필요하며 PATHWAY_LICENSE_KEY 환경변수로 전달한다(무료). pip 23.1 이상이 요구된다. 기본 로컬 임베더를 쓰면 문서·임베딩·색인이 모두 로컬이나 지정한 DB에 남고, 답변 생성 모델 API를 설정한 경우 검색된 일부 구절만 외부로 나간다. API 임베더를 고르면 문서 본문도 해당 API로 전송된다. 오디오·비디오 처리는 해당 API 키가 있어야 켜진다. 한 번에 질문 하나만 처리하며 대화 기억, 사용자 계정, 호스팅 서비스는 아직 없다.