首页 > 其他分享 >利用MeiliSearch和OpenAI API打造智能搜索系统

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

时间:2024-12-06 13:33:26浏览次数:5  
标签:MeiliSearch task name index self meili API OpenAI configs

利用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

相关文章

  • win32 API编程之GDI绘图
    一、GDI简介1)什么是设备上下文2)设备上下文类型3)常见的GDI对象4)windows坐标系5)GDI绘图步骤二、获取DC的3种方法1)获取DC的3种方法2)PAINTSTRUCT结构3)BeginPaint函数4)EndPaint函数5)GetDC函数6)GetWindowDC函数7)三种方式的区别8)代码实例#include<windows.h......
  • 【OpenAI】ChatGPT Pro月费200美元,硬核用户的福音还是高价陷阱?
    文章目录一、OpenAI12天狂欢的重磅更新1.1什么是“12DaysofOpenAI”?1.2首日重磅:o1满血版与ChatGPTPro二、o1满血版:更快、更强、更聪明2.1性能升级2.2推理能力提升2.3支持图片上传三、ChatGPTPro:顶级订阅计划的全新体验3.1ChatGPTPro的核心优势3.2Chat......
  • 一个api接口从请求数据到请求结束共与服务器进行了几次交互?
    一个API接口从请求数据到请求结束,前端与服务器通常进行两次交互:请求(Request):前端发送请求到服务器。这是第一次交互。请求中包含了请求方法(例如GET,POST,PUT,DELETE等),URL,以及任何必要的请求数据(例如表单数据,JSON数据等)。响应(Response):服务器处......
  • 天天 AI-241205:今日热点- OpenAI放王炸!Sora、满血o1,连续12天发布最新技术!
    2AGI.NET|探索AI无限潜力,2AGI为您带来最前沿资讯。OpenAI放王炸!Sora、满血o1,连续12天发布最新技术!OpenAI将进行为期12天的技术分享活动,每天发布最新技术或产品演示,包括文生视频模型Sora、增强的ChatGPT功能、GPT-4o图像等,引发科技界和AI社区的广泛关注和期待。来源 ......
  • OpenAI圣诞大礼包连更12天!满血版o1、Sora确认亮相
    【AGI舰长导读】重磅!满血版o1震撼上线了!12月5日起,OpenAI将开始连续12天的圣诞马拉松。根据外媒TheVerge的内部消息,满血版o1和Sora会正式发布,网友们沸腾了。满血版o1首次将多模态和新的推理范式结合起来,更智能、更快速。同时推出的还有200美元/月的专业版ChatGPTPro。奥特曼......
  • 探索 Vue 的 API 风格:选项式 API 与组合式 API 全解析
    目录探索Vue的API风格:选项式API与组合式API全解析一、VueAPI风格概述(一)选项式API(二)组合式API二、组合式API详细解析(一)使用前提(二)声明响应式变量(三)声明函数(四)声明钩子函数(五)将数据绑定到HTML元素(六)处理事件绑定(七)易错点提醒三、组合式API示例演......
  • Java流式编程(Stream API部分)
    一、流式编程在Java流式编程中,流(Stream)是一个抽象的概念,用于表示数据的序列。流提供了一种高级迭代的机制,允许你以声明式方式处理数据集合。1.1.流式编程概述流是一个元素序列,这些元素可以是集合中的元素,也可以是来自于数组、I/O通道、生成器函数等。Stream流的作用是结......
  • fastapi初见
    最近想学习一类pythonweb开发框架,在前辈的推荐下,开始对fastapi进行学习。发现fastapi超好的官方指导文档,现记录自己的学习过程,希望自己能在学习中能有所收获和成长官方文档地址:https://fastapi.tiangolo.com/zh/特点根据官方文档的介绍,fastapi具备:高性能,易于学习,高效编码,生......
  • 微信小程序常用 API 功能详解
    微信小程序提供了丰富的API,帮助开发者实现各种功能。本文将详细介绍一些常用的API,包括获取网络类型、下载文件到本地、预览文件、扫码、获取头像、获取用户信息以及判断API是否可用。1.获取网络类型通过wx.getNetworkTypeAPI,开发者可以获取当前设备的网络类型,如Wi......
  • vue学习-组合式API下的父子通信
    1.父传子基本思想:1;父组件给子组件绑定属性2:子组件内部通过props选项接收示例:父组件示例:子组件接收:运行代码打开浏览器,展示结果:这里看到子组件收到了父组件传过来的message成功接收并渲染出来。2.子传父基本思想:1.父组件中给子组件标签通过@绑定事件2.组组件内部......