关于数据库:图书搜索领域重大突破用Apache-SeaTunnelMilvus和OpenAI提高书名相似度搜索精准度和效率

39次阅读

共计 4240 个字符,预计需要花费 11 分钟才能阅读完成。

作者 | 刘广东,Apache SeaTunnel Committer

背景

目前,现有的图书搜寻解决方案(例如公共图书馆应用的解决方案)非常依赖于关键词匹配,而不是对书名理论内容的语义了解。因而会导致搜寻后果并不能很好地满足咱们的需要,甚至与咱们期待的后果天壤之别。这是因为仅仅依附关键词匹配是不够的,因为它无奈实现语义了解,也就无奈了解搜寻者真正的用意。

那么,有更好的办法能够让咱们更加精确、高效地进行图书搜寻吗?答案是有!本文中,我将介绍如何联合应用 Apache SeaTunnel、Milvus 和 OpenAI 进行类似度搜寻,实现对整个书名的语义了解,从而让搜寻后果更加精准。

应用训练有素的模型来示意输出数据被称为语义搜寻,这种办法能够扩大到各种不同的基于文本的用例,包含异样检测和文档搜寻。因而,本文所介绍的技术能够为图书搜寻畛域带来重大的冲破和影响。

接下来我来简略介绍几个与本文相干的概念和用到的工具 / 平台,便于大家更好地了解本文。

什么是 Apache SeaTunnel

Apache SeaTunnel 是一个开源的、高性能的、分布式的数据管理和计算平台。它是由 Apache 基金会反对的一个顶级我的项目,可能解决海量数据、提供实时的数据查问和计算,并反对多种数据源和格局。SeaTunnel 的指标是提供一个可扩大的、面向企业的数据管理和集成平台,以满足各种大规模数据处理需要。

什么是 Milvus

Milvus 是一个开源的相似向量搜索引擎,它反对海量向量的存储、检索和类似度搜寻,是一个针对大规模向量数据的高性能、低成本的解决方案。Milvus 能够在多种场景下应用,如举荐零碎、图像搜寻、音乐举荐和自然语言解决等。

什么是 OpenAI

ChatGPT 是一种基于 GPT(Generative Pre-trained Transformer)模型的对话生成零碎,是由 OpenAI 开发的。该零碎次要应用了自然语言解决、深度学习等技术,能够生成与人类对话类似的自然语言文本。ChatGPT 的利用范畴很广,能够用于开发智能客服、聊天机器人、智能助手等应用程序,也能够用于语言模型的钻研和开发。近年来,ChatGPT 曾经成为了自然语言解决畛域的钻研热点之一。

什么是 LLM(Large Language Model)

大语言模型(Large Language Model)是一种基于深度学习技术的自然语言解决模型,它能够对一段给定的文本进行剖析和了解,并生成与之相干的文本内容。大语言模型通常应用深度神经网络来学习自然语言的语法和语义规定,并将文本数据转换为间断向量空间中的向量示意。在训练过程中,大语言模型利用大量的文本数据来学习语言模式和统计法则,从而能够生成高质量的文本内容,如文章、新闻、对话等。大语言模型的应用领域十分宽泛,包含机器翻译、文本生成、问答零碎、语音辨认等。目前,许多凋谢源代码深度学习框架都提供了大语言模型的实现,如 TensorFlow、PyTorch 等。

教程

重点来了!我将展现如何将 Apache SeaTunnel、OpenAI 的 Embedding API 与咱们的矢量数据库联合应用,来通过语义搜寻整个书名。

筹备步骤

在试验之前,咱们须要去官网获取一个 OpenAI 的 token,而后在去部署一个 Milvus 的试验环境。咱们还须要筹备好将用于这个例子的数据。你能够从这里下载数据。

通过 SeaTunnel 将数据导入 Milvus
首先,将 book.csv 放到 /tmp/milvus_test/book 下,而后配置工作配置为 milvus.conf 并放到 config 下。请参考疾速使用指南。

env {
  # You can set engine configuration here
  execution.parallelism = 1
  job.mode = "BATCH"
  checkpoint.interval = 5000
  #execution.checkpoint.data-uri = "hdfs://localhost:9000/checkpoint"
}

source {
  # This is a example source plugin **only for test and demonstrate the feature source plugin**
  LocalFile {
    schema {
      fields {
        bookID = string
        title_1 = string
        title_2 = string
      }
    }
    path = "/tmp/milvus_test/book"
    file_format_type = "csv"
  }
}

transform {
}

sink {
  Milvus {
    milvus_host = localhost
    milvus_port = 19530
    username = root
    password = Milvus
    collection_name = title_db
    openai_engine = text-embedding-ada-002
    openai_api_key = sk-xxxx
    embeddings_fields = title_2
  }
}

执行如下命令:

./bin/SeaTunnel.sh --config ./config/milvus.conf -e local

查看数据库中数据,能够看到曾经有数据写入进去。

而后应用如下代码通过语义搜寻书名:

import json
import random
import openai
import time
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

COLLECTION_NAME = 'title_db'  # Collection name
DIMENSION = 1536  # Embeddings size
COUNT = 100  # How many titles to embed and insert.
MILVUS_HOST = 'localhost'  # Milvus server URI
MILVUS_PORT = '19530'
OPENAI_ENGINE = 'text-embedding-ada-002'  # Which engine to use
openai.api_key = 'sk-******'  # Use your own Open AI API Key here

connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)

collection = Collection(name=COLLECTION_NAME)

collection.load()


def embed(text):
    return openai.Embedding.create(
        input=text, 
        engine=OPENAI_ENGINE)["data"][0]["embedding"]


def search(text):
    # Search parameters for the index
    search_params={"metric_type": "L2"}

    results=collection.search(data=[embed(text)],  # Embeded search value
        anns_field="title_2",  # Search across embeddings
        param=search_params,
        limit=5,  # Limit to five results per search
        output_fields=['title_1']  # Include title field in result
    )

    ret=[]
    for hit in results[0]:
        row=[]
        row.extend([hit.id, hit.score, hit.entity.get('title_1')])  # Get the id, distance, and title for the results
        ret.append(row)
    return ret

search_terms=['self-improvement', 'landscape']

for x in search_terms:
    print('Search term:', x)
    for result in search(x):
        print(result)
    print()


搜寻后果如下:

Search term: self-improvement
[96, 0.4079835116863251, "The Dance of Intimacy: A Woman's Guide to Courageous Acts of Change in Key Relationships"]
[56, 0.41880303621292114, 'Nicomachean Ethics']
[76, 0.4309804439544678, 'Possession']
[19, 0.43588975071907043, 'Vanity Fair']
[7, 0.4423919916152954, 'Knowledge Is Power (The Amazing Days of Abby Hayes: #15)']

Search term: landscape
[9, 0.3023473024368286, 'The Lay of the Land']
[1, 0.3906732499599457, 'The Angry Hills']
[78, 0.392495334148407, 'Cloud Atlas']
[95, 0.39346450567245483, 'Alien']
[94, 0.399422287940979, 'The Known World']

如果咱们依照之前的老办法——关键词搜寻,书名中必须蕴含自我晋升、晋升等关键词;然而提供大模型进行语义级别的了解,则能够检索到更加合乎咱们需要的书名。比方在下面的例子中,咱们搜寻的关键词为 self-improvement(自我晋升),展现的书名《关系之舞:既密切又独立的相处艺术》、《尼各马可伦理学》等尽管不蕴含相干关键词,却很显著更加合乎咱们的要求。
可见,咱们利用 Apache SeaTunnel、Milvus 和 OpenAI,通过大语言模型的办法,能够实现更加精准的书名类似度搜素,为图书搜寻畛域带来重大的技术冲破,同时对于语义了解也提供了有价值的参考,心愿能够给大家带来一些启发。

相干链接

  • https://seatunnel.apache.org/
  • https://openai.com/
  • https://milvus.io/

    本文由 白鲸开源科技 提供公布反对!

正文完
 0