Pash1986's picture
Update app.py
4a9dcfc verified
raw
history blame
4.4 kB
from pymongo import MongoClient
import os
import time
import gradio as gr
import requests
import traceback
import google.generativeai as genai
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
try:
# Initialize MongoDB python client
MONGODB_URI = os.getenv("MONGODB_ATLAS_URI")
client = MongoClient(MONGODB_URI, appname="devrel.content.python")
DB_NAME = "google-ai"
COLLECTION_NAME = "embedded_docs"
ATLAS_VECTOR_SEARCH_INDEX_NAME = "vector_index"
collection = client[DB_NAME][COLLECTION_NAME]
### Insert data about 5 individual employees
collection.delete_many({})
collection.insert_many([
{
'_id' : '54633',
'content' : 'Employee number 54633, name John Doe, department Sales, location New York, salary 100000'
},
{
'_id' : '54634',
'content' : 'Employee number 54634, name Jane Doe, department Marketing, location Los Angeles, salary 120000',
},
{
'_id' : '54635',
'content' : 'Employee number 54635, name John Smith, department Engineering, location San Francisco, salary 150000'
},
{
'_id' : '54636',
'content' : 'Employee number 54636, name Jane Smith, department Finance, location Chicago, salary 130000'
},
{
'_id' : '54637',
'content' : 'Employee number 54637, name John Johnson, department HR, location Miami, salary 110000'
},
{
'_id' : '54638',
'content' : 'Employee number 54638, name Jane Johnson, department Operations, location Seattle, salary 140000'
}
])
# Exception handling to catch and display errors during the pipeline execution.
except Exception as erorr_message:
print("An error occurred: \n" + erorr_message)
gemini_pro = genai.GenerativeModel('gemini-2.0-flash')
def embed_text(text):
result = genai.embed_content(
model="models/embedding-001",
content=text,
task_type="retrieval_document",
title="Embedding of single string")
return result['embedding']
def get_rag_output(context, question):
template = f""" You are an hr assistant, answer in detail. Answer the question based only on the following context:
```
{context}
```
Question: {question}
"""
response = gemini_pro.generate_content([template], stream=False)
return response.text
def mongodb_vector_query(message):
docs = collection.aggregate([
{
'$vectorSearch' : {
'index' : 'vector_index',
'queryVector' : embed_text(message),
'path' : 'embedding',
'numCandidates' : 10,
'limit' : 5
}
},
{
'$project': {
'embedding': 0
}
}
])
return list(docs)
def get_rag(message, history):
try:
context = mongodb_vector_query(message)
result = get_rag_output(context, message)
# print(result)
print_llm_text = result
for i in range(len(print_llm_text)):
time.sleep(0.03)
yield print_llm_text[: i+1]
except Exception as e:
error_message = traceback.format_exc()
print("An error occurred: \n" + error_message)
yield error_message
def fetch_url_data(url):
try:
response = requests.get(url)
response.raise_for_status() # Raises an HTTPError if the HTTP request returned an unsuccessful status code
return response.text
except requests.RequestException as e:
return f"Error: {e}"
# Setup Gradio interface
with gr.Blocks() as demo:
with gr.Tab("Demo"):
gr.ChatInterface(get_rag,examples=["List all employees", "Where does jane work?", "Who has the highest salary? List it"], title="Atlas Vector Search Chat",description="This small chat uses a similarity search to find relevant employees as listed in the app.py inserts, it uses MongoDB Atlas and Google Gemini.",submit_btn="Search").queue()
with gr.Tab("Code"):
gr.Code(label="Code", language="python", value=fetch_url_data('https://huggingface.co/spaces/MongoDB/mongodb-gemini-rag/raw/main/app.py'))
if __name__ == "__main__":
demo.launch()