PaddlePaddle / PaddleNLP

👑 Easy-to-use and powerful NLP and LLM library with 🤗 Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including 🗂Text Classification, 🔍 Neural Search, ❓ Question Answering, ℹ️ Information Extraction, 📄 Document Intelligence, 💌 Sentiment Analysis etc.
https://paddlenlp.readthedocs.io
Apache License 2.0
12.18k stars 2.95k forks source link

[Bug]: 手把手搭建一个语义检索系统BUG,run.system.py在rank时出错,个人进行了修复,不过返回结果超级小和官方提供的有点出路。 #6573

Open dingidng opened 1 year ago

dingidng commented 1 year ago

软件环境

- paddle-bfloat         0.1.7
- paddle-serving-app    0.9.0
- paddle-serving-client 0.9.0
- paddle-serving-server 0.9.0
- paddle2onnx           1.0.8rc0
- paddlefsl             1.1.0
- paddlenlp             2.5.2
- paddlepaddle-gpu      2.4.2.post112

重复问题

错误描述

问题一:手把手搭建一个语义检索系统,项目链接 run.system.py文件中一个bug,在排序模块中

def rerank(df):
....
    result = np.array(eval(ret.value[0]))
    df["distance"] = result
...
[0.00703308 0.00505753 0.00439458 0.00474953 0.00432936 0.00410844 ^ SyntaxError: invalid syntax

稳定复现步骤 & 代码

手把手搭建一个语义检索系统,项目链接 run.system.py文件中一个bug,修复代码

#修改如下:
#result = np.array(eval(ret.value[0]))
    result_str = ret.value[0].strip("[]").split(" ")
    result_filtered = [float(num) for num in result_str if num]
    result = np.array(result_filtered)
    df["distance"] = result[:df.shape[0]]
    #df["distance"] = result

=== Connect collection literature_search ===

Search milvus time cost is 0.32386231422424316 seconds PipelineClient::predict pack_data time:1690883093.5578575 PipelineClient::predict before time:1690883093.5582104 time to cost :0.30440759658813477 seconds

**以及会输出2个文件 recall_result.csv 是召回检索的结果,rank_result.csv 是排序的结果**

* 展示前10条保存记录:

召回 recall_result.csv: ['query_text', 'text', 'distance'] ['中西方语言与文化的差异', '中西方文化差异以及语言体现中西方文化,差异,语言体现', '0.08333608508110046'] ['中西方语言与文化的差异', '试论中西方语言文化教育的差异比较与融合中西方,语言文化教育,差异', '0.17022335529327393'] ['中西方语言与文化的差异', '谈中西方文化差异东西方文化,差异', '0.20466828346252441'] ['中西方语言与文化的差异', '中西方文化差异研究中西方文化,文化差异,研究', '0.22409862279891968'] ['中西方语言与文化的差异', '论中西方文化差异在非言语交际中的体现中西方文化,差异,非言语交际', '0.22628486156463623'] ['中西方语言与文化的差异', '”而东西方文化间的差异,更利于人们去做比较研究。', '0.25659793615341187'] ['中西方语言与文化的差异', '基于中西文化差异探索外国语言学及应用语言学的应用中西方文化差异,外国语言学,应用语言学,应用研究', '0.26147013902664185'] ['中西方语言与文化的差异', '谈中西方文化交流与冲突的原因探究中西方文化交流,文化差异,文化冲突', '0.2798224091529846'] ['中西方语言与文化的差异', '关于东西方文化差异等问题的一些思考--伍铁平《语言文化评论集》读后语言的共性和个性,文化和语言的关系', '0.2950296401977539'] ['中西方语言与文化的差异', '浅析中西方文化差异在语言中的体现及其对翻译的影响中西方文化,差异,语言,翻译,影响', '0.30624112486839294']

排序rank_result.csv: ['query_text', 'text', 'distance'] ['中西方语言与文化的差异', '语言及文化.', '0.00721998'] ['中西方语言与文化的差异', '文化与语言的关系在中西文化中的映射交际,符号,语言,文化', '0.00718039'] ['中西方语言与文化的差异', '中西方文化差异以及语言体现中西方文化,差异,语言体现', '0.00703308'] ['中西方语言与文化的差异', '由此便可以发现两种语言以及两种文化的差异。', '0.00614658'] ['中西方语言与文化的差异', '浅谈中西言语交际行为中的文化差异交际用语,文化差异,中国,西方', '0.00583243'] ['中西方语言与文化的差异', '中西方文化差异的几个显著现象及其原因分析中西方文化,文化差异,词汇,亲属关系,法律', '0.00575102'] ['中西方语言与文化的差异', '浅析中西方文化差异在语言中的体现及其对翻译的影响中西方文化,差异,语言,翻译,影响', '0.00564118'] ['中西方语言与文化的差异', '汉语和英语均是历史悠久的语言。', '0.00551225'] ['中西方语言与文化的差异', '今日,总体来说,华语仍然被看作是保持与中华文化的联系的方式。', '0.00550965'] ['中西方语言与文化的差异', '他们的语言接近于汉语;', '0.00547498']

这里有一点疑问,以上召回和排序模型都经过Paddle Serving服务化以后,执行`python run_system.py`

**发现给出结果rank的值和官方的很不一致**

* 下面是官方结果:

PipelineClient::predict pack_data time:1656991375.5521955 PipelineClient::predict before time:1656991375.5529568 Extract feature time to cost :0.0161135196685791 seconds Search milvus time cost is 0.8139839172363281 seconds PipelineClient::predict pack_data time:1656991376.3981335 PipelineClient::predict before time:1656991376.3983877 time to cost :0.05616641044616699 seconds

* 这里自己执行和官方差距少了:

Extract feature time to cost :0.0161135196685791 seconds PipelineClient::predict pack_data time:1656991376.3981335 PipelineClient::predict before time:1656991376.3983877

但看了召回和排序模型都加载在内存,也被服务调用了

召回的结果:

中西方语言与文化的差异,港台文化对内地中小学生的负面影响,0.055068351328372955 中西方语言与文化的差异,外来文化在越南的传播与融合,0.05621318891644478 中西方语言与文化的差异,临终关怀中的“仪式”,0.05705389380455017 中西方语言与文化的差异,历史的真实与艺术加工,0.05745899677276611 ......

排序的结果:

中西方语言与文化的差异,论中西方教育差异,0.870943009853363 中西方语言与文化的差异,浅析中西方问候语的差异,0.8468159437179565 中西方语言与文化的差异,文化认同及其根源,0.8288694620132446 中西方语言与文化的差异,从历史文化角度分析中西方学校教育的差异,0.8209370970726013 中西方语言与文化的差异,中西医思维方式的差异,0.8150948882102966 中西方语言与文化的差异,浅析中韩餐桌文化差异,0.7751647233963013 ......

这里排序模型我用了CrossEncoder:rocketqa-base-cross-encoder。自己训练出来模型效果`AUC:0.804`

不知道为什么会有这么大出路,

>补充其中使用数据集为:
* 召回/milvus索引构建用的是[literature_search_data](https://bj.bcebos.com/v1/paddlenlp/data/literature_search_data.zip)
* 基于RocketQA的CrossEncoder训练的单塔模型使用的是官方提供的
[literature_search_rank](https://paddlenlp.bj.bcebos.com/applications/literature_search_rank.zip)

部分结果如下 {'text_a': '加强科研项目管理有效促进医学科研工作', 'text_b': '科研项目管理策略科研项目,项目管理,实施,必要性,策略', 'pred_prob': 0.6349033} {'text_a': '加强科研项目管理有效促进医学科研工作', 'text_b': '某医院科研现状的剖析及对策科研,发展,课题,管理,科室', 'pred_prob': 0.5942339}

serving部署方式返回概率:

(paddlenlp) deploy/python$ python rpc_client.py {'0': "{'query': '加强科研项目管理有效促进医学科研工作', 'title': '科研项目管理策略科研项目,项目管理,实施,必要性,策略'}"} PipelineClient::predict pack_data time:1690890179.6787615 PipelineClient::predict before time:1690890179.6793547 time to cost :0.01012730598449707 seconds (1,) [0.5664935]


**也都感觉正常, 但执行run_system.py发现给出结果rank的值和官方的很不一致,概率来看这个值都太小了吧**,

感谢您解答!
dingidng commented 1 year ago

更新一步,通过修改召回数量,从100---》10,发现在运行结果上与官方成功案例一致,但上述疑问仍存在。

PipelineClient::predict pack_data time:1690963720.3993883
PipelineClient::predict before time:1690963720.4000175
Extract feature time to cost :0.009766101837158203 seconds

=== start connecting to Milvus     ===

=== Connect collection literature_search ===

Search milvus time cost is 0.28246259689331055 seconds
PipelineClient::predict pack_data time:1690963720.702427
PipelineClient::predict before time:1690963720.7026079
time to cost :0.0238802433013916 seconds
w5688414 commented 1 year ago

您是多卡训练的吗?训练配置是啥?我记得我训练的时候是多卡

dingidng commented 1 year ago

您是多卡训练的吗?训练配置是啥?我记得我训练的时候是多卡

训练配置单卡V100 ,不用全量训练只是验证一下流程,反馈的内容主要是推理阶段遇到的问题

w5688414 commented 1 year ago

您是多卡训练的吗?训练配置是啥?我记得我训练的时候是多卡

训练配置单卡V100 ,不用全量训练只是验证一下流程,反馈的内容主要是推理阶段遇到的问题

您说的是召回的数量对结果的影响是吗?这个可能是重排序模型引起的

dingidng commented 1 year ago

您说的是召回的数量对结果的影响是吗?这个可能是重排序模型引起的

首先是提供码源有bug,run.system.py文件中一个bug

def rerank(df):
....
    result = np.array(eval(ret.value[0]))
    df["distance"] = result
...

[0.00703308 0.00505753 0.00439458 0.00474953 0.00432936 0.00410844 ^ SyntaxError: invalid syntax

修改后可运行排序

#修改如下:
#result = np.array(eval(ret.value[0]))
    result_str = ret.value[0].strip("[]").split(" ")
    result_filtered = [float(num) for num in result_str if num]
    result = np.array(result_filtered)
    df["distance"] = result[:df.shape[0]]
    #df["distance"] = result

首先我先描述一下官方给出案例结果

#召回的结果:
中西方语言与文化的差异,港台文化对内地中小学生的负面影响,0.055068351328372955
中西方语言与文化的差异,外来文化在越南的传播与融合,0.05621318891644478
......

排序的结果:

中西方语言与文化的差异,论中西方教育差异,0.870943009853363
中西方语言与文化的差异,浅析中西方问候语的差异,0.8468159437179565
......

可以看到召回阶段计算的是向量见距离、排序输出结果是概率

在看到我的

召回 recall_result.csv:
['query_text', 'text', 'distance']
['中西方语言与文化的差异', '中西方文化差异以及语言体现中西方文化,差异,语言体现', '0.08333608508110046']

----------------------------------------------------------------------------------------------------
排序rank_result.csv:
['query_text', 'text', 'distance']
['中西方语言与文化的差异', '语言及文化.', '0.00721998']
['中西方语言与文化的差异', '文化与语言的关系在中西文化中的映射交际,符号,语言,文化', '0.00718039']
['中西方语言与文化的差异', '中西方文化差异以及语言体现中西方文化,差异,语言体现', '0.00703308']

可以看到召回阶段计算的是向量见距离、排序输出结果是也是向量间距离;这里有点疑问,讲道理用的是官方码源返回结果应该与官方案例保持一致;于是我单独验证了排序模块服务化后的结果:

(paddlenlp) deploy/python$ python rpc_client.py
{'0': "{'query': '加强科研项目管理有效促进医学科研工作', 'title': '科研项目管理策略科研项目,项目管理,实施,必要性,策略'}"}
PipelineClient::predict pack_data time:1690890179.6787615
PipelineClient::predict before time:1690890179.6793547
time to cost :0.01012730598449707 seconds
(1,)
[0.5664935]

这里返回的是排序后预测概率。

总结一下第二个问题:看到run.system.py中输出排序结果是概率还是向量间距离有点疑惑,希望您可以确认一下。我看代码感觉输出的是向量距离;但是调用的serving里的config参数明确写明了是概率;同时用排序模块单独验证确实是个概率。发现和官网案例有点不一样,这里有点迷了,还请解答

w5688414 commented 6 months ago

排序模型是一个cross encoder输出的是概率。召回是向量间的相似距离,计算的是L2.

https://github.com/PaddlePaddle/PaddleNLP/blob/ae0bea9e8580bbedea96b45d4153be7a8b884d74/applications/neural_search/recall/milvus/config.py#L30

排序模型的端口是:

https://github.com/PaddlePaddle/PaddleNLP/blob/ae0bea9e8580bbedea96b45d4153be7a8b884d74/applications/neural_search/ranking/ernie_matching/deploy/python/config_nlp.yml#L16

这里的距离被排序模型重写了。

https://github.com/PaddlePaddle/PaddleNLP/blob/ae0bea9e8580bbedea96b45d4153be7a8b884d74/applications/neural_search/run_system.py#L77

欢迎开发者提PR贡献哈