# Importy podstawowych bibliotek import logging import gradio as gr from openai import OpenAI from langchain_chroma import Chroma from langchain_huggingface import HuggingFaceEmbeddings from datetime import datetime # Inicjalizacja klienta OpenAI client = OpenAI() # Konfiguracja embeddings dla języka polskiego embeddings = HuggingFaceEmbeddings(model_name='radlab/polish-sts-v2') # Inicjalizacja bazy wektorowej vector_store = Chroma( collection_name='baza', embedding_function=embeddings, persist_directory='baza' ) # Konfiguracja logowania logging.basicConfig( filename=f'logs/chat_log_{datetime.now().strftime("%Y%m%d")}.log', level=logging.INFO, format='%(asctime)s - %(message)s' ) def szukaj(query, konwersacja): """Wyszukuje podobne fragmenty w bazie wiedzy""" query += konwersacja context_objects = vector_store.similarity_search(query=query, k=3) context = "\n".join(obj.page_content for obj in context_objects) return context def formatuj_historie_dla_promptu(history): """Formatuje historię konwersacji do promptu""" return "\n".join(message["content"] for message in history) def odp(message, history): """Główna funkcja obsługująca odpowiedzi chatbota""" # Ograniczenie historii do ostatnich 3 wymian history = history[-6:] if len(history) > 6 else history # Przygotowanie kontekstu kontekst_konwersacji = formatuj_historie_dla_promptu(history) kontekst = szukaj(message, kontekst_konwersacji) prompt = f"Konwersacja:\n{kontekst_konwersacji}\nKontekst z bazy wiedzy:\n{kontekst}\nPytanie użytkownika: {message}" # Generowanie odpowiedzi response = client.chat.completions.create( model='gpt-4o-mini', temperature=0.2, messages=[ { 'role': 'system', 'content': 'Jesteś ekspertem dostępności cyfrowej i masz na imię Jacek. Odpowiadaj krótko na pytania korzystając z kontekstu i historii konwersacji.' }, { 'role': 'user', 'content': prompt } ] ) answer = response.choices[0].message.content # Logowanie logging.info( f"User message: {message}\n" f"Context length: {len(kontekst)}\n" f"Prompt tokens: {response.usage.prompt_tokens}\n" f"Completion tokens: {response.usage.completion_tokens}\n" f"Total tokens: {response.usage.total_tokens}\n" f"Response: {answer}" ) # Aktualizacja historii history.append({'role': 'user', 'content': message}) history.append({'role': 'assistant', 'content': answer}) return '', history # Interfejs graficzny with gr.Blocks(title='Jacek AI') as demo: chatbot = gr.Chatbot(type='messages', label='Jacek AI') msg = gr.Textbox(autofocus=True, label='Pytaj', show_label=False) msg.submit(odp, [msg, chatbot], [msg, chatbot]) # Uruchomienie aplikacji demo.launch(inbrowser=True)