import streamlit as st from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core.node_parser import SentenceSplitter from llama_index.core.ingestion import IngestionPipeline import chromadb from llama_index.vector_stores.chroma import ChromaVectorStore from llama_index.llms.ollama import Ollama # Ustawienia strony st.title("Aplikacja z LlamaIndex") # Załaduj dokumenty documents = SimpleDirectoryReader('./data/').load_data() db = chromadb.PersistentClient(path="./data") chroma_collection = db.get_or_create_collection("zalacznik_nr12") vector_store = ChromaVectorStore(chroma_collection=chroma_collection) # Utwórz pipeline do przetwarzania dokumentów pipeline = IngestionPipeline( transformations=[ SentenceSplitter(), embed_model, ], vector_store=vector_store ) # Utwórz indeks index = VectorStoreIndex.from_vector_store(vector_store, embed_model=embed_model) # Utwórz silnik zapytań llm = Ollama(model="qwen2:7b") query_engine = index.as_query_engine( llm=llm, response_mode='compact') # Store LLM generated responses if "messages" not in st.session_state.keys(): st.session_state.messages = [{"role": "assistant", "content": "Zadaj mi pytanie..."}] # Display chat messages for message in st.session_state.messages: with st.chat_message(message["role"]): st.write(message["content"]) # User-provided prompt if input := st.chat_input(): st.session_state.messages.append({"role": "user", "content": input}) with st.chat_message("user"): st.write(input) # Generate a new response if last message is not from assistant if st.session_state.messages[-1]["role"] != "assistant": with st.chat_message("assistant"): with st.spinner("Czekaj, odpowiedź jest generowana.."): response = query_engine.query(input) # Zbuduj treść wiadomości z odpowiedzią i score content = str(response.response) # Upewnij się, że response jest stringiem if hasattr(response, 'source_nodes') and response.source_nodes: # Sprawdź, czy source_nodes istnieje # Dodaj score pierwszego węzła (jeśli istnieje) content += f"\nScore: {response.source_nodes[0].score:.4f}" # Dodaj score st.write(content) # Wyświetl całą treść w Streamlit message = {"role": "assistant", "content": content} # Zapisz całą treść w wiadomości st.session_state.messages.append(message)