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
11.8k stars 2.88k forks source link

[Question]: FAQ 智能问答系统 #5702

Open nsz13536143631 opened 1 year ago

nsz13536143631 commented 1 year ago

请提出你的问题

怎么解决FAQ智能问答系统在问任何问题上都会回答的情况,因为有一些问题我们的数据库中没有,他会乱回答 如何让他不回答

w5688414 commented 1 year ago

这种情况有两种方法:

  1. 可以加入一些过滤规则。
  2. 定期训练更新模型。
nsz13536143631 commented 1 year ago

我目前用的是百度的快速搭建FAQ系统 麻烦问下具体怎么操作,在哪里加过滤规则

w5688414 commented 1 year ago

我目前用的是百度的快速搭建FAQ系统 麻烦问下具体怎么操作,在哪里加过滤规则

1.可以直接根据阈值筛选,然后对输出结果构造一些黑名单,屏蔽一些明显的错误。

  1. 做一个召回和排序的加权评分,得到最终的评分,然后根据阈值过滤。
gg22mm commented 1 year ago

我目前用的是百度的快速搭建FAQ系统 麻烦问下具体怎么操作,在哪里加过滤规则

1.可以直接根据阈值筛选,然后对输出结果构造一些黑名单,屏蔽一些明显的错误。 2. 做一个召回和排序的加权评分,得到最终的评分,然后根据阈值过滤。

我目前用的是百度的快速搭建FAQ系统 麻烦问下具体怎么操作,在哪里加过滤规则

图片 图片

我是通过 doc.score 来做 阈值 的, 不过效果好象也不好。 比如:

3、数据集 dicts = [ {'content': '高血压患者能吃党参吗?', 'name':'高血压病人可以口服党参的。党参有降血脂,降血压的作用,可以彻底消除血液中的垃圾,从而对冠心病以及心血管疾病的患者都有一定的稳定预防工作作用,因此平时口服党参能远离三高的危害。另外党参除了益气养血,降低中枢神经作用,调整消化系统功能,健脾补肺的功能。感谢您的进行咨询,期望我的解释对你有所帮助。'}, {'content': '高血压该治疗什么?', 'name':'高血压患者首先要注意控制食盐摄入量,每天不超过六克,注意不要吃太油腻的食物,多吃新鲜的绿色蔬菜水果,多吃有机食物,注意增强体育锻炼,增加身体素质,同时压力不要过大,精神不要紧张,效果不佳的话,可以积极配合以降压药物控制血压治疗,情绪平时保持平和,不易激动。'}, {'content': '老年人高血压一般如何治疗?', 'name':'你爷爷患高血压,这是老年人常见的心血管病,血管老化硬化,血压调整能力消退了,目前治疗高血压最重要的方式就是口服降压药,按时口服,不定期复检血压,把血压控制在正常范围是最理想的状态,建议不定期去医院查体,平时不要抽烟喝啤酒,不要吃太咸的食物。'}, {'content': '糖尿病还会进行遗传吗?', 'name':'2型糖尿病的隔代遗传概率为父母患糖尿病,临产的发生率为40%,比一般人患糖尿病,疾病,如何更重要的选择因素基于生活方式的,后天也隔代遗传隔代遗传易感性更公正,增强患糖尿病的风险,低糖低脂肪,平时清淡饮食,适当锻练,增强监测数据,血糖仪买个备取。'}, {'content': '糖尿病一般需要怎么治疗?', 'name':'糖尿病患者首先通过饮食控制和锻练运动,肥胖患者把体重降下来等方式调整一下看一看,如果血糖仍然偏高的话,要考虑决定合适的降糖药治疗,通常可以先决定口服降糖药,并且注意监测数据好血糖;还要防止含糖量高的食物,原则上甜食要尽量避免,还要防止暴饮暴食,适当锻练运动,控制体重。'}, {'content': '糖尿病患者能够进行缓解吗?', 'name':'糖尿病的治疗主要有饮食经营,活动,口服降糖药物治疗和麻醉胰岛素治疗。药物治疗,均需要有互相配合饮食和活动经营。建议您平时饮食要严格注意质和量的掌控,量要少而精,品种多而全,建议你饮食荤素配搭,每餐排便顺序是,蔬菜,豆制品,瘦肉,最后吃主食,主食宜不宜稀,要影响水果的摄取。如果您口服降糖药物效果不明显,建议您换用麻醉胰岛素治疗。'}, {'content': '糖尿病会出现什么症状?', 'name':'你好,根据你描述的情况看来糖尿病是可以致使血糖异常下降的,可以再次出现三多一少的症状,如喝水多,小便多,饭量大,体重减轻,建议你尽快复诊当地医院内分泌科看一看,需要有让大夫仔细检查你的血糖水平,明确有否糖尿病的情况,及时动用降糖药治疗,平时一定少吃甜食,足量锻练。'}, {'content': '老年患有高血压,危险有多大?', 'name':'老年患高血压的危害是比较大的,在临床诊断上可以影响心、脑、肾等脏器,为高血压可以得脑出血,也可以得脑梗塞,这个最重可以引来濒死,偏瘫,高血压还可以引来心肌肥厚,可以致使心功能不全,而且可以引致缺血性心脏病,长期的高血压还可以致使肾动脉硬化,可以引来肾功能不全。'}, {'content': '哪家医院能治胃反流', 'name':' 建议你用奥美拉唑同时,加用吗丁啉或莫沙必利或援生力维,另外还可以加用达喜片'}, {'content': '高血压能去做大幅度剧烈运动吗?', 'name':'您好,您现在是高血压患者,现在一直在口服着降压药物,所以呢,太剧烈的活动是不适合你的,但是也要每天有活动,每天都要有轻度的,不太剧烈的活动。饮食上要注意低盐低脂饮食,因为血脂高的话,可以引发动脉粥样硬化,增大心脏的阻力,有利于控制血压。平时要注意个人生活习惯,饮食要健康。'} ] # 当我输入:高血压患者能吃党参吗? 返回的评分很低 当我输入:高血压 评分反而偏高一点点

所以说评分做阈值也是有些点题

nsz13536143631 commented 1 year ago

我也存在相同的问题,他给出来的阈值分数没有参考意义,有解决办法@我一下 谢谢!!!

gg22mm commented 1 year ago

我也存在相同的问题,他给出来的阈值分数没有参考意义,有解决办法@我一下 谢谢!!!

是不是要自己训练?https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/question_answering/supervised_qa/faq_finance
我上次自己训练发现效果还不如直接用 “ 流水线PiPeline ” 效果好,所以我现在用的是: 流水线PiPeline 都不用训练了,直接使用,但是确实有你说的这个问题

图片

我是用这个的,出来的效果评分真没什么意义

icylord commented 1 year ago

我也存在相同的问题,他给出来的阈值分数没有参考意义,有解决办法@我一下 谢谢!!!

是不是要自己训练?https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/question_answering/supervised_qa/faq_finance 我上次自己训练发现效果还不如直接用 “ 流水线PiPeline ” 效果好,所以我现在用的是: 流水线PiPeline 都不用训练了,直接使用,但是确实有你说的这个问题

图片

我是用这个的,出来的效果评分真没什么意义

ErnieRanker 更换 simbert-base-chinese 这个model试试

senyousanmu commented 1 year ago

模型语言模型详细信息 rocketqa-zh-base-query-encoder Chinese 12-layer, 768-hidden, 12-heads, 118M parameters. Trained on DuReader retrieval text. rocketqa-zh-medium-query-encoder Chinese 6-layer, 768-hidden, 12-heads, 75M parameters. Trained on DuReader retrieval text. rocketqa-zh-mini-query-encoder Chinese 6-layer, 384-hidden, 12-heads, 27M parameters. Trained on DuReader retrieval text. rocketqa-zh-micro-query-encoder Chinese 4-layer, 384-hidden, 12-heads, 23M parameters. Trained on DuReader retrieval text. rocketqa-zh-nano-query-encoder Chinese 4-layer, 312-hidden, 12-heads, 18M parameters. Trained on DuReader retrieval text. rocketqav2-en-marco-query-encoder English 12-layer, 768-hidden, 12-heads, 118M parameters. Trained on MSMARCO. ernie-search-base-dual-encoder-marco-en English 12-layer, 768-hidden, 12-heads, 118M parameters. Trained on MSMARCO. 我并没有找到您说的模型,这些模型信息来自https://github.com/PaddlePaddle/PaddleNLP/blob/develop/pipelines/API.md。

gg22mm commented 1 year ago

我知道了,原来我之前用的一直是文章检索方式, 要改成问答方式。他们是不一样的。

但是不管是哪一种: 他们都用字段 “ content ” 来做为输入传进去。 这个字段是固定的,其它的可选的,不知道是不是这样,我猜的。这个没有文档说明

gg22mm commented 1 year ago

rocketqa-zh-base-query-encoder 变成 rocketqa-zh-dureader-query-encoder rocketqa-base-cross-encoder 变成 rocketqa-zh-dureader-query-encoder

from pipelines import SemanticSearchPipeline 变成 from pipelines import ExtractiveQAPipeline

然后再添加: reader = ErnieReader(model_name_or_path="ernie-gram-zh-finetuned-dureader-robust", use_gpu=False, num_processes=1)

senyousanmu commented 1 year ago

rocketqa-zh-base-query-encoder 变成 rocketqa-zh-dureader-query-encoder rocketqa-base-cross-encoder 变成 rocketqa-zh-dureader-query-encoder

from pipelines import SemanticSearchPipeline 变成 from pipelines import ExtractiveQAPipeline

然后再添加: reader = ErnieReader(model_name_or_path="ernie-gram-zh-finetuned-dureader-robust", use_gpu=False, num_processes=1)

是这种方式吗大佬?我还是看不出来阈值有什么区别,我贴一下代码。 import argparse import os import time

from pipelines.document_stores import FAISSDocumentStore from pipelines.nodes import DensePassageRetriever, ErnieRanker, ErnieReader from pipelines.utils import ( convert_files_to_dicts, fetch_archive_from_http, print_documents, )

document_store = FAISSDocumentStore.load('faiss_index') retriever = DensePassageRetriever( document_store=document_store, query_embedding_model="rocketqa-zh-dureader-query-encoder", passage_embedding_model="rocketqa-zh-dureader-query-encoder", max_seq_len_query=64, max_seq_len_passage=256, batch_size=16, use_gpu=False, embed_title=False, ) ranker = ErnieRanker(model_name_or_path="rocketqa-zh-dureader-cross-encoder", use_gpu=False) reader = ErnieReader(model_name_or_path="ernie-gram-zh-finetuned-dureader-robust", use_gpu=False, num_processes=1)

# Pipeline

from pipelines import ExtractiveQAPipeline

pipe = ExtractiveQAPipeline(reader, ranker, retriever)

pipeline_params = {"Retriever": {"top_k": 50}, "Ranker": {"top_k": 3}} prediction = pipe.run(query="报名时间?", params=pipeline_params) print(prediction) print_documents(prediction, print_name=False, print_meta=True)

gg22mm commented 1 year ago

pelines import ExtractiveQAPipeline

pipe = ExtractiveQAPipeline(reader, ranker, retriever)

pipeline_params = {"Retriever": {"top_k": 50}, "Ranker": {"top_k": 3}} prediction = pipe.run(query="报名时间?", params=pipeline_params) print(prediction)

是的,搜出来的结果比较靠谱

我在前端这样验证就可以了 //答案 var answer=obj.data[0].answer;
if(score<0.01) answer='没有找到比较靠谱的回答~~ 小机器人会再接再厉。请问点别的吧~!';

我是这样验证就可以了

gg22mm commented 1 year ago

图片

Milvus 只有一个字匹配,召唤率0.6这么高, 按道理只有一个字匹配的都可以过滤掉了~~

rDearApple commented 1 year ago

我也存在相同的问题,他给出来的阈值分数没有参考意义,有解决办法@我一下 谢谢!!!

是不是要自己训练?https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/question_answering/supervised_qa/faq_finance 我上次自己训练发现效果还不如直接用 “ 流水线PiPeline ” 效果好,所以我现在用的是: 流水线PiPeline 都不用训练了,直接使用,但是确实有你说的这个问题

图片

我是用这个的,出来的效果评分真没什么意义

你好,请问自己在faq_finance训练的模型如何接入FAQ

yangle9567 commented 12 months ago

FAQ分数无意义问题无法解决

gg22mm commented 11 months ago

多标题就会出现这个问题,如果是单个标题的话,没有这个问题.

也就是说: simcse 用增强数据会降低精度,只能用: train_unsupervised.csv 这种格式训练