ambrosfitz commited on
Commit
ff2fdee
1 Parent(s): 066f78f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -74
app.py CHANGED
@@ -1,89 +1,64 @@
1
- import os
2
- from openai import OpenAI
3
- import requests
4
  import gradio as gr
 
5
 
6
- # Initialize OpenAI client
7
- client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
8
 
9
- # Vector database search function
10
- def search_document(query, k=5):
11
- url = "http://154.12.226.68:8000/search"
12
-
13
- payload = {
14
- "text": query,
15
- "k": k
16
- }
17
 
18
- headers = {
19
- "Content-Type": "application/json"
20
- }
 
 
 
 
 
21
 
22
- try:
23
- response = requests.post(url, json=payload, headers=headers)
24
- response.raise_for_status()
25
- return response.json()
26
- except requests.exceptions.RequestException as e:
27
- return f"An error occurred: {e}"
28
 
29
- # Function to query OpenAI
30
- def query_openai(prompt):
31
- try:
32
- response = client.chat.completions.create(
33
- model="gpt-4o-mini",
34
- messages=[
35
- {"role": "system", "content": "You are a helpful assistant. Answer the question based on the provided context."},
36
- {"role": "user", "content": prompt}
37
- ]
38
- )
39
- return response.choices[0].message.content
40
- except Exception as e:
41
- return f"An error occurred while querying OpenAI: {e}"
42
-
43
- # Function to perform vector search and format results
44
- def vector_search(query):
45
- results = search_document(query)
46
- if isinstance(results, str): # Error occurred
47
- return results
48
- if not isinstance(results, dict) or 'results' not in results:
49
- return "Unexpected format in vector database response."
50
 
51
- formatted_results = ""
52
- for i, result in enumerate(results['results'], 1):
53
- content = result['metadata']['content']
54
- source = f"Source {i}: {result['metadata'].get('source', 'Unknown source')}, page {result['metadata'].get('page', 'Unknown page')}"
55
- metadata = ", ".join([f"{k}: {v}" for k, v in result['metadata'].items() if k != 'content'])
56
- formatted_results += f"{source}\nMetadata: {metadata}\nContent: {content}\n\n"
57
 
58
- return formatted_results
59
-
60
- # Combined function for search and query
61
- def search_and_query(question):
62
- # First, perform the vector search
63
- search_results = vector_search(question)
64
 
65
- # Then, use these results to query OpenAI
66
- prompt = f"""Given the following context and question, provide a comprehensive and accurate answer. Use ONLY the information provided in the context to answer. If the context doesn't contain relevant information to answer the question, state that clearly.
67
 
68
- Context:
69
- {search_results}
70
-
71
- Question: {question}
72
-
73
- Answer:"""
74
 
75
- openai_response = query_openai(prompt)
76
 
77
- # Return both the search results and the OpenAI response
78
- return search_results, openai_response
79
-
80
- # Gradio interface
81
- with gr.Blocks() as demo:
82
- question_input = gr.Textbox(label="Enter your question")
83
- search_output = gr.Textbox(label="Vector Search Results")
84
- answer_output = gr.Textbox(label="OpenAI Answer")
85
- query_button = gr.Button("Get Answer")
86
 
87
- query_button.click(search_and_query, inputs=question_input, outputs=[search_output, answer_output])
 
 
 
 
 
 
88
 
89
  demo.launch()
 
 
 
 
1
  import gradio as gr
2
+ import requests
3
 
4
+ API_URL = "http://154.12.226.68:8000"
 
5
 
6
+ def search_document(index_name, query, k):
7
+ url = f"{API_URL}/search/{index_name}"
8
+ payload = {"text": query, "k": k}
9
+ headers = {"Content-Type": "application/json"}
10
+ response = requests.post(url, json=payload, headers=headers)
11
+ results = response.json()
 
 
12
 
13
+ formatted_results = []
14
+ for result in results.get('results', []):
15
+ metadata = result.get('metadata', {})
16
+ formatted_result = f"Source: {metadata.get('source', 'Unknown')}\n"
17
+ formatted_result += f"Page: {metadata.get('page', 'Unknown')}\n"
18
+ formatted_result += f"Content: {metadata.get('content', 'No content available')}\n"
19
+ formatted_result += f"Distance: {result.get('distance', 'Unknown')}\n"
20
+ formatted_results.append(formatted_result)
21
 
22
+ return "\n\n".join(formatted_results)
 
 
 
 
 
23
 
24
+ def qa_document(index_name, question, k):
25
+ url = f"{API_URL}/qa/{index_name}"
26
+ payload = {"text": question, "k": k}
27
+ headers = {"Content-Type": "application/json"}
28
+ response = requests.post(url, json=payload, headers=headers)
29
+ result = response.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
+ answer = result.get('answer', 'No answer available')
32
+ sources = result.get('sources', [])
 
 
 
 
33
 
34
+ formatted_sources = []
35
+ for source in sources:
36
+ formatted_source = f"Source: {source.get('source', 'Unknown')}\n"
37
+ formatted_source += f"Relevance Score: {source.get('relevance_score', 'Unknown')}"
38
+ formatted_sources.append(formatted_source)
 
39
 
40
+ formatted_result = f"Answer: {answer}\n\nSources:\n" + "\n\n".join(formatted_sources)
41
+ return formatted_result
42
 
43
+ with gr.Blocks() as demo:
44
+ gr.Markdown("# Document Search and Question Answering System")
 
 
 
 
45
 
46
+ index_name = gr.Textbox(label="Index Name", value="default")
47
 
48
+ with gr.Tab("Search"):
49
+ search_input = gr.Textbox(label="Search Query")
50
+ search_k = gr.Slider(1, 10, 5, step=1, label="Number of Results")
51
+ search_button = gr.Button("Search")
52
+ search_output = gr.Textbox(label="Search Results", lines=10)
53
+
54
+ search_button.click(search_document, inputs=[index_name, search_input, search_k], outputs=search_output)
 
 
55
 
56
+ with gr.Tab("Question Answering"):
57
+ qa_input = gr.Textbox(label="Question")
58
+ qa_k = gr.Slider(1, 10, 5, step=1, label="Number of Contexts to Consider")
59
+ qa_button = gr.Button("Ask Question")
60
+ qa_output = gr.Textbox(label="Answer and Sources", lines=10)
61
+
62
+ qa_button.click(qa_document, inputs=[index_name, qa_input, qa_k], outputs=qa_output)
63
 
64
  demo.launch()