sj_retrieval_v2 / app.py
samsonleegh's picture
Update app.py
24981d7 verified
from llama_index.core.base.embeddings.base import similarity
from llama_index.llms.ollama import Ollama
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.core import StorageContext
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import load_index_from_storage
import os
from dotenv import load_dotenv
from llama_index.core.callbacks import CallbackManager, LlamaDebugHandler, CBEventType
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.postprocessor import SimilarityPostprocessor
from llama_index.llms.openai import OpenAI
from llama_index.llms.groq import Groq
from llama_parse import LlamaParse
from llama_index.core.indices.query.query_transform.base import HyDEQueryTransform
from llama_index.core.query_engine import TransformQueryEngine
from llama_index.core.extractors import (
SummaryExtractor,
QuestionsAnsweredExtractor,
)
from llama_index.core.schema import MetadataMode
from llama_index.core.ingestion import IngestionPipeline
load_dotenv()
# OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
GROQ_API_KEY = os.getenv('GROQ_API_KEY')
LLAMAINDEX_API_KEY = os.getenv('LLAMAINDEX_API_KEY')
llm = Groq(model="llama3-70b-8192")#"llama3-8b-8192")
Settings.llm = llm
# set up callback manager
llama_debug = LlamaDebugHandler(print_trace_on_end=True)
callback_manager = CallbackManager([llama_debug])
Settings.callback_manager = callback_manager
# converting documents into embeddings and indexing
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5")
Settings.embed_model = embed_model
# create splitter
splitter = SentenceSplitter(chunk_size=1024, chunk_overlap=20)
Settings.transformations = [splitter]
if os.path.exists("./vectordb"):
storage_context = StorageContext.from_defaults(persist_dir="./vectordb")
index = load_index_from_storage(storage_context)
else:
parser = LlamaParse(
api_key=LLAMAINDEX_API_KEY,
result_type="markdown", # "markdown" and "text" are available
verbose=True,
)
filename_fn = lambda filename: {"file_name": filename}
required_exts = [".pdf",".docx"]
file_extractor = {".pdf": parser}
reader = SimpleDirectoryReader(
"./data",
file_extractor=file_extractor,
required_exts=required_exts,
recursive=True,
file_metadata=filename_fn
)
documents = reader.load_data()
for doc in documents:
doc.text = str(doc.metadata) +' '+ doc.text
print("index creating with `%d` documents", len(documents))
# index = VectorStoreIndex.from_documents(documents, embed_model=embed_model, text_splitter=splitter)
extractor_llm = Groq(model="llama3-70b-8192", temperature=0.1, max_tokens=512) #OpenAI(temperature=0.1, model="gpt-3.5-turbo", max_tokens=512)
node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
extractors = [
SummaryExtractor(summaries=["prev", "self", "next"], llm=extractor_llm),
QuestionsAnsweredExtractor(
questions=3, llm=extractor_llm, metadata_mode=MetadataMode.EMBED
),
]
nodes = node_parser.get_nodes_from_documents(documents)
nodes_extract_ls = []
print('extracting from:', len(nodes), ' nodes.')
import time
batch_size=5
for i in range(0, len(nodes), batch_size):
print(i)
nodes_batch_raw = nodes[i:i+batch_size]
try:
pipeline = IngestionPipeline(transformations=[node_parser, *extractors])
nodes_batch = pipeline.run(nodes=nodes_batch_raw, in_place=False, show_progress=True)
nodes_extract_ls.append(nodes_batch)
except:
time.sleep(30) # api call limit reach, sleep 30 seconds before trying
nodes_extract = [
x
for xs in nodes_extract_ls
for x in xs
]
index = VectorStoreIndex(nodes_extract)
index.storage_context.persist(persist_dir="./vectordb")
query_engine = index.as_query_engine(
similarity_top_k=5,
#node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.7)],
verbose=True,
)
# query_engine = index.as_query_engine(
# similarity_top_k=10,
# #node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.7)],
# verbose=True,
# )
# # hyde: transform query into a temporary doc, and use doc to doc similarity match
# hyde = HyDEQueryTransform(include_original=True)
# hyde_query_engine = TransformQueryEngine(query_engine, query_transform=hyde)
import gradio as gr
def retreive(question):
qns_w_source = "Answer the following question: " + question + " Followed by providing the page and file name of the source document as well, thank you!"
streaming_response = query_engine.query(qns_w_source)
# sources = streaming_response.get_formatted_sources(length=5000)
return str(streaming_response) #+ "\n" + str(sources)
demo = gr.Interface(fn=retreive, inputs="textbox", outputs="textbox")
if __name__ == "__main__":
demo.launch(share=True)