File size: 7,331 Bytes
0271e9b
 
586aa0c
9d7f8de
9355ea5
0271e9b
 
 
 
178962d
 
0271e9b
586aa0c
0079c63
0271e9b
0f77de4
 
 
 
 
acff2ed
586aa0c
acff2ed
16997b3
b794ac4
 
 
9e7e0fe
 
 
 
 
 
 
0271e9b
 
 
9e7e0fe
0271e9b
0079c63
0271e9b
16997b3
 
 
601c6ac
9e7e0fe
16997b3
 
 
0271e9b
9e7e0fe
 
 
 
 
 
 
 
 
 
0271e9b
e87985a
0271e9b
0079c63
0271e9b
16997b3
0271e9b
 
 
 
 
9e7e0fe
0271e9b
16997b3
9e7e0fe
 
b30761b
 
 
 
 
9e7e0fe
 
 
b30761b
9e7e0fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16997b3
0271e9b
9e7e0fe
0271e9b
 
 
9e7e0fe
 
 
 
 
 
0271e9b
 
984507d
16997b3
0271e9b
16997b3
0271e9b
 
0079c63
9e7e0fe
 
 
b794ac4
 
 
 
ec533d0
9e7e0fe
0271e9b
b794ac4
 
7dc5633
b794ac4
 
9e7e0fe
b794ac4
 
9e7e0fe
b794ac4
9e7e0fe
 
 
 
 
 
 
 
 
0271e9b
0079c63
b794ac4
16997b3
9e7e0fe
 
 
 
16997b3
b30761b
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
import gradio as gr
import random
import openai
import pinecone
import os
from langchain.vectorstores import Pinecone
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
import datetime
import requests

openai.api_key= os.environ.get('API_OPENAI')
embeddings = OpenAIEmbeddings(openai_api_key=openai.api_key)

PINECONE_API_KEY = os.environ.get('API_PINECONE')
pinecone.init(
    api_key=PINECONE_API_KEY,  # find at app.pinecone.io
    environment="eu-west4-gcp"  # next to api key in console
)
AIRTABLE_API_KEY = os.environ.get('API_PINECONE')

##########

index_name = "yc-faq-air"
vectorstore = Pinecone.from_existing_index(index_name, embeddings)

AIRTABLE_ENDPOINT = "https://api.airtable.com/v0/appv2hF1PzrseVdeW/data_m"
AIRTABLE_ENDPOINT_LOG = "https://api.airtable.com/v0/appv2hF1PzrseVdeW/log_chat"
HEADERS = {
    "Authorization": f"Bearer {AIRTABLE_API_KEY}",
    "Content-Type": "application/json"
}


prompt = "Instruction: Твоя роль - кваліфікований співробітник саппорту у системи YouControl. Потрібно відповісти на питання від користувача з огляду на контекст. Контекст ми беремо з бази знань, але вона може бути не повна.  Якщо контекст не коректний, то відповідай на свій розсуд або передай запит сапорту, про контекс нічого не пишемо у відповіді. YouControl може писатися по різному: YC,Ю-контрол,Юконтрол, Юконтроль, Юр контроль, ЮК, UControl, Ю-контроль, YOU Kontrol, YouContro. ЗЕД - це зовнішня економічна діяльність."+"""
"""

messages = [{"role": "system", "content": prompt}]
chat_history = []

def ask_yc_bot(question):
  docs = vectorstore.similarity_search(question)
  source_name = docs[0].metadata['source']
  context = docs[0].page_content
  result = "Question: " + question +   "\n\n"  + " Context: " + context
  return result


def clear_f():

  global messages,  chat_history, context
  context=""
  prompt = """
  Instruction: Твоя роль - кваліфікований співробітник саппорту у системи YouControl.
  Потрібно відповісти на питання від користувача з огляду на контекст.
  Контекст ми беремо з бази знань, але вона може бути не повна.
  Якщо контекст не коректний, то відповідай на свій розсуд або передай запит сапорту, про контекс нічого не пишемо у відповіді.
  YouControl може писатися по різному: YC,Ю-контрол,Юконтрол, Юконтроль, Юр контроль, ЮК, UControl, Ю-контроль, YOU Kontrol, YouContro.
  ЗЕД - це зовнішня економічна діяльність
  """
  messages = []
  messages = [{"role": "system", "content": prompt}]
  chat_history.clear()
  return ""

def query_gpt_3_5(messages, context):
    completion = openai.ChatCompletion.create(
        model="gpt-4-0613",
        messages=messages
        )
    print ("gpt ответил", completion.choices[0].message.content)
    return completion.choices[0].message.content

def comment_bot(slider_value, comment_text):
    global messages
    result_messages = list(messages)
    #Убираем промт из чата
    first_element = result_messages.pop(0)  
    print ("Длина result_messages:", len(result_messages))
    result = '\n\n'.join(message['content'] for message in result_messages)
    print ("result:", result)
    date_d  = datetime.datetime.now().date()
    date_string = date_d.isoformat()
    upload_to_airtable_log(date_string, first_element['content'], result, slider_value, comment_text)

    return ""  # Если функция должна что-то возвращать, замените это на нужный вывод

def upload_to_airtable_log(date, question, answer, rating, comment):
    data = {
        "records": [{
            "fields": {
                 "date": date,
                 "question": question,
                 "answer": answer,
                 "rating": rating,
                 "comment": comment
            }
        }]
    }
    response = requests.post(AIRTABLE_ENDPOINT_LOG, headers=HEADERS, json=data)

    if response.status_code != 200:
        print(f"Error uploading airtable (log ) Status code: {response.status_code}. Content: {response.content}")
    else:
        print(f"Successfully uploaded airtable log")

def respond(message, chat_history):
        global messages
        message_rag = ask_yc_bot(message)
        user_message_dict = [{"role": "user", "content": message_rag}]
        messages.extend (user_message_dict)
        #удаляем сообщения если, если весь диалог больше 7500, оставляем нулевой элемент массива,  так как там инструкция
        while sum(len(message["content"]) for message in messages) >= 7500:
          if len(messages) > 1:
              del messages[1]
          else:
              break
        bot_message = query_gpt_3_5(messages, "")
        chat_history.append((message, bot_message))
        #print("chat_histori", chat_history)

        bot_message_dict = [{"role": "assistant", "content": bot_message}]

        messages.extend (bot_message_dict)
        print("messages", messages)
        print ("message_rag=", message_rag)
        print ("==========================")
        total_chars = sum(len(message["content"]) for message in messages)
        print(total_chars)
        return "", chat_history, message_rag
css = """
footer{display:none !important}
"""


with gr.Blocks(css=css) as demo:
    with gr.Row():
      with gr.Column(scale=2):
         chatbot = gr.Chatbot([(None, "Привіт! Що ти хочеш дізнатися про YouControl?")], height=300)
      with gr.Column(scale=1):
         context = gr.Textbox(lines=11, label="Last Context")
    msg = gr.Textbox(label="", placeholder="Введите сообщение")
    with gr.Row():
      with gr.Column(scale=2):
          submit_button = gr.Button("Отправить")
      with gr.Column(scale=1):
          clear = gr.ClearButton([msg, chatbot, context], value="Новый чат")


    with gr.Row():
        radio = gr.Radio(label="Рейтинг відповіді", choices=["Нема", "1", "2", "3", "4", "5"], value="Нема")
        comment = gr.Textbox(lines=2, label = "Коментар")
    with gr.Row():
        b2 = gr.ClearButton([radio, comment], value="Прокоментувати чат") 

    clear.click(clear_f)
    submit_button.click(respond, [msg, chatbot], [msg, chatbot, context])
    msg.submit(respond, [msg, chatbot], [msg, chatbot, context])

    inp_2 = [radio, comment]
    b2.click(comment_bot, inputs=inp_2, outputs=comment)
    #b2.click(clear_f)


demo.launch(debug=True)