Spaces:
Sleeping
Sleeping
Create app.py
Browse files
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')
|