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

利用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,从而创建一个智能化的搜索引擎。该搜索系统不仅能进行关键词匹配,还能理解更复杂的用户查询,提供更准确的搜索结果。这将极大提升用户的搜索体验。

印刷电路板(PCB)作为电子元件的关键支撑体,在电子设备中扮演着不可或缺的角色,其市场发展态势备受关注。QYResearch 的调研数据为我们揭示了该市场的全景:2024 年,全球印刷电路板市场规模约达 782.9 亿美元,而展望 2031 年,这一数字有望攀升至 1012.7 亿美元,在 2025 - 2031 期间,年复合增长率(CAGR)预计保持在 3.8%。然而,当前美国 2025 年关税框架的潜在变动,已然在全球市场掀起波澜,对印刷电路板市场的竞争格局、区域经济协同以及供应链体系产生着深远影响。 一、印刷电路板基础概述 印刷电路板,又被称作印制电路板或印刷线路板,常见英文缩写为 PCB(Printed circuit board)或 PWB(Printed wire board)。其内部存在金属导体,承担着连接电子元器件线路的重任。传统电路板主要运用印刷蚀刻阻剂的工艺,以此构建电路的线路与图面,这也是其名称的由来。在现代电子技术领域,PCB 通过电子印刷术制造而成,它成功搭建起电子元器件之间的电气连接桥梁,成为各类电子设备的核心组件。无论是体积小巧的智能穿戴设备,还是大型的服务器系统,只要其中配备集成电路等电子元件,PCB 必然 “参与其中”。 二、市场规模增长引擎 (一)中国主导地位凸显 中国在全球印刷电路板市场中占据着举足轻重的地位。据预测,2025 年中国市场规模有望达到 4333.21 亿元,在全球市场的占比将超过 50%。这一卓越成绩的背后,人工智能(AI)与新能源汽车产业功不可没,二者已成为驱动中国 PCB 市场增长的核心动力。以 AI 产业为例,随着 AI 技术的迅猛发展,对算力的需求呈爆发式增长,这使得 AI 服务器的市场需求大幅提升。而每台 AI 服务器中 PCB 的价值量可达 5000 元,预计到 2025 年,全球 AI 服务器相关的 PC
资源下载链接为: https://pan.quark.cn/s/637cf229ceb0 “official_web_copy_redbook” 是一个以小红书官网首页为蓝本,运用多种前端技术搭建而成的示例项目。开发者运用了 Bootstrap、jQuery、HTML5、CSS 以及 JavaScript 等一系列技术栈来完成页面制作。以下是对这些技术及其在项目中应用的详细阐述。 HTML5 作为超文本标记语言的最新版本,为网页开发带来了诸多新元素功能,其核心目标是提升网页的可读性、可访问性与互动性。在本项目中,HTML5 承担着构建网页基本架构的重任,它通过定义头部、导航、主体、底部等不同内容区块,清晰地划分页面结构。新出现的 <nav>、<section>、<article> 等元素,赋予了页面更强的语义化特性,这不仅有利于搜索引擎进行优化处理,也为无障碍访问提供了有力支持。 CSS(层叠样式表)主要负责掌控网页的外观与布局。在该项目里,CSS 被充分运用于定制小红书首页的视觉风格,涵盖颜色搭配、字体选择、间距设置以及整体布局等多个方面。借助 CSS,开发者能够实现响应式设计,确保页面在不同设备各种屏幕尺寸下都能呈现出良好的显示效果。而 CSS3 的出现,更是引入了动画过渡效果,这些效果或许被用于增强用户体验,例如制作按钮悬停时的特效、页面滚动时的动画等。 Bootstrap 是一款广受欢迎的开源前端框架,它集成了预设的 CSS 样式、JavaScript 组件以及网格系统,极大地提高了网页开发的效率。在仿小红书首页项目中,Bootstrap 很可能被用来快速搭建响应式布局,简化栅格设计流程,并提供诸如模态框、下拉菜单、按钮等交互元素。其包含的 CSS JavaScript 库,能够助力开发者维持设计的一致性与专业性。 jQuery 是一个轻量级的 JavaS
### Meilisearch 中的 AI 功能及其集成 Meilisearch 是一种快速且易于使用的开源搜索引擎,其最新版本已经集成了许多基于人工智能的技术,从而显著提升了搜索的相关性效率。以下是关于如何在 Meilisearch 中使用 AI 功能以及具体的集成方案。 #### 1. **AI 驱动的混合搜索** Meilisearch 的核心优势之一在于其能够通过 AI 技术增强传统文本搜索的能力[^3]。这种技术被称为“混合搜索”,它结合了传统的全文检索技术向量相似度计算方法。具体而言: - 用户可以利用嵌入模型(Embedding Model)将查询文档转换为高维空间中的向量表示。 - 这些向量随后被存储于 Meilisearch 的索引中,并可以通过近似最近邻算法(Approximate Nearest Neighbor, ANN)进行高效匹配[^4]。 #### 2. **设置 Meilisearch 并启用 AI 支持** 为了充分利用 Meilisearch 提供的 AI 能力,需要完成以下几个方面的配置: ##### 安装与初始化 首先,确保安装的是支持向量搜索功能的 Meilisearch 版本(如 v1.13 或更高)。可以从官方 GitHub 仓库获取二进制文件并启动服务[^2]: ```bash curl -L https://install.meilisearch.com | sh ./meilisearch --master-key=your_master_key & ``` ##### 创建索引并加载数据 创建一个新的索引并将结构化数据导入其中。如果计划执行向量搜索,则需额外指定用于存储嵌入向量的字段名称。例如,在 JSON 数据集中定义如下模式: ```json { "uid": "products", "primaryKey": "id", "settings": { "vectorRankingRule": true, "rankingRules": ["typo", "words", "proximity", "attribute", "sort", "exactness"] } } ``` 上述代码片段启用了 `vectorRankingRule` 参数以优化向量搜索的结果排序逻辑。 ##### 整合外部嵌入服务 由于 Meilisearch 自身并不直接提供生成嵌入的功能,因此通常建议借助第三方库或框架来预处理输入数据。比如 OpenAI、Hugging Face Transformers 等均可作为候选工具。下面是一个简单的 Python 实现案例演示如何将句子转化为对应的数值形式再上传至服务器端: ```python from sentence_transformers import SentenceTransformer import requests model = SentenceTransformer('all-MiniLM-L6-v2') texts = [ 'A laptop with a high resolution screen.', 'An affordable gaming PC.' ] embeddings = model.encode(texts).tolist() data = [{'id': i+1, 'text': t, 'embedding': e} for i,(t,e) in enumerate(zip(texts, embeddings))] response = requests.post( url='http://localhost:7700/indexes/products/documents', headers={'Authorization': f'Bearer your_master_key', 'Content-Type': 'application/json'}, json=data ) print(response.status_code) ``` #### 3. **实际应用场景分析** 当成功部署好具备 AI 增强特性的 Meilisearch 后,便可以在多种业务场景下发挥效用,包括但不限于电子商务推荐系统、社交媒体内容过滤器或者学术论文数据库管理平台等领域。这些地方往往都需要依赖复杂的语义理解能力才能满足最终用户的期望值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值