File size: 4,698 Bytes
c71be5c
08448e8
c71be5c
91b021f
c7a91bb
2398560
c7e3111
 
c71be5c
 
 
 
 
 
08448e8
 
c71be5c
 
 
 
6f9b7ab
60c7d45
 
c71be5c
08448e8
da6beb0
c71be5c
08448e8
1819fdd
da6beb0
 
08448e8
 
91b021f
 
 
c7a91bb
08448e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e91e3dc
 
08448e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da6beb0
08448e8
c71be5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
966bb6b
c71be5c
 
 
 
 
 
 
 
 
02dcacd
53a2ee3
4684ca5
 
6e3c053
 
 
 
 
 
02dcacd
c71be5c
 
 
 
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
import gradio as gr
from sentence_transformers import SentenceTransformer
from huggingface_hub import InferenceClient
import pandas as pd
import torch
import math
import httpcore
setattr(httpcore, 'SyncHTTPTransport', 'AsyncHTTPProxy')

"""
For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
"""
client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")

def get_detailed_instruct(task_description: str, query: str) -> str:
        return f'Instruct: {task_description}\nQuery: {query}'

def respond(
    message,
    history: list[tuple[str, str]],
    max_tokens = 2048,
    temperature = 0.7,
    top_p = 0.95,
):
    #system role
    messages = [{"role": "system", "content": "You are a moslem bot that always give answer based on quran and hadith!"}]

    #make a moslem bot
    messages.append({"role": "user", "content": "I want you to answer strictly based on quran and hadith"})
    messages.append({"role": "assistant", "content": "I'd be happy to help! Please go ahead and provide the sentence you'd like me to analyze. Please specify whether you're referencing a particular verse or hadith (Prophetic tradition) from the Quran or Hadith, or if you're asking me to analyze a general statement."})

    #adding references
    df = pd.read_csv("moslem-bot-reference.csv")
    for index, row in df.iterrows():
        messages.append({"role": "user", "content": row['user']})
        messages.append({"role": "assistant", "content": row['assistant']})

    #adding more references
    selected_references = torch.load('selected_references.sav', map_location=torch.device('cpu'))
    encoded_questions = torch.load('encoded_questions.sav', map_location=torch.device('cpu'))
    
    task = 'Given a web search query, retrieve relevant passages that answer the query'
    queries = [
        get_detailed_instruct(task, message)
    ]

    model = SentenceTransformer('intfloat/multilingual-e5-large-instruct')
    query_embeddings = model.encode(queries, convert_to_tensor=True, normalize_embeddings=True)
    scores = (query_embeddings @ encoded_questions.T) * 100
    selected_references['similarity'] = scores.tolist()[0]
    sorted_references = selected_references.sort_values(by='similarity', ascending=False)
    sorted_references = sorted_references.head(3)
    sorted_references = selected_references.sort_values(by='similarity', ascending=True)

    from googletrans import Translator
    translator = Translator()
    
    for index, row in sorted_references.iterrows():
        print(index)
        print(f'{row["user"]}')
        user = translator.translate(f'{row["user"]}', src='ar', dest='en')
        print(user)
        print(row['assistant'])
        assistant = translator.translate(row['assistant'])
        print(assistant)
        messages.append({"role": "user", "content":user })
        messages.append({"role": "assistant", "content": assistant})

    #history from chat session
    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    #latest user question
    messages.append({"role": "user", "content": message})
    print(messages)

    response = ""

    for message in client.chat_completion(
        messages,
        max_tokens=max_tokens,
        stream=True,
        temperature=temperature,
        top_p=top_p,
    ):
        token = message.choices[0].delta.content

        response += token
        yield response

"""
For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
"""
demo = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Slider(minimum=1, maximum=2048, value=2048, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (nucleus sampling)",
        ),
    ],
    examples=[
                ["Why is men created?"],
                ["How is life after death?"],
                ["Please tell me about superstition!"],
                ["How moses defeat pharaoh?"],
                ["Please tell me about inheritance law in Islam!"],
                ["A woman not wear hijab"],
                ["Worshipping God beside Allah"],
                ["Blindly obey a person"],
                ["Make profit from lending money to a friend"],
            ],
)

if __name__ == "__main__":
    demo.launch()