import os os.environ["TOKENIZERS_PARALLELISM"] = "false" import faiss import numpy as np import ollama import gradio as gr import os import argparse from sentence_transformers import SentenceTransformer # === KONFIGURACJA === model_name = "hse.ably.do:latest" # Nazwa modelu Ollama faiss_index_path = "faiss_index.idx" # Plik indeksu FAISS kodeks_file = "/home/ably.do/docs/kodekspracy.txt" # Plik z treścią kodeksu pracy embedding_model = SentenceTransformer("all-MiniLM-L6-v2") # Model do embedowania tekstu # === KROK 1: WCZYTYWANIE KODEKSU PRACY === def load_kodeks(filepath): with open(filepath, "r", encoding="utf-8") as file: content = file.read() articles = content.split("\n\n") # Dzielimy na sekcje return [article.strip() for article in articles if article.strip().startswith("Art.")] # === KROK 2: TWORZENIE INDEKSU FAISS === def create_faiss_index(sections): embeddings = embedding_model.encode(sections, convert_to_numpy=True) # Tworzenie wektorów index = faiss.IndexFlatL2(embeddings.shape[1]) # Indeks FAISS index.add(embeddings) # Dodanie wektorów do FAISS faiss.write_index(index, faiss_index_path) # Zapis indeksu return index, sections # === KROK 3: WYSZUKIWANIE NAJBLIŻSZEGO FRAGMENTU === def search_faiss(query, index, sections): query_vector = embedding_model.encode([query], convert_to_numpy=True) _, idx = index.search(query_vector, 1) return sections[idx[0][0]] if idx[0][0] < len(sections) else "Nie znaleziono pasującego artykułu." # === KROK 4: GENEROWANIE ODPOWIEDZI Z OLLAMA === def generate_response(user_query): if not os.path.exists(faiss_index_path): return "Błąd: Indeks FAISS nie istnieje. Uruchom aplikację z opcją --rebuild-index." try: index = faiss.read_index(faiss_index_path) except Exception as e: return f"Błąd ładowania FAISS: {str(e)}" sections = load_kodeks(kodeks_file) best_match = search_faiss(user_query, index, sections) # 👀 DEBUG: Sprawdź, co zwraca FAISS print(f"🔍 Najlepsze dopasowanie FAISS dla '{user_query}':\n{best_match}") prompt = f""" Odpowiedz na pytanie na podstawie następującego tekstu: {best_match} Pytanie: {user_query} Podaj dokładny tekst artykułu, jeśli go znajdziesz w treści powyżej. """ response = ollama.chat(model=model_name, messages=[{"role": "user", "content": prompt}]) print(f"📝 Odpowiedź modelu:\n{response}") # 👀 DEBUG: Sprawdź odpowiedź Ollama return response.get("message", response.get("content", "Błąd: Nie udało się wygenerować odpowiedzi.")) # === KROK 5: INTERFEJS WEBOWY === iface = gr.Interface( fn=generate_response, inputs=gr.Textbox(label="Zadaj pytanie o kodeks pracy"), outputs=gr.Textbox(label="Odpowiedź"), title="Asystent Kodeksu Pracy", description="Wpisz pytanie, a system zwróci odpowiedni fragment kodeksu pracy." ) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--rebuild-index", action="store_true", help="Odbudowanie indeksu FAISS") args = parser.parse_args() if args.rebuild_index or not os.path.exists(faiss_index_path): print("Tworzenie nowego indeksu FAISS...") sections = load_kodeks(kodeks_file) create_faiss_index(sections) else: print("Indeks FAISS już istnieje.") iface.launch(share=True)