⚠️
本教程适用于 Meilisearch v1.6 之前的版本。如果您使用的是 Meilisearch v1.6 或更高版本,请参考更新的指南 我们的文档中.

向量搜索允许您查找具有相似特征的文档。在本教程中,我们将使用 OpenAI 的文本嵌入来衡量文档属性之间的相似度。然后,我们将使用 LangChain 框架无缝集成 Meilisearch 并构建语义搜索。

💡
本指南使用 Meilisearch 的 Python SDK。但您可以 使用几乎任何语言与 Meilisearch 进行交互.

需求

本教程假设您对 Python 和 LangChain 有基本了解。不要担心,代码示例将包含大量注释。即使您还不是 LangChain 专家,您也不会感到迷茫!

本教程需要

  • Python(LangChain 需要 >= 3.8.1 且 < 4.0)和 pip CLI
  • Meilisearch 1.3、1.4 或 1.5(不高于 ⚠️)
  • OpenAI API 密钥 - 获取您的密钥
💡
我们正在努力使 LangChain 与 v1.6 及更高版本兼容。

设置 Meilisearch 实例

首先,确保您已运行 Meilisearch。您可以按照 本地安装文档 在本地运行 Meilisearch,或者在 Meilisearch Cloud 中创建一个项目。

无论哪种方式,您都需要启用向量存储功能。对于自托管的 Meilisearch,请阅读有关 启用实验性功能 的文档。在 Meilisearch Cloud 上,通过项目的“设置”页面启用“向量存储”。

创建 Meilisearch 实例后,请确保获取您的 Meilisearch 主机和 API 密钥。在本教程中,我们将使用具有写入权限的单个密钥:主 API 密钥

⚠️
在生产环境中,我们建议 使用不同的 API 密钥,这些密钥仅具有操作所需的最小权限。

创建项目

让我们为项目创建一个文件夹,其中包含一个空main.py 文件,用于存放我们的代码。

在编写代码之前,让我们安装必要的依赖项

pip install langchain openai meilisearch python-dotenv
💡
本指南使用 python-dotenv.env 文件加载环境变量。您可以自由地使用任何其他方便的方式加载它们。

如果使用 dotenv,请先创建一个 .env 文件来存储我们的凭据

# .env

MEILI_HTTP_ADDR="your Meilisearch host"
MEILI_MASTER_KEY="your Meilisearch API key"
OPENAI_API_KEY="your OpenAI API key"

现在我们有了环境变量,让我们创建一个 setup.py 文件,其中包含示例代码的模板

# setup.py

import os
from dotenv import load_dotenv # remove if not using dotenv
from langchain.vectorstores import Meilisearch
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import JSONLoader

load_dotenv() # remove if not using dotenv

# exit if missing env vars
if "MEILI_HTTP_ADDR" not in os.environ:
    raise Exception("Missing MEILI_HTTP_ADDR env var")
if "MEILI_MASTER_KEY" not in os.environ:
    raise Exception("Missing MEILI_MASTER_KEY env var")
if "OPENAI_API_KEY" not in os.environ:
    raise Exception("Missing OPENAI_API_KEY env var")

# Setup code will go here 👇

导入文档和嵌入

现在我们的项目已准备就绪,让我们将一些文档导入 Meilisearch。首先,下载这个小型电影数据集

🔗 movies-lite.json

然后,让我们更新 setup.py 文件以加载 JSON 并将其存储在 Meilisearch 中。我们还将使用 OpenAI 文本搜索模型来生成我们的向量嵌入。

# setup.py

# previous code

# Load documents
loader = JSONLoader(
    file_path="./movies-lite.json",
    jq_schema=".[] | {id: .id, overview: .overview, title: .title}",
    text_content=False,
)
documents = loader.load()
print("Loaded {} documents".format(len(documents)))

# Store documents in Meilisearch
embeddings = OpenAIEmbeddings()
vector_store = Meilisearch.from_documents(documents=documents, embedding=embeddings)

print("Started importing documents")

瞧!运行您的 Meilisearch 实例现在将包含您的文档。Meilisearch 异步运行诸如文档导入等任务 异步执行,因此您可能需要等待一段时间才能使文档可用。

🤔
遇到问题了吗?请随时在我们的 Discord 社区 寻求帮助。

我们的数据库现在应该包含我们的电影。让我们创建一个新的 search.py 文件来执行语义搜索查询:使用相似性搜索查找文档。

# search.py

import os
from dotenv import load_dotenv
from langchain.vectorstores import Meilisearch
from langchain.embeddings.openai import OpenAIEmbeddings
import meilisearch

load_dotenv()

# You can use the same code as `setup.py` to check for missing env vars

# Create the vector store
client = meilisearch.Client(
    url=os.environ.get("MEILI_HTTP_ADDR"),
    api_key=os.environ.get("MEILI_MASTER_KEY"),
)
embeddings = OpenAIEmbeddings()
vector_store = Meilisearch(client=client, embedding=embeddings)

# Make similarity search
query = "superhero fighting evil in a city at night"
results = vector_store.similarity_search(
    query=query,
    k=3,
)

# Display results
for result in results:
    print(result.page_content)

让我们尝试运行我们的文件!如果一切正常,我们应该看到以下输出

{"id": 155, "title": "The Dark Knight", "overview": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker."}
{"id": 314, "title": "Catwoman", "overview": "Liquidated after discovering a corporate conspiracy, mild-mannered graphic artist Patience Phillips washes up on an island, where she's resurrected and endowed with the prowess of a cat -- and she's eager to use her new skills ... as a vigilante. Before you can say \"cat and mouse,\" handsome gumshoe Tom Lone is on her tail."}
{"id": 268, "title": "Batman", "overview": "Batman must face his most ruthless nemesis when a deformed madman calling himself \"The Joker\" seizes control of Gotham's criminal underworld."}

恭喜 🎉 我们成功使用 Meilisearch 作为 LangChain 向量存储来执行相似性搜索。

更进一步

使用 Meilisearch 作为 LangChain 向量存储,您可以通过多种方式加载文档并搜索它们

有关更多信息,请务必查阅

最后,如果您想在没有 LangChain 的情况下使用 Meilisearch 向量搜索功能,请选择您喜欢的语言并查看 相关 SDK 文档.


订阅我们的 新闻稿,随时了解最新信息。要了解更多关于 Meilisearch 的未来以及如何帮助塑造它,请查看我们的 路线图,并加入我们的 产品讨论

有关其他事项,请加入我们的开发者社区,加入 Discord。在那里见!