Spaces:
Sleeping
Sleeping
File size: 6,745 Bytes
57da107 bf47070 57da107 | 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 | import os
os.environ["OPENAI_API_KEY"]
from llama_index.llms.openai import OpenAI
from llama_index.core.schema import MetadataMode
import openai
from openai import OpenAI as OpenAIOG
import logging
import sys
llm = OpenAI(temperature=0.0, model="gpt-3.5-turbo")
client = OpenAIOG()
from deep_translator import GoogleTranslator
# Load index
from llama_index.core import VectorStoreIndex
from llama_index.core import StorageContext
from llama_index.core import load_index_from_storage
storage_context = StorageContext.from_defaults(persist_dir="single_parse")
index = load_index_from_storage(storage_context)
query_engine = index.as_query_engine(similarity_top_k=3, llm=llm)
retriever = index.as_retriever(similarity_top_k = 3)
import gradio as gr
import re
import json
from datetime import datetime
acknowledgment_keywords = ["thanks", "thank you", "thx", "ok", "okay", "great", "got it",
"appreciate", "good", "makes sense"]
follow_up_keywords = ["but", "also", "and", "what", "how", "why", "when", "is", "?"]
greeting_keywords = ["hi", "hello", "hey", "how's it", "what's up", "yo", "howdy"]
def contains_exact_word_or_phrase(text, keywords):
text = text.lower()
for keyword in keywords:
if re.search(r'\b' + re.escape(keyword) + r'\b', text):
return True
return False
def contains_greeting(question):
# Check if the question contains acknowledgment keywords
return contains_exact_word_or_phrase(question, greeting_keywords)
def contains_acknowledgment(question):
# Check if the question contains acknowledgment keywords
return contains_exact_word_or_phrase(question, acknowledgment_keywords)
def contains_follow_up(question):
# Check if the question contains follow-up indicators
return contains_exact_word_or_phrase(question, follow_up_keywords)
def convert_to_date(date_str):
return datetime.strptime(date_str, "%Y%m%d")
def idahun(question: str, conversation_history: list[str]):
# Get conversation history
context = " ".join([item["user"] + " " + item["chatbot"] for item in conversation_history])
source0 = "RAG not run"
source1 = "RAG not run"
source2 = "RAG not run"
## Process greeting
# greet_response = process_greeting_response(question)
if contains_greeting(question) and not contains_follow_up(question):
greeting = (
f" The user previously asked and answered the following: {context}. "
f" The user just provided the following greeting: {question}. "
"Please respond accordingly."
)
completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": greeting}
]
)
reply_to_user = completion.choices[0].message.content
conversation_history.append({"user": question, "chatbot": reply_to_user})
return reply_to_user, source0, source1, source2, conversation_history
## Process acknowledgment
if contains_acknowledgment(question) and not contains_follow_up(question):
acknowledgment = (
f" The user previously asked and answered the following: {context}. "
f" The user just provided the following acknowledgement: {question}. "
"Please respond accordingly in English."
)
completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": acknowledgment}
]
)
reply_to_user = completion.choices[0].message.content
conversation_history.append({"user": question, "chatbot": reply_to_user})
return reply_to_user, source0, source1, source2, conversation_history
## If not greeting or acknowledgement, then proceed with RAG
# Retrieve sources
sources = retriever.retrieve(question)
source0 = sources[0].text
source1 = sources[1].text
source2 = sources[2].text
background = ("The person who asked the question is a person living with HIV."
" They are asking questions about HIV. Do not talk about anything that is not related to HIV. "
" Recognize that they already have HIV and do not suggest that they have to get tested"
" for HIV or take post-exposure prophylaxis, as that is not relevant, though their partners perhaps should."
" Do not suggest anything that is not relevant to someone who already has HIV."
" Do not mention in the response that the person is living with HIV.")
# Combine into final prompt - user background, conversation history, new question, retrieved sources
question_final = (
f" The user previously asked and answered the following: {context}. "
f" The user just asked the following question: {question}."
f" Please use the following content to generate a response: {source0} {source1} {source2}."
f" Please consider the following background information when generating a response: {background}."
" Keep answers brief and limited to the question that was asked."
" If they share a greeting, just greet them in return and ask if they have a question."
" Do not change the subject or address anything the user didn't directly ask about."
" If they respond with an acknowledgement, simply thank them."
" Do not discuss anything other than HIV. If they ask a question that is not about HIV, respond that"
" you are only able to discuss HIV."
" Keep the response to under 50 words and use simple language. The person asking the question does not know technical terms."
)
# Generate response
completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": question_final}
]
)
# Collect response
reply_to_user = completion.choices[0].message.content
# add question and reply to conversation history
conversation_history.append({"user": question, "chatbot": reply_to_user})
return reply_to_user, source0, source1, source2, conversation_history
demo = gr.Interface(
title = "Idahun Chatbot Demo (English)",
fn=idahun,
inputs=["text", gr.State(value=[])],
outputs = [
gr.Textbox(label="Chatbot Response", type="text"),
gr.Textbox(label="Source 1", max_lines = 10, autoscroll = False, type="text"),
gr.Textbox(label="Source 2", max_lines = 10, autoscroll = False, type="text"),
gr.Textbox(label="Source 3", max_lines = 10, autoscroll = False, type="text"),
gr.State()
],
)
demo.launch()
|