Meilisearch는 오픈 소스이자 번개처럼 빠르고, 매우 높은 관련성을 제공하는 검색 엔진입니다. 개발자가 경쾌한 검색 경험을 구축할 수 있도록 훌륭한 기본 설정을 제공합니다. Meilisearch를 자체 호스팅(Self-host)하거나 Meilisearch Cloud에서 실행할 수 있습니다.
Meilisearch v1.3는 벡터 검색을 지원합니다. 이 페이지는 Meilisearch를 벡터 스토어로 통합하고 이를 사용해 벡터 검색을 수행하는 방법을 안내합니다. 이 통합을 사용하려면 pip install -qU langchain-communitylangchain-community를 설치해야 합니다

설정

Meilisearch 인스턴스 시작하기

벡터 스토어로 사용할 실행 중인 Meilisearch 인스턴스가 필요합니다. 로컬에서 Meilisearch를 실행하거나 Meilisearch Cloud 계정을 생성할 수 있습니다. Meilisearch v1.3 기준으로, 벡터 저장소는 실험적 기능입니다. Meilisearch 인스턴스를 시작한 후, 반드시 벡터 저장소를 활성화해야 합니다. 자체 호스팅 Meilisearch의 경우 실험적 기능 활성화 문서를 참고하세요. Meilisearch Cloud에서는 프로젝트의 Settings 페이지에서 _Vector Store_를 활성화하세요. 이제 벡터 저장소가 활성화된 Meilisearch 인스턴스가 실행 중이어야 합니다. 🎉

자격 증명

Meilisearch 인스턴스와 상호작용하려면, Meilisearch SDK가 호스트(인스턴스의 URL)와 API 키를 필요로 합니다. 호스트
  • 로컬에서는 기본 호스트가 localhost:7700입니다
  • Meilisearch Cloud에서는 프로젝트 Settings 페이지에서 호스트를 확인하세요
API 키 Meilisearch 인스턴스는 기본적으로 다음 세 가지 API 키를 제공합니다:
  • MASTER KEY — Meilisearch 인스턴스를 생성할 때만 사용해야 합니다
  • ADMIN KEY — 데이터베이스 및 설정을 업데이트하기 위해 서버 측에서만 사용하세요
  • SEARCH KEY — 프런트엔드 애플리케이션에서 안전하게 공유할 수 있는 키입니다
필요에 따라 추가 API 키를 생성할 수 있습니다.

의존성 설치

이 가이드는 Meilisearch Python SDK를 사용합니다. 다음 명령으로 설치할 수 있습니다:
pip install -qU  meilisearch
자세한 내용은 Meilisearch Python SDK 문서를 참고하세요.

예제

Meilisearch 벡터 스토어를 초기화하는 방법은 여러 가지가 있습니다. 필요에 따라 Meilisearch client를 제공하거나 _URL_과 _API key_를 제공할 수 있습니다. 아래 예제에서는 환경 변수에서 자격 증명을 로드합니다. osgetpass를 사용하여 Notebook 환경에서 환경 변수를 사용할 수 있게 만들 수 있습니다. 이 방법은 아래의 모든 예제에 적용할 수 있습니다.
import getpass
import os

if "MEILI_HTTP_ADDR" not in os.environ:
    os.environ["MEILI_HTTP_ADDR"] = getpass.getpass(
        "Meilisearch HTTP address and port:"
    )
if "MEILI_MASTER_KEY" not in os.environ:
    os.environ["MEILI_MASTER_KEY"] = getpass.getpass("Meilisearch API Key:")
OpenAIEmbeddings를 사용하려면 OpenAI API Key가 필요합니다.
if "OPENAI_API_KEY" not in os.environ:
    os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

텍스트와 임베딩 추가

이 예제는 Meilisearch 벡터 스토어를 초기화하지 않고 Meilisearch 벡터 데이터베이스에 텍스트를 추가합니다.
from langchain_community.vectorstores import Meilisearch
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

embeddings = OpenAIEmbeddings()
embedders = {
    "default": {
        "source": "userProvided",
        "dimensions": 1536,
    }
}
embedder_name = "default"
with open("../../how_to/state_of_the_union.txt") as f:
    state_of_the_union = f.read()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(state_of_the_union)
# Use Meilisearch vector store to store texts & associated embeddings as vector
vector_store = Meilisearch.from_texts(
    texts=texts, embedding=embeddings, embedders=embedders, embedder_name=embedder_name
)
내부적으로 Meilisearch는 텍스트를 여러 벡터로 변환합니다. 이는 다음 예제와 동일한 결과를 가져옵니다.

문서와 임베딩 추가

이 예제에서는 LangChain TextSplitter를 사용해 텍스트를 여러 문서로 분할합니다. 그런 다음 해당 문서와 임베딩을 함께 저장합니다.
from langchain_community.document_loaders import TextLoader

# Load text
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)

# Create documents
docs = text_splitter.split_documents(documents)

# Import documents & embeddings in the vector store
vector_store = Meilisearch.from_documents(
    documents=documents,
    embedding=embeddings,
    embedders=embedders,
    embedder_name=embedder_name,
)

# Search in our vector store
query = "What did the president say about Ketanji Brown Jackson"
docs = vector_store.similarity_search(query, embedder_name=embedder_name)
print(docs[0].page_content)

Meilisearch Vectorstore 생성으로 문서 추가

이 방식에서는 벡터 스토어 객체를 생성한 뒤 그 안에 문서를 추가합니다.
import meilisearch
from langchain_community.vectorstores import Meilisearch

client = meilisearch.Client(url="http://127.0.0.1:7700", api_key="***")
vector_store = Meilisearch(
    embedding=embeddings,
    embedders=embedders,
    client=client,
    index_name="langchain_demo",
    text_key="text",
)
vector_store.add_documents(documents)
이 메서드는 문서와 함께 질의와의 거리 점수(distance score)도 반환합니다. embedder_name은 시맨틱 검색에 사용할 embedder의 이름이며, 기본값은 “default”입니다.
docs_and_scores = vector_store.similarity_search_with_score(
    query, embedder_name=embedder_name
)
docs_and_scores[0]
embedder_name은 시맨틱 검색에 사용할 embedder의 이름이며, 기본값은 “default”입니다.
embedding_vector = embeddings.embed_query(query)
docs_and_scores = vector_store.similarity_search_by_vector(
    embedding_vector, embedder_name=embedder_name
)
docs_and_scores[0]

추가 자료

문서 오픈 소스 저장소
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I