Meilisearch
Meilisearch 是一个开源、超快速和高度相关的搜索引擎。它提供了出色的默认设置,帮助开发人员构建迅捷的搜索体验。
您可以自行托管 Meilisearch 或在Meilisearch Cloud上运行。
Meilisearch v1.3 支持向量搜索。本页面将指导您将 Meilisearch 集成为向量存储,并使用它执行向量搜索。
设置
启动 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 meilisearch
有关更多信息,请参阅Meilisearch Python SDK 文档。
示例
有多种方法可以初始化 Meilisearch 向量存储:根据需要提供 Meilisearch 客户端或 URL 和 API 密钥。在我们的示例中,凭据将从环境中加载。
您可以使用 os
和 getpass
将环境变量提供给您的 Notebook 环境。您可以在所有以下示例中使用此技术。
import os
import getpass
os.environ["MEILI_HTTP_ADDR"] = getpass.getpass("Meilisearch HTTP 地址和端口:")
os.environ["MEILI_MASTER_KEY"] = getpass.getpass("Meilisearch API 密钥:")
我们想要使用 OpenAIEmbeddings,因此我们需要获取 OpenAI API 密钥。
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API 密钥:")
添加文本和嵌入
此示例将文本添加到 Meilisearch 向量数据库,而无需初始化 Meilisearch 向量存储。
from langchain.vectorstores import Meilisearch
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
embeddings = OpenAIEmbeddings()
with open("../../../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)
# 使用 Meilisearch 向量存储将文本和关联的嵌入作为向量存储
vector_store = Meilisearch.from_texts(texts=texts, embedding=embeddings)
在幕后,Meilisearch 将文本转换为多个向量。这将带我们到以下示例的相同结果。
添加文档和嵌入
在此示例中,我们将使用 Langchain TextSplitter 将文本拆分为多个文档。然后,我们将存储这些文档以及它们的嵌入。
from langchain.document_loaders import TextLoader
# 加载文本
loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 创建文档
docs = text_splitter.split_documents(documents)
# 在向量存储中导入文档和嵌入
vector_store = Meilisearch.from_documents(documents=documents, embedding=embeddings)
# 在向量存储中搜索
query = "What did the president say about Ketanji Brown Jackson"
docs = vector_store.similarity_search(query)
print(docs[0].page_content)
通过创建 Meilisearch 向量存储添加文档
在这种方法中,我们创建一个向量存储对象并向其添加文档。
from langchain.vectorstores import Meilisearch
import meilisearch
client = meilisearch.Client(url="http://127.0.0.1:7700", api_key="***")
vector_store = Meilisearch(
embedding=embeddings, client=client, index_name="langchain_demo", text_key="text"
)
vector_store.add_documents(documents)
带有分数的相似性搜索
此特定方法允许您返回查询与文档之间的距离分数。
docs_and_scores = vector_store.similarity_search_with_score(query)
docs_and_scores[0]
通过向量进行相似性搜索
embedding_vector = embeddings.embed_query(query)
docs_and_scores = vector_store.similarity_search_by_vector(embedding_vector)
docs_and_scores[0]
其他资源
文档
开源仓库