testing-space / app.py
emaaaa543's picture
Update app.py
6453a05 verified
import gradio as gr
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from langchain_core.documents import Document
from youtube_transcript_api import YouTubeTranscriptApi
from langchain_community.document_loaders import YoutubeLoader
from langchain_community.document_loaders import GoogleApiYoutubeLoader
import tiktoken
import os
from dotenv import load_dotenv
import json
from groq import Groq
from pydantic import BaseModel
from typing import List
# Load environment variables
load_dotenv()
groq_api_key = os.getenv("GROQ_API_KEY")
os.environ["USER_AGENT"] = "RAG-chat-app"
client = Groq(api_key=groq_api_key)
primer = f"""You are a personal assistant. Answer any questions I have about the Youtube Video provided.
Translate in specific language if user asks you to
"""
# Initialize Hugging Face embeddings
hf_embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# Initialize ChromaDB vector store
vector_store = Chroma(
collection_name="data_collection",
embedding_function=hf_embeddings,
)
# # Load and process YouTube video
# loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=e-gwvmhyU7A", add_video_info=True)
# data = loader.load() # Assume this loads the transcript
loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=e-gwvmhyU7A", add_video_info=True)
data = loader.load()
tokenizer = tiktoken.get_encoding('p50k_base')
def tiktoken_len(text):
tokens = tokenizer.encode(
text,
disallowed_special=()
)
return len(tokens)
# Initialize text splitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=2000,
chunk_overlap=100,
length_function=tiktoken_len,
separators=["\n\n", "\n", " ", ""]
)
# Split data from YouTube video
texts = text_splitter.split_documents(data)
# Store documents in ChromaDB
documents= [
Document(
page_content=f"Source: {t.metadata['source']}, Title: {t.metadata['title']} \n\nContent: {t.page_content}",
metadata=t.metadata
)
for t in texts]
vectorstore_from_texts = vector_store.add_documents(documents=documents)
# Define function to get embeddings from Hugging Face
def get_embedding(text):
return hf_embeddings.embed_query(text)
# Define Gradio interface function
def query_model(messages):
try:
# Call the function for user query vector embeddings
if isinstance(messages, list) and len(messages) > 0:
latest_message = messages[-1]['content']
else:
return "No messages provided or invalid format."
raw_query_embedding= get_embedding(latest_message)
# Perform similarity search with vector store
results = vector_store.similarity_search_by_vector(
embedding=raw_query_embedding, k=1
)
contexts = [doc.page_content for doc in results]
# Prepare context for RAG
augmented_query = (
"<CONTEXT>\n" +
"\n\n-------\n\n".join(contexts) +
"\n-------\n</CONTEXT>\n\n\n\nMY QUESTION:\n" +
messages
)
# Call to Groq or Hugging Face model for completion
response = client.chat.completions.create(
model="llama3-8b-8192",
messages=[
{"role": "system", "content": primer},
{"role": "user", "content": augmented_query},
],
max_tokens=1000,
temperature=1.2)
return {'assistantMessage':response.choices[0].message.content}
except Exception as e:
return str(e)
# Create Gradio interface
iface = gr.Interface(
fn=query_model,
inputs=gr.JSON(label="Enter array of messages (JSON format)"),
outputs=gr.Textbox(label="Response"),
title="RAG Model",
description="Retrieve and Generate responses from a YouTube video transcript."
)
if __name__ == "__main__":
iface.launch()