mrcuizhe commited on
Commit
287bf22
·
verified ·
1 Parent(s): bc0322a

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +236 -0
app.py ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import json
3
+ import gradio as gr
4
+ from datetime import datetime
5
+
6
+ def ai_record_analyze(score_prompt, standard_prompt, example_prompt, msg, chat_history):
7
+ sys_prompt = "你是一个销售培训专家, 我会给你完整的销售和客户沟通的对话资料, 其中每一行的会以[时间戳]和[角色]为开头,表示该对话发生的时间和说话的角色,你需要对我给你的会话进行打分和评价, 请你参照以下得分点和例子, 进行打分和评价:"
8
+ 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代码块形式返回。注意:你返回的时间戳必须是一段时间范围,不要只返回单个时间点,且确保你返回的支撑语句可以支持你的理由,如果未得分则不用返回时间戳"""
9
+
10
+ usr_prompt = msg
11
+
12
+ messages = []
13
+
14
+ if example_prompt == "":
15
+ messages.append({
16
+ "role": "system",
17
+ "content": f"{sys_prompt}\n\n得分点: {score_prompt}\n标准: {standard_prompt}\n\n{sys_prompt3}"
18
+ })
19
+ else:
20
+ messages.append({
21
+ "role": "system",
22
+ "content": f"{sys_prompt}\n\n得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}\n\n{sys_prompt3}"
23
+ })
24
+
25
+ messages.append({
26
+ "role": "user",
27
+ "content": usr_prompt
28
+ })
29
+
30
+ url = "http://117.50.195.92:8080/qwen72-not-quantize/v1/chat/completions"
31
+
32
+ payload_qs = {
33
+ "model": "HiPilot-V1.5-Chat",
34
+ "messages": messages,
35
+ "temperature": 0.9,
36
+ "max_tokens": 2048,
37
+ "stream": True
38
+ }
39
+ headers = {
40
+ 'Content-Type': 'application/json'
41
+ }
42
+
43
+ response = requests.post(url, headers=headers, json=payload_qs, stream=True)
44
+
45
+ bot_message = ""
46
+
47
+ if example_prompt == "":
48
+ chat_history.append([f"得分点: {score_prompt}\n标准: {standard_prompt}", bot_message])
49
+ else:
50
+ chat_history.append([f"得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}", bot_message])
51
+
52
+
53
+ for chunk in response.iter_lines():
54
+ if chunk: # 忽略空行
55
+ try:
56
+ chunk = chunk.decode('utf-8')
57
+ chunk = chunk.strip().split("data:")[-1]
58
+ chunk = json.loads(chunk)
59
+ if "content" in chunk["choices"][0]["delta"]:
60
+ bot_message += chunk["choices"][0]["delta"]["content"]
61
+ chat_history[-1][1] = bot_message
62
+ yield msg, chat_history
63
+
64
+ except json.JSONDecodeError as e:
65
+ print(f"Error decoding JSON: {e}")
66
+
67
+ return msg, chat_history
68
+
69
+ def update_prompt(template):
70
+ standard_dict = {
71
+ "一通电话同花顺开场白,总分1分": "关键字包括同花顺、云软件、回访、回馈、来电、软件使用情况等,只要满足其中任何一个或者其他相关开场白,即为完成开场白,得1分。未完成同花顺开场白, 则得0分",
72
+ "一通电话挖需求,总分5分": """总分5分,包括:
73
+ 1.询问到了客户持仓股票(你在做什么股票, 帮你看一下,持股、有什么股票、持仓、做什么方向)
74
+ 2.询问到了客户购买该股票的理由(为什么去买这个股票, 出于什么原因)
75
+ 3.询问到了客户的买入价格(什么时候买的, 多少钱的买的,买了多久)
76
+ 4.询问到了客户在该点买入的原因(为什么会在这个位置买,买入的原因)
77
+ 5.询问到了客户如果看到主力资金流入流出是否还会购买(如果你看到机构资金在出货你还会买吗, 还会卖吗)
78
+ 以上每点,如果销售只是发出询问,但客户未回答,则仍算0分,只有客户回答了问题,该点算完成并获得1分, 满分5分,且请给具体的股票、股票代码、时间、原因、理由等信息""",
79
+ "一通电话对比算账,总分1分": """总分1分,包括:
80
+ 是否和客户对比过使用软件前后差异, 完成这一模块则得1分, 未完成则得0分。""",
81
+ "一通电话总结需求,总分1分": """总分1分,包括:
82
+ 总结需求:回顾客户选股或者买卖点的需求, 完���得1分, 未完成得0分。""",
83
+ "一通电话灌输理念,总分1分": """总分1分,包括:
84
+ 灌输理念:做股票要跟着国家政策主力资金, 完成得1分, 未完成得0分。""",
85
+ "一通电话引出产品,总分1分": """总分1分,包括:
86
+ 引出产品:敢于说出产品的名字(产品包括超级level2/超级L2/手机短线宝/同花顺手机VIP/主力密码/荐股师/涨停助手/手机云参数/黄金十分钟/手机诊股/神奇电波选股/AI分时顶底/AI波段雷达/金牛情报/AI机构探测器/决策先锋/金融大师/大研究/财富先锋等), 完成得1分, 未完成得0分。""",
87
+ "一通电话产品介绍1,总分1分": """总分2分,包括:
88
+ 是否论述: GS点(买入卖出信号)/主力资金(主力资金有明盘和暗盘)/AI机构活跃度(股票资金参与活跃情况, 活跃度高, 涨跌幅度大), 如均完成得2分, 完成部分得1分, 均未完成得0分。
89
+ """,
90
+ "一通电话产品介绍2,总分1分": """总分1分,包括:
91
+ 是否案例补充, 存在案例补充得1分, 未完成则得0分。""",
92
+ "一通电话产品介绍3,总分1分": """总分1分,包括:
93
+ 图片发送, 完成得1分, 未完成得0分。""",
94
+ "一通电话尝试成交1,总分1分": """总分1分,包括:
95
+ 场景:在案例补充后(办理/合F/支付宝/付钱/微信), 完成得1分, 未完成得0分。""",
96
+ "一通电话尝试成交2,总分1分": """总分1分,包括:
97
+ 答疑后:在答疑补充后(办理/合作/支付宝/付钱/微信), 完成得1分, 未完成得0分。""",
98
+ "一通电话尝试成交3,总分1分": """总分1分,包括:
99
+ 优惠方案:定金,优惠券,限时活动(送个月), 完成得1分, 未完成得0分。""",
100
+ "一通电话收尾": """总分1分,包括:
101
+ 以股票或者群服务, 或者是约下次打电话时间. 完成得1分,未完成得0分""",
102
+
103
+ "二通电话暖场,总分1分": """自我介绍、询问客户近期的操作,完成暖场, 得1分。未完成暖场, 则得0分。""",
104
+ "二通电话回顾需求,总分1分": """总分1分,包括:
105
+ 回顾客户选股或买卖点的问题。完成得1分。未完成则得0分。""",
106
+ "二通电话引出产品,总分1分": """总分1分,包括:
107
+ 再次说出产品, 完成则得1分, 未完成则得0分。""",
108
+ "二通电话产品介绍,功能介绍1,总分1分": """总分1分,包括:
109
+ 强化介绍产品的几个核心功能, 完成得1分, 未完成得0分。""",
110
+ "二通电话产品介绍,功能介绍2,总分1分": """总分1分,包括:
111
+ 论证:案例补充, 完成得1分, 未完成得0分。""",
112
+ "二通电话产品介绍,功能介绍3,总分1分": """总分1分,包括:
113
+ 截图发送, 完成得1分, 未完成得0分。""",
114
+ "二通电话答疑,总分1分": """总分1分,包括:
115
+ 解决客户的疑虑点, 完成得1分, 未完成得0分。""",
116
+ "二通电话尝试成交,总分1分": """总分1分,包括:
117
+ 引导尝试客户成交例如(办理/合作/支付宝/付钱/微信), 完成得1分, 未完成得0分。""",
118
+ "二通电话结束语,总分1分": """总分1分,包括:
119
+ 引发客户思考并预约, 完成得1分, 未完成得0分。""",
120
+ "空白模板":""
121
+ }
122
+ score_dict = {
123
+ "一通电话同花顺开场白,总分1分": "同花顺开场白",
124
+ "一通电话挖需求,总分5分": "挖需求",
125
+ "一通电话对比算账,总分1分": "对比算账",
126
+ "一通电话总结需求,总分1分": "总结需求, 灌输理念, 引出产品",
127
+ "一通电话灌输理念,总分1分": "总结需求, 灌输理念, 引出产品",
128
+ "一通电话引出产品,总分1分": "总结需求, 灌输理念, 引出产品",
129
+ "一通电话产品介绍1,总分1分": "产品介绍",
130
+ "一通电话产品介绍2,总分1分": "产品介绍",
131
+ "一通电话产品介绍3,总分1分": "产品介绍",
132
+ "一通电话尝试成交1,总分1分": "尝试成交",
133
+ "一通电话尝试成交2,总分1分": "尝试成交",
134
+ "一通电话尝试成交3,总分1分": "尝试成交",
135
+ "一通电话收尾": "收尾",
136
+
137
+ "二通电话暖场,总分1分": "暖场",
138
+ "二通电话回顾需求,总分1分": "回顾需求",
139
+ "二通电话引出产品,总分1分": "引出产品",
140
+ "二通电话产品介绍,功能介绍1,总分1分": "产品介绍,功能介绍",
141
+ "二通电话产品介绍,功能介绍2,总分1分": "产品介绍,功能介绍",
142
+ "二通电话产品介绍,功能介绍3,总分1分": "产品介绍,功能介绍",
143
+ "二通电话答疑,总分1分": "答疑",
144
+ "二通电话尝试成交,总分1分": "尝试成交",
145
+ "二通电话结束语,总分1分": "结束语",
146
+ "空白模板":""
147
+ }
148
+ example_dict = {
149
+ "一通电话同花顺开场白,总分1分": "",
150
+ "一通电话挖需求,总分5分": "",
151
+ "一通电话对��算账,总分1分": """如果当时跟我们做, 从什么时候开始做到什么时候结束, 你大概就可以赚, 少亏多少, 就可以覆盖这个软件的成本了, 或者是除去软件成本聂可以赚多少。""",
152
+ "一通电话总结需求,总分1分": """唐先生像你这样买卖点把握不好""",
153
+ "一通电话灌输理念,总分1分": """唐先生你还是要跟着资金和国家政策""",
154
+ "一通电话引出产品,总分1分": """像你的买卖点把握不好, 可以跟着我们决策先锋的主力资金来走, 决策的GS点, AI机构活跃度""",
155
+ "一通电话产品介绍1,总分1分": "",
156
+ "一通电话产品介绍2,总分1分": """先生300033, 主力资金连续进XX, GS又发出来G点买入信号, 从买入到现在位置, 多少个工作日涨幅多少XX。""",
157
+ "一通电话产品介绍3,总分1分": """唐先生, 我这个图发给你, 你看到没""",
158
+ "一通电话尝试成交1,总分1分": """想你买卖点把握不好,可以和我们合作起来,我们这个功能很好。""",
159
+ "一通电话尝试成交2,总分1分": """想你买卖点把握不好,可以和我们合作起来,我们这个功能很好。""",
160
+ "一通电话尝试成交3,总分1分": "",
161
+ "一通电话收尾": "",
162
+
163
+ "二通电话暖场,总分1分": """最近股票有操作吗?之前持有的、还在持有吗""",
164
+ "二通电话回顾需求,总分1分": """像你这样、买卖点把握不好、买高/卖早、很难获利、之前介绍的决策。""",
165
+ "二通电话引出产品,总分1分": """上次提到的直播间优惠活动、上次说的决策先锋、直播听完后、觉得怎么样?""",
166
+ "二通电话产品介绍,功能介绍1,总分1分": """G点买入、S点卖出、趋势启动、趋势终结、明盘资金、暗盘资金""",
167
+ "二通电话产品介绍,功能介绍2,总分1分": """XXX股票、XX个交易日、XX收益""",
168
+ "二通电话产品介绍,功能介绍3,总分1分": """截图发你了,你看一下;微信打开一下,图""",
169
+ "二通电话答疑,总分1分": "",
170
+ "二通电话尝试成交,总分1分": """"我带你办理一下、你是微信还是支付宝、你打开同花顺app、我给你发了个链接有看到吗、付好后发我一下截图. 优惠、活动、折扣、办理、合作、支付宝、微信、付钱,定金、赠送、价值1164、服务包.""",
171
+ "二通电话结束语,总分1分": """考虑清楚、能不能帮到你、想不想改变、下次再联系你、你可以关注一下""",
172
+ "空白模板":""
173
+ }
174
+
175
+ return score_dict[template], standard_dict[template], example_dict[template]
176
+
177
+
178
+
179
+ def download_prompt(score_prompt, standard_prompt, example_prompt):
180
+ current_time = str(datetime.now())
181
+ address = f"/mnt/data/code_generation/cuizhe/yunruanjian/prompt_{current_time}.txt"
182
+ with open(address,'w') as f:
183
+ if example_prompt == "":
184
+ f.write(f"得分点: {score_prompt}\n标准: {standard_prompt}")
185
+ else:
186
+ f.write(f"得分点: {score_prompt}\n标准: {standard_prompt}\n例如: {example_prompt}")
187
+
188
+ return address
189
+
190
+
191
+
192
+
193
+ if __name__ == "__main__":
194
+ with gr.Blocks(analytics_enabled = False) as demo:
195
+ chatbot = gr.Chatbot(height=800)
196
+ with gr.Row():
197
+ msg = gr.Textbox(placeholder="复制黏贴对话内容", scale=4, max_lines=20, label = "录音内容")
198
+ with gr.Row():
199
+ template_choice = gr.Radio(
200
+ choices=[
201
+ "一通电话同花顺开场白,总分1分", "一通电话挖需求,总分5分", "一通电话对比算账,总分1分",
202
+ "一通电话总结需求,总分1分", "一通电话灌输理念,总分1分", "一通电话引出产品,总分1分",
203
+ "一通电话产品介绍1,总分1分", "一通电话产品介绍2,总分1分", "一通电话产品介绍3,总分1分",
204
+ "一通电话尝试成交1,总分1分", "一通电话尝试成交2,总分1分", "一通电话尝试成交3,总分1分",
205
+ "一通电话收尾", "二通电话暖场,总分1分", "二通电话回顾需求,总分1分",
206
+ "二通电话引出产品,总分1分", "二通电话产品介绍,功能介绍1,总分1分",
207
+ "二通电话产品介绍,功能介绍2,总分1分", "二通电话产品介绍,功能介绍3,总分1分",
208
+ "二通电话答疑,总分1分", "二通电话尝试成交,总分1分", "二通电话结束语,总分1分",
209
+ "空白模板"
210
+ ],
211
+ label="选择模板"
212
+ )
213
+
214
+ with gr.Row():
215
+ score_prompt = gr.Textbox(placeholder="得分点", scale=4, max_lines=20, label = "得分点prompt")
216
+ standard_prompt = gr.Textbox(placeholder="标准", scale=4, max_lines=20, label = "得分标准prompt")
217
+ example_prompt = gr.Textbox(placeholder="举例", scale=4, max_lines=20, label = "得分举例prompt")
218
+
219
+ with gr.Row():
220
+ submit = gr.Button("提交", variant="primary")
221
+ with gr.Row():
222
+ clear = gr.Button("清除")
223
+ stop = gr.Button("停止", variant="stop")
224
+
225
+ with gr.Row():
226
+ download_btn = gr.Button("生成文件")
227
+ prompt_file = gr.File(label="文件")
228
+
229
+ template_choice.change(fn=update_prompt, inputs=template_choice, outputs=[score_prompt, standard_prompt, example_prompt])
230
+ submit_event = submit.click(ai_record_analyze, inputs=[score_prompt, standard_prompt, example_prompt, msg, chatbot], outputs=[msg, chatbot])
231
+ download_btn.click(download_prompt, inputs=[score_prompt, standard_prompt, example_prompt], outputs=prompt_file)
232
+ clear.click(lambda: None, None, chatbot, queue=False)
233
+ stop.click(fn=None, inputs=None, outputs=None, cancels=[submit_event])
234
+
235
+ demo.queue()
236
+ demo.launch(share=False, server_port=8888, server_name='0.0.0.0')