import json import logging import os import sys import gradio as gr import openai from dotenv import load_dotenv from llama_index import SimpleDirectoryReader, VectorStoreIndex, load_index_from_storage from llama_index.indices.service_context import ServiceContext from llama_index.llms import OpenAI from llama_index.node_parser import SimpleNodeParser from llama_index.node_parser.extractors import ( MetadataExtractor, SummaryExtractor, QuestionsAnsweredExtractor, TitleExtractor, KeywordExtractor, ) from llama_index.storage.storage_context import StorageContext from llama_index.text_splitter import TokenTextSplitter # loads dotenv lib to retrieve API keys from .env file load_dotenv() openai.api_key = os.getenv("OPENAI_API_KEY") # enable INFO level logging logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) # define LLM service llm = OpenAI(temperature=0.1, model_name="gpt-3.5-turbo-16k", max_tokens=512) service_context = ServiceContext.from_defaults(llm=llm) # construct text splitter to split texts into chunks for processing text_splitter = TokenTextSplitter(separator=" ", chunk_size=512, chunk_overlap=128) # set the global service context object, avoiding passing service_context when building the index from llama_index import set_global_service_context set_global_service_context(service_context) # create metadata extractor metadata_extractor = MetadataExtractor( extractors=[ TitleExtractor(nodes=1, llm=llm), QuestionsAnsweredExtractor(questions=3, llm=llm), SummaryExtractor(summaries=["prev", "self"], llm=llm), KeywordExtractor(keywords=10, llm=llm) ], ) # create node parser to parse nodes from document node_parser = SimpleNodeParser( text_splitter=text_splitter, metadata_extractor=metadata_extractor, ) # loading documents documents_2023 = SimpleDirectoryReader(input_files=["data/data.pdf"], filename_as_id=True).load_data() print(f"loaded data with {len(documents_2023)} pages") def load_index(): try: # load storage context storage_context = StorageContext.from_defaults(persist_dir="./storage") # try to load the index from storage index = load_index_from_storage(storage_context) logging.info("Index loaded from storage.") except FileNotFoundError: # if index not found, create a new one logging.info("Index not found. Creating a new one...") nodes_2023 = node_parser.get_nodes_from_documents(documents_2023) print(f"loaded nodes_2022 with {len(nodes_2023)} nodes") # print metadata in json format for node in nodes_2023: metadata_json = json.dumps(node.metadata, indent=4) # Convert metadata to formatted JSON print(metadata_json) # based on the nodes and service_context, create index index = VectorStoreIndex(nodes=nodes_2023, service_context=service_context) # Persist index to disk index.storage_context.persist() logging.info("New index created and persisted to storage.") return index def data_querying(input_text): # Load index index = load_index() # queries the index with the input text response = index.as_query_engine().query(input_text) return response.response iface = gr.Interface(fn=data_querying, inputs=gr.components.Textbox(lines=3, label="Inserte su pregunta aquí"), outputs=gr.components.Textbox(lines=3, label="Respuesta"), examples=[ ["¿Quien eres?"], ["¿Cómo te llamas?"], ["¿Cómo puedes ayudarme?"], ["¿Qué puedo hacer si perdí mi contraseña?"], ["¿Qué puedo hacer si perdí mi tarjeta de cŕedito?"], ["Genera un reporte o lista de pasos de toda la info que necesito para abrir una cuenta"], ], title="Demo IA Conversacional", description="Pregúntame lo que quieras, te responderé con lo que sé.") iface.launch(share=False)