EddyGiusepe's picture
Prompt não sendo usado
269bac0
Raw
History Blame Contribute Delete
4.38 kB
"""
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)