Sambhavnoobcoder/Lecture-Notes-Chatbot
0
1import google.generativeai as genai2import requests3import numpy as np4import faiss5from sentence_transformers import SentenceTransformer6from bs4 import BeautifulSoup7import gradio as gr8 9# Configure Gemini API key10GOOGLE_API_KEY = 'AIzaSyA0yLvySmj8xjMd0sedSgklg1fj0wBDyyw' # Replace with your API key11genai.configure(api_key=GOOGLE_API_KEY)12 13# Fetch lecture notes and model architectures14def fetch_lecture_notes():15 lecture_urls = [16 "https://stanford-cs324.github.io/winter2022/lectures/introduction/",17 "https://stanford-cs324.github.io/winter2022/lectures/capabilities/",18 "https://stanford-cs324.github.io/winter2022/lectures/data/",19 "https://stanford-cs324.github.io/winter2022/lectures/modeling/"20 ]21 lecture_texts = []22 for url in lecture_urls:23 response = requests.get(url)24 if response.status_code == 200:25 print(f"Fetched content from {url}")26 lecture_texts.append((extract_text_from_html(response.text), url))27 else:28 print(f"Failed to fetch content from {url}, status code: {response.status_code}")29 return lecture_texts30 31def fetch_model_architectures():32 url = "https://github.com/Hannibal046/Awesome-LLM#milestone-papers"33 response = requests.get(url)34 if response.status_code == 200:35 print(f"Fetched model architectures, status code: {response.status_code}")36 return extract_text_from_html(response.text), url37 else:38 print(f"Failed to fetch model architectures, status code: {response.status_code}")39 return "", url40 41# Extract text from HTML content42def extract_text_from_html(html_content):43 soup = BeautifulSoup(html_content, 'html.parser')44 for script in soup(["script", "style"]):45 script.extract()46 text = soup.get_text(separator="\n", strip=True)47 return text48 49# Generate embeddings using SentenceTransformers50def create_embeddings(texts, model):51 texts_only = [text for text, _ in texts]52 embeddings = model.encode(texts_only)53 return embeddings54 55# Initialize FAISS index56def initialize_faiss_index(embeddings):57 dimension = embeddings.shape[1] # Assuming all embeddings have the same dimension58 index = faiss.IndexFlatL2(dimension)59 index.add(embeddings.astype('float32'))60 return index61 62# Handle natural language queries63conversation_history = []64 65def handle_query(query, faiss_index, embeddings_texts, model):66 global conversation_history67 68 query_embedding = model.encode([query]).astype('float32')69 70 # Search FAISS index71 _, indices = faiss_index.search(query_embedding, 3) # Retrieve top 3 results72 relevant_texts = [embeddings_texts[idx] for idx in indices[0]]73 74 # Combine relevant texts and truncate if necessary75 combined_text = "\n".join([text for text, _ in relevant_texts])76 max_length = 500 # Adjust as necessary77 if len(combined_text) > max_length:78 combined_text = combined_text[:max_length] + "..."79 80 # Generate a response using Gemini81 try:82 response = genai.generate_text(83 model="models/text-bison-001",84 prompt=f"Based on the following context:\n\n{combined_text}\n\nAnswer the following question: {query}",85 max_output_tokens=20086 )87 generated_text = response.result if response else "No response generated."88 except Exception as e:89 print(f"Error generating text: {e}")90 generated_text = "An error occurred while generating the response."91 92 # Update conversation history93 conversation_history.append((query, generated_text))94 95 # Extract sources96 sources = [url for _, url in relevant_texts]97 98 return generated_text, sources99 100def generate_concise_response(prompt, context):101 try:102 response = genai.generate_text(103 model="models/text-bison-001",104 prompt=f"{prompt}\n\nContext: {context}\n\nAnswer:",105 max_output_tokens=200106 )107 return response.result if response else "No response generated."108 except Exception as e:109 print(f"Error generating concise response: {e}")110 return "An error occurred while generating the concise response."111 112# Main function to execute the pipeline113def chatbot(message, history):114 lecture_notes = fetch_lecture_notes()115 model_architectures = fetch_model_architectures()116 117 all_texts = lecture_notes + [model_architectures]118 119 # Load the SentenceTransformers model120 embedding_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')121 122 embeddings = create_embeddings(all_texts, embedding_model)123 124 # Initialize FAISS index125 faiss_index = initialize_faiss_index(np.array(embeddings))126 127 response, sources = handle_query(message, faiss_index, all_texts, embedding_model)128 print("Query:", message)129 print("Response:", response)130 total_text = response131 132 if sources:133 print("Sources:", sources)134 relevant_source = "\n".join(sources)135 total_text += f"\n\nSources:\n{relevant_source}"136 else:137 print("Sources: None of the provided sources were used.")138 139 print("----")140 141 # Generate a concise and relevant summary using Gemini142 prompt = "Summarize the user queries so far"143 user_queries_summary = " ".join([msg[0] for msg in history] + [message])144 concise_response = generate_concise_response(prompt, user_queries_summary)145 print("Concise Response:")146 print(concise_response)147 148 return total_text149 150# Create the Gradio interface151iface = gr.ChatInterface(152 chatbot,153 title="LLM Research Assistant",154 description="Ask questions about LLM architectures, datasets, and training techniques.",155 examples=[156 "What are some milestone model architectures in LLMs?",157 "Explain the transformer architecture.",158 "Tell me about datasets used to train LLMs.",159 "How are LLM training datasets cleaned and preprocessed?",160 "Summarize the user queries so far"161 ],162 retry_btn="Regenerate",163 undo_btn="Undo",164 clear_btn="Clear",165)166 167if __name__ == "__main__":168 iface.launch(server_name="0.0.0.0", server_port=7860)