Spaces:
Runtime error
Runtime error
File size: 6,064 Bytes
42d7a9a e2f7220 42d7a9a 350e78f 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a c344afc 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a d0d96b5 42d7a9a e2f7220 42d7a9a e2f7220 42d7a9a | 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 | from unsloth import FastLanguageModel
from peft import PeftModel
import pandas as pd
from unsloth.chat_templates import get_chat_template
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer, util
import nltk
import json
from google.oauth2.service_account import Credentials
import gspread
import gradio as gr
# Download stopwords
nltk.download("stopwords")
from nltk.corpus import stopwords
# Load the base model with FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Llama-3.2-3B-Instruct",
max_seq_length=2048,
dtype=None,
load_in_4bit=True
)
adapter_path = "FosterSystemsDatabase/model" # Path to LoRA adapter on Hugging Face
model = PeftModel.from_pretrained(model, adapter_path)
# Load CSV data
file_path = 'Clean Missouri Data.csv'
df = pd.read_csv(file_path, encoding='MacRoman')
def search_relevant_policies(query, df, top_n=10, max_chars=40000):
# Convert policies into a TF-IDF matrix
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(df['Content'])
query_vector = tfidf.transform([query])
cosine_sim = cosine_similarity(query_vector, tfidf_matrix).flatten()
# Get the top N relevant policies
top_indices = cosine_sim.argsort()[-top_n:][::-1]
relevant_policies = df.iloc[top_indices].copy()
# Ensure total text is capped at max_chars
char_count = 0
valid_indices = []
for idx, row in relevant_policies.iterrows():
content_length = len(row["Content"])
if char_count + content_length > max_chars:
break
char_count += content_length
valid_indices.append(idx)
truncated_policies = relevant_policies.loc[valid_indices]
return truncated_policies
def get_content_after_query(response_text, query):
query_position = response_text.lower().find(query.lower())
if query_position != -1:
res = response_text[query_position + len(query):].strip()
return res[11:]
else:
return response_text.strip()
def process_query(query, tokenizer):
relevant_policies = search_relevant_policies(query, df)
formatted_policies = [row['Content'] for _, row in relevant_policies.iterrows()]
relevant_policy_text = "\n\n".join(formatted_policies)
messages_with_relevant_policies = [
{"role": "system", "content": relevant_policy_text},
{"role": "user", "content": query},
]
tokenizer = get_chat_template(tokenizer, chat_template="llama-3.1")
inputs = tokenizer.apply_chat_template(
messages_with_relevant_policies,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt"
).to("cuda")
FastLanguageModel.for_inference(model)
outputs = model.generate(input_ids=inputs, max_new_tokens=512, use_cache=True, temperature=0.7, min_p=0.1)
generated_response = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0]
response = get_content_after_query(generated_response, query)
# Rank the top policy using SBERT
model_sbert = SentenceTransformer('all-MiniLM-L6-v2')
response_embedding = model_sbert.encode(generated_response, convert_to_tensor=True)
policy_embeddings = model_sbert.encode(relevant_policies['Content'].tolist(), convert_to_tensor=True)
cosine_similarities = util.cos_sim(response_embedding, policy_embeddings).flatten()
most_relevant_index = cosine_similarities.argmax().item()
most_relevant_link = relevant_policies.iloc[most_relevant_index]['Link to Content']
return {
"response": response,
"most_relevant_link": most_relevant_link
}
# Set up Google Sheets
json_file_path = "fostercare-449201-85282f81c3b7.json"
with open(json_file_path, 'r') as file:
service_account_data = json.load(file)
scopes = ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/drive"]
creds = Credentials.from_service_account_info(service_account_data, scopes=scopes)
client = gspread.authorize(creds)
spreadsheet = client.open("Fostercare Responses").sheet1
# Gradio functions
def greet(query):
result_1 = process_query(query, tokenizer)
result_2 = process_query(query, tokenizer)
return [result_1["response"], result_2["response"]]
def choose_preference(name, output1, output2, preference, query, broken):
if not name:
return "Please enter your name before submitting."
broken_flag = "Yes" if broken else "No"
if preference == "Output 1":
new_row = [query, output1, output2, name, broken_flag]
spreadsheet.append_row(new_row)
return f"You preferred: Output 1 - {output1}"
elif preference == "Output 2":
new_row = [query, output2, output1, name, broken_flag]
spreadsheet.append_row(new_row)
return f"You preferred: Output 2 - {output2}"
else:
return "No preference selected."
# Gradio UI
with gr.Blocks() as demo:
name_input = gr.Textbox(label="Enter your name")
query_input = gr.Textbox(label="Enter your query")
# "Generate Outputs" button is now placed right after the query input
generate_button = gr.Button("Generate Outputs")
output_1 = gr.Textbox(label="Output 1", interactive=False)
output_2 = gr.Textbox(label="Output 2", interactive=False)
preference = gr.Radio(["Output 1", "Output 2"], label="Choose your preferred output")
broken_flag = gr.Checkbox(label="Mark as Broken Response")
submit_button = gr.Button("Submit Preference")
generate_button.click(greet, inputs=query_input, outputs=[output_1, output_2])
submit_button.click(
choose_preference,
inputs=[name_input, output_1, output_2, preference, query_input, broken_flag],
).then(
fn=lambda: ("", "", "", "", "", False, ""),
inputs=[],
outputs=[name_input, query_input, output_1, output_2, preference, broken_flag, preference_result]
)
demo.launch() |