Spaces:
Runtime error
Runtime error
import logging | |
import os | |
import json | |
import gradio as gr | |
from langchain import PromptTemplate, LLMChain | |
from langchain.chains.question_answering import load_qa_chain | |
from langchain.vectorstores import FAISS | |
from langchain.embeddings import HuggingFaceEmbeddings | |
from langchain.chat_models import ChatOpenAI | |
from prompts import PROMPT_EXTRACT_DATE, PROMPT_FED_ANALYST | |
from filterminutes import search_with_filter | |
from examples import FedMinutesSearch | |
# --------------------------Load the sentence transformer and the vector store--------------------------# | |
model_name = 'sentence-transformers/all-mpnet-base-v2' | |
model_kwargs = {'device': 'cpu'} | |
encode_kwargs = {'normalize_embeddings': False} | |
embeddings = HuggingFaceEmbeddings(model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs) | |
vs = FAISS.load_local("MINUTES_FOMC_HISTORY", embeddings) | |
# --------------------------Import the prompts------------------# | |
PROMPT_DATE = PromptTemplate.from_template(PROMPT_EXTRACT_DATE) | |
PROMPT_ANALYST = PromptTemplate.from_template(PROMPT_FED_ANALYST) | |
# --------------------------Define the qa chain for answering queries--------------------------# | |
def load_chains(open_ai_key): | |
date_extractor = LLMChain(llm=ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=open_ai_key), | |
prompt=PROMPT_DATE) | |
fed_chain = load_qa_chain(llm=ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0, openai_api_key=open_ai_key), | |
chain_type='stuff', prompt=PROMPT_ANALYST) | |
return date_extractor, fed_chain | |
def get_chain(query, api_key=os.environ['OPENAI_API_KEY']): | |
""" | |
Detects the date, computes similarity, and answers the query using | |
only documents corresponding to the date requested. | |
The query is first passed to the date extractor to extract the date | |
and then to the qa chain to answer the query. | |
Parameters | |
---------- | |
query : str | |
Query to be answered. | |
api_key : str | |
OpenAI API key. | |
Returns | |
Answer to the query. | |
""" | |
date_extractor, fed_chain = load_chains(api_key) | |
logging.info('Extracting the date in numeric format..') | |
date_response = date_extractor.run(query) | |
if date_response == 'False': | |
logging.info( | |
'No date elements found . Running the qa without filtering can output incorrect results.') | |
return 'No date elements found. Please include temporal references in your query. ' \ | |
'If you believe this is wrong, please flag below as appropriate.' | |
else: | |
filter_date = json.loads(date_response) | |
logging.info(f'Date parameters retrieved: {filter_date}') | |
if 'year' not in filter_date: | |
return 'Please add a specific year to the month.' | |
elif (int(filter_date['year']) > 2023 and int(filter_date['month']) > 6) or (int(filter_date['year']) == 1936 and int(filter_date['month']) < 3) or int(filter_date['year']) < 1936: | |
return 'Date is in the future or it is before the earliest of the publicly available records.' \ | |
' If you believe this is wrong, please flag below as appropriate.' | |
filtered_context = search_with_filter(vs, query, init_k=200, step=500, target_k=7, filter_dict=filter_date) | |
logging.info(20 * '-' + 'Metadata for the documents to be used' + 20 * '-') | |
if len(filtered_context) == 0: | |
return 'There is no information in the minutes for the given date. Please check if there were was an FOMC ' \ | |
'meeting on the given date. If you believe this is wrong, please flag below as appropriate.' | |
for doc in filtered_context: | |
logging.info(doc.metadata) | |
return fed_chain({'input_documents': filtered_context[:7], 'question': query})['output_text'] | |
if __name__ == '__main__': | |
app = gr.Interface(fn=get_chain, | |
inputs=[gr.Textbox(lines=2, placeholder="Enter your query", label='Your query'), | |
gr.Textbox(lines=1, placeholder="Your OpenAI API key here", | |
label='OpenAI Key (optional, for heavy use)')], | |
description='Here, you can use a ChatGPT-powered retrieval augmented generation system to ask questions' | |
' about the [minutes](' | |
'https://www.federalreserve.gov/monetarypolicy.htm) of the Federal' | |
' Open Market Committee meetings from March 1936 to June 2023. The answers are ' | |
'tuned to focus on economic, ' | |
'cultural, financial, and political developments occurring at a given time.' | |
' The model actively looks for the presence of date elements in the query ' | |
'and will stop the execution if cannot find them to minimize the risk of model ' | |
'hallucination. Nevertheless, the usual caveats for applications making use of generative AI apply.' | |
' Click the query examples below to see some possible outputs from the model.', | |
article='**Disclaimer**: This app is for demonstration purposes only, and no assurance of uninterrupted' | |
' functionality can be given at this time. Answers may take some' | |
' time to complete ' | |
'during periods of heavy usage. There is still significant work planned ahead. Please be patient :)', | |
analytics_enabled=True, | |
allow_flagging="manual", | |
flagging_options=["error", "not useful", "not true"], | |
outputs=gr.Textbox(lines=1, label='Answer'), | |
title='Search the FED minutes archive', | |
examples=FedMinutesSearch, | |
cache_examples=True | |
) | |
app.queue(concurrency_count=2) | |
app.launch() | |