Spaces:
Sleeping
Sleeping
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) |