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.embeddings import OpenAIEmbeddings | |
| from langchain.vectorstores import FAISS | |
| from langchain.chains import RetrievalQA | |
| from langchain.llms import OpenAI | |
| # Load environment variables (e.g., OPENAI_API_KEY) | |
| load_dotenv() | |
| # Global variable to store our QA chain. | |
| qa_chain = None | |
| async def start_chat(): | |
| """ | |
| When the chat starts, load the document using WebBaseLoader, split it into chunks, | |
| create embeddings, build a vector store, and finally initialize a RetrievalQA chain. | |
| This chain will serve as the backend for our RAG system. | |
| """ | |
| global qa_chain | |
| # URL to crawl (German Wikipedia page on Künstliche Intelligenz) | |
| url = "https://de.wikipedia.org/wiki/K%C3%BCnstliche_Intelligenz" | |
| # Retrieve the document from the webpage | |
| loader = WebBaseLoader(url) | |
| documents = loader.load() # returns a list of Document objects | |
| # Split the document into manageable chunks for better retrieval | |
| text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200) | |
| docs = text_splitter.split_documents(documents) | |
| # Create embeddings (make sure your OPENAI_API_KEY is set in your environment) | |
| embeddings = OpenAIEmbeddings() | |
| # Build a vector store from the documents using FAISS | |
| vectorstore = FAISS.from_documents(docs, embeddings) | |
| # Configure the retriever: retrieve the top 3 most relevant chunks | |
| retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) | |
| # Set up the language model (using OpenAI LLM here) with desired parameters | |
| llm = OpenAI(temperature=0) | |
| # Create a RetrievalQA chain that first retrieves relevant context and then generates an answer. | |
| 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 me questions about 'Künstliche Intelligenz'." | |
| ).send() | |
| async def process_question(message: cl.Message): | |
| """ | |
| When a message is received, use the QA chain to process the query. The chain: | |
| 1. Retrieves relevant document chunks. | |
| 2. Augments your query with the retrieved context. | |
| 3. Generates an answer via the language model. | |
| """ | |
| global qa_chain | |
| if qa_chain is None: | |
| await cl.Message(content="❌ The document has not been loaded yet.").send() | |
| return | |
| # Get the user's query | |
| query = message.content.strip() | |
| # Process the query using the RetrievalQA chain | |
| result = qa_chain.run(query) | |
| # Send the answer back to the user | |
| await cl.Message(content=result).send() | |