Spaces:
Sleeping
Sleeping
File size: 3,616 Bytes
7e1dfd1 80ac8cc 4d2d551 7e1dfd1 80ac8cc 35a96c0 4d2d551 7620448 4d2d551 35a96c0 4d2d551 35a96c0 4d2d551 35a96c0 4d2d551 35a96c0 4d2d551 35a96c0 4d2d551 35a96c0 4d2d551 35a96c0 7e1dfd1 4d2d551 80ac8cc 6b255cb 80ac8cc 4d2d551 80ac8cc 4d2d551 80ac8cc 4d2d551 80ac8cc 35a96c0 7e1dfd1 80ac8cc 4d2d551 35a96c0 7e1dfd1 80ac8cc 4d2d551 80ac8cc 4d2d551 7e1dfd1 80ac8cc 7e1dfd1 |
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 |
import gradio as gr
import openai
import os
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.schema import Document
from sentence_transformers import SentenceTransformer
from datasets import load_dataset
import nltk
# β
Load the Sentence Transformer Embedding Model
model_name = "sentence-transformers/all-MiniLM-L6-v2"
embedding_model = HuggingFaceEmbeddings(model_name=model_name)
# β
Set OpenAI API Key
openai.api_key = os.getenv("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
")
# β
Download NLTK Tokenizer
nltk.download('punkt')
# β
Load and Chunk Dataset
def chunk_documents(documents, max_chunk_size=500):
chunks = []
for doc in documents:
sentences = nltk.sent_tokenize(doc)
current_chunk = ""
for sentence in sentences:
if len(current_chunk) + len(sentence) <= max_chunk_size:
current_chunk += sentence + " "
else:
chunks.append(current_chunk.strip())
current_chunk = sentence + " "
if current_chunk:
chunks.append(current_chunk.strip())
return chunks
# β
Load Dataset and Prepare ChromaDB
dataset = load_dataset("rungalileo/ragbench", "techqa") # Example dataset
original_documents = dataset['train']['documents']
chunked_documents = chunk_documents(original_documents)
persist_directory = "chroma_db_directory"
documents = [Document(page_content=chunk) for chunk in chunked_documents]
# β
Initialize ChromaDB
vectordb = Chroma.from_documents(
documents=documents,
embedding=embedding_model,
persist_directory=persist_directory
)
vectordb.persist()
# β
Function to Retrieve Relevant Documents
def retrieve_documents(question, k=5):
docs = vectordb.similarity_search(question, k=k)
if not docs:
return ["β οΈ No relevant documents found. Try a different query."]
return [doc.page_content for doc in docs]
# β
Function to Generate AI Response
def generate_response(question, context):
if not context or "No relevant documents found." in context:
return "No relevant context available. Try a different query."
full_prompt = f"Context: {context}\n\nQuestion: {question}"
try:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an AI assistant that answers user queries based on the given context."},
{"role": "user", "content": full_prompt}
],
max_tokens=300,
temperature=0.7
)
return response['choices'][0]['message']['content'].strip()
except Exception as e:
return f"Error generating response: {str(e)}"
# β
Full RAG Pipeline
def rag_pipeline(question):
retrieved_docs = retrieve_documents(question, k=5)
context = " ".join(retrieved_docs)
response = generate_response(question, context)
return response, "\n\n".join(retrieved_docs)
# β
Gradio UI Interface
iface = gr.Interface(
fn=rag_pipeline,
inputs=gr.Textbox(label="Enter your question"),
outputs=[
gr.Textbox(label="Generated Response"),
gr.Textbox(label="Retrieved Documents")
],
title="RAG-Based Question Answering System",
description="Enter a question and retrieve relevant documents with AI-generated response."
)
# β
Launch the Gradio App
if __name__ == "__main__":
iface.launch()
|