Spaces:
Running
Running
import os | |
import asyncio | |
import logging | |
from dotenv import load_dotenv | |
from langchain.prompts import PromptTemplate | |
from langchain_community.vectorstores import Qdrant | |
from langchain.chains import RetrievalQA | |
from langchain_groq import ChatGroq | |
from langchain_community.embeddings.fastembed import FastEmbedEmbeddings | |
from langchain_experimental.text_splitter import SemanticChunker | |
from qdrant_client import QdrantClient | |
from qdrant_client.http import models as rest | |
from langchain_community.document_loaders import PyPDFDirectoryLoader | |
import gradio as gr | |
# Set up logging | |
logging.basicConfig(filename='app.log', level=logging.ERROR, format='%(asctime)s %(levelname)s %(message)s') | |
load_dotenv() | |
# Environment variables | |
api_key = os.getenv('API_KEY1') | |
GROQ_API_KEY = os.getenv("GROQ_API_KEY") | |
qdurl = os.getenv("QDURL") | |
# Initialize Qdrant Client | |
try: | |
client = QdrantClient( | |
url=qdurl, | |
port=6333, | |
verify=False, | |
api_key=api_key, | |
) | |
collections = client.get_collections() | |
except Exception as e: | |
print("An error occurred: %s", e) | |
if "server engine not running" in str(e).lower(): | |
print("The database engine is not running. Please check the server status.") | |
exit() | |
print("Database loaded") | |
# Initialize embeddings and database | |
hf = FastEmbedEmbeddings(model_name="nomic-ai/nomic-embed-text-v1.5-Q") | |
db = Qdrant( | |
client=client, | |
embeddings=hf, | |
collection_name="RR2" | |
) | |
load_vector_store = db | |
retriever = load_vector_store.as_retriever(search_kwargs={"k":3}) | |
llm = ChatGroq(temperature=0, model_name="llama3-8b-8192") | |
# Collection Management Functions | |
async def create_collection(url, port, collection_name, vector_size): | |
try: | |
client = QdrantClient( | |
url=url, | |
port=int(port), | |
api_key=api_key, | |
verify=False, | |
) | |
client.recreate_collection( | |
collection_name=collection_name, | |
vectors_config=rest.VectorParams( | |
size=int(vector_size), | |
distance=rest.Distance.COSINE, | |
) | |
) | |
return "Collection created successfully." | |
except Exception as e: | |
return f"Failed to create collection: {str(e)}" | |
# Data Processing Function | |
async def data_ingest_function(data_path, url, collection_name): | |
loop = asyncio.get_event_loop() | |
try: | |
def load_documents(): | |
loader = PyPDFDirectoryLoader(data_path) | |
hf = FastEmbedEmbeddings(model_name="nomic-ai/nomic-embed-text-v1.5-Q") | |
text_splitter = SemanticChunker(hf, breakpoint_threshold_type="interquartile") | |
documents = loader.load_and_split(text_splitter=text_splitter) | |
return documents | |
texts = await loop.run_in_executor(None, load_documents) | |
print(f"Processed {len(texts)} text chunks") | |
def index_documents(): | |
qdrant = Qdrant.from_documents( | |
texts, | |
hf, | |
url=url, | |
api_key=api_key, | |
collection_name=collection_name | |
) | |
return qdrant | |
await loop.run_in_executor(None, index_documents) | |
return "Data processing and indexing completed successfully." | |
except Exception as e: | |
return f"Failed to process data: {str(e)}" | |
# Gradio Admin Interface | |
with gr.Blocks(theme="soft", title="Admin LLM System", head="Admin for LARGE LANGUAGE MODEL SYSTEM") as admin: | |
with gr.Tab("Collection Management"): | |
with gr.Row(): | |
url_input = gr.Textbox(label="Qdrant URL", value="") | |
port_input = gr.Number(label="Port", value=6333) | |
collection_name_input = gr.Textbox(label="Collection Name", value="RR2") | |
vector_size_input = gr.Number(label="Vector Size", value=768) | |
create_collection_btn = gr.Button("Create Collection") | |
create_collection_btn.click( | |
create_collection, | |
inputs=[url_input, port_input, collection_name_input, vector_size_input], | |
outputs=gr.Textbox(label="Result") | |
) | |
with gr.Row(): | |
data_path_input = gr.Textbox(label="Data Folder Path") | |
url_processing_input = gr.Textbox(label="Qdrant URL for Processing", value="") | |
collection_name_processing_input = gr.Textbox(label="Collection Name for Processing", value="RR2") | |
start_processing_btn = gr.Button("Start Processing") | |
start_processing_btn.click( | |
data_ingest_function, | |
inputs=[data_path_input, url_processing_input, collection_name_processing_input], | |
outputs=gr.Textbox(label="Result") | |
) | |
# Launch Interface | |
if __name__ == "__main__": | |
admin.launch(server_name="0.0.0.0", server_port=7860, share=False) |