File size: 16,107 Bytes
287bf22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4495c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
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()