LaoCzi's picture
Update app.py
178962d
raw
history blame
7.33 kB
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)