File size: 4,329 Bytes
ac9e7e2
 
 
 
43ba4e0
ac9e7e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43ba4e0
 
 
 
 
 
 
 
342fff9
43ba4e0
 
 
 
ac9e7e2
 
 
 
8bff249
 
 
43ba4e0
ac9e7e2
43ba4e0
ac9e7e2
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
import requests 
import json 
import streamlit as st
import sys 
import time 

st.set_page_config(page_title="Samba-CoE_v0.1 Chatbot")

if 'expert_sampling_details' not in st.session_state.keys():
    st.session_state['temperature'] = 0.7
    st.session_state['top_p'] = 0.1
    st.session_state['max_length'] = 512
    st.session_state['history_buffer_length'] = 3
    st.session_state['top_k'] = 40

with st.sidebar:
    st.sidebar.info("Samba-CoE_v0.1 Chatbot")
    with st.sidebar.form("Chatbot Settings"):
        temperature = st.sidebar.slider('temperature', min_value=0.01, max_value=1.0, value=0.7, step=0.01)
        top_p = st.sidebar.slider('top_p', min_value=0.01, max_value=1.0, value=0.1, step=0.01)
        max_length = st.sidebar.slider('max_length', min_value=32, max_value=1024, value=512, step=8)
        submitted = st.form_submit_button("Submit")
        
        if submitted:
            st.session_state['max_length'] = max_length
            st.session_state['temperature'] = temperature
            st.session_state['top_p'] = top_p
            st.sidebar.success("Generation parameters:\n" + f'\n * temperature: {st.session_state.temperature}\n' + f'\n * top_p: {st.session_state.top_p}\n' + f'\n * max_tokens: {st.session_state.max_length}\n' + f'\n * skip_special_tokens: True\n'+ f'\n * do_sample: True\n' )    

def clear_chat_history():
    st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]

st.sidebar.button('Clear Chat History', on_click=clear_chat_history)

# Store LLM generated responses
if "messages" not in st.session_state.keys():
    st.session_state.messages = [{"role": "assistant", "content": "How may I assist you today?"}]

# Display or clear chat message
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.write(message["content"])
    
def generate_response(prompt_input):
    history_buffer_length = st.session_state.history_buffer_length
    message_history = st.session_state.messages[-history_buffer_length:]
    string_dialogue = "<s> [INST] You are a helpful assistant developed by SambaNova Systems as part of its Composition of Expert (CoE) effort. Always assist with care, respect, and truth. Respond with utmost utility yet securely and professionally. Avoid harmful, unethical, prejudiced, or negative content. Ensure replies promote fairness, positivity and an engaging conversation. [/INST] \n"
    for dict_message in message_history:
        if dict_message["role"] == "user":
            string_dialogue += '[INST]' + dict_message["content"] + '[/INST]' + '\n'
        else:
            string_dialogue += dict_message["content"] + "</s>" + '\n'

    payload = {'prompt': string_dialogue,
    'max_tokens': st.session_state['max_length'],
    'n': 1,
    'do_sample': True,
    'temperature': st.session_state['temperature'],
    'top_p': st.session_state['top_p'],
    'top_k': st.session_state['top_k'],
    'skip_special_token': True,
    'repition_penalty': 1.15,
    'stop_sequences': ['INST', '[INST]', '[/INST]']
    }
   
    r = requests.post(st.secrets["backend_url"], json=payload)
    response = r.json()['choices'][0]['text']
    
    return response

# User-provided prompt
if prompt := st.chat_input():
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.write(prompt)

def clean_response(response):
    if  '[INST' in response: 
        return response.split('[INST')[0]
    elif  '[/INST' in response: 
        return response.split('[/INST')[0]
    return response
    
def stream_response(response):
    response = "Please access our latest chatbot at this link: [Samba-CoE-v0.2](https://coe-1.cloud.snova.ai/)"
    for word in response.split(" "):
        yield word + " "
        time.sleep(0.02)

# Generate a new response if last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":
    with st.chat_message("assistant"):
        with st.spinner("Thinking..."):
            # response = generate_response(prompt)
            # response = clean_response(response)
            response = None
            st.write_stream(stream_response(response))

    message = {"role": "assistant", "content": response}
    st.session_state.messages.append(message)