|
@@ -0,0 +1,80 @@
|
|
|
+import time
|
|
|
+import os
|
|
|
+from dotenv import load_dotenv
|
|
|
+from config import system_prompt
|
|
|
+from langchain.globals import set_llm_cache
|
|
|
+from langchain_community.cache import SQLiteCache
|
|
|
+from embeddings import load_embeddings
|
|
|
+from rag_chain import simple_rag_prompt, get_context
|
|
|
+import pandas as pd
|
|
|
+from langchain_openai import OpenAIEmbeddings
|
|
|
+from langchain_chroma import Chroma
|
|
|
+
|
|
|
+# Load environment variables
|
|
|
+load_dotenv('environment.env')
|
|
|
+
|
|
|
+# Set up cache
|
|
|
+set_llm_cache(SQLiteCache(database_path=".langchain.db"))
|
|
|
+
|
|
|
+# Load standard QA data
|
|
|
+qa_df = pd.read_csv('log_record_rows.csv')
|
|
|
+
|
|
|
+# Initialize embeddings and Chroma
|
|
|
+embeddings_model = OpenAIEmbeddings()
|
|
|
+vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=embeddings_model)
|
|
|
+
|
|
|
+def search_similarity(query, SIMILARITY_THRESHOLD=0.82):
|
|
|
+ docs_and_scores = vectorstore.similarity_search_with_relevance_scores(query, k=1)
|
|
|
+ if docs_and_scores:
|
|
|
+ doc, score = docs_and_scores[0]
|
|
|
+ if score >= SIMILARITY_THRESHOLD:
|
|
|
+ # Find the corresponding answer in the qa_df
|
|
|
+ question = doc.page_content
|
|
|
+ answer = qa_df[qa_df['question'] == question]['answer'].values
|
|
|
+ if len(answer) > 0:
|
|
|
+ return answer[0], score
|
|
|
+ return None, 0
|
|
|
+
|
|
|
+def main():
|
|
|
+ # Load embeddings and index
|
|
|
+ embeddings, docs, df, index = load_embeddings()
|
|
|
+
|
|
|
+ # Define retrieval chain
|
|
|
+ retrieval_chain = lambda q: get_context(q, index, docs)
|
|
|
+
|
|
|
+ print("RAG system initialized. You can start asking questions.")
|
|
|
+ print("Type 'quit' to exit the program.")
|
|
|
+
|
|
|
+ while True:
|
|
|
+ user_input = input("\nEnter your question: ")
|
|
|
+
|
|
|
+ if user_input.lower() == 'quit':
|
|
|
+ break
|
|
|
+
|
|
|
+ start_time = time.time()
|
|
|
+
|
|
|
+ try:
|
|
|
+ # First, search in the standard QA
|
|
|
+ standard_answer, similarity_score = search_similarity(user_input)
|
|
|
+
|
|
|
+ if standard_answer is not None:
|
|
|
+ print(f"\nAnswer (from standard QA): {standard_answer}")
|
|
|
+ # print(f"Similarity Score: {similarity_score:.4f}")
|
|
|
+ else:
|
|
|
+ # If not found in standard QA, use RAG
|
|
|
+ rag_answer, rag_similarity_score = simple_rag_prompt(retrieval_chain, user_input)
|
|
|
+ print(f"\nAnswer (from RAG): {rag_answer}")
|
|
|
+ # print(f"Retrieval Similarity Score: {rag_similarity_score:.4f}")
|
|
|
+
|
|
|
+ end_time = time.time()
|
|
|
+ response_time = end_time - start_time
|
|
|
+ print(f"Response Time: {response_time:.2f} seconds")
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ print(f"Error processing question: {str(e)}")
|
|
|
+
|
|
|
+ # Add a small delay to avoid rate limiting
|
|
|
+ time.sleep(1)
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ main()
|