Spaces:
Running
Running
| __import__('pysqlite3') | |
| import sys | |
| sys.modules['sqlite3'] = sys.modules.pop('pysqlite3') | |
| from langchain_chroma import Chroma | |
| from langchain_openai import OpenAIEmbeddings | |
| from langchain_core.messages import HumanMessage | |
| from langchain.chains import create_history_aware_retriever, create_retrieval_chain | |
| from langchain.chains.combine_documents import create_stuff_documents_chain | |
| from langchain_chroma import Chroma | |
| from langchain_openai import OpenAIEmbeddings | |
| from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, PromptTemplate | |
| from langchain_openai import ChatOpenAI | |
| from openai import RateLimitError | |
| from dotenv import load_dotenv | |
| import gradio as gr | |
| load_dotenv() | |
| # OpenAI's GPT model to use | |
| GPT_VERSION = "gpt-3.5-turbo-0125" | |
| # Prompt used to contextualize a question inside the context of a conversation | |
| CONTEXTUALIZATION_PROMPT = """Given a chat history and the latest user question \ | |
| which might reference context in the chat history, formulate a standalone question \ | |
| which can be understood without the chat history. Do NOT answer the question, \ | |
| just reformulate it if needed and otherwise return it as is.""" | |
| # Prompt used for building an answer to a question using the retrieved context | |
| SYSTEM_PROMPT = """You are a marketing assistant for question-answering tasks for a company called Tryolabs. \ | |
| You must answer the question using pieces of retrieved context consisting of blogposts written by Tryolabs. \ | |
| Answer the question in a friendly manner, trying to refer to Tryolabs' content to engage the user and encourage \ | |
| to make contact with the company. \ | |
| When you can, include properly formatted hyperlinks to the content. TRY providing references to different content \ | |
| within the same response. Extract the hyperlink from the context. \ | |
| If you don't know the answer to the question, encourage the user to contact us for more information. \ | |
| Tryolabs' contact email is hello@tryolabs.com. \ | |
| Keep your answers concise. \ | |
| ALWAYS respond with Markdown. \ | |
| You MUST only use information found on the pieces of context given. You MUST NOT attribute any inventions to \ | |
| Tryolabs unless explicitly mentioned on the context. \ | |
| {context}""" | |
| llm = ChatOpenAI(model=GPT_VERSION) | |
| vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=OpenAIEmbeddings()) | |
| retriever = vectorstore.as_retriever(search_type="mmr", search_kwargs={'k': 6, 'lambda_mult': 0.3}) | |
| contextualize_q_prompt = ChatPromptTemplate.from_messages( | |
| [ | |
| ("system", CONTEXTUALIZATION_PROMPT), | |
| MessagesPlaceholder("chat_history"), | |
| ("human", "{input}"), | |
| ] | |
| ) | |
| history_aware_retriever = create_history_aware_retriever(llm, retriever, contextualize_q_prompt) | |
| custom_rag_prompt = ChatPromptTemplate.from_messages( | |
| [ | |
| ("system", SYSTEM_PROMPT), | |
| MessagesPlaceholder("chat_history"), | |
| ("human", "{input}") | |
| ] | |
| ) | |
| document_prompt = PromptTemplate( | |
| input_variables=['page_content', 'title', 'link'], | |
| template="Title: {title}, Link to blogpost: {link}, Content: {page_content}" | |
| ) | |
| qa_chain = create_stuff_documents_chain(llm, custom_rag_prompt, document_prompt=document_prompt) | |
| rag_chain = create_retrieval_chain(history_aware_retriever, qa_chain) | |
| def predict(message, history): | |
| chat_history = [] | |
| for m, a in history: | |
| chat_history.append(HumanMessage(content=m)) | |
| chat_history.append(a) | |
| try: | |
| ai_response = rag_chain.invoke({"input": message, "chat_history": chat_history}) | |
| answer = ai_response["answer"] | |
| except RateLimitError as e: | |
| if "You exceeded your current quota" in e.message: | |
| answer = "This demo has ran out of credits! Come back again soon and try it out" | |
| else: | |
| answer = "There seems to be a problem with the OpenAI API. We'll look into it!" | |
| except Exception as e: | |
| answer = "There seems to be a problem with the OpenAI API. We'll look into it!" | |
| return answer | |
| theme = gr.themes.Default().set( | |
| button_primary_background_fill_dark="#26C8A1", | |
| button_primary_background_fill_hover_dark="#3cd6b2", | |
| button_primary_border_color_dark="#26C8A1", | |
| button_primary_text_color_dark="#0B0723", | |
| background_fill_primary_dark="#0B0723", | |
| ) | |
| gr.ChatInterface( | |
| fn=predict, | |
| examples=[ | |
| "What experience do you have working with pricing optimization?", | |
| "How can I build my own MLOps pipeline?", | |
| "How can I fine-tune my own LLMs?" | |
| ], | |
| theme=theme | |
| ).launch() |