python >= 3.8.16
paddlenlp = 2.5.2
paddlepaddle-gpu =2.4.2.post112
paddleocr = 2.6.1.3
numpy = 1.24.3
opencv-contrib-python =4.6.0.66
CUDA Version: 11.2
cuDNN Version 8.2
win11
NVIDIA RTX 3050 4GB
11th Gen Intel® Core™ i7-11800H @ 2.30GHz 2.30 GHz
依赖安装:
首先需要安装PaddlePaddle,PaddlePaddle的安装请参考文档官方安装文档
安装以下依赖:
git clone https://github.com/tvst/htbuilder.git
cd htbuilder/
python setup install
下载pipelines源代码:
# pip 一键安装
pip install --upgrade paddle-pipelines -i https://pypi.tuna.tsinghua.edu.cn/simple
# 或者源码进行安装最新版本
cd ${HOME}/PaddleNLP/pipelines/
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py install
# 下载pipelines源代码
git clone https://github.com/PaddlePaddle/PaddleNLP.git
cd PaddleNLP/pipelines
paddlenlp 预置了基于DuReader-Robust数据集搭建语义检索系统的代码示例,以通过如下命令快速体验语义检索系统的效果(建议使用GPU)
python examples/semantic-search/semantic_search_example.py --device gpu
如果只有 CPU 机器,安装CPU版本的Paddle后,可以通过 --device 参数指定 cpu 即可, 运行耗时较长
python examples/semantic-search/semantic_search_example.py --device cpu
启动ANN服务
参考官方文档下载安装 elasticsearch-8.3.2 并解压。
启动 ES 服务 把xpack.security.enabled
设置成false,如下:
pack.security.enabled: false
找不到的话可以到elasticsearch/config目录下 elasticsearch.yml中手动添加
然后直接双击bin目录下的elasticsearch.bat即可启动。
检查确保 ES 服务启动成功
curl http://localhost:9200/_aliases?pretty=true
备注:ES 服务默认开启端口为 9200
文档数据写入ANN索引库
# 以DuReader-Robust 数据集为例建立 ANN 索引库
python utils/offline_ann.py --index_name dureader_robust_query_encoder --doc_dir data/dureader_dev
参数含义说明
index_name
: 索引的名称doc_dir
: txt文本数据的路径host
: Elasticsearch的IP地址port
: Elasticsearch的端口号delete_index
: 是否删除现有的索引和数据,用于清空es的数据,默认为false可以使用下面的命令来查看数据:
# 打印几条数据
curl http://localhost:9200/dureader_robust_query_encoder/_search
启动Rest API模型服务
# 指定语义检索系统的Yaml配置文件,Linux/macos
export PIPELINE_YAML_PATH=rest_api/pipeline/semantic_search.yaml
# 指定语义检索系统的Yaml配置文件,Windows powershell
$env:PIPELINE_YAML_PATH='rest_api/pipeline/semantic_search.yaml'
# 使用端口号 8891 启动模型服务
python rest_api/application.py 8891
启动后可以使用curl命令验证是否成功运行:
curl -X POST -k http://localhost:8891/query -H 'Content-Type: application/json' -d '{"query": "衡量酒水的价格的因素有哪些?","params": {"Retriever": {"top_k": 5}, "Ranker":{"top_k": 5}}}'
启动WebUI
# 配置模型服务地址, Linux/macos
export API_ENDPOINT=http://127.0.0.1:8891
# 配置模型服务地址, windows
$env:API_ENDPOINT='http://127.0.0.1:8891'
# 在指定端口 8502 启动 WebUI
python -m streamlit run ui/webapp_semantic_search.py --server.port 8502
然后就可以在浏览器上访问了http://127.0.0.1:8502 !
通过如下命令设置操作系统默认编码为 zh_CN.UTF-8
export LANG=zh_CN.UTF-8
推荐您使用anaconda进行单独安装,安装教程请参考faiss
# CPU-only version
conda install -c pytorch faiss-cpu
# GPU(+CPU) version
conda install -c pytorch faiss-gpu
更换系统预置的模型以后,由于模型不一样了,需要重新构建索引,并修改相关的配置文件。以语义索引为例,需要修改2个地方,第一个地方是utils/offline_ann.py
,另一个是rest_api/pipeline/semantic_search.yaml
,并重新运行:
首先修改utils/offline_ann.py
:
python utils/offline_ann.py --index_name dureader_robust_base_encoder \
--doc_dir data/dureader_dev \
--query_embedding_model rocketqa-zh-base-query-encoder \
--passage_embedding_model rocketqa-zh-base-para-encoder \
--embedding_dim 768 \
--delete_index
然后修改rest_api/pipeline/semantic_search.yaml
文件:
components: # define all the building-blocks for Pipeline
- name: DocumentStore
type: ElasticsearchDocumentStore # consider using MilvusDocumentStore or WeaviateDocumentStore for scaling to large number of documents
params:
host: localhost
port: 9200
index: dureader_robust_base_encoder # 修改索引名
embedding_dim: 768 # 修改向量的维度
- name: Retriever
type: DensePassageRetriever
params:
document_store: DocumentStore # params can reference other components defined in the YAML
top_k: 10
query_embedding_model: rocketqa-zh-base-query-encoder # 修改Retriever的query模型名
passage_embedding_model: rocketqa-zh-base-para-encoder # 修改 Retriever的para模型
embed_title: False
- name: Ranker # custom-name for the component; helpful for visualization & debugging
type: ErnieRanker # pipelines Class name for the component
params:
model_name_or_path: rocketqa-base-cross-encoder # 修改 ErnieRanker的模型名
top_k: 3
然后重新运行:
# 指定语义检索系统的Yaml配置文件
export PIPELINE_YAML_PATH=rest_api/pipeline/semantic_search.yaml
# 使用端口号 8891 启动模型服务
python rest_api/application.py 8891
exception during geoip databases update
需要编辑config/elasticsearch.yml,在末尾添加:
ingest.geoip.downloader.enabled: false
requests.exceptions.MissingSchema: Invalid URL 'None/query': No scheme supplied. Perhaps you meant http://None/query?
环境变量没有生效,请检查一下环境变量,确保PIPELINE_YAML_PATH和API_ENDPOINT生效:
方法 :打开poweshell终端,输入:
$env:PIPELINE_YAML_PATH='rest_api/pipeline/semantic_search.yaml'
$env:API_ENDPOINT='http://127.0.0.1:8891'
RuntimeError: (NotFound) Cannot open file C:\Users\my_name/.paddleocr/whl\det\ch\ch_PP-OCRv3_det_infer/inference.pdmodel, please confirm whether the file is normal.
这是Windows系统用户命名为中文的原因,详细解决方法参考issue. https://github.com/PaddlePaddle/PaddleNLP/issues/3242
Exception: Failed loading pipeline component 'DocumentStore': RequestError(400, 'illegal_argument_exception', 'Mapper for [embedding] conflicts with existing mapper:\n\tCannot update parameter [dims] from [312] to [768]')
以语义检索为例,这是因为模型的维度不对造成的,请检查一下 elastic search
中的文本的向量的维度和semantic_search.yaml
里面DocumentStore
设置的维度embedding_dim
是否一致,如果不一致,请重新使用utils/offline_ann.py
构建索引。总之,请确保构建索引所用到的模型和semantic_search.yaml
设置的模型是一致的。
注意: 修改后重新构建索引时,一定要先将以前的索引全部删除否则无效。可以执行以下命令:
curl -XDELETE http://localhost:9200/dureader_robust_query_encoder