borgo9 commited on
Commit
cc262ca
·
verified ·
1 Parent(s): 62281a8

Upload csv_rag_gradio_app.py

Browse files
Files changed (1) hide show
  1. csv_rag_gradio_app.py +75 -0
csv_rag_gradio_app.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ from langchain_community.document_loaders.csv_loader import CSVLoader
4
+ from langchain_openai import ChatOpenAI, OpenAIEmbeddings
5
+ from langchain_community.docstore.in_memory import InMemoryDocstore
6
+ from langchain_community.vectorstores import FAISS
7
+ from langchain_core.prompts import ChatPromptTemplate
8
+ from langchain.chains import create_retrieval_chain
9
+ from langchain.chains.combine_documents import create_stuff_documents_chain
10
+ import faiss
11
+ import os
12
+
13
+ # Set your OpenAI API key here or use a secret in HF Spaces
14
+ os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY", "")
15
+
16
+ # Build the RAG pipeline from a CSV file
17
+ def build_rag(csv_path):
18
+ loader = CSVLoader(file_path=csv_path)
19
+ docs = loader.load_and_split()
20
+ embeddings = OpenAIEmbeddings()
21
+ index = faiss.IndexFlatL2(len(embeddings.embed_query(" ")))
22
+ vector_store = FAISS(
23
+ embedding_function=embeddings,
24
+ index=index,
25
+ docstore=InMemoryDocstore(),
26
+ index_to_docstore_id={}
27
+ )
28
+ vector_store.add_documents(documents=docs)
29
+ retriever = vector_store.as_retriever()
30
+ llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
31
+ system_prompt = (
32
+ "You are an assistant for question-answering tasks. "
33
+ "Use the following pieces of retrieved context to answer "
34
+ "the question. If you don't know the answer, say that you "
35
+ "don't know. Use three sentences maximum and keep the "
36
+ "answer concise.\n\n{context}"
37
+ )
38
+ prompt = ChatPromptTemplate.from_messages([
39
+ ("system", system_prompt),
40
+ ("human", "{input}"),
41
+ ])
42
+ question_answer_chain = create_stuff_documents_chain(llm, prompt)
43
+ rag_chain = create_retrieval_chain(retriever, question_answer_chain)
44
+ return rag_chain
45
+
46
+ rag_chain = None
47
+
48
+ def upload_csv(file):
49
+ global rag_chain
50
+ rag_chain = build_rag(file.name)
51
+ return "CSV loaded and indexed! You can now ask questions."
52
+
53
+ def ask_question(question):
54
+ if rag_chain is None:
55
+ return "Please upload a CSV file first."
56
+ try:
57
+ answer = rag_chain.invoke({"input": question})
58
+ return answer['answer']
59
+ except Exception as e:
60
+ return f"Error: {e}"
61
+
62
+ with gr.Blocks() as demo:
63
+ gr.Markdown("# Simple CSV RAG Q&A Bot\nUpload a CSV and ask questions about its content!")
64
+ with gr.Row():
65
+ csv_input = gr.File(label="Upload CSV", file_types=[".csv"])
66
+ upload_btn = gr.Button("Load CSV")
67
+ status = gr.Textbox(label="Status", interactive=False)
68
+ question = gr.Textbox(label="Ask a question about your CSV")
69
+ answer = gr.Textbox(label="Answer", interactive=False)
70
+ ask_btn = gr.Button("Ask")
71
+
72
+ upload_btn.click(upload_csv, inputs=csv_input, outputs=status)
73
+ ask_btn.click(ask_question, inputs=question, outputs=answer)
74
+
75
+ demo.launch()