File size: 4,593 Bytes
6977d0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# coding: utf-8
import os

import openai
import gradio as gr

MAX_TURNS = 20
MAX_BOXES = MAX_TURNS * 2

openai.api_key = "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"


# 充当DM和NLG角色
system_0 = "你来充当易鑫集团的一个礼貌的、专业的汽车贷款专员,来给客户打电话确认贷款情况。\
客户是黄西虢先生,刚刚扫码申请了车辆抵押分期业务,想申请贷款。\
对话时要注意以下几点:\
1. 不要主动结束对话,要努力保持和客户的通话,一直到加上客户的微信后,再礼貌地和客户告别。\
2. 不要问客户要身份信息。\
3. 不要一开始就要联系方式,需要等时机成熟时再要。\
4. 主要关注以下几点:客户车辆是贷款购买还是全款购买、客户车辆的购车时间和年限、客户车辆品牌、客户车辆裸车价、客户期望的贷款金额、贷款资金用途、是否有行驶证证书。\
5. 你要一步一步地询问客户问题,一次只问一个问题。\
6. 如果客户拒绝继续沟通,不要和客户结束通话。你可以告诉客户他有办理贷款的资格,并体现出我们的合作机构民生银行这个平台来吸引客户,然后继续和客户沟通。\
7. 只要客户拥有全款购买的车辆,或按揭贷款购买且已还清贷款的车辆,那么客户就有贷款的资格,贷款额度为车辆购买价格的80%,贷款的利息很低。 \
8. 在办理贷款时,需要把客户的行驶证证书抵押给银行,你需要询问客户是否可以接受这一条件。\
9. 对话的目的是加上客户的微信,并促成客户的贷款业务。\
10. 贷款额度是裸车价的80%。\
11. 客户必须有行驶证才能贷款。"


def api_inference(input, history):
    """api_inference"""
    print('api_inference...')

    # api
    role = "user"
    user_input = {"role": role, "content": input}

    try:
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            temperature=0.0,
            messages= history + [user_input],
        )
    except Exception as e:
        print(e)
    # add user to history
    history.append(user_input)
    # assistant response
    role = completion.choices[0].message["role"]
    response = completion.choices[0].message["content"]
    # add assistant to history
    assert role == "assistant"
    assistant_response = {"role": role, "content": response}
    history.append(assistant_response)

    print('api_inference done')
    return [history]


def predict(input, prompt, history=None):
    """predict"""
    print('predict...')

    if history is None:
        history = []

    history[0]["content"] = prompt
        
    for history in api_inference(input, history):
        updates = []
        for item in history[1:]:
            role = item["role"]
            role_txt = role
            if role == 'user':
                role_txt = '客户'
            if role == 'assistant':
                role_txt = '坐席'
            updates.append(gr.update(visible=True, value=role_txt + ': ' + item['content']))

        if len(updates) < MAX_BOXES:
            updates = updates + [gr.Textbox.update(visible=False)] * (MAX_BOXES - len(updates))

        yield [history] + updates


with gr.Blocks(title='外呼场景测试Demo') as demo:

    prompt = gr.Textbox(label='prompt: (change according to your ideas)', show_label=True, value=system_0, lines=9, 
                        interactive=True).style(container=False)
    
    state = gr.State([{"role": "system", "content": prompt.value},])
    text_boxes = []

    for i in range(MAX_BOXES):
        if i % 2 == 0:
            text_boxes.append(gr.Markdown(visible=False, label="提问:"))
        else:
            text_boxes.append(gr.Markdown(visible=False, label="回复:"))

    with gr.Row():
        with gr.Column(scale=4):
            txt = gr.Textbox(show_label=False, placeholder="Enter text and press enter", lines=9).style(
                container=False)
            button = gr.Button("Generate")

        with gr.Column(scale=1):
            max_length = gr.Slider(0, 4096, value=2048, step=1.0, label="Maximum length", interactive=False)
            top_p = gr.Slider(0, 1, value=0.7, step=0.01, label="Top p", interactive=False)
            temperature = gr.Slider(0, 1, value=0.0, step=0.01, label="Temperature", interactive=False)

    button.click(predict, [txt, prompt, state], [state] + text_boxes)

demo.queue().launch(share=False, inbrowser=True, server_name="0.0.0.0", server_port=8006)

# gr.close_all()