Spaces:
Sleeping
Sleeping
import requests | |
import json | |
import gradio as gr | |
from datetime import datetime | |
def ai_record_analyze(score_prompt, standard_prompt, example_prompt, msg, chat_history): | |
sys_prompt = "你是一个销售培训专家, 我会给你完整的销售和客户沟通的对话资料, 其中每一行的会以[时间戳]和[角色]为开头,表示该对话发生的时间和说话的角色,你需要对我给你的会话进行打分和评价, 请你参照以下得分点和例子, 进行打分和评价:" | |
sys_prompt3 = """以上得分点中, 你需要给出打分,并给出打分的理由以及支撑你打分的对话语句;如果未得分或者得了0分,也必须要给出理由并给出优化建议,支撑语句输出空字符。请严格按照以下json格式返回,且仅返回json格式内的内容:\n[{'得分': 'xxx',\n'理由':'xxx',\n'优化建议': 'xxx',\n'支撑语句': '0:1:00-0:2:00\n0:2:01-0:3:01'}]\n其中得分你只返回所获得的分数,例如,例如1代表1分,2代表2分。优化建议中返回你认为可以改进的点或者优化的部分。支撑语句返回具体支撑语句的时间戳(每一行最前面的时间戳),你只返回时间戳,不返回该行的具体内容,如果对应多个时间戳则用换行符分隔。注意:我给你的打分标准可能会有多个,但是你返回的时候要把所有得分合并,json列表中只返回一个元素,且不以json代码块形式返回。注意:你返回的时间戳必须是一段时间范围,不要只返回单个时间点,且确保你返回的支撑语句可以支持你的理由,如果未得分则不用返回时间戳""" | |
usr_prompt = msg | |
messages = [] | |
if example_prompt == "": | |
messages.append({ | |
"role": "system", | |
"content": f"{sys_prompt}\n\n得分点: {score_prompt}\n标准: {standard_prompt}\n\n{sys_prompt3}" | |
}) | |
else: | |
messages.append({ | |
"role": "system", | |
"content": f"{sys_prompt}\n\n得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}\n\n{sys_prompt3}" | |
}) | |
messages.append({ | |
"role": "user", | |
"content": usr_prompt | |
}) | |
url = "http://117.50.195.92:8080/qwen72-not-quantize/v1/chat/completions" | |
payload_qs = { | |
"model": "HiPilot-V1.5-Chat", | |
"messages": messages, | |
"temperature": 0.9, | |
"max_tokens": 2048, | |
"stream": True | |
} | |
headers = { | |
'Content-Type': 'application/json' | |
} | |
response = requests.post(url, headers=headers, json=payload_qs, stream=True) | |
bot_message = "" | |
if example_prompt == "": | |
chat_history.append([f"得分点: {score_prompt}\n标准: {standard_prompt}", bot_message]) | |
else: | |
chat_history.append([f"得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}", bot_message]) | |
for chunk in response.iter_lines(): | |
if chunk: # 忽略空行 | |
try: | |
chunk = chunk.decode('utf-8') | |
chunk = chunk.strip().split("data:")[-1] | |
chunk = json.loads(chunk) | |
if "content" in chunk["choices"][0]["delta"]: | |
bot_message += chunk["choices"][0]["delta"]["content"] | |
chat_history[-1][1] = bot_message | |
yield msg, chat_history | |
except json.JSONDecodeError as e: | |
print(f"Error decoding JSON: {e}") | |
return msg, chat_history | |
def update_prompt(template): | |
standard_dict = { | |
"一通电话同花顺开场白,总分1分": "关键字包括同花顺、云软件、回访、回馈、来电、软件使用情况等,只要满足其中任何一个或者其他相关开场白,即为完成开场白,得1分。未完成同花顺开场白, 则得0分", | |
"一通电话挖需求,总分5分": """总分5分,包括: | |
1.询问到了客户持仓股票(你在做什么股票, 帮你看一下,持股、有什么股票、持仓、做什么方向) | |
2.询问到了客户购买该股票的理由(为什么去买这个股票, 出于什么原因) | |
3.询问到了客户的买入价格(什么时候买的, 多少钱的买的,买了多久) | |
4.询问到了客户在该点买入的原因(为什么会在这个位置买,买入的原因) | |
5.询问到了客户如果看到主力资金流入流出是否还会购买(如果你看到机构资金在出货你还会买吗, 还会卖吗) | |
以上每点,如果销售只是发出询问,但客户未回答,则仍算0分,只有客户回答了问题,该点算完成并获得1分, 满分5分,且请给具体的股票、股票代码、时间、原因、理由等信息""", | |
"一通电话对比算账,总分1分": """总分1分,包括: | |
是否和客户对比过使用软件前后差异, 完成这一模块则得1分, 未完成则得0分。""", | |
"一通电话总结需求,总分1分": """总分1分,包括: | |
总结需求:回顾客户选股或者买卖点的需求, 完成得1分, 未完成得0分。""", | |
"一通电话灌输理念,总分1分": """总分1分,包括: | |
灌输理念:做股票要跟着国家政策主力资金, 完成得1分, 未完成得0分。""", | |
"一通电话引出产品,总分1分": """总分1分,包括: | |
引出产品:敢于说出产品的名字(产品包括超级level2/超级L2/手机短线宝/同花顺手机VIP/主力密码/荐股师/涨停助手/手机云参数/黄金十分钟/手机诊股/神奇电波选股/AI分时顶底/AI波段雷达/金牛情报/AI机构探测器/决策先锋/金融大师/大研究/财富先锋等), 完成得1分, 未完成得0分。""", | |
"一通电话产品介绍1,总分1分": """总分2分,包括: | |
是否论述: GS点(买入卖出信号)/主力资金(主力资金有明盘和暗盘)/AI机构活跃度(股票资金参与活跃情况, 活跃度高, 涨跌幅度大), 如均完成得2分, 完成部分得1分, 均未完成得0分。 | |
""", | |
"一通电话产品介绍2,总分1分": """总分1分,包括: | |
是否案例补充, 存在案例补充得1分, 未完成则得0分。""", | |
"一通电话产品介绍3,总分1分": """总分1分,包括: | |
图片发送, 完成得1分, 未完成得0分。""", | |
"一通电话尝试成交1,总分1分": """总分1分,包括: | |
场景:在案例补充后(办理/合F/支付宝/付钱/微信), 完成得1分, 未完成得0分。""", | |
"一通电话尝试成交2,总分1分": """总分1分,包括: | |
答疑后:在答疑补充后(办理/合作/支付宝/付钱/微信), 完成得1分, 未完成得0分。""", | |
"一通电话尝试成交3,总分1分": """总分1分,包括: | |
优惠方案:定金,优惠券,限时活动(送个月), 完成得1分, 未完成得0分。""", | |
"一通电话收尾": """总分1分,包括: | |
以股票或者群服务, 或者是约下次打电话时间. 完成得1分,未完成得0分""", | |
"二通电话暖场,总分1分": """自我介绍、询问客户近期的操作,完成暖场, 得1分。未完成暖场, 则得0分。""", | |
"二通电话回顾需求,总分1分": """总分1分,包括: | |
回顾客户选股或买卖点的问题。完成得1分。未完成则得0分。""", | |
"二通电话引出产品,总分1分": """总分1分,包括: | |
再次说出产品, 完成则得1分, 未完成则得0分。""", | |
"二通电话产品介绍,功能介绍1,总分1分": """总分1分,包括: | |
强化介绍产品的几个核心功能, 完成得1分, 未完成得0分。""", | |
"二通电话产品介绍,功能介绍2,总分1分": """总分1分,包括: | |
论证:案例补充, 完成得1分, 未完成得0分。""", | |
"二通电话产品介绍,功能介绍3,总分1分": """总分1分,包括: | |
截图发送, 完成得1分, 未完成得0分。""", | |
"二通电话答疑,总分1分": """总分1分,包括: | |
解决客户的疑虑点, 完成得1分, 未完成得0分。""", | |
"二通电话尝试成交,总分1分": """总分1分,包括: | |
引导尝试客户成交例如(办理/合作/支付宝/付钱/微信), 完成得1分, 未完成得0分。""", | |
"二通电话结束语,总分1分": """总分1分,包括: | |
引发客户思考并预约, 完成得1分, 未完成得0分。""", | |
"空白模板":"" | |
} | |
score_dict = { | |
"一通电话同花顺开场白,总分1分": "同花顺开场白", | |
"一通电话挖需求,总分5分": "挖需求", | |
"一通电话对比算账,总分1分": "对比算账", | |
"一通电话总结需求,总分1分": "总结需求, 灌输理念, 引出产品", | |
"一通电话灌输理念,总分1分": "总结需求, 灌输理念, 引出产品", | |
"一通电话引出产品,总分1分": "总结需求, 灌输理念, 引出产品", | |
"一通电话产品介绍1,总分1分": "产品介绍", | |
"一通电话产品介绍2,总分1分": "产品介绍", | |
"一通电话产品介绍3,总分1分": "产品介绍", | |
"一通电话尝试成交1,总分1分": "尝试成交", | |
"一通电话尝试成交2,总分1分": "尝试成交", | |
"一通电话尝试成交3,总分1分": "尝试成交", | |
"一通电话收尾": "收尾", | |
"二通电话暖场,总分1分": "暖场", | |
"二通电话回顾需求,总分1分": "回顾需求", | |
"二通电话引出产品,总分1分": "引出产品", | |
"二通电话产品介绍,功能介绍1,总分1分": "产品介绍,功能介绍", | |
"二通电话产品介绍,功能介绍2,总分1分": "产品介绍,功能介绍", | |
"二通电话产品介绍,功能介绍3,总分1分": "产品介绍,功能介绍", | |
"二通电话答疑,总分1分": "答疑", | |
"二通电话尝试成交,总分1分": "尝试成交", | |
"二通电话结束语,总分1分": "结束语", | |
"空白模板":"" | |
} | |
example_dict = { | |
"一通电话同花顺开场白,总分1分": "", | |
"一通电话挖需求,总分5分": "", | |
"一通电话对比算账,总分1分": """如果当时跟我们做, 从什么时候开始做到什么时候结束, 你大概就可以赚, 少亏多少, 就可以覆盖这个软件的成本了, 或者是除去软件成本聂可以赚多少。""", | |
"一通电话总结需求,总分1分": """唐先生像你这样买卖点把握不好""", | |
"一通电话灌输理念,总分1分": """唐先生你还是要跟着资金和国家政策""", | |
"一通电话引出产品,总分1分": """像你的买卖点把握不好, 可以跟着我们决策先锋的主力资金来走, 决策的GS点, AI机构活跃度""", | |
"一通电话产品介绍1,总分1分": "", | |
"一通电话产品介绍2,总分1分": """先生300033, 主力资金连续进XX, GS又发出来G点买入信号, 从买入到现在位置, 多少个工作日涨幅多少XX。""", | |
"一通电话产品介绍3,总分1分": """唐先生, 我这个图发给你, 你看到没""", | |
"一通电话尝试成交1,总分1分": """想你买卖点把握不好,可以和我们合作起来,我们这个功能很好。""", | |
"一通电话尝试成交2,总分1分": """想你买卖点把握不好,可以和我们合作起来,我们这个功能很好。""", | |
"一通电话尝试成交3,总分1分": "", | |
"一通电话收尾": "", | |
"二通电话暖场,总分1分": """最近股票有操作吗?之前持有的、还在持有吗""", | |
"二通电话回顾需求,总分1分": """像你这样、买卖点把握不好、买高/卖早、很难获利、之前介绍的决策。""", | |
"二通电话引出产品,总分1分": """上次提到的直播间优惠活动、上次说的决策先锋、直播听完后、觉得怎么样?""", | |
"二通电话产品介绍,功能介绍1,总分1分": """G点买入、S点卖出、趋势启动、趋势终结、明盘资金、暗盘资金""", | |
"二通电话产品介绍,功能介绍2,总分1分": """XXX股票、XX个交易日、XX收益""", | |
"二通电话产品介绍,功能介绍3,总分1分": """截图发你了,你看一下;微信打开一下,图""", | |
"二通电话答疑,总分1分": "", | |
"二通电话尝试成交,总分1分": """"我带你办理一下、你是微信还是支付宝、你打开同花顺app、我给你发了个链接有看到吗、付好后发我一下截图. 优惠、活动、折扣、办理、合作、支付宝、微信、付钱,定金、赠送、价值1164、服务包.""", | |
"二通电话结束语,总分1分": """考虑清楚、能不能帮到你、想不想改变、下次再联系你、你可以关注一下""", | |
"空白模板":"" | |
} | |
return score_dict[template], standard_dict[template], example_dict[template] | |
def download_prompt(score_prompt, standard_prompt, example_prompt): | |
current_time = str(datetime.now()) | |
address = f"/mnt/data/code_generation/cuizhe/yunruanjian/prompt_{current_time}.txt" | |
with open(address,'w') as f: | |
if example_prompt == "": | |
f.write(f"得分点: {score_prompt}\n标准: {standard_prompt}") | |
else: | |
f.write(f"得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}") | |
return address | |
if __name__ == "__main__": | |
with gr.Blocks(analytics_enabled = False) as demo: | |
chatbot = gr.Chatbot(height=800) | |
with gr.Row(): | |
msg = gr.Textbox(placeholder="复制黏贴对话内容", scale=4, max_lines=20, label = "录音内容") | |
with gr.Row(): | |
template_choice = gr.Radio( | |
choices=[ | |
"一通电话同花顺开场白,总分1分", "一通电话挖需求,总分5分", "一通电话对比算账,总分1分", | |
"一通电话总结需求,总分1分", "一通电话灌输理念,总分1分", "一通电话引出产品,总分1分", | |
"一通电话产品介绍1,总分1分", "一通电话产品介绍2,总分1分", "一通电话产品介绍3,总分1分", | |
"一通电话尝试成交1,总分1分", "一通电话尝试成交2,总分1分", "一通电话尝试成交3,总分1分", | |
"一通电话收尾", "二通电话暖场,总分1分", "二通电话回顾需求,总分1分", | |
"二通电话引出产品,总分1分", "二通电话产品介绍,功能介绍1,总分1分", | |
"二通电话产品介绍,功能介绍2,总分1分", "二通电话产品介绍,功能介绍3,总分1分", | |
"二通电话答疑,总分1分", "二通电话尝试成交,总分1分", "二通电话结束语,总分1分", | |
"空白模板" | |
], | |
label="选择模板" | |
) | |
with gr.Row(): | |
score_prompt = gr.Textbox(placeholder="得分点", scale=4, max_lines=20, label = "得分点prompt") | |
standard_prompt = gr.Textbox(placeholder="标准", scale=4, max_lines=20, label = "得分标准prompt") | |
example_prompt = gr.Textbox(placeholder="举例", scale=4, max_lines=20, label = "得分举例prompt") | |
with gr.Row(): | |
submit = gr.Button("提交", variant="primary") | |
with gr.Row(): | |
clear = gr.Button("清除") | |
stop = gr.Button("停止", variant="stop") | |
with gr.Row(): | |
download_btn = gr.Button("生成文件") | |
prompt_file = gr.File(label="文件") | |
template_choice.change(fn=update_prompt, inputs=template_choice, outputs=[score_prompt, standard_prompt, example_prompt]) | |
submit_event = submit.click(ai_record_analyze, inputs=[score_prompt, standard_prompt, example_prompt, msg, chatbot], outputs=[msg, chatbot]) | |
download_btn.click(download_prompt, inputs=[score_prompt, standard_prompt, example_prompt], outputs=prompt_file) | |
clear.click(lambda: None, None, chatbot, queue=False) | |
stop.click(fn=None, inputs=None, outputs=None, cancels=[submit_event]) | |
demo.queue() | |
demo.launch() | |