Spaces:
Sleeping
Sleeping
| # app.py | |
| import os | |
| from dotenv import load_dotenv | |
| from pydantic import BaseModel | |
| from qdrant_search import QdrantSearch | |
| from langchain_groq import ChatGroq | |
| from nomic_embeddings import EmbeddingsModel | |
| import gradio as gr | |
| load_dotenv() | |
| import warnings | |
| warnings.filterwarnings("ignore", category=FutureWarning) | |
| os.environ["TOKENIZERS_PARALLELISM"] = "FALSE" | |
| # Initialize global variables | |
| collection_names = ["docs_v1_2", "docs_v2_2", "docs_v3_2"] | |
| limit = 5 | |
| llm = ChatGroq(model="mixtral-8x7b-32768") | |
| embeddings = EmbeddingsModel() | |
| search = QdrantSearch( | |
| qdrant_url=os.environ["QDRANT_CLOUD_URL"], | |
| api_key=os.environ["QDRANT_API_KEY"], | |
| embeddings=embeddings | |
| ) | |
| # Define the query processing function | |
| def chat_with_langassist(query: str): | |
| if not query.strip(): | |
| return "Query cannot be empty.", [] | |
| # Retrieve relevant documents from Qdrant | |
| retrieved_docs = search.query_multiple_collections(query, collection_names, limit) | |
| # Prepare the context from retrieved documents | |
| context = "\n".join([doc['text'] for doc in retrieved_docs]) | |
| # Construct the prompt with context and question | |
| prompt = ( | |
| # "You are LangAssist, a knowledgeable assistant for the LangChain Python Library. " | |
| # "Given the following context from the documentation, provide a helpful answer to the user's question.\n\n" | |
| # "Context:\n{context}\n\n" | |
| # "Question: {question}\n\n" | |
| # "Answer:" | |
| "You are LangChat, a knowledgeable assistant for the LangChain Python Library. " | |
| "Given the following context from the documentation, provide a helpful answer to the user's question. \n\n" | |
| "Context:\n{context}\n\n" | |
| "You can ignore the context if the question is a simple chat like Hi, hello, and just respond in a normal manner as LangChat, otherwise use the context to answer the query." | |
| "If you can't find the answer from the sources, mention that clearly instead of making up an answer.\n\n" | |
| "Question: {question}\n\n" | |
| "Answer:" | |
| ).format(context=context, question=query) | |
| # Generate an answer using the language model | |
| try: | |
| answer = llm.invoke(prompt).content.strip() | |
| except Exception as e: | |
| return f"Error: {str(e)}", [] | |
| # Prepare sources | |
| sources = [ | |
| { | |
| "source": doc['source'], | |
| "text": doc['text'] | |
| } for doc in retrieved_docs | |
| ] | |
| return answer, sources | |
| # Define Gradio interface | |
| with gr.Blocks() as demo: | |
| gr.Markdown("<h1>LangAssist Chat</h1>") | |
| chatbot = gr.Chatbot() | |
| msg = gr.Textbox() | |
| clear = gr.Button("Clear") | |
| sources_display = gr.Markdown(label="Sources") | |
| def respond(message, chat_history, sources_display): | |
| answer, sources = chat_with_langassist(message) | |
| chat_history.append((message, answer)) | |
| if sources: | |
| formatted_sources = "\n".join([f"- **Source:** {source['source']}\n **Text:** {source['text']}" for source in sources]) | |
| else: | |
| formatted_sources = "No sources available." | |
| return chat_history, gr.update(value=''), formatted_sources | |
| msg.submit(respond, [msg, chatbot, sources_display], [chatbot, msg, sources_display]) | |
| clear.click(lambda: None, None, [chatbot, sources_display]) | |
| # Run the Gradio app | |
| if __name__ == "__main__": | |
| demo.launch() |