jaczad commited on
Commit
24d5064
·
1 Parent(s): a6ac792

Zmodyfikowana główna aplikacja

Browse files

- zarządzanie pamięcią konwersacji
- logowanie działania
- optymalizacja odpytań w bazie

Files changed (4) hide show
  1. .DS_Store +0 -0
  2. README.md +24 -0
  3. app.py +55 -43
  4. logs/.DS_Store +0 -0
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
README.md CHANGED
@@ -12,4 +12,28 @@ preload_from_hub:
12
  short_description: Chatbot znający się na cyfrowej dostępności i WCAG po polsku
13
  ---
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
12
  short_description: Chatbot znający się na cyfrowej dostępności i WCAG po polsku
13
  ---
14
 
15
+ # Jacek AI - Asystent Dostępności Cyfrowej
16
+
17
+ ## Opis
18
+ Jacek AI to inteligentny chatbot specjalizujący się w tematyce dostępności cyfrowej. Aplikacja łączy w sobie zaawansowane możliwości wyszukiwania kontekstowego z generowaniem odpowiedzi przy pomocy modelu językowego.
19
+
20
+ ## Funkcjonalności
21
+ - Kontekstowe odpowiedzi bazujące na wiedzy z bazy danych
22
+ - Zachowanie historii konwersacji (ostatnie 3 wymiany)
23
+ - Przyjazny interfejs użytkownika
24
+ - Szczegółowe logowanie interakcji
25
+
26
+ ## Technologie
27
+ - OpenAI API - generowanie odpowiedzi
28
+ - Chroma DB - baza wiedzy
29
+ - HuggingFace Embeddings (radlab/polish-sts-v2) - embeddingi dla języka polskiego
30
+ - Gradio - interfejs graficzny
31
+ - Python logging - system logowania
32
+
33
+ ## Uruchomienie
34
+ 1. Zainstaluj wymagane zależności:
35
+
36
+ pip install openai langchain-chroma gradio
37
+
38
+
39
  Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py CHANGED
@@ -1,79 +1,91 @@
1
- # %%
 
2
  import gradio as gr
3
  from openai import OpenAI
4
  from langchain_chroma import Chroma
5
  from langchain_huggingface import HuggingFaceEmbeddings
 
6
 
 
 
7
 
8
-
9
- # %%
10
- client=OpenAI()
11
-
12
-
13
- # %%
14
  embeddings = HuggingFaceEmbeddings(model_name='radlab/polish-sts-v2')
15
 
16
- # %%
17
  vector_store = Chroma(
18
  collection_name='baza',
19
  embedding_function=embeddings,
20
  persist_directory='baza'
21
  )
22
 
 
 
 
 
 
 
23
 
24
-
25
- # Funkcja wyszukiwania najbardziej podobnych fragmentów
26
  def szukaj(query, konwersacja):
27
- query+=konwersacja
 
28
  context_objects = vector_store.similarity_search(query=query, k=3)
29
- context = "" # Inicjalizacja pustego ciągu znaków
30
- for context_object in context_objects:
31
- context += context_object.page_content + "\n"
32
  return context
33
 
34
-
35
-
36
-
37
- # Funkcja wyciągająca z historii tekst jako wsad do kontekstu
38
  def formatuj_historie_dla_promptu(history):
39
- prompt = ""
40
- for message in history:
41
- role = message["role"]
42
- content = message["content"]
43
- prompt += f"{content}\n"
44
- return prompt
45
 
46
-
47
-
48
- # Główna funkcja chata
49
  def odp(message, history):
 
 
 
 
 
50
  kontekst_konwersacji = formatuj_historie_dla_promptu(history)
51
- Kontekst=szukaj(message, kontekst_konwersacji)
52
- prompt= f"Konwersacja:\n{kontekst_konwersacji}\nKontekst z bazy wiedzy:\n{Kontekst}\nPytanie użytkownika: {message}"
53
- response=client.chat.completions.create(
 
 
54
  model='gpt-4o-mini',
55
  temperature=0.2,
56
  messages=[
57
- {'role': 'system',
58
- 'content': 'Jesteś ekspertem dostępności cyfrowej i masz na imię Jacek. Odpowiadaj krótko na pytania korzystając z kontekstu i historii konwersacji.'},
59
- {'role': 'user',
60
- 'content': prompt}
 
 
 
 
61
  ]
62
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  history.append({'role': 'user', 'content': message})
64
- history.append({'role': 'assistant', 'content': response.choices[0].message.content})
 
65
  return '', history
66
 
67
-
68
- ## Interfejs graficzny
69
  with gr.Blocks(title='Jacek AI') as demo:
70
  chatbot = gr.Chatbot(type='messages', label='Jacek AI')
71
  msg = gr.Textbox(autofocus=True, label='Pytaj', show_label=False)
72
  msg.submit(odp, [msg, chatbot], [msg, chatbot])
73
- demo.launch()
74
-
75
-
76
- # %%
77
-
78
-
79
 
 
 
 
1
+ # Importy podstawowych bibliotek
2
+ import logging
3
  import gradio as gr
4
  from openai import OpenAI
5
  from langchain_chroma import Chroma
6
  from langchain_huggingface import HuggingFaceEmbeddings
7
+ from datetime import datetime
8
 
9
+ # Inicjalizacja klienta OpenAI
10
+ client = OpenAI()
11
 
12
+ # Konfiguracja embeddings dla języka polskiego
 
 
 
 
 
13
  embeddings = HuggingFaceEmbeddings(model_name='radlab/polish-sts-v2')
14
 
15
+ # Inicjalizacja bazy wektorowej
16
  vector_store = Chroma(
17
  collection_name='baza',
18
  embedding_function=embeddings,
19
  persist_directory='baza'
20
  )
21
 
22
+ # Konfiguracja logowania
23
+ logging.basicConfig(
24
+ filename=f'logs/chat_log_{datetime.now().strftime("%Y%m%d")}.log',
25
+ level=logging.INFO,
26
+ format='%(asctime)s - %(message)s'
27
+ )
28
 
 
 
29
  def szukaj(query, konwersacja):
30
+ """Wyszukuje podobne fragmenty w bazie wiedzy"""
31
+ query += konwersacja
32
  context_objects = vector_store.similarity_search(query=query, k=3)
33
+ context = "\n".join(obj.page_content for obj in context_objects)
 
 
34
  return context
35
 
 
 
 
 
36
  def formatuj_historie_dla_promptu(history):
37
+ """Formatuje historię konwersacji do promptu"""
38
+ return "\n".join(message["content"] for message in history)
 
 
 
 
39
 
 
 
 
40
  def odp(message, history):
41
+ """Główna funkcja obsługująca odpowiedzi chatbota"""
42
+ # Ograniczenie historii do ostatnich 3 wymian
43
+ history = history[-6:] if len(history) > 6 else history
44
+
45
+ # Przygotowanie kontekstu
46
  kontekst_konwersacji = formatuj_historie_dla_promptu(history)
47
+ kontekst = szukaj(message, kontekst_konwersacji)
48
+ prompt = f"Konwersacja:\n{kontekst_konwersacji}\nKontekst z bazy wiedzy:\n{kontekst}\nPytanie użytkownika: {message}"
49
+
50
+ # Generowanie odpowiedzi
51
+ response = client.chat.completions.create(
52
  model='gpt-4o-mini',
53
  temperature=0.2,
54
  messages=[
55
+ {
56
+ 'role': 'system',
57
+ 'content': 'Jesteś ekspertem dostępności cyfrowej i masz na imię Jacek. Odpowiadaj krótko na pytania korzystając z kontekstu i historii konwersacji.'
58
+ },
59
+ {
60
+ 'role': 'user',
61
+ 'content': prompt
62
+ }
63
  ]
64
  )
65
+
66
+ answer = response.choices[0].message.content
67
+
68
+ # Logowanie
69
+ logging.info(
70
+ f"User message: {message}\n"
71
+ f"Context length: {len(kontekst)}\n"
72
+ f"Prompt tokens: {response.usage.prompt_tokens}\n"
73
+ f"Completion tokens: {response.usage.completion_tokens}\n"
74
+ f"Total tokens: {response.usage.total_tokens}\n"
75
+ f"Response: {answer}"
76
+ )
77
+
78
+ # Aktualizacja historii
79
  history.append({'role': 'user', 'content': message})
80
+ history.append({'role': 'assistant', 'content': answer})
81
+
82
  return '', history
83
 
84
+ # Interfejs graficzny
 
85
  with gr.Blocks(title='Jacek AI') as demo:
86
  chatbot = gr.Chatbot(type='messages', label='Jacek AI')
87
  msg = gr.Textbox(autofocus=True, label='Pytaj', show_label=False)
88
  msg.submit(odp, [msg, chatbot], [msg, chatbot])
 
 
 
 
 
 
89
 
90
+ # Uruchomienie aplikacji
91
+ demo.launch(inbrowser=True)
logs/.DS_Store ADDED
Binary file (6.15 kB). View file