目录

如何10分钟搭建效果领先的语义搜索系统

目录

如何10分钟搭建效果领先的语义搜索系统?

PaddleNLP最近发布了Paddle-Pipelines,Paddle-Pipelines是一个端到端智能文本产线框架,面向 NLP 全场景为用户提供低门槛构建强大产品级系统的能力。本项目将通过一种简单高效的方式搭建一套语义检索系统,使用自然语言文本通过语义进行智能文档查询,而不是关键字匹配,用户可以通过简单的配置,并上传数据,就可以完成自己想要定制化的搜索系统。

搜索技术的应用范围很广,比如建筑的规范搜索,公司内部规范条文的搜索,对话文本匹配,工单信息匹配,检索式智能问答,大规模不固定标签场景的文本分类,基于内容的搜索推荐等等场景。我们看一段视频,感受一下语义搜索的效果。

语义搜索

Pipelines预置了基于ERNIE 3.0系列模型训练的RocketQA的模型,效果图如下图所示,使用的数据集是Dureader Retrieval百万量级的人工标注的搜索数据集,对于速度和精度都进行了优化,其中nano模型在CPU上使用Pipelines能够达到100ms的速度,大大节省了用户的搭建成本。

https://i-blog.csdnimg.cn/blog_migrate/0a802c0d266bde31fcceb9d0258c8e2d.png

Pipelines的原理流程图如下,用户通过前端输入Query以后,后端收到数据,然后进行语义向量抽取,抽取出Sentence/Query Embdding,然后在索引库中进行ANN检索,然后对检索的结果进行重新排序,最后通过后端把结果返回给前端,用户就可以看到搜索的结果。

构建索引库的流程:用户把预先准备好的数据放入Pipelines系统,抽取向量得到Sentence Embedding,然后放入索引工具(比如Milvus,Elastic Search,FAISS)来构建索引库。

https://i-blog.csdnimg.cn/blog_migrate/23b635ea65a64b7a10cb39f77a30cfa3.png

Pipelines的代码构建也很简单,下面是代码一段语义检索的代码示例:

from pipelines.document_stores import FAISSDocumentStore
from pipelines.nodes import DensePassageRetriever, ErnieRanker

# Step1: Preparing the data

documents = [
{'content': '金钱龟不分品种,只有生长地之分,在我国主要分布于广东、广西、福建、海南、香港、澳门等地,在国外主要分布于越南等亚热带国家和地区。',
'meta': {'name': 'test1.txt'}},
{'content': '衡量酒水的价格的因素很多的,酒水的血统(也就是那里产的,采用什么工艺等);存储的时间等等,酒水是一件很难标准化得商品,只要你敢要价,有买的那就值那个钱。',
'meta': {'name': 'test2.txt'}}
]

# Step2: Initialize a FaissDocumentStore to store texts of documents

document_store = FAISSDocumentStore(embedding_dim=768)
document_store.write_documents(documents)

# Step3: Initialize a DenseRetriever and build ANN index

retriever = DensePassageRetriever(document_store=document_store, query_embedding_model="rocketqa-zh-base-query-encoder",embed_title=False)
document_store.update_embeddings(retriever)

# Step4: Initialize a Ranker

ranker = ErnieRanker(model_name_or_path="rocketqa-base-cross-encoder")

# Step5: Initialize a SemanticSearchPipeline and ask questions

from pipelines import SemanticSearchPipeline
pipeline = SemanticSearchPipeline(retriever, ranker)
prediction = pipeline.run(query="衡量酒水的价格的因素有哪些?")

通过 SemanticSearchPipeline 就可以把定义的流水线节点串联起来,并且流水线的节点可以进行定制化,用户可以根据情况选择需要的节点。

搭建流程

为了帮助大家快速的搭建起来,Pipelines 提供了 Windows,Linux,Mac 等主流系统的搭建流程,Windows 上的搭建流程还特地录制了安装视频。下面特地介绍一下安装搭建流程,有需要的用户可以参考链接。

Windows 的搭建流程请参考链接:https://github.com/PaddlePaddle/PaddleNLP/blob/develop/pipelines/examples/semantic-search/Install_windows.md

Windows 的配套安装视频 B 站链接如下:https://www.bilibili.com/video/BV1DY4y1M7HE/?vd_source=f5bc16e5093165f01588d5a24417419d

Liunx 和 Mac 的搭建流程请参考:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/pipelines/examples/semantic-search

Docker 一键安装体验

如果用户想要快速体验带有后台和前端的 Pipelines,可以使用 Docker 的方式来安装,这样就避免了各种平台的环境搭建,搭建环境难免会碰到各种各样的问题。

第一步启动 elastic search 容器

docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.3.3
docker run \
 -d \
 --name es02 \
 --net elastic \
 -p 9200:9200 \
 -e discovery.type=single-node \
 -e ES_JAVA_OPTS="-Xms256m -Xmx256m"\
 -e xpack.security.enabled=false \
 -e cluster.routing.allocation.disk.threshold_enabled=false \
 -it \
 docker.elastic.co/elasticsearch/elasticsearch:8.3.3

第二步是启动 pipelines 容器

对于 Linux 使用 Docker 的用户,使用下面的命令:

docker pull registry.baidubce.com/paddlepaddle/paddlenlp:2.4.0
docker run -d --name paddlenlp_pipelines --net host -ti registry.baidubce.com/paddlepaddle/paddlenlp:2.4.0

对于 Windows&Macos 上使用 Docker 的用户,用下面的命令:

docker pull registry.baidubce.com/paddlepaddle/paddlenlp:2.4.0.windows.darwin
docker run -d --name paddlenlp_pipelines -p 8891:8891 -p 8502:8502 -ti registry.baidubce.com/paddlepaddle/paddlenlp:2.4.0.windows.darwin

如果用户有 gpu,可以启动对应版本的 cuda 镜像。详情请参考:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/pipelines

cpu 容器启动大概需要等待 3 分钟,然后输入网址http://127.0.0.1:8502 就可以启动了,Enjoy it!如果有任何问题,可以去 Github 上提 issue 哈。