orama
무엇인가
Orama는 JavaScript/TypeScript로 작성된 임베디드 검색 엔진 라이브러리다. 프로세스 안에서 인덱스를 만들고 질의를 처리하며, 브라우저·Node.js 서버·엣지 런타임에서 같은 API로 동작한다. 별도 검색 서버를 띄우는 제품이 아니라 애플리케이션 코드에 포함되는 라이브러리 계열에 속한다.
어떻게 동작하나
create()로 스키마를 정의해 인덱스 인스턴스를 만들고, insert()로 문서를 넣고, search()로 질의한다. 스키마는 문자열·숫자·불리언·열거형·지오포인트와 그 배열형까지 10가지 타입을 받는다. 전문 검색은 BM25 스코어링을 쓰고 30개 언어의 토큰화·스테밍을 처리한다. search()에 mode: 'vector' 또는 'hybrid'를 넘기면 벡터 검색으로 전환되며, 이때 텍스트 임베딩은 호출자가 검색 시점에 직접 넘긴다. 인덱스는 메모리에 상주하고 영속화는 플러그인이 맡는다.
무엇과 다른가
Elasticsearch나 Algolia 같은 외부 검색 서비스는 별도 프로세스, 네트워크 왕복, 인프라 운영을 전제로 한다. Orama는 같은 프로세스 안에 인덱스를 들고 있어 네트워크 홉이 없고, 코어 번들이 2KB 미만이라 클라이언트 번들에 넣을 수 있다. 벡터 검색을 위해 별도 벡터 DB를 두지 않고 하나의 인덱스에서 전문·벡터·하이브리드 질의를 함께 처리한다.
어떻게 쓰나
설치 후 create({ schema }) → insert → search 순서로 첫 질의를 만든다. 기능 확장은 플러그인으로 한다. @orama/plugin-embeddings는 임베딩 생성을, plugin-secure-proxy는 클라이언트에서 OpenAI 호출을 안전하게 중계하는 역할을, plugin-data-persistence는 인덱스 저장·복원을 담당한다. 그 외 analytics, QPS, PT15 플러그인과 VitePress·Docusaurus·Astro·Nextra 문서 사이트 통합이 있다. v3.0.0부터는 GenAI 채팅 세션을 만들어 ChatGPT·Perplexity류 경험을 붙일 수 있다.
전제와 한계
벡터·하이브리드 검색에 필요한 임베딩을 라이브러리가 생성하지 않으므로 외부 임베딩 모델이나 플러그인이 있어야 한다. GenAI 채팅은 OpenAI API 호출을 전제로 하고, 클라이언트에서 호출하려면 secure proxy 플러그인을 거쳐야 한다. 인덱스는 기본적으로 메모리에 있으므로 영속화 플러그인 없이는 프로세스가 끝날 때 사라진다. 스키마 타입은 10가지로 고정되어 있고, 2KB는 코어 크기이며 플러그인을 포함한 크기가 아니다.
관련 논문 5
유사 도구
- meilisearchRust로 작성된 검색 엔진 서버다. 전문 검색과 시맨틱 검색을 결합한 하이브리드 검색을 RESTful HTTP API로 제공한다.
- AutoRAGPDF·위키·노트·논문을 검색해 근거를 직접 읽고 번호 붙은 지식 단위로 큐레이션하는 자가 진화형 사서 에이전트 CLI다.
- chroma임베딩과 메타데이터를 저장하고 벡터·전문·하이브리드 검색을 제공하는 오픈소스 AI 검색 인프라다. Rust 코어와 Python·JS 클라이언트로 동작한다.
- paradedbPostgres에 커스텀 인덱스를 추가해 전문 검색·벡터 검색·집계를 한 데이터베이스 안에서 처리하는 Rust 확장이다. 별도 검색 시스템을 두지 않는다.
- RediSearchRedis 해시에 보조 인덱스와 전문 검색, 벡터 유사도 검색, 집계를 붙이는 쿼리·인덱싱 엔진이다. Redis 8부터 코어에 포함된다.
- databerry노코드로 자체 데이터에 근거해 답하는 LLM 에이전트를 만들어 링크·위젯·API로 배포하는 플랫폼이다. 문서를 임베딩해 벡터 검색으로 근거를 찾는다.