利用MeiliSearch和OpenAI API打造智能搜索系统
简介

在本文中,我们将展示如何结合使用MeiliSearch和OpenAI的API来创建一个智能搜索系统。MeiliSearch是一款开源、高性能的搜索引擎,而OpenAI提供了强大的自然语言处理(NLP)模型。通过这两个工具,我们可以实现高效而智能的文本搜索功能。

第一步:引入依赖和配置文件

在实现之前,我们需要引入所需的库,并加载配置文件。代码如下:

import meilisearch
import requests
from meilisearch.models.task import Task
import time
import openai
import json
from tqdm import tqdm

接下来,我们定义一个 MeiliSearchHandler 类来封装主要的功能。在初始化时,我们会加载配置文件,其中包括MeiliSearch和OpenAI的相关配置。

class MeiliSearchHandler:
    def __init__(self, config_path):
        with open(config_path) as f:
            self.configs = json.load(f)
        self.meili_client = meilisearch.Client(self.configs["meili_configs"]["url"], self.configs["meili_configs"]["key"])
        self.openai_client = openai.OpenAI(api_key=self.configs["ai_configs"]["api_key"],
                                           base_url=self.configs["ai_configs"]["api_base"])
        self.index_name = self.configs["meili_configs"]["index"]
        self.embedder_name = self.configs["meili_configs"]["embedder_name"]
        self.embedding_dimension = 3072
第二步:开启MeiliSearch的向量存储功能

MeiliSearch原生支持向量存储,我们需要手动开启这一功能。通过向API发起PATCH请求,我们可以启用向量存储:

def enable_vector_store(self):
    url = f"{self.configs['meili_configs']['url']}/experimental-features"
    payload = {"vectorStore": True}
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {self.configs['meili_configs']['key']}"
    }
    response = requests.patch(url, json=payload, headers=headers)
    print('开启vectorStore完成', response.json())
第三步:创建和配置索引

我们需要在MeiliSearch中创建一个索引,并配置嵌入相关的设置。

def create_index(self):
    create_index_task = self.meili_client.create_index(self.index_name, {"primaryKey": "id"})
    return self.get_task(create_index_task)

def update_index_settings(self):
    settings_task = self.meili_client.index(self.index_name).update_settings({
        "embedders": {
            self.embedder_name: {
                "source": "userProvided",
                "dimensions": self.embedding_dimension
            }
        }
    })
    return self.get_task(settings_task)
第四步:生成文本嵌入

利用OpenAI的API,我们可以将文本转换为嵌入向量。

def embed_text(self, text: str):
    emb = self.openai_client.embeddings.create(
        model="text-embedding-3-large",
        input=text
    )
    return emb.data[0].embedding
第五步:准备和添加数据

我们需要将数据处理成合适的格式,并将其添加到MeiliSearch索引中。

def prepare_data(self, texts):
    data = []
    for i, record in enumerate(tqdm(texts)):
        dic = {
            "id": i + 100,
            "text": record,
            "embedding": self.embed_text(record)
        }
        data.append(dic)
    return data

def add_documents(self, documents):
    add_documents_task = self.meili_client.index(self.index_name).add_documents(documents)
    while True:
        be_task = self.get_task(add_documents_task, wait_time=2)
        print(be_task)
        if be_task.status == "succeeded":
            print('任务完成')
            break
        elif be_task.status == "failed":
            print('任务失败')
            break
第六步:进行搜索查询

一旦数据添加完成,我们就可以通过文本查询进行搜索。这里的搜索是通过生成查询的嵌入向量,并与索引中的向量进行匹配来实现的。

def search_query(self, query):
    query_embedding = self.embed_text(query)
    search_result = self.meili_client.index(self.index_name).search(query, {
        "hybrid": {
            "semanticRatio": 0.5,
            "embedder": self.embedder_name
        },
        "vector": query_embedding,
        "showRankingScoreDetails": True,
        "limit": 5
    })
    return search_result
最后:主程序执行

在主程序中,我们实例化 MeiliSearchHandler,并调用上述方法来实现完整的功能流程。

if __name__ == "__main__":
    handler = MeiliSearchHandler("config.json")
    handler.enable_vector_store()
    handler.create_index()
    handler.update_index_settings()

    texts = ['问题:早上好', '答案:晚上好']
    data = handler.prepare_data(texts)

    documents = [
        {
            "id": record["id"],
            "text": record["text"],
            "_vectors": {
                handler.embedder_name: record["embedding"]
            }
        }
        for record in data
    ]
    handler.add_documents(documents)
    
    query = "答案"
    search_result = handler.search_query(query)
    print(search_result)
总结

通过本文的步骤,你可以在自己的项目中集成MeiliSearch和OpenAI的API,从而创建一个智能化的搜索引擎。该搜索系统不仅能进行关键词匹配,还能理解更复杂的用户查询,提供更准确的搜索结果。这将极大提升用户的搜索体验。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐