import gradio as gr import os from langchain_community.vectorstores import FAISS from langchain_together import TogetherEmbeddings, Together from langchain.prompts import ChatPromptTemplate from langchain.schema.runnable import RunnablePassthrough from langchain.schema.output_parser import StrOutputParser from langchain.memory import ConversationBufferMemory from typing import List, Tuple import re TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY') class ChatBot: def __init__(self): self.embeddings = TogetherEmbeddings( model="togethercomputer/m2-bert-80M-32k-retrieval", together_api_key=TOGETHER_API_KEY ) self.vectorstore = FAISS.load_local( ".", embeddings=self.embeddings, allow_dangerous_deserialization=True ) self.retriever = self.vectorstore.as_retriever() self.model = Together( model="meta-llama/Llama-3.3-70B-Instruct-Turbo", temperature=0.4, max_tokens=256, top_k=30, together_api_key=TOGETHER_API_KEY ) self.memory = ConversationBufferMemory( return_messages=True, memory_key="chat_history", output_key="answer" ) self.template = """Quyidagi ko'rsatmalarga qat'iy rioya qiling: 1. Faqat o'zbek tilida javob bering 2. Faqat berilgan ma'lumotlar asosida javob bering 3. Agar savol tushunarsiz bo'lsa yoki ma'lumot bo'lmasa, "Kechirasiz, bu haqida ma'lumotga ega emasman" deb javob bering 4. O'zingizdan savol bermang 5. Javobni takrorlamang 6. Salomlashish uchun "Assalomu alaykum" yoki "Vaalaykum assalom" dan foydalaning Kontekst: {context} Suhbat Tarixi: {chat_history} Savol: {question} Javob:""" self.prompt = ChatPromptTemplate.from_template(self.template) self.chain = ( { "context": self.retriever, "chat_history": lambda x: self.get_chat_history(), "question": RunnablePassthrough() } | self.prompt | self.model | StrOutputParser() ) def get_chat_history(self) -> str: messages = self.memory.load_memory_variables({})["chat_history"] return "\n".join([f"{m.type}: {m.content}" for m in messages]) def process_response(self, response: str) -> str: unwanted_tags = ["[INST]", "[/INST]", "", ""] for tag in unwanted_tags: response = response.replace(tag, "") response = re.sub(r"```.*?```", "", response, flags=re.DOTALL) response = re.sub(r"print\(.*?\)", "", response) response = re.sub(r'\s+', ' ', response) return response.strip() def chat(self, message: str, history: List[Tuple[str, str]]) -> str: try: if message == "__init__": return "Assalomu alaykum. Sizga qanday yordam bera olaman?" self.memory.chat_memory.add_user_message(message) response = self.chain.invoke(message) clean_response = self.process_response(response) if not clean_response or len(clean_response.split()) < 3: clean_response = "Kechirasiz, savolingizni tushunolmadim. Iltimos, batafsilroq savol bering." self.memory.chat_memory.add_ai_message(clean_response) return clean_response except Exception as e: return f"Xatolik yuz berdi: {str(e)}" def reset_chat(self) -> List[Tuple[str, str]]: self.memory.clear() return [] def create_demo() -> gr.Interface: chatbot = ChatBot() with gr.Blocks() as demo: gr.Markdown("""# RAG Chatbot Beeline Uzbekistanning jismoniy shaxslar uchun tariflari haqida ma'lumotlar beruvchi bot""") chatbot_interface = gr.Chatbot( height=600, show_copy_button=True, ) with gr.Row(): msg = gr.Textbox( show_label=False, placeholder="Xabaringizni shu yerda yozing", container=False ) submit = gr.Button("Xabarni yuborish", variant="primary") clear = gr.Button("Yangi suhbat") def respond(message, chat_history): message = message.strip() if not message: return "", chat_history bot_message = chatbot.chat(message, chat_history) chat_history.append((message, bot_message)) return "", chat_history def init_chat(): initial_greeting = chatbot.chat("__init__", []) return [("", initial_greeting)] submit.click(respond, [msg, chatbot_interface], [msg, chatbot_interface]) msg.submit(respond, [msg, chatbot_interface], [msg, chatbot_interface]) clear.click(init_chat, None, chatbot_interface) demo.load(init_chat, None, chatbot_interface) return demo demo = create_demo() if __name__ == "__main__": demo.launch()