Spaces:
Sleeping
Sleeping
File size: 10,129 Bytes
a11d725 b604759 a11d725 6124a59 b44eb8e a11d725 14d2b4a a11d725 14d2b4a 3276236 a11d725 95b560d a11d725 9c79a3d 3276236 5b8deb9 4534c4b 5820ad9 c56d48f 5820ad9 ef14eb1 9c79a3d 5820ad9 a11d725 8663bc9 a11d725 8663bc9 a11d725 1901235 a11d725 1901235 a11d725 1901235 a11d725 1901235 a11d725 8663bc9 b604759 a11d725 b604759 a11d725 1901235 f7004e6 1901235 412e87e f7004e6 a11d725 522a1ee a11d725 b604759 a11d725 |
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
import subprocess
import sys
def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
install("groq")
install("langchain-community==0.0.32")
install("sentence-transformers==2.3.1")
install("chromadb==0.4.22")
install("langchain==0.1.9")
install("tiktoken==0.6.0")
install("openai==1.23.2")
install("gcsfs>=2023.3.0")
install("datasets")
install ("ipywidgets")
#!pip install -q openai==1.23.2 \
# gcsfs>=2023.3.0 \
# tiktoken==0.6.0 \
# pypdf==4.0.1 \
# langchain==0.1.9 \
# langchain-community==0.0.32 \
# chromadb==0.4.22 \
# sentence-transformers==2.3.1 \
# datasets
## Setup
# Import the necessary Libraries
import json
import uuid
import os
from groq import Groq
import gradio as gr
from langchain_community.embeddings.sentence_transformer import (SentenceTransformerEmbeddings)
from langchain_community.vectorstores import Chroma
from huggingface_hub import CommitScheduler
from pathlib import Path
import time
import signal
from huggingface_hub import create_repo
from huggingface_hub import HfApi
from huggingface_hub import notebook_login
notebook_login()
from huggingface_hub import login
hf_key=os.getenv('HF_TOKEN')
login(token=hf_key) # Or use huggingface-cli login
# Create Client
os.environ['GROQ_API_KEY'] = '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';
client = Groq(
api_key=os.environ.get("GROQ_API_KEY"),
)
#chat_completion = client.chat.completions.create(
# messages=[
# {
# "role": "user",
# "content": "Explain the importance of fast language models"
# }
#],
# model="llama3-8b-8192",
#)
# Define the embedding model and the vectorstore
embedding_model= SentenceTransformerEmbeddings(model_name="thenlper/gte-large")
collection_name = 'reports_collection'
vectorstore = Chroma(
collection_name=collection_name,
persist_directory="./db",
embedding_function=embedding_model
)
# Prepare the logging functionality
api = HfApi()
log_file = Path("logs/") / f"data_{uuid.uuid4()}.json"
log_folder = log_file.parent
log_file.parent.mkdir(exist_ok=True)
scheduler = CommitScheduler(
repo_id="alemarino2025/imat",
repo_type="dataset",
folder_path=log_folder,
path_in_repo="alemarino2025/imat/data",
hf_api=api,
every=2
)
# Define the Q&A system message
qna_system_message = """
Sei un mental trainer. Ti chiami Mat.
Il tuo compito è svolgere conversazioni con atleti che presumibilmente hanno dei problemi durante la loro attività sportiva. Per svolgere queste conversazioni devi attenerti ai seguenti sei Step sequenziali:
Step 1.
All'inizio della conversazione devi cercare di conoscere meglio il paziente per contestualizzare meglio il problema. È importante fare domande sul background anagrafico e sportivo dell’atleta perché conoscere la sua età e la sua storia personale legata alla sua vita privata. Ciò è determinante ed utile per arricchire le tue conoscenze sul paziente e fornire consigli più specifici.
Step 2.
Approfondisci la domanda dell’utente dando valore, attenzione ed ascolto attivo a ciò che dice l’utente. Questo è importante perché attraverso una serie di domande relative alla problematica proposta, l’utente si sentirà accolto e accettato. Accrescere la sinergia con l’utente diventa dunque di strutturale importanza perché rafforza il tuo rapporto con l'utente.
Step 3.
Fai richieste specifiche su quelli che sono gli obiettivi che l'utente si propone di raggiungere per migliorare la sua situazione. Questo diventa necessario perché ogni utente è unico e la sua unicità mette il mental trainer nella condizione di strutturare un percorso specifico, ad hoc per ognuno di loro.
Step 4.
Concorda un piano d’azione per raggiungere gli obiettivi proposti durante lo step 3. Questi devono essere misurabili e raggiungibili perché è importante supportare il paziente evitando di alimentare in lui eventuali frustrazioni dovute al mancato raggiungimento degli obiettivi.
Step 5.
Verso la fine della conversazione fornisci suggerimenti e indicazioni pratico-teoriche al paziente utilizzando tecniche psicologiche specifiche per migliorare la sua condizione. Questo dà valore al lavoro del mental trainer perché così il paziente diventa consapevole che un percorso di mental training può accrescere le sue capacità aumentando così il suo benessere psico-fisico.
Step 6.
Infine devi riassumere all’utente ciò che è stato detto proponendo eventualmente altri incontri in futuro. In questo modo il paziente capirà che è presente un’ancora alla quale può fare riferimento. Ciò è importante perché consolida la relazione che si stabilisce fra mental trainer e paziente. Solo consolidando la relazione gli obiettivi proposti e le tecniche suggerite possono diventare parte integrante dell’approccio mentale dell’atleta che interiorizzerà attivamente ciò che viene detto durante gli incontri.
L'input dell'utente includerà il contesto necessario per svolgere il tuo compito. Questo contesto inizierà con il token ###Contesto.
Il contesto contiene riferimenti a parti specifiche di documenti pertinenti alla query dell'utente, insieme al numero di pagina del report.
La fonte per il contesto inizierà con il token ###Pagina
Quando crei le tue risposte:
1. Seleziona solo il contesto pertinente per rispondere alla domanda.
2. Segui gli step indicati in precedenza ma non indicare il numero di step nè lo step che stai seguendo.
3. Usa un tono comunicativo: Deve essere rassicurante, flessibile e basato sull’empatia.
4. Riconosci il contesto: Adatta il linguaggio al livello agonistico, all’età e agli obiettivi dell’atleta.
5. Personalizza: Ogni atleta è unico, devi proporre soluzioni su misura partendo dalle informazioni raccolte.
6. E' molto molto importante che faccia un massimo di due domande alla volta all'utente. Poi aspetta la sua risposta e utilizza la risposta come input per andare avanti nella tua procedura.
Le domande dell'utente inizieranno con il token: ###Domanda.
Se la domanda è irrilevante o se il contesto è vuoto - "Mi dispiace, questo è fuori dalla mia knowledge base"
"""
# Define the user message template
qna_user_message_template = """
###Context
Here are some documents and their page number that are relevant to the question mentioned below.
(context)
###Question
{question}
"""
# prompt: write code that breaks the loop after 30 minutes
class TimeoutException(Exception):
pass
def alarm_handler(signum, frame):
raise TimeoutException("Timed out!")
# Initialize conversation history
conversation_history = []
def predict(user_input, timeout_seconds=1800): # 30 minutes = 1800 seconds
filter = "/content/drive/My Drive/Colab Notebooks/medical/Conoscenze-unito.pdf"
relevant_document_chunks = vectorstore.similarity_search(user_input, k=10,filter={"source": filter})
context_list = [d.page_content + "\ ###Page: " + str(d.metadata['page']) + "\n\n " for d in relevant_document_chunks]
context_for_query = ".".join(context_list) + "this is all thhe context I have"
global conversation_history
conversation_history.append({"role": "user", "content": user_input})
# Prepare the prompt with conversation history
current_prompt = [
{'role': 'system','content': qna_system_message},
{'role': 'user','content': qna_user_message_template.format(
context=context_for_query,
question=user_input
)
}
]
current_prompt.extend(conversation_history)
# Set signal handler
#signal.signal(signal.SIGALRM, alarm_handler)
#signal.alarm(timeout_seconds) # Produce SIGALRM in `timeout_seconds` seconds
try:
chat_completion = client.chat.completions.create(
messages=current_prompt,
model="deepseek-r1-distill-llama-70b", # Replace with your actual model name llama3-8b-8192 deepseek-r1-distill-llama-70b
)
bot_response = chat_completion.choices[0].message.content
conversation_history.append({"role": "assistant", "content": bot_response})
# signal.alarm(0) # Cancel the alarm
return bot_response
except TimeoutException:
print("The request timed out.")
# signal.alarm(0) # Cancel the alarm
return "The request timed out."
except Exception as e:
print(f"An error occurred: {e}")
# signal.alarm(0) # Cancel the alarm
return "An error occurred during the conversation."
while True:
response = chat_with_bot_timeout(user_input)
#print("Mat:", response)
user_input = input("You: ")
if user_input.lower() in ["quit", "exit"]:
break
prediction = response.choices[0].message.content.strip()
#except Exception as e:
# prediction = str(e)
# While the prediction is made, log boh the inputs and outputs to a local log file
# while writing to the log file, ensure that the commit scheduler is locked to avoid parallel
# access
json_data = {
"user_input": user_input,
"retrieved_context": context_for_query,
"model_response": prediction
}
with scheduler.lock:
with log_file.open("a") as f:
try:
json.dump(json_data, f)
#f.write(json.dumps(json_data))
f.write("\n")
except TypeError as e:
logger.error(f"Failed to serialize JSON: {str(e)}")
raise
return prediction
# Set-up the Gradio UI
# Add text box.
textbox = gr.Textbox(placeholder="Enter your query here", lines=6)
# Create the interface
demo = gr.Interface(
inputs=[textbox], fn=predict, outputs="text",
title="I Mat - Your Mental Trainer",
description="This web API presents an interface to interact with your mental trainer Mat",
concurrency_limit=16
)
demo.queue()
demo.launch(share=True)
|