baidubce / bce-qianfan-sdk

Provide best practices for LMOps, as well as elegant and convenient access to the features of the Qianfan MaaS Platform. (提供大模型工具链最佳实践,以及优雅且便捷地访问千帆大模型平台)
https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html
Apache License 2.0
318 stars 48 forks source link

不能正确按照返回要求返回结果 #537

Closed zhengshuheng closed 3 months ago

zhengshuheng commented 4 months ago

Issue you'd like to raise.

代码: import qianfan chat = qianfan.ChatCompletion({'top_p': 0.8, 'temperature': 0.2, 'penalty_score': 1.0}) params.update( {"messages":[{"role":"user","content":prompt1}]} ) resp = chat.do(**params) print(resp["result"])

prompt: 你是一位资深用户问题分析师,负责对用户输入的问题进行分析总结

【任务】: 1、将用户提问进行分析; 2、分析用户提问,根据指令从知识库中选择符合要求的问题Q; 3、分析用户提问时,可忽略问题中的量词;

【指令】: 1、当用户提问在产品知识范围内时,只能从知识库中返回符合要求的答案; 2、当用户提问不在产品知识范围内,对用户提问重新理解后在产品知识范围内时,只能从知识库中返回符合要求的答案。

【用户提问】: EC软件汇营销规则设置好之后是否实时生效?

【产品知识】: 1、EC软件是一款社交化的SCRM客户关系管理软件。 2、EC软件包括PC端、MAC端、Android端、ios端等终端。 3、EC软件包含标准版、个人版、专业版、行业版等套餐版本,套餐支持按年按月购买,套餐过期后需要进行续费。 4、EC套餐版本除了包含基本的服务同时包含汇营销、营客通、在线客服、易企查、云呼、云小号、话务中心等增值服务,增值服务可以捆绑到套餐购买也可以单独购买。

【知识库】: [ { "q": "汇营销开启互通状态之后,数据是实时同步的吗", "a": "尊敬的用户您好,汇营销开启互通状态之后,数据每5秒同步一次,可视为实时同步,谢谢。" }, { "q": "自动化规则设置之后多久生效", "a": "尊敬的用户您好,自动化规则设置后第二天生效,谢谢!" }, { "q": "汇营销在哪设置商机自动分配规则", "a": "尊敬的用户您好,请依次打开汇营销-设置-流转规则设置-商机分配设置,在商机分配设置的界面选择自定义分配,点击添加规则即可。感谢您的支持,谢谢。" }, { "q": "汇营销账号绑定之后开启互通状态什么时候开始同步数据", "a": "尊敬的用户您好,汇营销账号绑定之后立即生效,开启互通状态会立即按照设置的规则同步数据,谢谢。" } ] 【返回要求】: 1.返回答案不能直接引用用户提问; 2.只返回一条JSON格式数据; 3.确保响应可被Java的fastjson函数解析; 4.返回答案只能是知识库中的q,不能是a; 5.如果没有匹配答案时,按照如下的JSON格式返回,格式:{"no_relevance":true,"question":""}; 6.如果有完全匹配的答案时,按照如下的JSON格式返回,格式:{"no_relevance":false,"question":""};

以上prompt 预期返回应该是:“自动化规则设置之后多久生效” 实际 没有按照返回要求返回 返回了用户问题 “EC软件汇营销规则设置好之后是否实时生效?”

问题

除了不按返回要求返回之外,还存在,相似度已经比较高但理解为不相关的情况。 比如用户问题“介绍一下易企查” 与 标准QA 有【如何购买易企查】【通过易企查可以查看到企业的什么信息】【易企查有什么作用】 【易企查功能可以体验吗】【易企查客户适用于企业客户还是个人客户】几个相似度非常高的QA时,还有概率识别为这是不相关的。

Suggestion:

No response

zhengshuheng commented 4 months ago

使用模型为ERNIE-Bot

danielhjz commented 4 months ago

可以采取以下方法优化一下prompt: 1、 指令和任务合并,放在前面 2、增加fewshot和COT 3、用户的query放在最后 以下是一个Prompt例子

prompt = """
1、将用户提问进行分析;
2、分析用户提问,根据指令从知识库中选择符合要求的问题question;
3、分析用户提问时,可忽略问题中的量词;
4.返回答案不能直接引用用户提问;
5.只返回一条JSON格式数据;
6.返回答案只能是知识库中的question,不能是answer;
7.如果没有匹配答案时,按照如下的JSON格式返回,格式:{"no_relevance":true,"question":""};
8.如果有完全匹配的答案时,按照如下的JSON格式返回,格式:{"no_relevance":false,"question":""};

【产品知识】:
1、EC软件是一款社交化的SCRM客户关系管理软件。
2、EC软件包括PC端、MAC端、Android端、ios端等终端。
3、EC软件包含标准版、个人版、专业版、行业版等套餐版本,套餐支持按年按月购买,套餐过期后需要进行续费。
4、EC软件套餐版本除了包含基本的服务,同时包含汇营销、营客通、在线客服、易企查、云呼、云小号、话务中心等增值服务,增值服务可以捆绑到套餐购买也可以单独购买。

【知识库】:
[
{
"question": "汇营销开启互通状态之后,数据是实时同步的吗",
"answer": "尊敬的用户您好,汇营销开启互通状态之后,数据每5秒同步一次,可视为实时同步,谢谢。"
},
{
"question": "自动化规则设置之后多久生效",
"answer": "尊敬的用户您好,自动化规则设置后第二天生效,谢谢!"
},
{
"question": "汇营销在哪设置商机自动分配规则",
"answer": "尊敬的用户您好,请依次打开汇营销-设置-流转规则设置-商机分配设置,在商机分配设置的界面选择自定义分配,点击添加规则即可。感谢您的支持,谢谢。"
},
{
"question": "汇营销账号绑定之后开启互通状态什么时候开始同步数据",
"answer": "尊敬的用户您好,汇营销账号绑定之后立即生效,开启互通状态会立即按照设置的规则同步数据,谢谢。"
}
]

【示例】:
1.用户提问 EC软件汇营销分配规则可以在哪里配置??
2.知识库:[{"question":"汇销商是什么", "answer":"answer1"}, {"question":"在哪设置商机自动分配规则", "answer":"answer2"}]
3.分析: 知识库第一句询问了汇销商是什么, 所以第二句的question的主语是销汇商,第二句可以理解为在哪设置汇销商的商机自动分配规则,。用户提问的重点是汇销商配置分配规则,可以分解为汇销商和分配规则而不是汇销商分配规则;虽然知识库所说为自动分配规则,但是当前知识库中并没有更精确匹配用户所提到的分配规则,所以和第二句内容最相关,所以返回第二句question:在哪设置商机自动分配规则。
4.返回:{"no_relevance":false,"question":"在哪设置商机自动分配规则"}

【用户提问】:
EC软件汇营销规则设置好之后是否实时生效?
【返回】:

"""

import qianfan

chat = qianfan.ChatCompletion(model="ERNIE-3.5-8K", **{'top_p': 0,'penalty_score': 1.0, "response_format": "json_object"})
params = {}
params.update(
{
"messages":[{"role":"user","content":prompt}]}
)
resp = chat.do(system="你是一位资深用户问题分析师,负责理解用户输入的问题,根据【产品知识】,【知识库】给出回答", **params)
print(resp["result"])

不太OK的话可以使用qianfan.trainer.Finetune进行模型微调,把业务知识库以及希望的回答格式内化到模型