File size: 3,749 Bytes
0394b1d
f9d1bd8
6dacbc2
 
 
 
 
0394b1d
6dacbc2
 
0394b1d
6dacbc2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0cf95f2
b21cd71
ceaa0db
0cf95f2
b21cd71
 
f9d1bd8
b21cd71
52548bf
b21cd71
f9d1bd8
b21cd71
6dacbc2
b21cd71
 
 
6dacbc2
f9d1bd8
6fea818
c737e57
0cf95f2
6dacbc2
bc17c1b
6dacbc2
 
bc17c1b
6dacbc2
 
bc17c1b
f9d1bd8
6dacbc2
0cf95f2
6fea818
c737e57
0cf95f2
f83a451
6dacbc2
 
 
 
bc17c1b
6dacbc2
7207714
6dacbc2
0cf95f2
6dacbc2
 
 
 
bc17c1b
6dacbc2
 
bc17c1b
6dacbc2
 
bc17c1b
6dacbc2
 
bc17c1b
f9d1bd8
6dacbc2
f9d1bd8
c737e57
f9d1bd8
bc17c1b
f9d1bd8
 
 
 
 
 
 
 
 
 
bc17c1b
f9d1bd8
 
 
b21cd71
f9d1bd8
b21cd71
f9d1bd8
c98d37d
0cf95f2
27307fd
7d59cb9
c2f639d
f83a451
0394b1d
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
import gradio as gr
import requests
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.vectorstores import FAISS
from langchain_community.chat_models.huggingface import ChatHuggingFace
from langchain.schema import SystemMessage, HumanMessage, AIMessage
from langchain_community.llms import HuggingFaceEndpoint

model_name = "sentence-transformers/all-mpnet-base-v2"
embedding_llm = SentenceTransformerEmbeddings(model_name=model_name)

db = FAISS.load_local("faiss_index", embedding_llm, allow_dangerous_deserialization=True)

# Set up Hugging Face model
llm = HuggingFaceEndpoint(
    repo_id="HuggingFaceH4/starchat2-15b-v0.1",
    task="text-generation",
    max_new_tokens=4096,
    temperature=0.6,
    top_p=0.9,
    top_k=40,
    repetition_penalty=1.2,
    do_sample=True,
)
chat_model = ChatHuggingFace(llm=llm)

messages = [
    SystemMessage(content="You are a helpful assistant."),
    HumanMessage(content="Hi AI, how are you today?"),
    AIMessage(content="I'm great thank you. How can I help you?")
]

def handle_message(message: str, mode: str):
    result_text, result_image = "", None
    
    if not message.strip():
        return "Enter a valid message.", None
    
    if mode == "Chat-Message":
        result_text = chat_message(message)
    elif mode == "Web-Search":
        result_text = web_search(message)
    elif mode == "Chart-Generator":
        result_text, result_image = chart_generator(message)
    else:
        result_text = "Select a valid mode."
    
    return result_text, result_image

def chat_message(message: str):
    global messages
    
    prompt = HumanMessage(content=message)
    messages.append(prompt)
    
    response = chat_model.invoke(messages)
    messages.append(response.content)
    
    if len(messages) >= 6:
        messages = messages[-6:]
        
    return f"IT-Assistant: {response.content}"

def web_search(message: str):
    global messages
    
    similar_docs = db.similarity_search(message, k=3)
    
    if similar_docs:
        source_knowledge = "\n".join([x.page_content for x in similar_docs])
    else:
        source_knowledge = ""
        
    augmented_prompt = f"""
    If the answer to the next query is not contained in the Web Search, say 'No Answer Is Available' and then just give guidance for the query.

    Query: {message}

    Web Search:
    {source_knowledge}
    """
    
    prompt = HumanMessage(content=augmented_prompt)
    messages.append(prompt)
    
    response = chat_model.invoke(messages)
    messages.append(response.content)
    
    if len(messages) >= 6:
        messages = messages[-6:]
        
    return f"IT-Assistant: {response.content}"

def chart_generator(message: str):
    global messages

    chart_url = f"https://quickchart.io/natural/{message}"
    response = requests.get(chart_url)

    if response.status_code == 200:
        message_with_description = f"Describe and analyse the content of this chart: {message}"

        prompt = HumanMessage(content=message_with_description)
        messages.append(prompt)

        response = chat_model.invoke(messages)
        messages.append(response.content)
        
        if len(messages) >= 6:
            messages = messages[-6:]

        return f"IT-Assistant: {response.content}", chart_url
    else:
        return f"Can't generate this image. Please provide valid chart details.", None
        
demo = gr.Interface(
    fn=handle_message,
    inputs=["text", gr.Radio(["Chat-Message", "Web-Search", "Chart-Generator"], label="mode", info="Choose a mode and enter your message, then click submit to interact.")],
    outputs=[gr.Textbox(label="Response"), gr.Image(label="Chart", type="auto")],
    title="IT Assistant")

demo.launch()