LaoCzi commited on
Commit
0271e9b
·
1 Parent(s): 00f15b5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -116
app.py CHANGED
@@ -1,144 +1,74 @@
1
- import os
 
2
  import openai
3
  import pinecone
 
 
 
 
 
4
  openai.api_key= os.environ.get('API_OPENAI')
5
- AIRTABLE_API_KEY = os.environ.get('API_AIRTABLE')
6
  PINECONE_API_KEY = os.environ.get('API_PINECONE')
7
  pinecone.init(
8
  api_key=PINECONE_API_KEY, # find at app.pinecone.io
9
  environment="eu-west4-gcp" # next to api key in console
10
  )
11
 
12
-
13
-
14
- import gradio as gr
15
- import os
16
- import csv
17
- from langchain.vectorstores import Pinecone
18
- from langchain.embeddings.openai import OpenAIEmbeddings
19
- from langchain.chains import ConversationalRetrievalChain
20
- from langchain.chat_models import ChatOpenAI
21
- import openai
22
- import pinecone
23
- import datetime
24
- from tqdm.autonotebook import tqdm
25
- import requests
26
-
27
  embeddings = OpenAIEmbeddings(openai_api_key=openai.api_key)
28
-
29
- AIRTABLE_ENDPOINT = "https://api.airtable.com/v0/appv2hF1PzrseVdeW/data_m"
30
- AIRTABLE_ENDPOINT_LOG = "https://api.airtable.com/v0/appv2hF1PzrseVdeW/log"
31
- HEADERS = {
32
- "Authorization": f"Bearer {AIRTABLE_API_KEY}",
33
- "Content-Type": "application/json"
34
- }
35
-
36
- def get_text_by_name(name):
37
- params = {
38
- "filterByFormula": f"{{name}} = '{name}'"
39
- }
40
- response = requests.get(AIRTABLE_ENDPOINT, headers=HEADERS, params=params)
41
-
42
- if response.status_code != 200:
43
- print(f"Error fetching data. Status code: {response.status_code}. Content: {response.content}")
44
- return None
45
-
46
- records = response.json().get("records")
47
-
48
- if not records:
49
- print(f"No record found with name: {name}")
50
- return None
51
-
52
- # Assuming that names are unique, take the first record.
53
- return records[0]["fields"].get("text")
54
-
55
- def upload_to_airtable_log(date, question, answer, rating, comment):
56
- data = {
57
- "records": [{
58
- "fields": {
59
- "date": date,
60
- "question": question,
61
- "answer": answer,
62
- "rating": rating,
63
- "comment": comment
64
- }
65
- }]
66
- }
67
- response = requests.post(AIRTABLE_ENDPOINT_LOG, headers=HEADERS, json=data)
68
-
69
- if response.status_code != 200:
70
- print(f"Error uploading airtable (log ) Status code: {response.status_code}. Content: {response.content}")
71
- else:
72
- print(f"Successfully uploaded airtable log")
73
-
74
- def query_gpt_3_5(prompt, context):
75
- prompt = "Instruction: Твоя роль - кваліфікований співробітник саппорту у системи YouControl. Потрібно відповісти на питання від користувача з огляду на контекст. Контекст ми беремо з бази знань, але вона може бути не повна. Якщо контекст не коректний, то відповідай на свій розсуд або передай запит сапорту, про контекс нічого не пишемо у відповіді. YouControl може писатися по різному: YC,Ю-контрол,Юконтрол, Юконтроль, Юр контроль, ЮК, UControl, Ю-контроль, YOU Kontrol, YouContro. ЗЕД - це зовнішня економічна діяльність."+"""
76
- """+ "question:" + prompt + """
77
- context:""" + context + """
78
- answer:"""
79
- completion = openai.ChatCompletion.create(
80
- model="gpt-4-0613",
81
- messages=[
82
- {"role": "user", "content": prompt}
83
- ]
84
- )
85
- return completion.choices[0].message.content
86
-
87
- def print_docs(docs):
88
- for doc in docs:
89
- print(f"Chunk: {doc.page_content}")
90
- print(f"Content: {doc.metadata['source']}\n")
91
-
92
-
93
-
94
  index_name = "yc-faq-air"
95
  vectorstore = Pinecone.from_existing_index(index_name, embeddings)
96
 
 
 
 
 
 
97
  def ask_yc_bot(question):
98
- if (len(question)<3 ): return "Не зрозумів питання"
99
  docs = vectorstore.similarity_search(question)
100
  source_name = docs[0].metadata['source']
101
  context = docs[0].page_content
102
- result = query_gpt_3_5(question, context)
103
  return result
104
 
105
 
106
- def comment_bot(slider_value, comment_text, question_text, answer_text):
107
- date_d = datetime.datetime.now().date()
108
- date_string = date_d.isoformat()
109
- upload_to_airtable_log(date_string, question_text, answer_text, slider_value, comment_text)
110
-
111
- return " " # Если функция должна что-то возвращать, замените это на нужный вывод
112
-
113
- import gradio as gr
114
 
115
- description = """<img style="float: left; margin-right: 20px; " src="https://huggingface.co/spaces/LaoCzi/YouControlChatBot/resolve/main/guru_b.png">
116
- <h3><b>FAQ GURU</b></h3>
117
- Бот навчений на матеріалах академії за темою YouControl, про YC.market і YCW нічого не знає. <br> Будь ласка, оцініть його відповідь)))
118
- """
 
 
119
 
120
- demo = gr.Blocks(theme=gr.themes.Soft())
121
 
122
- with demo:
123
- gr.HTML(description)
124
- with gr.Row():
125
- with gr.Column(scale=1):
126
- text = gr.Textbox(lines=5, label = "Питання?")
127
- with gr.Column(scale=2):
128
- answer = gr.Textbox(lines=5, label = "Відповідь")
129
- with gr.Row():
130
- b1 = gr.Button("Запитати")
131
 
132
- with gr.Row():
133
- radio = gr.Radio(label="Рейтинг відповіді", choices=["Нема", "1", "2", "3", "4", "5"], value="Нема")
134
- comment = gr.Textbox(lines=2, label = "Коментар")
135
- with gr.Row():
136
- b2 = gr.Button("Прокоментувати відповідь")
137
 
138
- inp_2 = [radio, comment, text, answer]
139
- b1.click(ask_yc_bot, inputs=text, outputs=answer)
140
- b2.click(comment_bot, inputs=inp_2, outputs=comment)
 
141
 
 
 
 
 
 
 
 
 
142
 
143
 
144
- demo.launch(share=False, debug=True)
 
1
+ import gradio as gr
2
+ import random
3
  import openai
4
  import pinecone
5
+ from langchain.vectorstores import Pinecone
6
+ from langchain.embeddings.openai import OpenAIEmbeddings
7
+ from langchain.chains import ConversationalRetrievalChain
8
+ from langchain.chat_models import ChatOpenAI
9
+
10
  openai.api_key= os.environ.get('API_OPENAI')
11
+
12
  PINECONE_API_KEY = os.environ.get('API_PINECONE')
13
  pinecone.init(
14
  api_key=PINECONE_API_KEY, # find at app.pinecone.io
15
  environment="eu-west4-gcp" # next to api key in console
16
  )
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  embeddings = OpenAIEmbeddings(openai_api_key=openai.api_key)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  index_name = "yc-faq-air"
20
  vectorstore = Pinecone.from_existing_index(index_name, embeddings)
21
 
22
+
23
+ prompt = "Instruction: Твоя роль - кваліфікований співробітник саппорту у системи YouControl. Потрібно відповісти на питання від користувача з огляду на контекст. Контекст ми беремо з бази знань, але вона може бути не повна. Якщо контекст не коректний, то відповідай на свій розсуд або передай запит сапорту, про контекс нічого не пишемо у відповіді. YouControl може писатися по різному: YC,Ю-контрол,Юконтрол, Юконтроль, Юр контроль, ЮК, UControl, Ю-контроль, YOU Kontrol, YouContro. ЗЕД - це зовнішня економічна діяльність."+"""
24
+ """
25
+ messages = [{"role": "system", "content": prompt}]
26
+
27
  def ask_yc_bot(question):
 
28
  docs = vectorstore.similarity_search(question)
29
  source_name = docs[0].metadata['source']
30
  context = docs[0].page_content
31
+ result = "Питання: " + question + " Контектс: " + context
32
  return result
33
 
34
 
35
+ def clear_f():
36
+ prompt = "Instruction: Твоя роль - кваліфікований співробітник саппорту у системи YouControl. Потрібно відповісти на питання від користувача з огляду на контекст. Контекст ми беремо з бази знань, але вона може бути не повна. Якщо контекст не коректний, то відповідай на свій розсуд або передай запит сапорту, про контекс нічого не пишемо у відповіді. YouControl може писатися по різному: YC,Ю-контрол,Юконтрол, Юконтроль, Юр контроль, ЮК, UControl, Ю-контроль, YOU Kontrol, YouContro. ЗЕД - це зовнішня економічна діяльність."+"""
37
+ """
38
+ messages = [{"role": "system", "content": prompt}]
39
+ return ""
 
 
 
40
 
41
+ def query_gpt_3_5(messages, context):
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-4-0613",
44
+ messages=messages
45
+ )
46
+ return completion.choices[0].message.content
47
 
 
48
 
49
+ def respond(message, chat_history):
50
+ message_rag = ask_yc_bot(message)
51
+ user_message_dict = [{"role": "user", "content": message_rag}]
52
+ messages.extend (user_message_dict)
53
+ bot_message = query_gpt_3_5(messages, "")
54
+ chat_history.append((message, bot_message))
55
+ print("chat_histori", chat_history)
 
 
56
 
57
+ bot_message_dict = [{"role": "assistant", "content": bot_message}]
 
 
 
 
58
 
59
+ messages.extend (bot_message_dict)
60
+ print("messages", messages)
61
+ return "", chat_history
62
+ css = "footer{display:none !important}"
63
 
64
+ with gr.Blocks(css=css) as demo:
65
+ chatbot = gr.Chatbot()
66
+ msg = gr.Textbox()
67
+ submit_button = gr.Button("Отправить")
68
+ clear = gr.ClearButton([msg, chatbot])
69
+ clear.click(clear_f)
70
+ submit_button.click(respond, [msg, chatbot], [msg, chatbot])
71
+ msg.submit(respond, [msg, chatbot], [msg, chatbot])
72
 
73
 
74
+ demo.launch(debug=True)