File size: 3,160 Bytes
929a283
93452e4
929a283
 
93452e4
929a283
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3d70771
929a283
 
 
 
 
97c8253
 
 
3d70771
3d00632
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
105
106
107
import gradio as gr
import faiss
import numpy as np
import openai
from sentence_transformers import SentenceTransformer
from nltk.tokenize import sent_tokenize

# Load the Ubuntu manual from a .txt file
with open("/content/ubuntu_manual.txt", "r", encoding="utf-8") as file:
    full_text = file.read()

# Function to chunk the text into smaller pieces
def chunk_text(text, chunk_size=500):  # Larger chunks
    sentences = sent_tokenize(text)
    chunks = []
    current_chunk = []

    for sentence in sentences:
        if len(current_chunk) + len(sentence.split()) <= chunk_size:
            current_chunk.append(sentence)
        else:
            chunks.append(" ".join(current_chunk))
            current_chunk = [sentence]

    if current_chunk:
        chunks.append(" ".join(current_chunk))

    return chunks

# Apply chunking to the entire text
manual_chunks = chunk_text(full_text, chunk_size=500)

# Load your FAISS index
index = faiss.read_index("path/to/your/faiss_index.bin")

# Load your embedding model
embedding_model = SentenceTransformer('your_embedding_model_name')

# OpenAI API key
openai.api_key = 'your-openai-api-key'

# Function to create embeddings
def embed_text(text_list):
    return np.array(embedding_model.encode(text_list), dtype=np.float32)

# Function to retrieve relevant chunks for a user query
def retrieve_chunks(query, k=5):
    query_embedding = embed_text([query])
    
    # Search the FAISS index
    distances, indices = index.search(query_embedding, k=k)
    
    # Debugging: Print out the distances and indices
    print("Distances:", distances)
    print("Indices:", indices)
    
    # Check if indices are valid
    if len(indices[0]) == 0:
        return []

    # Ensure indices are within bounds
    valid_indices = [i for i in indices[0] if i < len(manual_chunks)]
    if not valid_indices:
        return []

    # Retrieve relevant chunks
    relevant_chunks = [manual_chunks[i] for i in valid_indices]
    return relevant_chunks

# Function to truncate long inputs
def truncate_input(text, max_length=512):
    tokens = generator_tokenizer.encode(text, truncation=True, max_length=max_length, return_tensors="pt")
    return tokens

# Function to perform RAG: Retrieve chunks and generate a response
def rag_response(query, k=5, max_new_tokens=150):
    # Step 1: Retrieve relevant chunks
    relevant_chunks = retrieve_chunks(query, k=k)
    
    if not relevant_chunks:
        return "Sorry, I couldn't find relevant information."

    # Step 2: Combine the query with retrieved chunks
    augmented_input = query + "\n" + "\n".join(relevant_chunks)
    
    # Truncate and encode the input
    inputs = truncate_input(augmented_input)
    
    # Generate response
    outputs = generator_model.generate(inputs, max_new_tokens=max_new_tokens)
    generated_text = generator_tokenizer.decode(outputs[0], skip_special_tokens=True)
    
    return generated_text

# Gradio Interface
iface = gr.Interface(
    fn=rag_response,
    inputs="text",
    outputs="text",
    title="RAG Chatbot with FAISS and GPT-3.5",
    description="Ask me anything!"
)

if __name__ == "__main__":
    iface.launch()