Skip to main content
Meilisearch 是一个开源、极速且高度相关的搜索引擎。它具有出色的默认配置,帮助开发者构建快速的搜索体验。 您可以自托管 Meilisearch 或在 Meilisearch Cloud 上运行。
Meilisearch v1.3 支持向量搜索。本页面将指导您将 Meilisearch 集成为向量存储并使用它执行向量搜索。 使用本集成需要通过 pip install -qU langchain-community 安装 langchain-community

设置

启动 Meilisearch 实例

您需要一个运行中的 Meilisearch 实例作为向量存储。您可以在本地运行 Meilisearch 或创建 Meilisearch Cloud 账户。 从 Meilisearch v1.3 起,向量存储是一项实验性功能。启动 Meilisearch 实例后,您需要启用向量存储。对于自托管的 Meilisearch,请阅读启用实验性功能的文档。在 Meilisearch Cloud 上,通过项目的_设置_页面启用 Vector Store 现在您应该有一个已启用向量存储的 Meilisearch 实例在运行了。🎉

凭证

要与 Meilisearch 实例交互,Meilisearch SDK 需要主机(实例 URL)和 API 密钥。 主机
  • 本地,默认主机为 localhost:7700
  • Meilisearch Cloud 上,在项目的_设置_页面中找到主机
API 密钥 Meilisearch 实例提供三种内置 API 密钥:
  • MASTER KEY(主密钥)— 仅用于创建 Meilisearch 实例
  • ADMIN KEY(管理密钥)— 仅在服务端用于更新数据库及其设置
  • SEARCH KEY(搜索密钥)— 可安全在前端应用中共享的密钥
您可以根据需要创建其他 API 密钥

安装依赖

本指南使用 Meilisearch Python SDK。您可以通过以下命令安装:
pip install -qU  meilisearch
更多信息请参阅 Meilisearch Python SDK 文档

示例

初始化 Meilisearch 向量存储有多种方式:提供 Meilisearch 客户端,或根据需要提供 URLAPI 密钥。在我们的示例中,凭证将从环境变量中加载。 您可以使用 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 密钥。
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 向量存储来添加文档

在这种方式中,我们创建一个向量存储对象,然后向其中添加文档。
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)

带分数的相似度搜索

此特定方法允许您返回文档及查询与它们之间的距离分数。embedder_name 是用于语义搜索的嵌入器名称,默认为 “default”。
docs_and_scores = vector_store.similarity_search_with_score(
    query, embedder_name=embedder_name
)
docs_and_scores[0]

按向量进行相似度搜索

embedder_name 是用于语义搜索的嵌入器名称,默认为 “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]

其他资源

文档 开源仓库