File size: 4,382 Bytes
9fd9072
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269bac0
9fd9072
 
 
 
 
 
 
 
 
 
 
269bac0
9fd9072
 
269bac0
 
 
9fd9072
 
 
269bac0
 
9fd9072
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""

Data Scientist.: Dr.Eddy Giusepe Chirinos Isidro



Link de estudo --> https://youtu.be/cY-0TRj-teI



Link de estudo (adicional) --> https://medium.com/@woyera/how-to-chat-with-your-pdf-using-python-llama-2-41df80c4e674



https://github.com/langchain-ai/langchain/discussions/9158

"""
from langchain.document_loaders import YoutubeLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import ChatVectorDBChain
import os

# Pip install langchain, openai, chromadb, youtube-transcript-api and pytube

#import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
#openai.api_key  = os.environ['OPENAI_API_KEY']

# Carregue a transcrição do youtube:
# SE O SEU VÍDEO DO YOUTUBE FOR MUITO CURTO, VOCÊ PODE RECEBER UM ERRO DO CHROMADB OU SOLICITAR MAIS ELEMENTOS DO QUE EXISTEM NO ÍNDICE
loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=Q8eajxcS6dQ&t=21s",
                                        add_video_info=True,
                                        language=["pt", "id"],
                                        translation="pt")

# O chromadb está recebendo mensagens de erro com os metadados do youtube, então estamos usando apenas o texto da transcrição e não os metadados
documents = loader.load()
documents[0].metadata
documents[0].page_content
del documents[0].metadata['publish_date']


# Divida os documentos em pedaços de 1000 caracteres:
text_splitter = RecursiveCharacterTextSplitter(
    # Defina um tamanho de Chunk bem pequeno, apenas para mostrar.
    chunk_size = 1000,
    chunk_overlap  = 20,
    length_function = len,
)
documents = text_splitter.split_documents(documents)

persist_directory = "db"
# Crie um armazenamento de vetores a partir dos documentos
embeddings = OpenAIEmbeddings()

# verifique o diretório persist e crie se ele não existir
if not os.path.exists(persist_directory):
    vectorstore = Chroma.from_documents(documents, embeddings, persist_directory=persist_directory)
else:
    vectorstore = Chroma(persist_directory=persist_directory, embedding_function=embeddings)

from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

# Criamos um prompt de bate-papo:
system_template="""Use os seguintes trechos de contexto e histórico de bate-papo para responder às perguntas dos usuários.

                   Se você não sabe a resposta, apenas diga que não sabe, não tente inventar uma resposta.

----------------

{context}



"""
messages = [
    SystemMessagePromptTemplate.from_template(system_template),
    HumanMessagePromptTemplate.from_template("{question}")
]

prompt = ChatPromptTemplate.from_messages(messages) # Não estou usando o prompt


# Antigo (Deprecated):
# qa = ChatVectorDBChain.from_llm(ChatOpenAI(temperature=0), vectorstore, qa_prompt=prompt)

from langchain.chains import ConversationalRetrievalChain
qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0),
                                           vectorstore.as_retriever(search_kwargs={'k':2}),
                                           return_source_documents=True,
                                           verbose=False
                                           )
                                           


# Não consegui fazer com que o histórico de bate-papo funcionasse corretamente. provavelmente está confiando demais no contexto ou ficando confuso com muita informação:
chat_history = []

# Usamos um loop while para que possamos continuar fazendo perguntas:
while True:
    query = input("Você: ")
    result = qa({"question": query, "chat_history": chat_history})
    # append to the chat history
    # chat_history.append((query, result["answer"]))
    # chat_history = [(query, result["answer"])]
    # stylize the answer in bold
    print("\033[1m" + "Bot: " + result["answer"] + "\033[0m")
    # print(result)