Spaces:
Sleeping
Sleeping
Upload 3 files
Browse files- README.md +67 -6
- app.py +327 -0
- requirements.txt +5 -0
README.md
CHANGED
@@ -1,13 +1,74 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version:
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: mit
|
11 |
---
|
12 |
|
13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: Enterprise Active Reading Framework
|
3 |
+
emoji: π§
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: purple
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 4.0.0
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: mit
|
11 |
---
|
12 |
|
13 |
+
# Enterprise Active Reading Framework Demo
|
14 |
+
|
15 |
+
A demonstration of the Active Reading concept from ["Learning Facts at Scale with Active Reading"](https://arxiv.org/abs/2508.09494) adapted for enterprise document processing.
|
16 |
+
|
17 |
+
## What is Active Reading?
|
18 |
+
|
19 |
+
Active Reading is a breakthrough approach where AI models generate their own learning strategies to study documents, achieving significant improvements in fact learning and retention:
|
20 |
+
|
21 |
+
- **66% accuracy on SimpleQA** (+313% relative improvement)
|
22 |
+
- **26% accuracy on FinanceBench** (+160% relative improvement)
|
23 |
+
|
24 |
+
## Demo Features
|
25 |
+
|
26 |
+
This Hugging Face Space demonstrates:
|
27 |
+
|
28 |
+
- **Self-Generated Learning Strategies**: The model creates its own approach to reading documents
|
29 |
+
- **Multiple Analysis Types**: Fact extraction, summarization, question generation
|
30 |
+
- **Domain Detection**: Automatically identifies document type (Finance, Legal, Technical, Medical)
|
31 |
+
- **Interactive Interface**: Try different strategies on various document types
|
32 |
+
|
33 |
+
## Enterprise Applications
|
34 |
+
|
35 |
+
The full framework supports:
|
36 |
+
- π Financial report analysis
|
37 |
+
- βοΈ Legal document review
|
38 |
+
- π§ Technical documentation processing
|
39 |
+
- π₯ Medical research summarization
|
40 |
+
- π’ General business document analysis
|
41 |
+
|
42 |
+
## How to Use
|
43 |
+
|
44 |
+
1. Select a sample document or paste your own text
|
45 |
+
2. Choose an Active Reading strategy
|
46 |
+
3. Click "Apply Active Reading" to see the AI's analysis
|
47 |
+
4. Explore the extracted facts, generated questions, and summaries
|
48 |
+
|
49 |
+
## Technical Implementation
|
50 |
+
|
51 |
+
This demo uses:
|
52 |
+
- **Transformer Models**: For natural language understanding
|
53 |
+
- **Pattern Recognition**: For fact extraction and domain detection
|
54 |
+
- **Self-Supervised Learning**: Models generate their own training tasks
|
55 |
+
- **Gradio Interface**: For interactive demonstration
|
56 |
+
|
57 |
+
## Full Enterprise Version
|
58 |
+
|
59 |
+
This is a simplified demo. The complete Enterprise Active Reading Framework includes:
|
60 |
+
|
61 |
+
- **Multi-format Support**: PDF, Word, databases, APIs
|
62 |
+
- **Enterprise Security**: PII detection, encryption, audit logging
|
63 |
+
- **Scalable Deployment**: Docker, Kubernetes, monitoring
|
64 |
+
- **Advanced Evaluation**: Custom benchmarks and performance metrics
|
65 |
+
|
66 |
+
For the full implementation, visit: [GitHub Repository](https://github.com/your-repo/active-reader)
|
67 |
+
|
68 |
+
## Citation
|
69 |
+
|
70 |
+
Based on the research paper:
|
71 |
+
```
|
72 |
+
Lin, J., Berges, V.P., Chen, X., Yih, W.T., Ghosh, G., & OΔuz, B. (2024).
|
73 |
+
Learning Facts at Scale with Active Reading. arXiv:2508.09494.
|
74 |
+
```
|
app.py
ADDED
@@ -0,0 +1,327 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
"""
|
3 |
+
Streamlined Active Reading Demo for Hugging Face Spaces
|
4 |
+
|
5 |
+
This is a simplified version of the Enterprise Active Reading Framework
|
6 |
+
optimized for demo deployment on Hugging Face Spaces.
|
7 |
+
"""
|
8 |
+
|
9 |
+
import gradio as gr
|
10 |
+
import torch
|
11 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
12 |
+
import re
|
13 |
+
from typing import List, Dict, Any
|
14 |
+
import json
|
15 |
+
import logging
|
16 |
+
|
17 |
+
# Setup logging
|
18 |
+
logging.basicConfig(level=logging.INFO)
|
19 |
+
logger = logging.getLogger(__name__)
|
20 |
+
|
21 |
+
class SimpleActiveReader:
|
22 |
+
"""
|
23 |
+
Simplified Active Reading implementation for demo purposes
|
24 |
+
"""
|
25 |
+
|
26 |
+
def __init__(self, model_name: str = "microsoft/DialoGPT-small"):
|
27 |
+
"""Initialize with a smaller model suitable for HF Spaces"""
|
28 |
+
self.model_name = model_name
|
29 |
+
self.device = "cuda" if torch.cuda.is_available() else "cpu"
|
30 |
+
|
31 |
+
logger.info(f"Loading model {model_name} on {self.device}")
|
32 |
+
|
33 |
+
try:
|
34 |
+
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
|
35 |
+
self.model = AutoModelForCausalLM.from_pretrained(model_name)
|
36 |
+
self.model.to(self.device)
|
37 |
+
|
38 |
+
# Add padding token if not present
|
39 |
+
if self.tokenizer.pad_token is None:
|
40 |
+
self.tokenizer.pad_token = self.tokenizer.eos_token
|
41 |
+
|
42 |
+
logger.info("Model loaded successfully")
|
43 |
+
except Exception as e:
|
44 |
+
logger.error(f"Error loading model: {e}")
|
45 |
+
raise
|
46 |
+
|
47 |
+
def extract_facts(self, text: str) -> List[str]:
|
48 |
+
"""Extract facts from text using simple NLP patterns"""
|
49 |
+
# Simple fact extraction using sentence patterns
|
50 |
+
sentences = re.split(r'[.!?]+', text)
|
51 |
+
facts = []
|
52 |
+
|
53 |
+
for sentence in sentences:
|
54 |
+
sentence = sentence.strip()
|
55 |
+
if len(sentence) < 10: # Skip very short sentences
|
56 |
+
continue
|
57 |
+
|
58 |
+
# Look for factual patterns (contains numbers, dates, proper nouns)
|
59 |
+
if (re.search(r'\d+', sentence) or # Contains numbers
|
60 |
+
re.search(r'\b[A-Z][a-z]+\s+[A-Z][a-z]+\b', sentence) or # Proper nouns
|
61 |
+
any(word in sentence.lower() for word in ['is', 'are', 'was', 'were', 'has', 'have'])):
|
62 |
+
facts.append(sentence)
|
63 |
+
|
64 |
+
return facts[:10] # Limit to 10 facts for demo
|
65 |
+
|
66 |
+
def generate_summary(self, text: str, max_length: int = 100) -> str:
|
67 |
+
"""Generate a summary of the text"""
|
68 |
+
# Simple extractive summarization
|
69 |
+
sentences = re.split(r'[.!?]+', text)
|
70 |
+
sentences = [s.strip() for s in sentences if len(s.strip()) > 20]
|
71 |
+
|
72 |
+
if not sentences:
|
73 |
+
return "No content to summarize."
|
74 |
+
|
75 |
+
# Take first few sentences as summary
|
76 |
+
summary_sentences = sentences[:3]
|
77 |
+
summary = '. '.join(summary_sentences)
|
78 |
+
|
79 |
+
if len(summary) > max_length:
|
80 |
+
summary = summary[:max_length] + "..."
|
81 |
+
|
82 |
+
return summary
|
83 |
+
|
84 |
+
def generate_questions(self, text: str) -> List[str]:
|
85 |
+
"""Generate questions based on the text content"""
|
86 |
+
facts = self.extract_facts(text)
|
87 |
+
questions = []
|
88 |
+
|
89 |
+
for fact in facts[:5]: # Limit to 5 questions
|
90 |
+
# Simple question generation patterns
|
91 |
+
if re.search(r'\d+', fact):
|
92 |
+
# For facts with numbers
|
93 |
+
questions.append(f"What is the specific number mentioned regarding {fact.split()[0]}?")
|
94 |
+
elif 'is' in fact.lower():
|
95 |
+
# For definitional facts
|
96 |
+
subject = fact.split(' is ')[0] if ' is ' in fact else fact.split()[0]
|
97 |
+
questions.append(f"What is {subject}?")
|
98 |
+
elif any(word in fact.lower() for word in ['when', 'where', 'who']):
|
99 |
+
questions.append(f"Can you provide details about: {fact[:50]}?")
|
100 |
+
else:
|
101 |
+
# Generic question
|
102 |
+
questions.append(f"What can you tell me about: {fact[:40]}?")
|
103 |
+
|
104 |
+
return questions
|
105 |
+
|
106 |
+
def detect_domain(self, text: str) -> str:
|
107 |
+
"""Detect the domain/topic of the text"""
|
108 |
+
text_lower = text.lower()
|
109 |
+
|
110 |
+
finance_keywords = ['revenue', 'profit', 'financial', 'investment', 'budget', 'cost', 'price', 'money']
|
111 |
+
legal_keywords = ['contract', 'agreement', 'legal', 'law', 'regulation', 'compliance', 'policy']
|
112 |
+
technical_keywords = ['system', 'software', 'algorithm', 'technology', 'data', 'computer', 'technical']
|
113 |
+
medical_keywords = ['patient', 'medical', 'health', 'treatment', 'diagnosis', 'clinical', 'medicine']
|
114 |
+
|
115 |
+
if any(keyword in text_lower for keyword in finance_keywords):
|
116 |
+
return "Finance"
|
117 |
+
elif any(keyword in text_lower for keyword in legal_keywords):
|
118 |
+
return "Legal"
|
119 |
+
elif any(keyword in text_lower for keyword in technical_keywords):
|
120 |
+
return "Technical"
|
121 |
+
elif any(keyword in text_lower for keyword in medical_keywords):
|
122 |
+
return "Medical"
|
123 |
+
else:
|
124 |
+
return "General"
|
125 |
+
|
126 |
+
# Initialize the model
|
127 |
+
try:
|
128 |
+
active_reader = SimpleActiveReader()
|
129 |
+
except Exception as e:
|
130 |
+
logger.error(f"Failed to initialize model: {e}")
|
131 |
+
active_reader = None
|
132 |
+
|
133 |
+
def process_document(text: str, strategy: str) -> tuple:
|
134 |
+
"""
|
135 |
+
Process document with selected strategy
|
136 |
+
|
137 |
+
Returns: (result_text, facts_json, questions_json, summary_text, domain)
|
138 |
+
"""
|
139 |
+
if not active_reader:
|
140 |
+
return "Error: Model not loaded", "", "", "", ""
|
141 |
+
|
142 |
+
if not text.strip():
|
143 |
+
return "Please enter some text to analyze.", "", "", "", ""
|
144 |
+
|
145 |
+
try:
|
146 |
+
# Detect domain
|
147 |
+
domain = active_reader.detect_domain(text)
|
148 |
+
|
149 |
+
# Apply selected strategy
|
150 |
+
if strategy == "Fact Extraction":
|
151 |
+
facts = active_reader.extract_facts(text)
|
152 |
+
result = f"**Extracted {len(facts)} facts:**\n\n" + "\n".join([f"β’ {fact}" for fact in facts])
|
153 |
+
facts_json = json.dumps(facts, indent=2)
|
154 |
+
questions_json = ""
|
155 |
+
summary_text = ""
|
156 |
+
|
157 |
+
elif strategy == "Question Generation":
|
158 |
+
questions = active_reader.generate_questions(text)
|
159 |
+
result = f"**Generated {len(questions)} questions:**\n\n" + "\n".join([f"Q: {q}" for q in questions])
|
160 |
+
facts_json = ""
|
161 |
+
questions_json = json.dumps(questions, indent=2)
|
162 |
+
summary_text = ""
|
163 |
+
|
164 |
+
elif strategy == "Summarization":
|
165 |
+
summary = active_reader.generate_summary(text)
|
166 |
+
result = f"**Summary:**\n\n{summary}"
|
167 |
+
facts_json = ""
|
168 |
+
questions_json = ""
|
169 |
+
summary_text = summary
|
170 |
+
|
171 |
+
elif strategy == "Complete Analysis":
|
172 |
+
facts = active_reader.extract_facts(text)
|
173 |
+
questions = active_reader.generate_questions(text)
|
174 |
+
summary = active_reader.generate_summary(text)
|
175 |
+
|
176 |
+
result = f"""**Domain:** {domain}
|
177 |
+
|
178 |
+
**Summary:**
|
179 |
+
{summary}
|
180 |
+
|
181 |
+
**Key Facts ({len(facts)}):**
|
182 |
+
""" + "\n".join([f"β’ {fact}" for fact in facts]) + f"""
|
183 |
+
|
184 |
+
**Generated Questions ({len(questions)}):**
|
185 |
+
""" + "\n".join([f"Q: {q}" for q in questions])
|
186 |
+
|
187 |
+
facts_json = json.dumps(facts, indent=2)
|
188 |
+
questions_json = json.dumps(questions, indent=2)
|
189 |
+
summary_text = summary
|
190 |
+
|
191 |
+
return result, facts_json, questions_json, summary_text, domain
|
192 |
+
|
193 |
+
except Exception as e:
|
194 |
+
logger.error(f"Processing error: {e}")
|
195 |
+
return f"Error processing document: {str(e)}", "", "", "", ""
|
196 |
+
|
197 |
+
def create_demo():
|
198 |
+
"""Create the Gradio demo interface"""
|
199 |
+
|
200 |
+
# Sample texts for demonstration
|
201 |
+
sample_texts = {
|
202 |
+
"Financial Report": """
|
203 |
+
The company reported quarterly revenue of $150 million in Q3 2024, representing a 15% increase compared to the same period last year. The growth was primarily driven by increased demand for AI-powered solutions and expansion into new markets. Operating expenses totaled $120 million, resulting in a net profit margin of 20%. The company announced plans to hire 200 additional engineers by the end of 2024 to support the growing business. Cash reserves stand at $500 million, providing strong financial stability for future investments.
|
204 |
+
""",
|
205 |
+
|
206 |
+
"Technical Documentation": """
|
207 |
+
The new API endpoint accepts POST requests with JSON payload containing user authentication tokens. The system processes requests using a distributed microservices architecture deployed on Kubernetes clusters. Response times average 150ms with 99.9% uptime reliability. The authentication service uses OAuth 2.0 protocol with JWT tokens that expire after 24 hours. Rate limiting is implemented at 1000 requests per minute per API key. All data is encrypted using AES-256 encryption both in transit and at rest.
|
208 |
+
""",
|
209 |
+
|
210 |
+
"Legal Contract": """
|
211 |
+
This Software License Agreement governs the use of the proprietary software between Company A and Company B. The license term is effective for 36 months from the execution date of January 1, 2024. The licensee agrees to pay annual fees of $50,000 due on each anniversary date. The software may be used by up to 100 concurrent users within the licensee's organization. Termination of this agreement requires 90 days written notice. Both parties agree to maintain confidentiality of proprietary information for 5 years beyond contract termination.
|
212 |
+
""",
|
213 |
+
|
214 |
+
"Medical Research": """
|
215 |
+
The clinical trial involved 500 patients diagnosed with Type 2 diabetes over a 12-month period. Participants received either the experimental drug or placebo in a double-blind study design. The treatment group showed a 25% reduction in HbA1c levels compared to baseline measurements. Side effects were reported in 12% of patients, primarily mild gastrointestinal symptoms. The research was conducted across 10 medical centers with IRB approval. Statistical significance was achieved with p-value < 0.001, indicating strong evidence for treatment efficacy.
|
216 |
+
"""
|
217 |
+
}
|
218 |
+
|
219 |
+
with gr.Blocks(title="Enterprise Active Reading Demo", theme=gr.themes.Soft()) as demo:
|
220 |
+
|
221 |
+
gr.Markdown("""
|
222 |
+
# π§ Enterprise Active Reading Framework Demo
|
223 |
+
|
224 |
+
Based on ["Learning Facts at Scale with Active Reading"](https://arxiv.org/abs/2508.09494) - This demo shows how AI models can generate their own learning strategies to extract knowledge from enterprise documents.
|
225 |
+
|
226 |
+
**Key Features:**
|
227 |
+
- **Self-Generated Learning**: The model creates its own reading strategies
|
228 |
+
- **Multiple Strategies**: Fact extraction, summarization, question generation
|
229 |
+
- **Domain Detection**: Automatically identifies document type (Finance, Legal, Technical, Medical)
|
230 |
+
- **Enterprise Ready**: Designed for business document processing
|
231 |
+
""")
|
232 |
+
|
233 |
+
with gr.Row():
|
234 |
+
with gr.Column(scale=2):
|
235 |
+
gr.Markdown("### π Input Document")
|
236 |
+
|
237 |
+
# Sample text selector
|
238 |
+
sample_selector = gr.Dropdown(
|
239 |
+
choices=list(sample_texts.keys()),
|
240 |
+
label="Choose a sample document (optional)",
|
241 |
+
value=None
|
242 |
+
)
|
243 |
+
|
244 |
+
# Text input
|
245 |
+
text_input = gr.Textbox(
|
246 |
+
lines=10,
|
247 |
+
placeholder="Paste your document text here or select a sample above...",
|
248 |
+
label="Document Text",
|
249 |
+
max_lines=20
|
250 |
+
)
|
251 |
+
|
252 |
+
# Strategy selection
|
253 |
+
strategy_selector = gr.Radio(
|
254 |
+
choices=["Fact Extraction", "Question Generation", "Summarization", "Complete Analysis"],
|
255 |
+
value="Complete Analysis",
|
256 |
+
label="Active Reading Strategy"
|
257 |
+
)
|
258 |
+
|
259 |
+
# Process button
|
260 |
+
process_btn = gr.Button("π Apply Active Reading", variant="primary", size="lg")
|
261 |
+
|
262 |
+
with gr.Column(scale=3):
|
263 |
+
gr.Markdown("### π Results")
|
264 |
+
|
265 |
+
# Main results
|
266 |
+
results_output = gr.Markdown(label="Analysis Results")
|
267 |
+
|
268 |
+
# Domain detection
|
269 |
+
domain_output = gr.Textbox(label="π― Detected Domain", interactive=False)
|
270 |
+
|
271 |
+
# Detailed outputs in tabs
|
272 |
+
with gr.Tabs():
|
273 |
+
with gr.Tab("π Extracted Facts"):
|
274 |
+
facts_output = gr.Code(language="json", label="Facts (JSON)")
|
275 |
+
|
276 |
+
with gr.Tab("β Generated Questions"):
|
277 |
+
questions_output = gr.Code(language="json", label="Questions (JSON)")
|
278 |
+
|
279 |
+
with gr.Tab("π Summary"):
|
280 |
+
summary_output = gr.Textbox(lines=5, label="Document Summary")
|
281 |
+
|
282 |
+
# Event handlers
|
283 |
+
def load_sample_text(sample_choice):
|
284 |
+
if sample_choice and sample_choice in sample_texts:
|
285 |
+
return sample_texts[sample_choice]
|
286 |
+
return ""
|
287 |
+
|
288 |
+
sample_selector.change(
|
289 |
+
fn=load_sample_text,
|
290 |
+
inputs=[sample_selector],
|
291 |
+
outputs=[text_input]
|
292 |
+
)
|
293 |
+
|
294 |
+
process_btn.click(
|
295 |
+
fn=process_document,
|
296 |
+
inputs=[text_input, strategy_selector],
|
297 |
+
outputs=[results_output, facts_output, questions_output, summary_output, domain_output]
|
298 |
+
)
|
299 |
+
|
300 |
+
# Examples
|
301 |
+
gr.Markdown("""
|
302 |
+
### π‘ How It Works
|
303 |
+
|
304 |
+
1. **Select a Strategy**: Choose how you want the AI to "read" your document
|
305 |
+
2. **Input Text**: Paste your document or select a sample
|
306 |
+
3. **AI Processing**: The model generates its own learning approach and applies it
|
307 |
+
4. **Extract Knowledge**: Get structured facts, questions, or summaries
|
308 |
+
|
309 |
+
**Enterprise Applications:**
|
310 |
+
- π Financial report analysis
|
311 |
+
- βοΈ Legal document review
|
312 |
+
- π§ Technical documentation processing
|
313 |
+
- π₯ Medical research summarization
|
314 |
+
|
315 |
+
---
|
316 |
+
*This is a simplified demo. The full enterprise framework includes security features, multi-format document support, and production deployment capabilities.*
|
317 |
+
""")
|
318 |
+
|
319 |
+
return demo
|
320 |
+
|
321 |
+
if __name__ == "__main__":
|
322 |
+
demo = create_demo()
|
323 |
+
demo.launch(
|
324 |
+
share=True,
|
325 |
+
server_name="0.0.0.0",
|
326 |
+
server_port=7860
|
327 |
+
)
|
requirements.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Minimal requirements for Hugging Face Spaces demo
|
2 |
+
torch>=2.0.0
|
3 |
+
transformers>=4.30.0
|
4 |
+
gradio>=4.0.0
|
5 |
+
numpy>=1.24.0
|