Spaces:
Sleeping
Sleeping
import json | |
import gradio as gr | |
from sentence_transformers import SentenceTransformer | |
import faiss | |
import numpy as np | |
from huggingface_hub import InferenceClient | |
# ๐น Load JSON Data with Colorado Food Stamp Information | |
DATA_FILE = "colorado_foodstamps.json" | |
def load_json_data(): | |
try: | |
with open(DATA_FILE, "r", encoding="utf-8") as f: | |
data = json.load(f) | |
# Ensure data is a dictionary, not a list | |
if isinstance(data, list): | |
data = {str(i): str(entry) for i, entry in enumerate(data)} | |
# Convert all values to strings | |
data = {key: str(value) for key, value in data.items()} | |
return data | |
except (FileNotFoundError, ValueError) as e: | |
return {"error": f"Data loading issue: {e}"} | |
data = load_json_data() | |
# ๐น Initialize FAISS for Searching Relevant Answers | |
model = SentenceTransformer("multi-qa-mpnet-base-dot-v1") # slower with great accuracy | |
def create_faiss_index(data): | |
texts = list(data.values()) | |
embeddings = np.array([model.encode(text) for text in texts]) | |
index = faiss.IndexFlatL2(embeddings.shape[1]) | |
index.add(embeddings) | |
return index, texts | |
index, texts = create_faiss_index(data) | |
# ๐น Function to Search FAISS for Relevant Answers | |
def search_faiss(query, top_k=1): | |
query_embedding = model.encode(query).reshape(1, -1) | |
distances, indices = index.search(query_embedding, top_k) | |
return texts[indices[0][0]] if indices[0][0] < len(texts) else "No relevant information found." | |
# ๐น Hugging Face API for Additional Responses | |
client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.1") | |
def get_huggingface_response(query): | |
messages = [{"role": "system", "content": "Provide accurate food stamp information for Colorado."}, | |
{"role": "user", "content": query}] | |
response = "" | |
for message in client.chat_completion(messages, max_tokens=1024, stream=True, temperature=0.7, top_p=0.95): | |
response += message.choices[0].delta.content | |
return response | |
# ๐น Main Chatbot Function | |
def chatbot_response(message, history): | |
relevant_info = search_faiss(message, top_k=1) # Retrieve 1 most relevant sections | |
if "No relevant information found." not in relevant_info: | |
user_query_with_context = f""" | |
You are an expert in Colorado SNAP (food stamp) policies. The user is asking: | |
**User Question:** {message} | |
### **Relevant Policy Information Retrieved (Multiple Sources)** | |
{relevant_info} | |
### **Task:** | |
- **Summarize all retrieved policy information** and provide a clear, concise answer. | |
- **Use bullet points** for clarity. | |
- **If a rule applies, state it explicitly.** | |
- **If multiple sources provide different information, clarify the distinctions.** | |
- **If the policy does not fully answer the question, provide general guidance and suggest relevant keywords to search.** | |
""" | |
return get_huggingface_response(user_query_with_context) | |
return get_huggingface_response(message) | |
# ๐น Gradio Chat Interface | |
demo = gr.ChatInterface(chatbot_response, textbox=gr.Textbox(placeholder="Ask about Colorado food stamps...")) | |
demo.launch() | |