利用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,从而创建一个智能化的搜索引擎。该搜索系统不仅能进行关键词匹配,还能理解更复杂的用户查询,提供更准确的搜索结果。这将极大提升用户的搜索体验。
标签:MeiliSearch,task,name,index,self,meili,API,OpenAI,configs From: https://blog.csdn.net/rootb/article/details/144199248