Spaces:
Build error
Build error
#Import the necessary Libraries | |
import os | |
import uuid | |
import json | |
import gradio as gr | |
from openai import OpenAI | |
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings | |
from langchain_community.vectorstores import Chroma | |
from huggingface_hub import CommitScheduler | |
from pathlib import Path | |
from dotenv import load_dotenv | |
# Create Client | |
load_dotenv() | |
os.environ['OPENAI_API_KEY'] = anyscale_api_key | |
client = OpenAI( | |
base_url="https://api.endpoints.anyscale.com/v1", | |
api_key=os.environ['OPENAI_API_KEY'] | |
) | |
# Define the embedding model and the vectorstore | |
embedding_model = SentenceTransformerEmbeddings(model_name='thenlper/gte-large') | |
# Load the persisted vectorDB | |
collection_name = 'picco-2023' | |
vectorstore_persisted = Chroma( | |
collection_name=collection_name, | |
embedding_function=embedding_model, | |
persist_directory='/content/picco_db' | |
) | |
retriever = vectorstore_persisted.as_retriever( | |
search_type="similarity", | |
search_kwargs={'k': 5}, | |
) | |
# Prepare the logging functionality | |
log_file = Path("logs/") / f"data_{uuid.uuid4()}.json" | |
log_folder = log_file.parent | |
scheduler = CommitScheduler( | |
repo_id="picco-qna", | |
repo_type="dataset", | |
folder_path=log_folder, | |
path_in_repo="data", | |
every=2 | |
# Define the Q&A system message | |
qna_system_message = """ | |
You are an academic assistant who answers questions regarding pulse integrated continuous cardiac output (PiCCO) for learners preparing for PiCCO workshop . | |
User input will have the context required by you to answer user questions. | |
This context will begin with the token: ###Context. | |
The context contains references to specific portions of a document relevant to the user query. | |
User questions will begin with the token: ###Question. | |
Please answer only using the context provided in the input. Do not mention anything about the context in your final answer. | |
If the answer is not found in the context, respond "I don't know". | |
""" | |
# Define the user message template | |
qna_user_message_template = """ | |
###Context | |
Here are some documents that are relevant to the question mentioned below.- | |
{context} | |
###Question | |
{question} | |
""" | |
# Define the predict function that runs when 'Submit' is clicked or when an API request is made | |
def predict(user_input): | |
relevant_document_chunks = vectorstore_persisted.similarity_search(user_input, k=5) | |
# Create context_for_query | |
context_list = [f"Page {doc.metadata['page']}: {doc.page_content}" for doc in relevant_document_chunks] | |
context_for_query = ".".join(context_list) | |
# Create messages | |
prompt = [ | |
{'role': 'system', 'content': qna_system_message}, | |
{'role': 'user', 'content': qna_user_message_template.format(context=context_for_query, question=user_input)} | |
] | |
# Get response from the LLM | |
try: | |
response = client.chat.completions.create( | |
model="mlabonne/NeuralHermes-2.5-Mistral-7B", | |
messages=prompt, | |
temperature=0 | |
) | |
prediction = response.choices[0].message.content | |
except Exception as e: | |
prediction = f'Sorry, I encountered the following error: \n {e}' | |
print(prediction) | |
# Log both the inputs and outputs to a local log file | |
with scheduler.lock: | |
with log_file.open("a") as f: | |
f.write(json.dumps({ | |
'user_input': user_input, | |
'retrieved_context': context_for_query, | |
'model_response': prediction | |
})) | |
f.write("\n") | |
return prediction | |
# Set-up the Gradio UI | |
# Create the interface | |
demo = gr.Interface( | |
inputs=gr.Textbox(placeholder="Enter your query here"), | |
fn=predict, | |
outputs="text", | |
description="This web API presents an interface to ask questions on PiCCO Technology", | |
article="Note that questions that are not relevant to PiCCO not be answered.", | |
title="KSA/CCSK Hemodynamic Workshop Question & Answer Bot, by Chiko", | |
concurrency_limit=16, | |
examples = [ | |
["State and explain the main scientific principles used in PiCCO technology"], | |
["What is the relevance of PiCCO in the operating room and critical care unit?"], | |
["Name and explain the parameters that can be measured using PiCCO, give their reference ranges"], | |
["State the basic equation that is used to estimate cardiac output using pulse contour analysis, explain each variable in detail"] | |
] | |
) | |
demo.queue() | |
demo.launch() | |