File size: 2,468 Bytes
17a012d
 
 
 
 
 
 
 
3dfdd36
 
 
17a012d
 
 
 
 
8f71fc7
17a012d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f71fc7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from langchain.document_loaders import YoutubeLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.llms import OpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.vectorstores import FAISS
from dotenv import load_dotenv
import gradio as gr
from langchain.document_loaders import YoutubeLoader


load_dotenv()

embeddings = OpenAIEmbeddings()

video_url = "https://www.youtube.com/watch?v=PfTOr3ONKzU"
def create_vector_db_from_youtube_url(video_url: str):
    loader = YoutubeLoader.from_youtube_url(video_url)
    transcript = loader.load()
    
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
    docs = text_splitter.split_documents(transcript)
    
    db = FAISS.from_documents(docs, embeddings)
    return db




# create_vector_db_from_youtube_url(video_url)

def get_response_from_query(db, query, k=4):
  docs = db.similarity_search(query, k=k)
  docs_page_content = " ".join([d.page_content for d in docs])

  llm = OpenAI(model_name="text-davinci-003")
  prompt = PromptTemplate(
      input_variables=["question", "docs"],
      template = """
      Youare a helpful Youtube assistant that can answer questions about videos based on video transcript.
      
      Answer the following question: {question}
      By searching the following video transcript: {docs}

      Only use the factua; information from the transcript to answer the question.

      If you feel like you dont have enough information to answer the question, say "I dont know".

      Your answer ahould be detailed.
      """
  )

  chain = LLMChain(llm=llm, prompt=prompt)

  response = chain.run(question = query, docs = docs_page_content)
  response = response.replace("\n", " ")
  return response


def gradio_interface(youtube_url, query):
    if query and youtube_url:
        db = create_vector_db_from_youtube_url(youtube_url)
        response = get_response_from_query(db, query)
        return response

# Membuat antarmuka Gradio
iface = gr.Interface(
    fn=gradio_interface,
    inputs=["text", "text"],  # Dua input teks: URL YouTube dan pertanyaan
    outputs="text",          # Output berupa teks
    title="YouTube Assistant",
    description="Masukkan URL YouTube dan ajukan pertanyaan tentang video tersebut."
)

# Menjalankan antarmuka Gradio
iface.launch(debug=True, share=True)