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()