目前,现有的图书搜索解决方案(如公共图书馆中使用的解决方案)主要依赖于关键词匹配,而不是对图书标题实际内容的语义理解。因此,搜索结果可能不能很好地满足我们的需求,甚至可能与我们的期望大为不同。这是因为仅仅依赖于关键词匹配是不够的,它无法实现语义理解,因此无法理解搜索者的真实意图。
所以,有没有更好的方法来更准确、更高效地进行图书搜索呢?答案是肯定的!在本文中,我将介绍如何结合使用Apache SeaTunnel、Milvus和OpenAI进行相似性搜索,以实现对整个图书标题的语义理解,并使搜索结果更准确。
使用训练模型来表示输入数据被称为语义搜索,这种方法可以扩展到各种基于文本的用例,包括异常检测和文档搜索。因此,本文介绍的技术可以为图书搜索领域带来重大突破和影响。
接下来,我将简要介绍与本文相关的几个概念、工具/平台,以便更好地理解本文。
什么是Apache SeaTunnel?
Apache SeaTunnel是一个开源的、高性能的、分布式的数据管理和计算平台。它是由Apache基金会支持的顶级项目,能够处理大规模的数据,提供实时数据查询和计算,并支持多种数据源和格式。SeaTunnel的目标是提供一个可扩展的、企业级的数据管理和集成平台,以满足各种大规模数据处理需求。
什么是Milvus?
Milvus是一个开源的向量相似性搜索引擎,支持存储、检索和相似性搜索大规模向量。它是一个高性能、低成本的大规模向量数据解决方案。Milvus可以应用于各种场景,如推荐系统、图像搜索、音乐推荐等。
什么是OpenAI?
ChatGPT是一个基于OpenAI开发的生成式预训练变压器(GPT)模型的对话式人工智能系统。该系统主要使用自然语言处理和深度学习技术生成类似于人类对话的自然语言文本。ChatGPT具有广泛的应用领域,包括智能客服、聊天机器人、智能助手和语言模型的研究与开发等。近年来,ChatGPT已成为自然语言处理领域的研究热点之一。
什么是LLM?
大型语言模型(LLM)是一种基于深度学习技术的自然语言处理模型,可以分析和理解给定的文本,并生成与之相关的文本内容。大型语言模型通常使用深度神经网络学习自然语言的语法和语义规则,并将文本数据转化为连续向量空间中的向量表示。在训练过程中,大型语言模型使用大量文本数据学习语言模式和统计规律,从而能够生成高质量的文章、新闻和对话等文本内容。大型语言模型在机器翻译、文本生成、问答系统、语音识别等领域有广泛的应用。目前,许多开源的深度学习框架提供了大型语言模型的实现,如TensorFlow、PyTorch等。
教程
我们开始吧!我将向您展示如何将Apache SeaTunnel、OpenAI的Embedding API与我们的向量数据库结合使用,以对整个图书标题进行语义搜索。
准备工作
在进行实验之前,我们需要从OpenAI的官方网站获得一个OpenAI令牌,然后部署一个Milvus实验环境。我们还需要准备将用于此示例的数据。您可以从这里下载数据。
通过SeaTunnel将数据导入Milvus。
首先,将book.csv放置在/tmp/milvus_test/book下,然后将任务配置配置为milvus.conf并放置在config下。请参考快速入门指南。
env { # 您可以在此设置引擎配置 execution.parallelism = 1 job.mode = "BATCH" checkpoint.interval = 5000 #execution.checkpoint.data-uri = "hdfs://localhost:9000/checkpoint"}
source { # 这是一个示例源插件**仅用于测试和演示功能源插件** 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 jsonimport randomimport openaiimport timefrom pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
COLLECTION_NAME = 'title_db' # 集合名称DIMENSION = 1536 # 嵌入尺寸COUNT = 100 # 需要嵌入和插入的标题数量MILVUS_HOST = 'localhost' # Milvus 服务器地址MILVUS_PORT = '19530'OPENAI_ENGINE = 'text-embedding-ada-002' # 使用的引擎openai.api_key = 'sk-******' # 在此处填写您自己的 Open AI API 密钥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_params={ "metric_type": "L2" } results=collection.search( data=[embed(text)], # 嵌入的搜索值 anns_field="title_2", # 在嵌入中搜索 param=search_params, limit=5, # 每次搜索限制五个结果 output_fields=['title_1'] # 包括标题字段在结果中 ) ret=[] for hit in results[0]: row=[] row.extend([hit.id, hit.score, hit.entity.get('title_1')]) # 获取结果的 id、距离和标题 ret.append(row) return retsearch_terms=['自我提升', '风景']for x in search_terms: print('搜索词:', x) for result in search(x): print(result) print()
这是结果:
搜索词: 自我提升[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)']
搜索词: 风景[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']
如果我们使用旧的关键词搜索方法,书名必须包含”自我提升”和”提升”关键词。然而,通过使用大型语言模型进行语义理解,我们可以获取更与我们需要相关的书名。例如,在上面的例子中,当我们搜索关键词”自我提升”时,显示的书名如”The Dance of Intimacy: A Woman’s Guide to Courageous Acts of Change in Key Relationships”和”Nichomachean Ethics”并不包含相关关键词,但明显与我们的需求更相关。
因此,通过使用 Apache SeaTunnel、Milvus 和 OpenAI,我们可以通过大型语言模型实现更准确的书名相似度搜索,为图书搜索领域带来重大技术突破,同时为语义理解提供宝贵的参考。希望这能给大家带来一些启示。