File size: 5,430 Bytes
c46e62c
eac7abb
 
2ff5a83
 
 
eac7abb
 
 
 
 
 
 
 
 
e3c7652
7750c4a
 
5f10bb4
 
7750c4a
 
73e6552
4f66cb8
 
 
 
 
 
 
 
 
 
 
 
 
 
73e6552
4f66cb8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73e6552
4f66cb8
8bda472
16937bb
8bda472
16937bb
9686f63
7750c4a
eac7abb
f443a92
91dc355
eac7abb
 
 
 
 
 
 
f443a92
eac7abb
b24691a
 
61f786b
 
 
 
 
 
 
 
 
eac7abb
 
73e6552
b4f6b6b
 
 
5f10bb4
a6d68c1
0b9036a
84416f7
 
 
4ac8a4e
1da1b16
 
 
950aabc
 
 
 
 
1da1b16
 
 
eac7abb
534531a
 
 
 
 
 
 
dd3611a
534531a
 
 
 
 
 
 
 
 
 
 
 
 
037abb6
534531a
 
 
 
eac7abb
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
import gradio as gr
# from transformers import pipeline
# from transformers.utils import logging
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
import torch
from llama_index.core import VectorStoreIndex
from llama_index.core import Document
from llama_index.core import Settings
from llama_index.llms.huggingface import (
    HuggingFaceInferenceAPI,
    HuggingFaceLLM,
)
from huggingface_hub import login
import chromadb as chromadb
from chromadb.utils import embedding_functions
import shutil
import os
#

last = 0
CHROMA_DATA_PATH = "chroma_data/"
EMBED_MODEL = "BAAI/bge-m3"
# all-MiniLM-L6-v2
CHUNK_SIZE = 800
CHUNK_OVERLAP = 50
max_results = 3
min_len = 40
min_distance = 0.35
max_distance = 0.6
temperature = 0.55
max_tokens=3072
top_p=0.8
frequency_penalty=0.0
presence_penalty=0.15
jezik = "srpski"

system_sr = "Zoveš se U-Chat AI asistent i pomažeš korisniku usluga kompanije United Group. Korisnik postavlja pitanje ili problem, upareno sa dodatnima saznanjima. Na osnovu toga napiši korisniku kratak i ljubazan odgovor koji kompletira njegov zahtev ili mu daje odgovor na pitanje. "
# " Ako ne znaš odgovor, reci da ne znaš, ne izmišljaj ga."
system_sr += "Usluge kompanije United Group uključuju i kablovsku mrežu za digitalnu televiziju, pristup internetu, uređaj EON SMART BOX za TV sadržaj, kao i fiksnu telefoniju."

chroma_client = chromadb.PersistentClient(CHROMA_DATA_PATH)
embedding_func = embedding_functions.SentenceTransformerEmbeddingFunction(
        model_name=EMBED_MODEL
    )

collection = chroma_client.get_or_create_collection(
        name="chroma_data",
        embedding_function=embedding_func,
        metadata={"hnsw:space": "cosine"},
    )
last = collection.count()

#
HF_TOKEN = "wncSKewozDfuZCXCyFbYbAMHgUrfcrumkc"
#
login(token=("hf_" + HF_TOKEN))

system_propmpt = system_sr

# "facebook/blenderbot-400M-distill",  facebook/blenderbot-400M-distill, stabilityai/stablelm-zephyr-3b, BAAI/bge-small-en-v1.5
Settings.llm = HuggingFaceInferenceAPI(model_name="mistralai/Mistral-Nemo-Instruct-2407",
                              device_map="auto",
                              system_prompt = system_propmpt,
                              context_window=4096,
                              max_new_tokens=256,
#                              stopping_ids=[50278, 50279, 50277, 1, 0],
                              generate_kwargs={"temperature": 0.5, "do_sample": False},
#                              tokenizer_kwargs={"max_length": 4096},
                              tokenizer_name="mistralai/Mistral-Nemo-Instruct-2407", 
                             )
# "BAAI/bge-m3"
Settings.embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2")
#documents = [Document(text="Indian parliament elections happened in April-May 2024. BJP Party won."),
#             Document(text="Indian parliament elections happened in April-May 2021. XYZ Party won."),
#             Document(text="Indian parliament elections happened in 2020. ABC Party won."),
#            ]
#index = VectorStoreIndex.from_documents(
#    documents,
#)
vector_store = ChromaVectorStore(chroma_collection=collection)
index = VectorStoreIndex.from_vector_store(vector_store, embed_model=Settings.embed_model)
query_engine = index.as_query_engine()
def rag(input_text, file):
    if (file):
#        documents = []
#        for f in file:
#            documents += SimpleDirectoryReader(f).load_data()
#        f = file + "*.pdf"
        pathname = os.path.dirname
#        shutil.copyfile(file.name, path)
        print("pathname=", pathname)
        print("basename=", os.path.basename(file))
        print("filename=", file.name)        
        documents = SimpleDirectoryReader(file).load_data()
        index2 = VectorStoreIndex.from_documents(documents)
        query_engine = index2.as_query_engine()
        return query_engine.query(input_text)
#        collection.add(
#            documents=documents,
#        ids=[f"id{last+i}" for i in range(len(documents))],
#        metadatas=[{"state": "s0", "next": "s0", "used": False, "source": 'None', "page": -1, "lang": jezik } for i in range(len(documents)) ]
#    )
    else:
        query_engine = index.as_query_engine()
        return query_engine.query(input_text)

#iface = gr.Interface(fn=rag, inputs=[gr.Textbox(label="Pitanje:", lines=6), gr.File()], 
#                     outputs=[gr.Textbox(label="Odgovor:", lines=6)], 
#                     title="Kako Vam mogu pomoći?",
#                     description= "UChat"
#                    )

def upload_file(filepath):
    documents = SimpleDirectoryReader(filepath).load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine()
    return filepath

with gr.Blocks() as iface:
    gr.Markdown("Uchat")
    file_out = gr.File()
    with gr.Row():
        with gr.Column(scale=1):
            inp = gr.Textbox(label="Pitanje:", lines=6)
            u = gr.UploadButton("Upload a file", file_count="single")
        with gr.Column(scale=1):
            out = gr.Textbox(label="Odgovor:", lines=6)
            sub = gr.Button("Pokreni")

    u.upload(upload_file, u, file_out)
    sub.click(rag, inp, out)
    
iface.launch()