Paddlenlp は Windows でローカルにセマンティック検索システムを構築します
1. 動作環境
- ソフトウェア環境:
-
Python >= 3.8.16
-
パドレンLP = 2.5.2
-
パドルパドル-GPU =2.4.2.post112
-
パドルOCR = 2.6.1.3
-
numpy = 1.24.3
-
opencv-contrib-python =4.6.0.66
-
CUDA バージョン: 11.2
-
cuDNN バージョン 8.2
-
win11
- ハードウェア環境:
-
NVIDIA RTX 3050 4GB
-
第 11 世代インテル® Core™ i7-11800H @ 2.30 GHz 2.30 GHz
-
依存インストール:
まずPaddlePaddleをインストールする必要があります。PaddlePaddleのインストールについては公式のインストールドキュメントを参照してください。
次の依存関係をインストールします。
git clone https://github.com/tvst/htbuilder.git cd htbuilder/ python setup install
パイプラインのソースコードをダウンロードします。
# 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
[注意] 以下の処理はすべてパイプラインのルートディレクトリで実行するだけでよく、ディレクトリにジャンプする必要はありません。
2. データの説明
Paddlenlp には、DuReader-Robust データ セットに基づいてセマンティック検索システムを構築するためのプリセット コード サンプルが用意されており、次のコマンドを通じてセマンティック検索システムの効果をすぐに体験できます (GPU を推奨)
python examples/semantic-search/semantic_search_example.py --device gpu
CPU マシンしか持っていない場合は、Paddle の CPU バージョンをインストールした後、--device パラメーターで CPU を指定できますが、実行には時間がかかります。
python examples/semantic-search/semantic_search_example.py --device cpu
3. Web視覚的意味検索システムの構築
-
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
faiss がインストールされているにもかかわらず、faiss が見つからないと表示される場合はどうすればよいですか?
別途 anaconda を使用してインストールすることをお勧めします (インストールチュートリアルについてはfaissを参照してください)。
# CPU-only version
conda install -c pytorch faiss-cpu
# GPU(+CPU) version
conda install -c pytorch faiss-gpu
パイプライン内のプリセット モデルを置き換えるにはどうすればよいですか?
システムプリセットモデルを置き換えた後は、モデルが異なるため、インデックスを再構築し、関連する設定ファイルを変更する必要があります。セマンティック インデックス作成を例にとると、2 か所を変更する必要があります。1 つ目はutils/offline_ann.py
、もう 1 つは で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
Windows でフロントエンドを実行するとエラーが発生する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'
Windows でアプリケーションを実行すると、次のエラーが発生しました。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 システム ユーザーの名前が中国語で付けられる理由です。詳細な解決策については、この問題を参照してください。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