Spaces:
Sleeping
Sleeping
| import os | |
| import chainlit as cl | |
| from dotenv import load_dotenv | |
| # LangChain imports for retrieval and generation | |
| from langchain.document_loaders import WebBaseLoader | |
| from langchain.text_splitter import CharacterTextSplitter | |
| from langchain.vectorstores import FAISS | |
| from langchain.chains import RetrievalQA | |
| # Google Generative AI integrations | |
| from langchain_google_genai import GoogleGenerativeAI # For LLM generation | |
| from langchain_google_genai.embeddings import GoogleGenerativeAIEmbeddings # For embeddings | |
| # Load environment variables (GEMINI_API_KEY should be defined) | |
| load_dotenv() | |
| GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") | |
| if not GEMINI_API_KEY: | |
| raise ValueError("GEMINI_API_KEY not found in .env file") | |
| # Configure the LLM using Google’s Gemini model. | |
| # You can change the model name if needed (e.g., "gemini-pro", "gemini-1.5-flash-latest", etc.) | |
| llm = GoogleGenerativeAI(model="gemini-1.5-flash-latest", google_api_key=GEMINI_API_KEY) | |
| # Global variable for the RetrievalQA chain | |
| qa_chain = None | |
| async def start_chat(): | |
| """ | |
| On chat start, this function loads a document from the provided URL using WebBaseLoader, | |
| splits it into chunks for retrieval, creates embeddings with Google’s embedding model, | |
| and builds a vector store (using FAISS). Finally, it creates a RetrievalQA chain that | |
| will retrieve relevant document sections and generate answers using the Gemini LLM. | |
| """ | |
| global qa_chain | |
| # URL to crawl (German Wikipedia page on "Künstliche Intelligenz") | |
| url = "https://de.wikipedia.org/wiki/K%C3%BCnstliche_Intelligenz" | |
| loader = WebBaseLoader(url) | |
| documents = loader.load() # Returns a list of Document objects | |
| # Split the document into chunks for effective retrieval | |
| text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200) | |
| docs = text_splitter.split_documents(documents) | |
| # Create embeddings using Google Generative AI embeddings | |
| embeddings = GoogleGenerativeAIEmbeddings(model="models/text-embedding-004", google_api_key=GEMINI_API_KEY) | |
| # Build a FAISS vector store for efficient similarity search | |
| vectorstore = FAISS.from_documents(docs, embeddings) | |
| retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) | |
| # Build the RetrievalQA chain that augments queries with the retrieved context | |
| qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever) | |
| await cl.Message( | |
| content="✅ Document loaded and processed successfully! You can now ask questions about 'Künstliche Intelligenz'." | |
| ).send() | |
| async def process_message(message: cl.Message): | |
| """ | |
| When a user message arrives, this function uses the RetrievalQA chain to retrieve relevant | |
| context from the processed document, augment the user query, and generate an answer using | |
| the Gemini-based LLM. | |
| """ | |
| global qa_chain | |
| if qa_chain is None: | |
| await cl.Message(content="❌ The document is still being loaded. Please wait a moment.").send() | |
| return | |
| # Retrieve user query and generate the answer using the chain | |
| query = message.content.strip() | |
| result = qa_chain.run(query) | |
| await cl.Message(content=result).send() | |