Meilisearch
Meilisearch is an open-source, lightning-fast, and hyper relevant search engine. It comes with great defaults to help developers build snappy search experiences.
You can self-host Meilisearch or run on 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 上,通过项目的设置页面启用向量存储。
你现在应该有一个运行中的 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 --upgrade --quiet meilisearch
有关更多信息,请参阅 Meilisearch Python SDK 文档。
示例
初始化 Meilisearch 向量存储有多种方法:可以提供一个 Meilisearch 客户端,或者根据需要提供 URL 和 API 密钥。在我们的示例中,凭据将从环境中加载。
您可以通过使用 os 和 getpass 将环境变量引入到您的 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 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)
带分数的相似性搜索
这种方法允许您返回文档以及查询到它们的距离分数。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]
更多资源
文档
开源仓库