File size: 4,107 Bytes
eaa0108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3cc511b
eaa0108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from llama_index.core import SimpleDirectoryReader
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import SummaryIndex, VectorStoreIndex
from llama_index.core.tools import QueryEngineTool
from llama_index.core.query_engine.router_query_engine import RouterQueryEngine
from llama_index.core.selectors import LLMSingleSelector
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.groq import Groq
from llama_index.core import Settings
from langchain.embeddings.huggingface import HuggingFaceEmbeddings

import os
from dotenv import load_dotenv
load_dotenv()

GROQ_API_KEY = os.getenv("GROQ_API_KEY")

embed_model= HuggingFaceEmbeddings(model_name="BAAI/bge-large-en-v1.5")


llm = Groq(model="llama3-70b-8192", api_key=GROQ_API_KEY)

Settings.llm = llm
Settings.embed_model = embed_model

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("files").load_data()

from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore
import qdrant_client

client = qdrant_client.QdrantClient(
    location=":memory:",
)

vector_store = QdrantVectorStore(
    collection_name = "paper",
    client=client,
    enable_hybrid=True,
    batch_size=20,
)

storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex.from_documents(
    documents,
    embed_model=embed_model,
    storage_context=storage_context,
)

from llama_index.core.memory import ChatMemoryBuffer

memory = ChatMemoryBuffer.from_defaults(token_limit= 3000)

chat_engine = index.as_chat_engine(
    chat_mode="context",
    memory=memory,
    system_prompt=(
        "You are an AI assistant who answers the user questions"
    ),
)



def is_greeting(user_input):

    greetings = ["hello", "hi", "hey", "good morning", "good afternoon", "good evening", "greetings"]
    user_input_lower = user_input.lower().strip()
    return any(greet in user_input_lower for greet in greetings)

def is_bye(user_input):
    greetings = ["bye","thanks", "thank you", "thanks a lot", "bye bye", "have a good day"]
    user_input_lower = user_input.lower().strip()
    return any(greet in user_input_lower for greet in greetings)

import gradio as gr
def chat_with_ai(user_input, chat_history):
    if is_greeting(str(user_input)):
        response = 'hi,how can i help you?'
        chat_history.append((user_input, response))
        return chat_history, ""
    if is_bye(str(user_input)):
        response = "you're welcome"
        chat_history.append((user_input, response))
        return chat_history, ""
    response = chat_engine.chat(user_input)
    full_text = response.response

    references = response.source_nodes
    ref,pages = [],[]
    for i in range(len(references)):
      if references[i].metadata['file_name'] not in ref:
        ref.append(references[i].metadata['file_name'])
      pages.append(references[i].metadata['page_label'])
    complete_response = str(full_text) + "\n\n" + "references:" + str(ref) + "\n\n" + "pages:" + str(pages)
    if ref !=[] :
      chat_history.append((user_input, complete_response))
      ref = []
    elif ref==[] :
      chat_history.append((user_input,str(response)))

    return chat_history, ""


def gradio_chatbot():
    with gr.Blocks() as demo:
        gr.Markdown("# Chat Interface for llama3.1_70B with Groq and llama_index")

        chatbot = gr.Chatbot(label="llamaindex Chatbot")
        user_input = gr.Textbox(
            placeholder="Ask a question...", label="Enter your question"
        )

        submit_button = gr.Button("Send")

        chat_history = gr.State([])

        submit_button.click(chat_with_ai, inputs=[user_input, chat_history], outputs=[chatbot, user_input])

        user_input.submit(chat_with_ai, inputs=[user_input, chat_history], outputs=[chatbot, user_input])

    return demo

gradio_chatbot().launch(debug=True)