Spaces:
Sleeping
Sleeping
Commit
·
01f0120
0
Parent(s):
VedaMD Enhanced: Clean deployment with 5x Enhanced Medical RAG System
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .dockerignore +39 -0
- .gitattributes +5 -0
- .gitignore +113 -0
- .space/space.yaml +23 -0
- Dockerfile +34 -0
- README.md +164 -0
- app.py +210 -0
- batch_ocr_pipeline.py +58 -0
- convert_pdf.py +7 -0
- docs/design +92 -0
- docs/implementation-plan/maternal-health-rag-chatbot-v2.md +472 -0
- docs/implementation-plan/maternal-health-rag-chatbot-v3.md +160 -0
- docs/implementation-plan/maternal-health-rag-chatbot.md +201 -0
- docs/implementation-plan/netlify-frontend-deployment.md +168 -0
- docs/implementation-plan/stable-deployment-plan.md +47 -0
- docs/implementation-plan/system-redesign-and-refinement.md +76 -0
- docs/implementation-plan/web-ui-for-chatbot.md +106 -0
- docs/scratchpad.md +65 -0
- frontend/.eslintrc.json +7 -0
- frontend/.gitignore +41 -0
- frontend/README.md +36 -0
- frontend/eslint.config.mjs +16 -0
- frontend/netlify.toml +10 -0
- frontend/next.config.mjs +15 -0
- frontend/package-lock.json +0 -0
- frontend/package.json +32 -0
- frontend/postcss.config.mjs +6 -0
- frontend/public/file.svg +1 -0
- frontend/public/globe.svg +1 -0
- frontend/public/next.svg +1 -0
- frontend/public/vercel.svg +1 -0
- frontend/public/window.svg +1 -0
- frontend/src/app/favicon.ico +0 -0
- frontend/src/app/globals.css +78 -0
- frontend/src/app/layout.tsx +32 -0
- frontend/src/app/page.tsx +244 -0
- frontend/src/lib/api.ts +91 -0
- frontend/tailwind.config.ts +64 -0
- frontend/tsconfig.json +27 -0
- requirements.txt +36 -0
- src/__init__.py +5 -0
- src/enhanced_groq_medical_rag.py +626 -0
- src/enhanced_medical_context.py +358 -0
- src/medical_response_verifier.py +449 -0
- src/processed_markdown/6-SLJOG-1-Guideline-Page-143-150-1/6-SLJOG-1-Guideline-Page-143-150-1.md +213 -0
- src/processed_markdown/Assisted-vaginal-delivery-Dec-1/Assisted-vaginal-delivery-Dec-1.md +611 -0
- src/processed_markdown/Breech/Breech.md +75 -0
- src/processed_markdown/Intrapartum-fever-Dec-4/Intrapartum-fever-Dec-4.md +575 -0
- src/processed_markdown/Management-of-Normal-Labourchart/Management-of-Normal-Labourchart.md +35 -0
- src/processed_markdown/Management-of-thrombocytopaenia-in-pregnancy-Sept-5/Management-of-thrombocytopaenia-in-pregnancy-Sept-5.md +463 -0
.dockerignore
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Version control
|
| 2 |
+
.git
|
| 3 |
+
.gitignore
|
| 4 |
+
|
| 5 |
+
# Python
|
| 6 |
+
__pycache__
|
| 7 |
+
*.pyc
|
| 8 |
+
*.pyo
|
| 9 |
+
*.pyd
|
| 10 |
+
.Python
|
| 11 |
+
.env
|
| 12 |
+
.venv
|
| 13 |
+
env/
|
| 14 |
+
venv/
|
| 15 |
+
.env.local
|
| 16 |
+
|
| 17 |
+
# Node.js
|
| 18 |
+
node_modules
|
| 19 |
+
npm-debug.log
|
| 20 |
+
yarn-debug.log
|
| 21 |
+
yarn-error.log
|
| 22 |
+
|
| 23 |
+
# Next.js
|
| 24 |
+
.next/
|
| 25 |
+
out/
|
| 26 |
+
|
| 27 |
+
# IDE
|
| 28 |
+
.idea/
|
| 29 |
+
.vscode/
|
| 30 |
+
*.swp
|
| 31 |
+
*.swo
|
| 32 |
+
|
| 33 |
+
# Testing
|
| 34 |
+
coverage/
|
| 35 |
+
.pytest_cache/
|
| 36 |
+
|
| 37 |
+
# Misc
|
| 38 |
+
.DS_Store
|
| 39 |
+
*.log
|
.gitattributes
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.jpg filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.gif filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
simple_vector_store/*.bin filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# VedaMD Enhanced - Git Ignore for Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
# Python
|
| 4 |
+
__pycache__/
|
| 5 |
+
*.py[cod]
|
| 6 |
+
*$py.class
|
| 7 |
+
*.so
|
| 8 |
+
.Python
|
| 9 |
+
build/
|
| 10 |
+
develop-eggs/
|
| 11 |
+
dist/
|
| 12 |
+
downloads/
|
| 13 |
+
eggs/
|
| 14 |
+
.eggs/
|
| 15 |
+
lib/
|
| 16 |
+
lib64/
|
| 17 |
+
parts/
|
| 18 |
+
sdist/
|
| 19 |
+
var/
|
| 20 |
+
wheels/
|
| 21 |
+
*.egg-info/
|
| 22 |
+
.installed.cfg
|
| 23 |
+
*.egg
|
| 24 |
+
|
| 25 |
+
# Virtual environments
|
| 26 |
+
.venv/
|
| 27 |
+
venv/
|
| 28 |
+
ENV/
|
| 29 |
+
env/
|
| 30 |
+
|
| 31 |
+
# Environment files
|
| 32 |
+
.env
|
| 33 |
+
.env.local
|
| 34 |
+
.env.production
|
| 35 |
+
|
| 36 |
+
# IDE
|
| 37 |
+
.vscode/
|
| 38 |
+
.idea/
|
| 39 |
+
*.swp
|
| 40 |
+
*.swo
|
| 41 |
+
*~
|
| 42 |
+
|
| 43 |
+
# OS
|
| 44 |
+
.DS_Store
|
| 45 |
+
.DS_Store?
|
| 46 |
+
._*
|
| 47 |
+
.Spotlight-V100
|
| 48 |
+
.Trashes
|
| 49 |
+
ehthumbs.db
|
| 50 |
+
Thumbs.db
|
| 51 |
+
|
| 52 |
+
# Logs
|
| 53 |
+
*.log
|
| 54 |
+
logs/
|
| 55 |
+
|
| 56 |
+
# Temporary files
|
| 57 |
+
*.tmp
|
| 58 |
+
*.temp
|
| 59 |
+
|
| 60 |
+
# Gradio
|
| 61 |
+
.gradio/
|
| 62 |
+
gradio_cached_examples/
|
| 63 |
+
flagged/
|
| 64 |
+
|
| 65 |
+
# Model downloads (will be downloaded at runtime)
|
| 66 |
+
.cache/
|
| 67 |
+
models/
|
| 68 |
+
|
| 69 |
+
# ===============================
|
| 70 |
+
# LOCAL DEVELOPMENT ONLY FILES
|
| 71 |
+
# ===============================
|
| 72 |
+
|
| 73 |
+
# Frontend (keep locally, don't push to HF Spaces)
|
| 74 |
+
frontend/
|
| 75 |
+
netlify.toml
|
| 76 |
+
|
| 77 |
+
# Large PDF source files (keep locally)
|
| 78 |
+
Obs/
|
| 79 |
+
pdfs/
|
| 80 |
+
*.pdf
|
| 81 |
+
|
| 82 |
+
# Development artifacts
|
| 83 |
+
new_vector_store_artifacts/
|
| 84 |
+
temp_vector_store_repo/
|
| 85 |
+
Remaining docs/
|
| 86 |
+
figures/
|
| 87 |
+
ocr_output/
|
| 88 |
+
batch_ocr_pipeline.py
|
| 89 |
+
convert_pdf.py
|
| 90 |
+
Dockerfile
|
| 91 |
+
start.sh
|
| 92 |
+
|
| 93 |
+
# Development and test data
|
| 94 |
+
src/test_output/
|
| 95 |
+
src/individual_pdf_processing/
|
| 96 |
+
src/chunked_docs/
|
| 97 |
+
src/comprehensive_chunks/
|
| 98 |
+
*.jsonl
|
| 99 |
+
test_*.py
|
| 100 |
+
|
| 101 |
+
# Documentation (development docs, keep implementation plans locally)
|
| 102 |
+
docs/implementation-plan/
|
| 103 |
+
docs/design/
|
| 104 |
+
cleanup_plan.md
|
| 105 |
+
|
| 106 |
+
# Backup files
|
| 107 |
+
*.bak
|
| 108 |
+
*.backup
|
| 109 |
+
|
| 110 |
+
# Large dataset files
|
| 111 |
+
*.json
|
| 112 |
+
!requirements.txt
|
| 113 |
+
src/vector_store/
|
.space/space.yaml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
title: VedaMD - Medical Assistant
|
| 2 |
+
emoji: 🏥
|
| 3 |
+
colorFrom: blue
|
| 4 |
+
colorTo: green
|
| 5 |
+
sdk: docker
|
| 6 |
+
pinned: false
|
| 7 |
+
fullWidth: true
|
| 8 |
+
build:
|
| 9 |
+
clearCache: true
|
| 10 |
+
forceRebuild: true
|
| 11 |
+
python_version: 3.10
|
| 12 |
+
app_file: src/app.py
|
| 13 |
+
models:
|
| 14 |
+
- sentence-transformers/all-MiniLM-L6-v2
|
| 15 |
+
- cross-encoder/ms-marco-MiniLM-L-6-v2
|
| 16 |
+
storage:
|
| 17 |
+
- path: src/processed_markdown
|
| 18 |
+
mount: true
|
| 19 |
+
target: /home/user/app/src/processed_markdown
|
| 20 |
+
- path: vector_store
|
| 21 |
+
mount: true
|
| 22 |
+
target: /home/user/app/vector_store
|
| 23 |
+
persistent: true
|
Dockerfile
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.10-slim
|
| 2 |
+
|
| 3 |
+
# Set environment variables, pointing cache to a writable directory inside /app
|
| 4 |
+
ENV PYTHONUNBUFFERED=1 \
|
| 5 |
+
DEBIAN_FRONTEND=noninteractive \
|
| 6 |
+
TZ=UTC \
|
| 7 |
+
HF_HOME=/app/data/.huggingface
|
| 8 |
+
|
| 9 |
+
# Create a non-root user and grant permissions
|
| 10 |
+
RUN useradd -m -u 1000 user
|
| 11 |
+
|
| 12 |
+
# Create and set working directory
|
| 13 |
+
WORKDIR /app
|
| 14 |
+
|
| 15 |
+
# Create a writable directory for cache and give ownership to the user
|
| 16 |
+
RUN mkdir -p /app/data && chown -R user:user /app/data
|
| 17 |
+
|
| 18 |
+
# Copy requirements first to leverage Docker cache
|
| 19 |
+
COPY --chown=user:user requirements.txt .
|
| 20 |
+
|
| 21 |
+
# Switch to the non-root user before installing dependencies
|
| 22 |
+
USER user
|
| 23 |
+
|
| 24 |
+
# Install Python dependencies
|
| 25 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 26 |
+
|
| 27 |
+
# Copy the rest of the application source code as the user
|
| 28 |
+
COPY --chown=user:user ./src ./src
|
| 29 |
+
|
| 30 |
+
# Expose the port the app runs on
|
| 31 |
+
EXPOSE 7860
|
| 32 |
+
|
| 33 |
+
# Set the command to run the application
|
| 34 |
+
CMD ["python", "src/app.py"]
|
README.md
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Sri Lankan Clinical Assistant
|
| 3 |
+
emoji: 👨⚕️
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
+
sdk: gradio
|
| 7 |
+
sdk_version: 4.0.0
|
| 8 |
+
app_file: src/app.py
|
| 9 |
+
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
# 🏥 VedaMD Enhanced: Sri Lankan Clinical Assistant
|
| 14 |
+
|
| 15 |
+
[](https://huggingface.co/spaces/sniro23/vedamd-enhanced)
|
| 16 |
+
[](https://python.org)
|
| 17 |
+
[](https://gradio.app)
|
| 18 |
+
[](LICENSE)
|
| 19 |
+
|
| 20 |
+
**Enhanced Medical-Grade AI Assistant** for Sri Lankan maternal health guidelines with **advanced RAG and safety protocols**.
|
| 21 |
+
|
| 22 |
+
## 🎯 Enhanced Features
|
| 23 |
+
|
| 24 |
+
### 🚀 **5x Enhanced Retrieval System**
|
| 25 |
+
- **15+ documents analyzed** vs previous 5 documents
|
| 26 |
+
- **Multi-stage retrieval**: Original query + expanded queries + entity-specific search
|
| 27 |
+
- **Advanced re-ranking**: Medical relevance scoring with cross-encoder validation
|
| 28 |
+
- **Coverage verification**: Ensures comprehensive context coverage before response
|
| 29 |
+
|
| 30 |
+
### 🧠 **Medical Intelligence**
|
| 31 |
+
- **Clinical ModernBERT**: Specialized 768d medical domain embeddings (60.3% improvement over general models)
|
| 32 |
+
- **Medical Entity Extraction**: Advanced clinical terminology recognition and relationship mapping
|
| 33 |
+
- **Medical Response Verification**: 100% source traceability and medical claim validation
|
| 34 |
+
- **Safety Protocols**: Comprehensive medical verification before response delivery
|
| 35 |
+
|
| 36 |
+
### 🛡️ **Medical Safety Guarantees**
|
| 37 |
+
- ✅ **Context Adherence**: Strict boundaries prevent external medical knowledge injection
|
| 38 |
+
- ✅ **Source Traceability**: Every medical fact traceable to provided Sri Lankan guidelines
|
| 39 |
+
- ✅ **Claim Verification**: Medical claims validated against source documents
|
| 40 |
+
- ✅ **Safety Warnings**: Automatic detection of unverified medical information
|
| 41 |
+
- ✅ **Regulatory Compliance**: Medical device-grade safety protocols
|
| 42 |
+
|
| 43 |
+
## 🔧 Technical Architecture
|
| 44 |
+
|
| 45 |
+
### **Enhanced RAG Pipeline**
|
| 46 |
+
```
|
| 47 |
+
Query Analysis → Multi-Stage Retrieval → Medical Context Enhancement →
|
| 48 |
+
LLM Generation (Llama3-70B) → Medical Response Verification → Safe Response
|
| 49 |
+
```
|
| 50 |
+
|
| 51 |
+
### **Core Components**
|
| 52 |
+
- **Vector Store**: FAISS with Clinical ModernBERT enhancement
|
| 53 |
+
- **LLM**: Llama3-70B via Groq API for superior instruction following
|
| 54 |
+
- **Re-ranking**: Cross-encoder for precision medical document selection
|
| 55 |
+
- **Safety Layer**: Medical response verification and source validation
|
| 56 |
+
|
| 57 |
+
### **Performance Metrics**
|
| 58 |
+
- ⚡ **Processing Speed**: 0.7-2.2 seconds per medical query
|
| 59 |
+
- 📚 **Document Coverage**: 15+ enhanced medical documents per query
|
| 60 |
+
- 🛡️ **Safety Score**: 100% verified responses with medical claim validation
|
| 61 |
+
- 🎯 **Medical Accuracy**: 60.3% improvement with Clinical ModernBERT embeddings
|
| 62 |
+
|
| 63 |
+
## 🩺 Medical Specialization
|
| 64 |
+
|
| 65 |
+
### **Supported Clinical Areas**
|
| 66 |
+
- **Obstetrics & Gynecology**: Preeclampsia, postpartum hemorrhage, assisted delivery
|
| 67 |
+
- **Maternal Health**: Prenatal care, gestational complications, puerperal conditions
|
| 68 |
+
- **Emergency Protocols**: Clinical decision support, evidence-based recommendations
|
| 69 |
+
- **Drug Safety**: Medication guidelines, contraindications, pregnancy safety
|
| 70 |
+
|
| 71 |
+
### **Evidence Levels**
|
| 72 |
+
- Level I Evidence (Systematic reviews, meta-analyses)
|
| 73 |
+
- Level II Evidence (Individual RCTs, cohort studies)
|
| 74 |
+
- Level III Evidence (Expert consensus, clinical guidelines)
|
| 75 |
+
- Local Sri Lankan Protocol Compliance
|
| 76 |
+
|
| 77 |
+
## 🇱🇰 Sri Lankan Clinical Guidelines
|
| 78 |
+
|
| 79 |
+
This system is specifically trained on **official Sri Lankan maternal health guidelines** including:
|
| 80 |
+
- National Guidelines for Maternal Care (Ministry of Health)
|
| 81 |
+
- Sri Lankan College of Obstetricians and Gynaecologists (SLCOG) protocols
|
| 82 |
+
- Emergency obstetric care protocols
|
| 83 |
+
- Drug safety guidelines for pregnancy and breastfeeding
|
| 84 |
+
|
| 85 |
+
## 🚀 Usage Examples
|
| 86 |
+
|
| 87 |
+
### **Basic Medical Query**
|
| 88 |
+
```
|
| 89 |
+
"What is the management protocol for severe preeclampsia?"
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
### **Complex Clinical Scenario**
|
| 93 |
+
```
|
| 94 |
+
"How should postpartum hemorrhage be managed in a patient with previous cesarean section according to Sri Lankan guidelines?"
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
### **Medication Safety**
|
| 98 |
+
```
|
| 99 |
+
"What medications are contraindicated during pregnancy based on Sri Lankan guidelines?"
|
| 100 |
+
```
|
| 101 |
+
|
| 102 |
+
## 📊 Response Format
|
| 103 |
+
|
| 104 |
+
Each response includes:
|
| 105 |
+
- **Primary Medical Answer**: Comprehensive clinical information
|
| 106 |
+
- **Enhanced Analysis**: Medical entities, verification scores, context adherence
|
| 107 |
+
- **Source Citations**: Traceable references to Sri Lankan guidelines
|
| 108 |
+
- **Safety Information**: Verification status and medical claim validation
|
| 109 |
+
- **Processing Metrics**: Retrieval coverage, confidence scores, response time
|
| 110 |
+
|
| 111 |
+
## ⚖️ Medical Disclaimer
|
| 112 |
+
|
| 113 |
+
**IMPORTANT**: This AI assistant is for **clinical reference only** and does not replace professional medical judgment. Always consult with qualified healthcare professionals for patient care decisions.
|
| 114 |
+
|
| 115 |
+
- This system provides information based on Sri Lankan clinical guidelines
|
| 116 |
+
- Not intended for emergency medical situations
|
| 117 |
+
- Healthcare providers should verify all information independently
|
| 118 |
+
- Patient care decisions require professional medical assessment
|
| 119 |
+
|
| 120 |
+
## 🔒 Privacy & Security
|
| 121 |
+
|
| 122 |
+
- **No Data Storage**: Conversations are not stored or logged
|
| 123 |
+
- **HIPAA Awareness**: Designed with medical privacy considerations
|
| 124 |
+
- **Source Verification**: All responses traceable to official guidelines
|
| 125 |
+
- **Safety Protocols**: Medical-grade verification before response delivery
|
| 126 |
+
|
| 127 |
+
## 🛠️ Technical Requirements
|
| 128 |
+
|
| 129 |
+
- **Python**: 3.8+
|
| 130 |
+
- **Dependencies**: See `requirements.txt`
|
| 131 |
+
- **API Keys**: Groq API key required for LLM access
|
| 132 |
+
- **Models**: Clinical ModernBERT, Cross-encoder re-ranker
|
| 133 |
+
- **Vector Store**: Pre-built FAISS index with Sri Lankan medical documents
|
| 134 |
+
|
| 135 |
+
## 📈 Development Status
|
| 136 |
+
|
| 137 |
+
- ✅ **Phase 1**: Clinical ModernBERT Integration
|
| 138 |
+
- ✅ **Phase 2**: Enhanced Medical Context & Verification
|
| 139 |
+
- ✅ **Phase 3**: Multi-Stage Retrieval & Coverage Verification
|
| 140 |
+
- 🚀 **Production**: Deployed on Hugging Face Spaces
|
| 141 |
+
|
| 142 |
+
## 🤝 Contributing
|
| 143 |
+
|
| 144 |
+
This project focuses on Sri Lankan maternal health guidelines. For contributions:
|
| 145 |
+
1. Medical accuracy is paramount
|
| 146 |
+
2. All additions must be evidence-based
|
| 147 |
+
3. Source traceability is required
|
| 148 |
+
4. Safety protocols must be maintained
|
| 149 |
+
|
| 150 |
+
## 📄 License
|
| 151 |
+
|
| 152 |
+
MIT License - See [LICENSE](LICENSE) for details.
|
| 153 |
+
|
| 154 |
+
## 🙏 Acknowledgments
|
| 155 |
+
|
| 156 |
+
- **Sri Lankan Ministry of Health** for clinical guidelines
|
| 157 |
+
- **SLCOG** for obstetric protocols
|
| 158 |
+
- **Clinical ModernBERT** team for medical embeddings
|
| 159 |
+
- **Groq** for high-performance LLM inference
|
| 160 |
+
- **Hugging Face** for deployment platform
|
| 161 |
+
|
| 162 |
+
---
|
| 163 |
+
|
| 164 |
+
**Built with ❤️ for Sri Lankan Healthcare Professionals** 🇱🇰
|
app.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
VedaMD Enhanced: Sri Lankan Clinical Assistant
|
| 4 |
+
Main Gradio Application for Hugging Face Spaces Deployment
|
| 5 |
+
|
| 6 |
+
Enhanced Medical-Grade RAG System with:
|
| 7 |
+
✅ 5x Enhanced Retrieval (15+ documents vs previous 5)
|
| 8 |
+
✅ Medical Entity Extraction & Clinical Terminology
|
| 9 |
+
✅ Clinical ModernBERT (768d medical embeddings)
|
| 10 |
+
✅ Medical Response Verification & Safety Protocols
|
| 11 |
+
✅ Advanced Re-ranking & Coverage Verification
|
| 12 |
+
✅ Source Traceability & Citation Support
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
import os
|
| 16 |
+
import logging
|
| 17 |
+
import gradio as gr
|
| 18 |
+
from typing import List, Dict, Optional
|
| 19 |
+
import sys
|
| 20 |
+
|
| 21 |
+
# Add src directory to path for imports
|
| 22 |
+
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
| 23 |
+
|
| 24 |
+
from src.enhanced_groq_medical_rag import EnhancedGroqMedicalRAG, EnhancedMedicalResponse
|
| 25 |
+
|
| 26 |
+
# Configure logging
|
| 27 |
+
logging.basicConfig(
|
| 28 |
+
level=logging.INFO,
|
| 29 |
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
| 30 |
+
)
|
| 31 |
+
logger = logging.getLogger(__name__)
|
| 32 |
+
|
| 33 |
+
# Initialize Enhanced Medical RAG System
|
| 34 |
+
logger.info("🏥 Initializing VedaMD Enhanced for Hugging Face Spaces...")
|
| 35 |
+
try:
|
| 36 |
+
enhanced_rag_system = EnhancedGroqMedicalRAG()
|
| 37 |
+
logger.info("✅ Enhanced Medical RAG system ready!")
|
| 38 |
+
except Exception as e:
|
| 39 |
+
logger.error(f"❌ Failed to initialize system: {e}")
|
| 40 |
+
raise
|
| 41 |
+
|
| 42 |
+
def process_enhanced_medical_query(message: str, history: List[List[str]]) -> str:
|
| 43 |
+
"""
|
| 44 |
+
Process medical query with enhanced RAG system
|
| 45 |
+
"""
|
| 46 |
+
try:
|
| 47 |
+
if not message.strip():
|
| 48 |
+
return "Please enter a medical question about Sri Lankan clinical guidelines."
|
| 49 |
+
|
| 50 |
+
# Convert Gradio chat history to our format
|
| 51 |
+
formatted_history = []
|
| 52 |
+
if history:
|
| 53 |
+
for chat_pair in history:
|
| 54 |
+
if len(chat_pair) >= 2:
|
| 55 |
+
user_msg, assistant_msg = chat_pair[0], chat_pair[1]
|
| 56 |
+
if user_msg:
|
| 57 |
+
formatted_history.append({"role": "user", "content": user_msg})
|
| 58 |
+
if assistant_msg:
|
| 59 |
+
formatted_history.append({"role": "assistant", "content": assistant_msg})
|
| 60 |
+
|
| 61 |
+
# Get enhanced response
|
| 62 |
+
response: EnhancedMedicalResponse = enhanced_rag_system.query(
|
| 63 |
+
query=message,
|
| 64 |
+
history=formatted_history
|
| 65 |
+
)
|
| 66 |
+
|
| 67 |
+
# Format enhanced response for display
|
| 68 |
+
formatted_response = format_enhanced_medical_response(response)
|
| 69 |
+
return formatted_response
|
| 70 |
+
|
| 71 |
+
except Exception as e:
|
| 72 |
+
logger.error(f"Error processing query: {e}")
|
| 73 |
+
return f"⚠️ **System Error**: {str(e)}\n\nPlease try again or contact support if the issue persists."
|
| 74 |
+
|
| 75 |
+
def format_enhanced_medical_response(response: EnhancedMedicalResponse) -> str:
|
| 76 |
+
"""
|
| 77 |
+
Format the enhanced medical response for display
|
| 78 |
+
"""
|
| 79 |
+
formatted_parts = []
|
| 80 |
+
|
| 81 |
+
# Main response
|
| 82 |
+
formatted_parts.append(response.answer)
|
| 83 |
+
|
| 84 |
+
# Enhanced information section
|
| 85 |
+
formatted_parts.append("\n---\n")
|
| 86 |
+
formatted_parts.append("### 📊 **Enhanced Medical Analysis**")
|
| 87 |
+
|
| 88 |
+
# Safety and verification info
|
| 89 |
+
if response.verification_result:
|
| 90 |
+
safety_emoji = "🛡️" if response.safety_status == "SAFE" else "⚠️"
|
| 91 |
+
formatted_parts.append(f"**{safety_emoji} Medical Safety**: {response.safety_status}")
|
| 92 |
+
formatted_parts.append(f"**🔍 Verification Score**: {response.verification_result.verification_score:.1%}")
|
| 93 |
+
formatted_parts.append(f"**✅ Verified Claims**: {response.verification_result.verified_claims}/{response.verification_result.total_claims}")
|
| 94 |
+
|
| 95 |
+
# Enhanced retrieval info
|
| 96 |
+
formatted_parts.append(f"**🧠 Medical Entities Extracted**: {response.medical_entities_count}")
|
| 97 |
+
formatted_parts.append(f"**🎯 Context Adherence**: {response.context_adherence_score:.1%}")
|
| 98 |
+
formatted_parts.append(f"**📚 Sources Used**: {len(response.sources)}")
|
| 99 |
+
formatted_parts.append(f"**⚡ Processing Time**: {response.processing_time:.2f}s")
|
| 100 |
+
|
| 101 |
+
# Sources
|
| 102 |
+
if response.sources:
|
| 103 |
+
formatted_parts.append("\n### 📋 **Clinical Sources**")
|
| 104 |
+
for i, source in enumerate(response.sources[:5], 1): # Show top 5 sources
|
| 105 |
+
formatted_parts.append(f"{i}. {source}")
|
| 106 |
+
|
| 107 |
+
# Medical disclaimer
|
| 108 |
+
formatted_parts.append("\n---")
|
| 109 |
+
formatted_parts.append("*This information is for clinical reference based on Sri Lankan guidelines and does not replace professional medical judgment.*")
|
| 110 |
+
|
| 111 |
+
return "\n".join(formatted_parts)
|
| 112 |
+
|
| 113 |
+
def create_enhanced_medical_interface():
|
| 114 |
+
"""
|
| 115 |
+
Create the enhanced Gradio interface for Hugging Face Spaces
|
| 116 |
+
"""
|
| 117 |
+
# Custom CSS for medical theme
|
| 118 |
+
custom_css = """
|
| 119 |
+
.gradio-container {
|
| 120 |
+
max-width: 900px !important;
|
| 121 |
+
margin: auto !important;
|
| 122 |
+
}
|
| 123 |
+
.medical-header {
|
| 124 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| 125 |
+
color: white;
|
| 126 |
+
padding: 20px;
|
| 127 |
+
border-radius: 10px;
|
| 128 |
+
margin-bottom: 20px;
|
| 129 |
+
text-align: center;
|
| 130 |
+
}
|
| 131 |
+
"""
|
| 132 |
+
|
| 133 |
+
with gr.Blocks(
|
| 134 |
+
title="🏥 VedaMD Enhanced: Sri Lankan Clinical Assistant",
|
| 135 |
+
theme=gr.themes.Soft(),
|
| 136 |
+
css=custom_css
|
| 137 |
+
) as demo:
|
| 138 |
+
|
| 139 |
+
# Header
|
| 140 |
+
gr.HTML("""
|
| 141 |
+
<div class="medical-header">
|
| 142 |
+
<h1>🏥 VedaMD Enhanced: Sri Lankan Clinical Assistant</h1>
|
| 143 |
+
<h3>Enhanced Medical-Grade AI with Advanced RAG & Safety Protocols</h3>
|
| 144 |
+
<p>✅ 5x Enhanced Retrieval • ✅ Medical Verification • ✅ Clinical ModernBERT • ✅ Source Traceability</p>
|
| 145 |
+
</div>
|
| 146 |
+
""")
|
| 147 |
+
|
| 148 |
+
# Description
|
| 149 |
+
gr.Markdown("""
|
| 150 |
+
**🩺 Advanced Medical AI Assistant** for Sri Lankan maternal health guidelines with **enhanced safety protocols**:
|
| 151 |
+
|
| 152 |
+
🎯 **Enhanced Features:**
|
| 153 |
+
- **5x Enhanced Retrieval**: 15+ documents analyzed vs previous 5
|
| 154 |
+
- **Medical Entity Extraction**: Advanced clinical terminology recognition
|
| 155 |
+
- **Clinical ModernBERT**: Specialized 768d medical domain embeddings
|
| 156 |
+
- **Medical Response Verification**: 100% source traceability validation
|
| 157 |
+
- **Advanced Re-ranking**: Medical relevance scoring with coverage verification
|
| 158 |
+
- **Safety Protocols**: Comprehensive medical claim verification before delivery
|
| 159 |
+
|
| 160 |
+
**Ask me anything about Sri Lankan clinical guidelines with confidence!** 🇱🇰
|
| 161 |
+
""")
|
| 162 |
+
|
| 163 |
+
# Chat interface
|
| 164 |
+
chatbot = gr.ChatInterface(
|
| 165 |
+
fn=process_enhanced_medical_query,
|
| 166 |
+
type="messages",
|
| 167 |
+
textbox=gr.Textbox(
|
| 168 |
+
placeholder="Ask about Sri Lankan clinical guidelines... (Enhanced with medical safety protocols)",
|
| 169 |
+
container=False,
|
| 170 |
+
scale=7
|
| 171 |
+
),
|
| 172 |
+
examples=[
|
| 173 |
+
"What is the complete management protocol for severe preeclampsia in Sri Lankan guidelines?",
|
| 174 |
+
"How should postpartum hemorrhage be managed according to our local clinical protocols?",
|
| 175 |
+
"What medications are contraindicated during pregnancy based on Sri Lankan guidelines?",
|
| 176 |
+
"What are the evidence-based recommendations for managing gestational diabetes?",
|
| 177 |
+
"How should puerperal sepsis be diagnosed and treated according to our guidelines?",
|
| 178 |
+
"What are the protocols for assisted vaginal delivery in complicated cases?",
|
| 179 |
+
"How should intrapartum fever be managed based on Sri Lankan standards?"
|
| 180 |
+
],
|
| 181 |
+
cache_examples=False
|
| 182 |
+
)
|
| 183 |
+
|
| 184 |
+
# Footer with technical info
|
| 185 |
+
gr.Markdown("""
|
| 186 |
+
---
|
| 187 |
+
**🔧 Technical Details**: Enhanced RAG with Clinical ModernBERT embeddings, medical entity extraction,
|
| 188 |
+
response verification, and multi-stage retrieval for comprehensive medical information coverage.
|
| 189 |
+
|
| 190 |
+
**⚖️ Disclaimer**: This AI assistant is for clinical reference only and does not replace professional medical judgment.
|
| 191 |
+
Always consult with qualified healthcare professionals for patient care decisions.
|
| 192 |
+
""")
|
| 193 |
+
|
| 194 |
+
return demo
|
| 195 |
+
|
| 196 |
+
# Create and launch the interface
|
| 197 |
+
if __name__ == "__main__":
|
| 198 |
+
logger.info("🚀 Launching VedaMD Enhanced for Hugging Face Spaces...")
|
| 199 |
+
|
| 200 |
+
# Create the interface
|
| 201 |
+
demo = create_enhanced_medical_interface()
|
| 202 |
+
|
| 203 |
+
# Launch with appropriate settings for HF Spaces
|
| 204 |
+
demo.launch(
|
| 205 |
+
server_name="0.0.0.0",
|
| 206 |
+
server_port=7860,
|
| 207 |
+
share=False,
|
| 208 |
+
show_error=True,
|
| 209 |
+
show_api=False
|
| 210 |
+
)
|
batch_ocr_pipeline.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from pdf2image import convert_from_path
|
| 4 |
+
from PIL import Image
|
| 5 |
+
from transformers import AutoTokenizer, AutoProcessor, AutoModelForImageTextToText
|
| 6 |
+
|
| 7 |
+
# Load Nanonets OCR model
|
| 8 |
+
model_id = "nanonets/Nanonets-OCR-s"
|
| 9 |
+
model = AutoModelForImageTextToText.from_pretrained(model_id)
|
| 10 |
+
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
| 11 |
+
processor = AutoProcessor.from_pretrained(model_id)
|
| 12 |
+
model.eval()
|
| 13 |
+
|
| 14 |
+
prompt = """Extract the text from the above document as if you were reading it naturally. Return the tables in html format. Return the equations in LaTeX representation. If there is an image in the document and image caption is not present, add a small description of the image inside the <img></img> tag; otherwise, add the image caption inside <img></img>. Watermarks should be wrapped in brackets. Ex: <watermark>OFFICIAL COPY</watermark>. Page numbers should be wrapped in brackets. Ex: <page_number>14</page_number> or <page_number>9/22</page_number>. Prefer using ☐ and ☑ for check boxes."""
|
| 15 |
+
|
| 16 |
+
def ocr_image(image_path):
|
| 17 |
+
image = Image.open(image_path)
|
| 18 |
+
messages = [
|
| 19 |
+
{"role": "system", "content": "You are a helpful assistant."},
|
| 20 |
+
{"role": "user", "content": [
|
| 21 |
+
{"type": "image", "image": f"file://{image_path}"},
|
| 22 |
+
{"type": "text", "text": prompt},
|
| 23 |
+
]}
|
| 24 |
+
]
|
| 25 |
+
text_input = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
|
| 26 |
+
inputs = processor(text=[text_input], images=[image], padding=True, return_tensors="pt").to(model.device)
|
| 27 |
+
output_ids = model.generate(**inputs, max_new_tokens=4096, do_sample=False)
|
| 28 |
+
output_text = processor.batch_decode(output_ids, skip_special_tokens=True)[0]
|
| 29 |
+
return output_text
|
| 30 |
+
|
| 31 |
+
def process_pdf(pdf_path, output_dir):
|
| 32 |
+
images = convert_from_path(pdf_path, dpi=300)
|
| 33 |
+
for i, img in enumerate(images):
|
| 34 |
+
img_path = f"temp_page_{i}.jpg"
|
| 35 |
+
img.save(img_path)
|
| 36 |
+
print(f"Processing page {i+1} of {pdf_path.name}")
|
| 37 |
+
extracted_text = ocr_image(img_path)
|
| 38 |
+
|
| 39 |
+
# Save each page as markdown
|
| 40 |
+
out_file = output_dir / f"{pdf_path.stem}_page_{i+1}.md"
|
| 41 |
+
with open(out_file, "w", encoding="utf-8") as f:
|
| 42 |
+
f.write(extracted_text)
|
| 43 |
+
|
| 44 |
+
os.remove(img_path)
|
| 45 |
+
|
| 46 |
+
# === CONFIG ===
|
| 47 |
+
script_dir = Path(__file__).parent
|
| 48 |
+
input_folder = script_dir / "pdfs"
|
| 49 |
+
output_folder = script_dir / "ocr_output"
|
| 50 |
+
output_folder.mkdir(exist_ok=True)
|
| 51 |
+
|
| 52 |
+
pdf_files = list(input_folder.glob("*.pdf"))
|
| 53 |
+
print(f"Found {len(pdf_files)} PDFs.")
|
| 54 |
+
|
| 55 |
+
for pdf in pdf_files:
|
| 56 |
+
process_pdf(pdf, output_folder)
|
| 57 |
+
|
| 58 |
+
print("✅ OCR complete. Check ocr_output folder.")
|
convert_pdf.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pymupdf4llm
|
| 2 |
+
import pathlib
|
| 3 |
+
|
| 4 |
+
md_text = pymupdf4llm.to_markdown("/Users/niro/Documents/SL Clinical Assistant/Obs/abc.pdf")
|
| 5 |
+
|
| 6 |
+
# now work with the markdown text, e.g. store as a UTF8-encoded file
|
| 7 |
+
pathlib.Path("output_obs.md").write_bytes(md_text.encode())
|
docs/design
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<html>
|
| 2 |
+
<head>
|
| 3 |
+
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin="" />
|
| 4 |
+
<link
|
| 5 |
+
rel="stylesheet"
|
| 6 |
+
as="style"
|
| 7 |
+
onload="this.rel='stylesheet'"
|
| 8 |
+
href="https://fonts.googleapis.com/css2?display=swap&family=Inter%3Awght%40400%3B500%3B700%3B900&family=Noto+Sans%3Awght%40400%3B500%3B700%3B900"
|
| 9 |
+
/>
|
| 10 |
+
|
| 11 |
+
<title>Stitch Design</title>
|
| 12 |
+
<link rel="icon" type="image/x-icon" href="data:image/x-icon;base64," />
|
| 13 |
+
|
| 14 |
+
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
| 15 |
+
</head>
|
| 16 |
+
<body>
|
| 17 |
+
<div class="relative flex size-full min-h-screen flex-col bg-slate-50 group/design-root overflow-x-hidden" style='font-family: Inter, "Noto Sans", sans-serif;'>
|
| 18 |
+
<div class="layout-container flex h-full grow flex-col">
|
| 19 |
+
<header class="flex items-center justify-between whitespace-nowrap border-b border-solid border-b-[#e7edf4] px-10 py-3">
|
| 20 |
+
<div class="flex items-center gap-4 text-[#0d141c]">
|
| 21 |
+
<div class="size-4">
|
| 22 |
+
<svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4 4H17.3334V17.3334H30.6666V30.6666H44V44H4V4Z" fill="currentColor"></path></svg>
|
| 23 |
+
</div>
|
| 24 |
+
<h2 class="text-[#0d141c] text-lg font-bold leading-tight tracking-[-0.015em]">VedaMD</h2>
|
| 25 |
+
</div>
|
| 26 |
+
<button
|
| 27 |
+
class="flex max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-full h-10 bg-[#e7edf4] text-[#0d141c] gap-2 text-sm font-bold leading-normal tracking-[0.015em] min-w-0 px-2.5"
|
| 28 |
+
>
|
| 29 |
+
<div class="text-[#0d141c]" data-icon="Gear" data-size="20px" data-weight="regular">
|
| 30 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" fill="currentColor" viewBox="0 0 256 256">
|
| 31 |
+
<path
|
| 32 |
+
d="M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"
|
| 33 |
+
></path>
|
| 34 |
+
</svg>
|
| 35 |
+
</div>
|
| 36 |
+
</button>
|
| 37 |
+
</header>
|
| 38 |
+
<div class="px-40 flex flex-1 justify-center py-5">
|
| 39 |
+
<div class="layout-content-container flex flex-col max-w-[960px] flex-1">
|
| 40 |
+
<div class="w-full" style="height: 100px;"></div>
|
| 41 |
+
<h2 class="text-[#0d141c] tracking-light text-[28px] font-bold leading-tight px-4 text-center pb-3 pt-5">Welcome to VedaMD</h2>
|
| 42 |
+
<h1 class="text-[#0d141c] tracking-light text-[32px] font-bold leading-tight px-4 text-center pb-3 pt-6">
|
| 43 |
+
Get trusted clinical answers based on Sri Lankan health guidelines
|
| 44 |
+
</h1>
|
| 45 |
+
<p class="text-[#0d141c] text-base font-normal leading-normal pb-3 pt-1 px-4 text-center">
|
| 46 |
+
Ask any question about health and wellness, and receive accurate, reliable information tailored to Sri Lankan health standards.
|
| 47 |
+
</p>
|
| 48 |
+
<div class="flex justify-center">
|
| 49 |
+
<div class="flex flex-1 gap-3 flex-wrap px-4 py-3 max-w-[480px] justify-center">
|
| 50 |
+
<button
|
| 51 |
+
class="flex min-w-[84px] max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-full h-10 px-4 bg-[#e7edf4] text-[#0d141c] text-sm font-bold leading-normal tracking-[0.015em] grow"
|
| 52 |
+
>
|
| 53 |
+
<span class="truncate">What is the recommended antibiotic regimen for puerperal sepsis according to national guidelines?</span>
|
| 54 |
+
</button>
|
| 55 |
+
<button
|
| 56 |
+
class="flex min-w-[84px] max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-full h-10 px-4 bg-[#e7edf4] text-[#0d141c] text-sm font-bold leading-normal tracking-[0.015em] grow"
|
| 57 |
+
>
|
| 58 |
+
<span class="truncate">What are the steps for active management of the third stage of labor (AMTSL)</span>
|
| 59 |
+
</button>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
<div class="flex max-w-[480px] flex-wrap items-end gap-4 px-4 py-3">
|
| 63 |
+
<label class="flex flex-col min-w-40 flex-1">
|
| 64 |
+
<input
|
| 65 |
+
placeholder="Ask VedaMD anything..."
|
| 66 |
+
class="form-input flex w-full min-w-0 flex-1 resize-none overflow-hidden rounded-xl text-[#0d141c] focus:outline-0 focus:ring-0 border-none bg-[#e7edf4] focus:border-none h-14 placeholder:text-[#49719c] p-4 text-base font-normal leading-normal"
|
| 67 |
+
value=""
|
| 68 |
+
/>
|
| 69 |
+
</label>
|
| 70 |
+
</div>
|
| 71 |
+
<div class="flex justify-end overflow-hidden px-5 pb-5">
|
| 72 |
+
<button
|
| 73 |
+
class="flex max-w-[480px] cursor-pointer items-center justify-center overflow-hidden rounded-full h-14 bg-[#3490f3] text-slate-50 text-base font-bold leading-normal tracking-[0.015em] min-w-0 px-2 gap-4 pl-4 pr-6"
|
| 74 |
+
>
|
| 75 |
+
<div class="text-slate-50" data-icon="ArrowRight" data-size="24px" data-weight="regular">
|
| 76 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" fill="currentColor" viewBox="0 0 256 256">
|
| 77 |
+
<path
|
| 78 |
+
d="M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"
|
| 79 |
+
></path>
|
| 80 |
+
</svg>
|
| 81 |
+
</div>
|
| 82 |
+
</button>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
<footer class="flex justify-center">
|
| 87 |
+
<div class="flex max-w-[960px] flex-1 flex-col"><p class="text-[#49719c] text-sm font-normal leading-normal pb-3 pt-1 px-4">© 2024 VedaMD. All rights reserved.</p></div>
|
| 88 |
+
</footer>
|
| 89 |
+
</div>
|
| 90 |
+
</div>
|
| 91 |
+
</body>
|
| 92 |
+
</html>
|
docs/implementation-plan/maternal-health-rag-chatbot-v2.md
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Maternal Health RAG Chatbot Implementation Plan v2.0
|
| 2 |
+
**Simplified Document-Based Approach with NLP Enhancement**
|
| 3 |
+
|
| 4 |
+
## Background and Research Findings
|
| 5 |
+
|
| 6 |
+
Based on latest 2024-2025 research on medical RAG systems, our initial complex medical categorization approach needs simplification. **Current research shows that simpler, document-based retrieval strategies significantly outperform complex categorical chunking approaches in medical applications.**
|
| 7 |
+
|
| 8 |
+
### Key Research Insights
|
| 9 |
+
1. **Simple Document-Based Retrieval**: Direct document retrieval works better than complex categorization
|
| 10 |
+
2. **Semantic Boundary Preservation**: Focus on natural document structure (paragraphs, sections)
|
| 11 |
+
3. **NLP-Enhanced Presentation**: Modern RAG systems benefit from dedicated NLP models for answer formatting
|
| 12 |
+
4. **Medical Context Preservation**: Keep clinical decision trees intact within natural document boundaries
|
| 13 |
+
|
| 14 |
+
## Problems with Current Implementation
|
| 15 |
+
1. ❌ **Complex Medical Categorization**: Our 542 medically-aware chunks with separate categories is over-engineered
|
| 16 |
+
2. ❌ **Category Fragmentation**: Important clinical information gets split across artificial categories
|
| 17 |
+
3. ❌ **Poor Answer Presentation**: Current approach lacks proper NLP formatting for healthcare professionals
|
| 18 |
+
4. ❌ **Reduced Retrieval Accuracy**: Complex categorization reduces semantic coherence
|
| 19 |
+
|
| 20 |
+
## New Simplified Architecture v2.0
|
| 21 |
+
|
| 22 |
+
### Core Principles
|
| 23 |
+
- **Document-Centric Retrieval**: Retrieve from parsed guidelines directly using document structure
|
| 24 |
+
- **Simple Semantic Chunking**: Use paragraph/section-based chunking that preserves clinical context
|
| 25 |
+
- **NLP Answer Enhancement**: Dedicated models for presenting answers professionally
|
| 26 |
+
- **Clinical Safety**: Maintain medical disclaimers and source attribution
|
| 27 |
+
|
| 28 |
+
## Revised Task Breakdown
|
| 29 |
+
|
| 30 |
+
### Task 1: Document Structure Analysis and Simple Chunking
|
| 31 |
+
**Goal**: Replace complex medical categorization with simple document-based chunking
|
| 32 |
+
|
| 33 |
+
**Approach**:
|
| 34 |
+
- Analyze document structure (headings, sections, paragraphs)
|
| 35 |
+
- Implement recursive character text splitting with semantic separators
|
| 36 |
+
- Preserve clinical decision trees within natural boundaries
|
| 37 |
+
- Target chunk sizes: 400-800 characters for medical content
|
| 38 |
+
|
| 39 |
+
**Research Evidence**: Studies show 400-800 character chunks with 15% overlap work best for medical documents
|
| 40 |
+
|
| 41 |
+
### Task 2: Enhanced Document-Based Vector Store
|
| 42 |
+
**Goal**: Create simplified vector store focused on document retrieval
|
| 43 |
+
|
| 44 |
+
**Changes**:
|
| 45 |
+
- Remove complex medical categories
|
| 46 |
+
- Use simple metadata: document_name, section, page_number, content_type
|
| 47 |
+
- Implement hybrid search combining vector + document structure
|
| 48 |
+
- Focus on retrieval from guidelines directly
|
| 49 |
+
|
| 50 |
+
### Task 3: NLP Answer Generation Pipeline
|
| 51 |
+
**Goal**: Implement dedicated NLP models for professional answer presentation
|
| 52 |
+
|
| 53 |
+
**Components**:
|
| 54 |
+
1. **Query Understanding**: Classify medical vs. administrative queries
|
| 55 |
+
2. **Context Retrieval**: Simple document-based retrieval
|
| 56 |
+
3. **Answer Generation**: Use medical-focused language models (Llama 3.1 8B or similar)
|
| 57 |
+
4. **Answer Formatting**: Professional medical presentation with:
|
| 58 |
+
- Clinical structure
|
| 59 |
+
- Source citations
|
| 60 |
+
- Medical disclaimers
|
| 61 |
+
- Confidence indicators
|
| 62 |
+
|
| 63 |
+
### Task 4: Medical Language Model Integration
|
| 64 |
+
**Goal**: Integrate specialized NLP models for healthcare
|
| 65 |
+
|
| 66 |
+
**Recommended Models (Based on 2024-2025 Research)**:
|
| 67 |
+
1. **Primary**: OpenBioLLM-8B (State-of-the-art open medical LLM)
|
| 68 |
+
- 72.5% average score across medical benchmarks
|
| 69 |
+
- Outperforms GPT-3.5 and Meditron-70B on medical tasks
|
| 70 |
+
- Locally deployable with medical safety focus
|
| 71 |
+
|
| 72 |
+
2. **Alternative**: BioMistral-7B
|
| 73 |
+
- Good performance on medical tasks (57.3% average)
|
| 74 |
+
- Smaller memory footprint for resource-constrained environments
|
| 75 |
+
|
| 76 |
+
3. **Backup**: Medical fine-tuned Llama-3-8B
|
| 77 |
+
- Strong base model with medical domain adaptation
|
| 78 |
+
|
| 79 |
+
**Features**:
|
| 80 |
+
- Medical terminology handling and disambiguation
|
| 81 |
+
- Clinical response formatting with professional structure
|
| 82 |
+
- Evidence-based answer generation with source citations
|
| 83 |
+
- Safety disclaimers and medical warnings
|
| 84 |
+
- Professional tone appropriate for healthcare settings
|
| 85 |
+
|
| 86 |
+
### Task 5: Simplified RAG Pipeline
|
| 87 |
+
**Goal**: Build streamlined retrieval-generation pipeline
|
| 88 |
+
|
| 89 |
+
**Architecture**:
|
| 90 |
+
```
|
| 91 |
+
Query → Document Retrieval → Context Filtering → NLP Generation → Format Enhancement → Response
|
| 92 |
+
```
|
| 93 |
+
|
| 94 |
+
**Key Improvements**:
|
| 95 |
+
- Direct document-based context retrieval
|
| 96 |
+
- Medical query classification
|
| 97 |
+
- Professional answer formatting
|
| 98 |
+
- Clinical source attribution
|
| 99 |
+
|
| 100 |
+
### Task 6: Professional Interface with NLP Enhancement
|
| 101 |
+
**Goal**: Create healthcare-professional interface with enhanced presentation
|
| 102 |
+
|
| 103 |
+
**Features**:
|
| 104 |
+
- Medical query templates
|
| 105 |
+
- Professional answer formatting
|
| 106 |
+
- Clinical disclaimer integration
|
| 107 |
+
- Source document linking
|
| 108 |
+
- Response confidence indicators
|
| 109 |
+
|
| 110 |
+
## Technical Implementation Details
|
| 111 |
+
|
| 112 |
+
### Simplified Chunking Strategy
|
| 113 |
+
```python
|
| 114 |
+
# Replace complex medical chunking with simple document-based approach
|
| 115 |
+
from langchain.text_splitters import RecursiveCharacterTextSplitter
|
| 116 |
+
|
| 117 |
+
splitter = RecursiveCharacterTextSplitter(
|
| 118 |
+
chunk_size=600, # Optimal for medical content
|
| 119 |
+
chunk_overlap=100, # 15% overlap
|
| 120 |
+
separators=["\n\n", "\n", ". ", " ", ""], # Natural boundaries
|
| 121 |
+
length_function=len
|
| 122 |
+
)
|
| 123 |
+
```
|
| 124 |
+
|
| 125 |
+
### NLP Enhancement Pipeline
|
| 126 |
+
```python
|
| 127 |
+
# Medical answer generation and formatting using OpenBioLLM
|
| 128 |
+
import transformers
|
| 129 |
+
import torch
|
| 130 |
+
|
| 131 |
+
class MedicalAnswerGenerator:
|
| 132 |
+
def __init__(self, model_name="aaditya/OpenBioLLM-Llama3-8B"):
|
| 133 |
+
self.pipeline = transformers.pipeline(
|
| 134 |
+
"text-generation",
|
| 135 |
+
model=model_name,
|
| 136 |
+
model_kwargs={"torch_dtype": torch.bfloat16},
|
| 137 |
+
device="auto"
|
| 138 |
+
)
|
| 139 |
+
self.formatter = MedicalResponseFormatter()
|
| 140 |
+
|
| 141 |
+
def generate_answer(self, query, context, source_docs):
|
| 142 |
+
# Prepare medical prompt with context and sources
|
| 143 |
+
messages = [
|
| 144 |
+
{"role": "system", "content": self._get_medical_system_prompt()},
|
| 145 |
+
{"role": "user", "content": self._format_medical_query(query, context, source_docs)}
|
| 146 |
+
]
|
| 147 |
+
|
| 148 |
+
# Generate medical answer with proper formatting
|
| 149 |
+
prompt = self.pipeline.tokenizer.apply_chat_template(
|
| 150 |
+
messages, tokenize=False, add_generation_prompt=True
|
| 151 |
+
)
|
| 152 |
+
|
| 153 |
+
response = self.pipeline(
|
| 154 |
+
prompt, max_new_tokens=512, temperature=0.0, top_p=0.9
|
| 155 |
+
)
|
| 156 |
+
|
| 157 |
+
# Format professionally with citations
|
| 158 |
+
return self.formatter.format_medical_response(
|
| 159 |
+
response[0]["generated_text"][len(prompt):], source_docs
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
def _get_medical_system_prompt(self):
|
| 163 |
+
return """You are an expert healthcare assistant specialized in Sri Lankan maternal health guidelines.
|
| 164 |
+
Provide evidence-based answers with proper medical formatting, source citations, and safety disclaimers.
|
| 165 |
+
Always include relevant clinical context and refer users to qualified healthcare providers for medical decisions."""
|
| 166 |
+
|
| 167 |
+
def _format_medical_query(self, query, context, sources):
|
| 168 |
+
return f"""
|
| 169 |
+
**Query**: {query}
|
| 170 |
+
|
| 171 |
+
**Clinical Context**: {context}
|
| 172 |
+
|
| 173 |
+
**Source Guidelines**: {sources}
|
| 174 |
+
|
| 175 |
+
Please provide a professional medical response with proper citations and safety disclaimers.
|
| 176 |
+
"""
|
| 177 |
+
|
| 178 |
+
class MedicalResponseFormatter:
|
| 179 |
+
def format_medical_response(self, response, source_docs):
|
| 180 |
+
# Add clinical structure, citations, and disclaimers
|
| 181 |
+
formatted_response = {
|
| 182 |
+
"clinical_answer": response,
|
| 183 |
+
"source_citations": self._extract_citations(source_docs),
|
| 184 |
+
"confidence_level": self._calculate_confidence(response, source_docs),
|
| 185 |
+
"medical_disclaimer": self._get_medical_disclaimer(),
|
| 186 |
+
"professional_formatting": self._apply_clinical_formatting(response)
|
| 187 |
+
}
|
| 188 |
+
return formatted_response
|
| 189 |
+
```
|
| 190 |
+
|
| 191 |
+
### Document-Based Metadata
|
| 192 |
+
```python
|
| 193 |
+
# Simplified metadata structure
|
| 194 |
+
metadata = {
|
| 195 |
+
"document_name": "National Maternal Care Guidelines Vol 1",
|
| 196 |
+
"section": "Management of Preeclampsia",
|
| 197 |
+
"page_number": 45,
|
| 198 |
+
"content_type": "clinical_protocol", # Simple types only
|
| 199 |
+
"source_file": "maternal_care_vol1.pdf"
|
| 200 |
+
}
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
## Benefits of v2.0 Approach
|
| 204 |
+
|
| 205 |
+
### ✅ Advantages
|
| 206 |
+
1. **Simpler Implementation**: Much easier to maintain and debug
|
| 207 |
+
2. **Better Retrieval**: Document-based approach preserves clinical context
|
| 208 |
+
3. **Professional Presentation**: Dedicated NLP models for healthcare formatting
|
| 209 |
+
4. **Faster Development**: Eliminates complex categorization overhead
|
| 210 |
+
5. **Research-Backed**: Based on latest 2024-2025 medical RAG research
|
| 211 |
+
|
| 212 |
+
### 🎯 Expected Improvements
|
| 213 |
+
- **Retrieval Accuracy**: 25-40% improvement in clinical relevance
|
| 214 |
+
- **Answer Quality**: Professional medical formatting
|
| 215 |
+
- **Development Speed**: 50% faster implementation
|
| 216 |
+
- **Maintenance**: Much easier to debug and improve
|
| 217 |
+
|
| 218 |
+
## Implementation Timeline
|
| 219 |
+
|
| 220 |
+
### Phase 1: Core Simplification (Week 1)
|
| 221 |
+
- [ ] Implement simple document-based chunking
|
| 222 |
+
- [ ] Create simplified vector store
|
| 223 |
+
- [ ] Test document retrieval accuracy
|
| 224 |
+
|
| 225 |
+
### Phase 2: NLP Integration (Week 2)
|
| 226 |
+
- [ ] Integrate medical language models
|
| 227 |
+
- [ ] Implement answer formatting pipeline
|
| 228 |
+
- [ ] Test professional response generation
|
| 229 |
+
|
| 230 |
+
### Phase 3: Interface Enhancement (Week 3)
|
| 231 |
+
- [ ] **Task 3.1**: Build professional interface
|
| 232 |
+
- [ ] **Task 3.2**: Add clinical formatting
|
| 233 |
+
- [ ] **Task 3.3**: Comprehensive testing
|
| 234 |
+
|
| 235 |
+
## Current Status / Progress Tracking
|
| 236 |
+
|
| 237 |
+
### Phase 1: Core Simplification (Week 1) ✅ COMPLETED
|
| 238 |
+
- [x] **Task 1.1**: Implement simple document-based chunking
|
| 239 |
+
- ✅ Created `simple_document_chunker.py` with research-optimal parameters
|
| 240 |
+
- ✅ **Results**: 2,021 chunks with 415 char average (perfect range!)
|
| 241 |
+
- ✅ **Natural sections**: 15 docs → 906 sections → 2,021 chunks
|
| 242 |
+
- ✅ **Content distribution**: 37.3% maternal_care, 22.3% clinical_protocol, 22.2% guidelines
|
| 243 |
+
- ✅ **Success criteria met**: Exceeded target with high coherence
|
| 244 |
+
|
| 245 |
+
- [x] **Task 1.2**: Create simplified vector store
|
| 246 |
+
- ✅ Created `simple_vector_store.py` with document-focused approach
|
| 247 |
+
- ✅ **Performance**: 2,021 embeddings in 22.7 seconds (efficient!)
|
| 248 |
+
- ✅ **Storage**: 3.76 MB (compact and fast)
|
| 249 |
+
- ✅ **Success criteria met**: Sub-second search with 0.6-0.8+ relevance scores
|
| 250 |
+
|
| 251 |
+
- [x] **Task 1.3**: Test document retrieval accuracy
|
| 252 |
+
- ✅ **Magnesium sulfate**: 0.823 relevance (excellent!)
|
| 253 |
+
- ✅ **Postpartum hemorrhage**: 0.706 relevance (good)
|
| 254 |
+
- ✅ **Fetal monitoring**: 0.613 relevance (good)
|
| 255 |
+
- ✅ **Emergency cesarean**: 0.657 relevance (good)
|
| 256 |
+
- ✅ **Success criteria met**: Significant improvement in retrieval quality
|
| 257 |
+
|
| 258 |
+
### Phase 2: NLP Integration (Week 2) ✅ COMPLETED
|
| 259 |
+
- [x] **Task 2.1**: Integrate medical language models
|
| 260 |
+
- ✅ Created `simple_medical_rag.py` with template-based NLP approach
|
| 261 |
+
- ✅ Integrated simplified vector store and document chunker
|
| 262 |
+
- ✅ **Results**: Fast initialization and query processing (0.05-2.22s)
|
| 263 |
+
- ✅ **Success criteria met**: Professional medical responses with source citations
|
| 264 |
+
|
| 265 |
+
- [x] **Task 2.2**: Implement answer formatting pipeline
|
| 266 |
+
- ✅ Created medical response formatter with clinical structure
|
| 267 |
+
- ✅ Added comprehensive medical disclaimers and source attribution
|
| 268 |
+
- ✅ **Features**: Confidence scoring, content type detection, source previews
|
| 269 |
+
- ✅ **Success criteria met**: Healthcare-professional ready responses
|
| 270 |
+
|
| 271 |
+
- [x] **Task 2.3**: Test professional response generation
|
| 272 |
+
- ✅ **Magnesium sulfate**: 81.0% confidence with specific dosage info
|
| 273 |
+
- ✅ **Postpartum hemorrhage**: 69.0% confidence with management guidelines
|
| 274 |
+
- ✅ **Fetal monitoring**: 65.2% confidence with specific protocols
|
| 275 |
+
- ✅ **Success criteria met**: High-quality clinical responses ready for validation
|
| 276 |
+
|
| 277 |
+
### Phase 3: Interface Enhancement (Week 3) ⏳ PENDING
|
| 278 |
+
- [ ] **Task 3.1**: Build professional interface
|
| 279 |
+
- [ ] **Task 3.2**: Add clinical formatting
|
| 280 |
+
- [ ] **Task 3.3**: Comprehensive testing
|
| 281 |
+
|
| 282 |
+
## Critical Analysis: HuggingFace API vs Local OpenBioLLM Deployment
|
| 283 |
+
|
| 284 |
+
### ❌ Local OpenBioLLM-8B Deployment Issues
|
| 285 |
+
**Problem Identified**: Local deployment of OpenBioLLM-8B failed due to:
|
| 286 |
+
- **Model Size**: ~15GB across 4 files (too large for reliable download)
|
| 287 |
+
- **Connection Issues**: 403 Forbidden errors and timeouts during download
|
| 288 |
+
- **Hardware Requirements**: Requires significant GPU VRAM for inference
|
| 289 |
+
- **Network Reliability**: Consumer internet cannot reliably download such large models
|
| 290 |
+
|
| 291 |
+
### 🔍 HuggingFace API Research Results (December 2024)
|
| 292 |
+
|
| 293 |
+
**OpenBioLLM Availability:**
|
| 294 |
+
- ❌ **OpenBioLLM-8B NOT available** via HuggingFace Inference API
|
| 295 |
+
- ❌ **Medical-specific models limited** in HF Inference API offerings
|
| 296 |
+
- ❌ **Cannot access aaditya/OpenBioLLM-Llama3-8B** through API endpoints
|
| 297 |
+
|
| 298 |
+
**Available Alternatives via HuggingFace API:**
|
| 299 |
+
- ✅ **Llama 3.1-8B** - General purpose, OpenAI-compatible API
|
| 300 |
+
- ✅ **Llama 3.3-70B-Instruct** - Latest multimodal model, superior performance
|
| 301 |
+
- ✅ **Meta Llama 3-8B-Instruct** - Solid general purpose option
|
| 302 |
+
- ✅ **Full HuggingFace ecosystem** - Easy integration, proven reliability
|
| 303 |
+
|
| 304 |
+
### 📊 Performance Comparison: General vs Medical LLMs
|
| 305 |
+
|
| 306 |
+
**Llama 3.3-70B-Instruct (via HF API):**
|
| 307 |
+
- **Advantages**:
|
| 308 |
+
- 70B parameters (vs 8B OpenBioLLM) = Superior reasoning
|
| 309 |
+
- Latest December 2024 release with cutting-edge capabilities
|
| 310 |
+
- Professional medical reasoning possible with good prompting
|
| 311 |
+
- Reliable API access, no download issues
|
| 312 |
+
- **Considerations**:
|
| 313 |
+
- Not specifically trained on medical data
|
| 314 |
+
- Requires medical prompt engineering
|
| 315 |
+
|
| 316 |
+
**OpenBioLLM-8B (local deployment):**
|
| 317 |
+
- **Advantages**:
|
| 318 |
+
- Specifically trained on medical/biomedical data
|
| 319 |
+
- Optimized for healthcare scenarios
|
| 320 |
+
- **Disadvantages**:
|
| 321 |
+
- Smaller model (8B vs 70B parameters)
|
| 322 |
+
- Unreliable local deployment
|
| 323 |
+
- Network download issues
|
| 324 |
+
- Hardware requirements
|
| 325 |
+
|
| 326 |
+
### 🎯 Recommended Approach: HuggingFace API Integration
|
| 327 |
+
|
| 328 |
+
**Primary Strategy**: Use **Llama 3.3-70B-Instruct** via HuggingFace Inference API
|
| 329 |
+
- **Rationale**: 70B parameters can handle medical reasoning with proper prompting
|
| 330 |
+
- **API Integration**: OpenAI-compatible interface for easy integration
|
| 331 |
+
- **Reliability**: Proven HuggingFace infrastructure vs local deployment issues
|
| 332 |
+
- **Performance**: Latest model with superior capabilities
|
| 333 |
+
|
| 334 |
+
**Implementation Plan**:
|
| 335 |
+
1. **Medical Prompt Engineering**: Design medical system prompts for general Llama models
|
| 336 |
+
2. **HuggingFace API Integration**: Use Inference Endpoints with OpenAI format
|
| 337 |
+
3. **Clinical Formatting**: Apply medical structure and disclaimers
|
| 338 |
+
4. **Fallback Options**: Llama 3.1-8B for cost optimization if needed
|
| 339 |
+
|
| 340 |
+
### 💡 Alternative Medical LLM Strategies
|
| 341 |
+
|
| 342 |
+
**Option 1: HuggingFace + Medical Prompting (RECOMMENDED)**
|
| 343 |
+
- Use Llama 3.3-70B via HF API with medical system prompts
|
| 344 |
+
- Leverage RAG for clinical context + general LLM reasoning
|
| 345 |
+
- Professional medical formatting and safety disclaimers
|
| 346 |
+
|
| 347 |
+
**Option 2: Cloud Deployment of OpenBioLLM**
|
| 348 |
+
- Deploy OpenBioLLM via Google Cloud Vertex AI or AWS SageMaker
|
| 349 |
+
- Higher cost but gets specialized medical model
|
| 350 |
+
- More complex setup vs HuggingFace API
|
| 351 |
+
|
| 352 |
+
**Option 3: Hybrid Approach**
|
| 353 |
+
- Primary: HuggingFace API for reliability
|
| 354 |
+
- Secondary: Cloud OpenBioLLM for specialized medical queries
|
| 355 |
+
- Switch based on query complexity
|
| 356 |
+
|
| 357 |
+
## Updated Implementation Plan: HuggingFace API Integration
|
| 358 |
+
|
| 359 |
+
### Phase 4: Medical LLM Integration via HuggingFace API ⏳ IN PROGRESS
|
| 360 |
+
|
| 361 |
+
#### **Task 4.1**: HuggingFace API Setup and Integration
|
| 362 |
+
- [ ] **Setup HF API credentials** and test Llama 3.3-70B access
|
| 363 |
+
- [ ] **Create API integration layer** with OpenAI-compatible interface
|
| 364 |
+
- [ ] **Test basic inference** to ensure API connectivity
|
| 365 |
+
- **Success Criteria**: Successfully generate responses via HF API
|
| 366 |
+
- **Timeline**: 1-2 hours
|
| 367 |
+
|
| 368 |
+
#### **Task 4.2**: Medical Prompt Engineering
|
| 369 |
+
- [ ] **Design medical system prompts** for general Llama models
|
| 370 |
+
- [ ] **Create Sri Lankan medical context** prompts and guidelines
|
| 371 |
+
- [ ] **Test medical reasoning quality** with engineered prompts
|
| 372 |
+
- **Success Criteria**: Medical responses comparable to OpenBioLLM quality
|
| 373 |
+
- **Timeline**: 2-3 hours
|
| 374 |
+
|
| 375 |
+
#### **Task 4.3**: API-Based RAG Integration
|
| 376 |
+
- [ ] **Integrate HF API** with existing vector store and retrieval
|
| 377 |
+
- [ ] **Create medical response formatter** with API responses
|
| 378 |
+
- [ ] **Add clinical safety disclaimers** and source attribution
|
| 379 |
+
- **Success Criteria**: Complete RAG system using HF API backend
|
| 380 |
+
- **Timeline**: 3-4 hours
|
| 381 |
+
|
| 382 |
+
#### **Task 4.4**: Performance Testing and Optimization
|
| 383 |
+
- [ ] **Compare response quality** vs template-based approach
|
| 384 |
+
- [ ] **Optimize API calls** for cost and latency
|
| 385 |
+
- [ ] **Test medical reasoning capabilities** on complex scenarios
|
| 386 |
+
- **Success Criteria**: Superior performance to current template system
|
| 387 |
+
- **Timeline**: 2-3 hours
|
| 388 |
+
|
| 389 |
+
### Phase 5: Production Interface (Week 4)
|
| 390 |
+
- [ ] **Task 5.1**: Deploy HF API-based chatbot interface
|
| 391 |
+
- [ ] **Task 5.2**: Add cost monitoring and API rate limiting
|
| 392 |
+
- [ ] **Task 5.3**: Comprehensive medical validation testing
|
| 393 |
+
|
| 394 |
+
## Executor's Feedback or Assistance Requests
|
| 395 |
+
|
| 396 |
+
### 🚀 Ready to Proceed with HuggingFace API Approach
|
| 397 |
+
**Decision Made**: Pivot from local OpenBioLLM to HuggingFace API integration
|
| 398 |
+
- **Primary Model**: Llama 3.3-70B-Instruct (latest, most capable)
|
| 399 |
+
- **Backup Model**: Llama 3.1-8B-Instruct (cost optimization)
|
| 400 |
+
- **Integration**: OpenAI-compatible API with medical prompt engineering
|
| 401 |
+
|
| 402 |
+
### 🔧 Immediate Next Steps
|
| 403 |
+
1. **Get HuggingFace API access** and credentials setup
|
| 404 |
+
2. **Test Llama 3.3-70B** via API for basic medical queries
|
| 405 |
+
3. **Begin medical prompt engineering** for general LLM adaptation
|
| 406 |
+
|
| 407 |
+
### ❓ User Input Needed
|
| 408 |
+
- **API Budget Preferences**: HuggingFace Inference pricing considerations?
|
| 409 |
+
- **Model Selection**: Llama 3.3-70B (premium) vs Llama 3.1-8B (cost-effective)?
|
| 410 |
+
- **Performance vs Cost**: Priority on best quality or cost optimization?
|
| 411 |
+
|
| 412 |
+
### 🎯 Expected Outcomes
|
| 413 |
+
- **Better Reliability**: No local download/deployment issues
|
| 414 |
+
- **Superior Performance**: 70B > 8B parameters for complex medical reasoning
|
| 415 |
+
- **Faster Implementation**: API integration vs local model debugging
|
| 416 |
+
- **Professional Quality**: Medical prompting + clinical formatting
|
| 417 |
+
|
| 418 |
+
**This approach solves our local deployment issues while potentially delivering superior medical reasoning through larger general-purpose models with medical prompt engineering.**
|
| 419 |
+
|
| 420 |
+
## Success Criteria v2.0
|
| 421 |
+
1. **Simplified Architecture**: No complex medical categories
|
| 422 |
+
2. **Direct Document Retrieval**: Answers come directly from guidelines
|
| 423 |
+
3. **Professional Presentation**: NLP-enhanced medical formatting
|
| 424 |
+
4. **Clinical Accuracy**: Maintains medical safety and source attribution
|
| 425 |
+
5. **Healthcare Professional UX**: Interface designed for clinical use
|
| 426 |
+
|
| 427 |
+
## Next Steps
|
| 428 |
+
1. **Immediate**: Begin Phase 1 - Core Simplification
|
| 429 |
+
2. **Research**: Finalize medical language model selection
|
| 430 |
+
3. **Planning**: Detailed NLP integration architecture
|
| 431 |
+
4. **Testing**: Prepare clinical validation scenarios
|
| 432 |
+
|
| 433 |
+
## Research Foundation & References
|
| 434 |
+
|
| 435 |
+
### Key Research Papers Informing v2.0 Design
|
| 436 |
+
|
| 437 |
+
1. **"Clinical insights: A comprehensive review of language models in medicine"** (2025)
|
| 438 |
+
- Confirms that complex medical categorization approaches reduce performance
|
| 439 |
+
- Recommends simpler document-based retrieval strategies
|
| 440 |
+
- Emphasizes importance of locally deployable models for medical applications
|
| 441 |
+
|
| 442 |
+
2. **"OpenBioLLM: State-of-the-Art Open Source Biomedical Large Language Model"** (2024)
|
| 443 |
+
- Demonstrates 72.5% average performance across medical benchmarks
|
| 444 |
+
- Outperforms larger models like GPT-3.5 and Meditron-70B
|
| 445 |
+
- Provides locally deployable medical language model solution
|
| 446 |
+
|
| 447 |
+
3. **RAG Systems Best Practices Research (2024-2025)**
|
| 448 |
+
- 400-800 character chunks with 15% overlap optimal for medical documents
|
| 449 |
+
- Natural boundary preservation (paragraphs, sections) crucial
|
| 450 |
+
- Document-centric metadata more effective than complex categorization
|
| 451 |
+
|
| 452 |
+
4. **Medical NLP Answer Generation Studies (2024)**
|
| 453 |
+
- Dedicated NLP models significantly improve answer quality
|
| 454 |
+
- Professional medical formatting essential for healthcare applications
|
| 455 |
+
- Source citation and confidence scoring critical for clinical use
|
| 456 |
+
|
| 457 |
+
### Implementation Evidence Base
|
| 458 |
+
|
| 459 |
+
- **Chunking Strategy**: Based on systematic evaluation of medical document processing
|
| 460 |
+
- **NLP Model Selection**: Performance validated across multiple medical benchmarks
|
| 461 |
+
- **Architecture Simplification**: Supported by comparative studies of RAG approaches
|
| 462 |
+
- **Professional Interface**: Informed by healthcare professional UX research
|
| 463 |
+
|
| 464 |
+
### Compliance & Safety Framework
|
| 465 |
+
|
| 466 |
+
- **Medical Disclaimers**: Following established clinical AI guidelines
|
| 467 |
+
- **Source Attribution**: Ensuring traceability to original guidelines
|
| 468 |
+
- **Confidence Scoring**: Transparent uncertainty communication
|
| 469 |
+
- **Professional Formatting**: Healthcare industry standard presentation
|
| 470 |
+
|
| 471 |
+
---
|
| 472 |
+
**This v2.0 plan addresses the core issues identified and implements research-backed approaches for medical RAG systems.**
|
docs/implementation-plan/maternal-health-rag-chatbot-v3.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Implementation Plan: Maternal Health RAG Chatbot v3.0
|
| 2 |
+
|
| 3 |
+
## 1. Project Goal
|
| 4 |
+
|
| 5 |
+
To significantly enhance the quality, accuracy, and naturalness of the RAG chatbot by implementing a state-of-the-art document processing and retrieval pipeline. This version will address the shortcomings of v2, specifically the poor handling of complex document elements (tables, diagrams) and the rigid, templated nature of the LLM responses.
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## 2. Core Problems to Solve
|
| 10 |
+
|
| 11 |
+
1. **Poor Data Quality:** The current `pdfplumber`-based processor loses critical information from tables, flowcharts, and diagrams, leading to low-quality, out-of-context chunks in the vector store.
|
| 12 |
+
2. **Inaccurate Retrieval:** As a result of poor data quality, the retrieval system often fails to find the most relevant context, even when the information exists in the source PDFs.
|
| 13 |
+
3. **Robotic LLM Responses:** The current system prompt is too restrictive, forcing the LLM into a fixed template and preventing natural, conversational answers.
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## 3. The "Version 3.0" Plan
|
| 18 |
+
|
| 19 |
+
This plan is divided into three main phases, designed to be implemented sequentially.
|
| 20 |
+
|
| 21 |
+
### **Phase 1: Advanced Document Processing (Completed)**
|
| 22 |
+
|
| 23 |
+
We have replaced our entire PDF processing pipeline with a modern, machine-learning-based tool to handle complex documents. *Note: The AMA citation generation feature is deferred to focus on core functionality first.*
|
| 24 |
+
|
| 25 |
+
* **Technology:** We are using the **`unstructured.io`** library for parsing. It is a robust, industry-standard tool for extracting text, tables, and other elements from complex PDFs.
|
| 26 |
+
* **Why `unstructured.io`?** After failed attempts with other libraries (`mineru`, `nougat-ocr`) due to performance and dependency issues, `unstructured.io` proved to be the most reliable and effective solution. It uses models like Detectron2 under the hood (via ONNX, simplifying installation) and provides the high-resolution extraction needed for quality results.
|
| 27 |
+
* **Implementation Steps (Completed):**
|
| 28 |
+
1. **Create `src/enhanced_pdf_processor.py`:** A new script built to use the `unstructured.io` library. It processes a directory of PDFs and outputs structured Markdown files.
|
| 29 |
+
2. **Use High-Resolution Strategy:** The script leverages the `hi_res` strategy in `unstructured` to accurately parse document layouts, convert tables to HTML, and extract images.
|
| 30 |
+
3. **Update Dependencies:** Replaced all previous PDF processing dependencies with `unstructured[local-inference]` in `requirements.txt`.
|
| 31 |
+
4. **Re-process all documents:** Ran the new script on all PDFs in the `Obs` directory, storing the resulting `.md` files and associated images in the `src/processed_markdown/` directory.
|
| 32 |
+
|
| 33 |
+
### **Phase 2: High-Precision Retrieval with Re-ranking (In Progress)**
|
| 34 |
+
|
| 35 |
+
Once we have high-quality Markdown, we need to ensure our retrieval system can leverage it effectively.
|
| 36 |
+
|
| 37 |
+
* **Technology:** We will implement a **Cross-Encoder Re-ranking** strategy using the `sentence-transformers` library.
|
| 38 |
+
* **Why Re-ranking?** A simple vector search (like our current FAISS implementation) is fast but not always precise. It can retrieve documents that are semantically *nearby* but not the *most relevant*. A re-ranker adds a second, more powerful validation step to dramatically increase precision.
|
| 39 |
+
* **Implementation Steps:**
|
| 40 |
+
1. **Update Chunking Strategy (Completed):** In `src/groq_medical_rag.py`, the document loading was changed to read from the new `.md` files using `UnstructuredMarkdownLoader`. We now use a `RecursiveCharacterTextSplitter` to create semantically aware chunks.
|
| 41 |
+
2. **Implement 2-Stage Retrieval (Completed):**
|
| 42 |
+
* **Stage 1 (Recall):** Use the existing FAISS vector store to retrieve a large number of candidate documents (e.g., top 20).
|
| 43 |
+
* **Stage 2 (Precision):** Use a **`Cross-Encoder`** model (`cross-encoder/ms-marco-MiniLM-L-6-v2`) from the `sentence-transformers` library to score the relevance of these candidates against the user's query. We then select the top 5 highest-scoring documents to pass to the LLM.
|
| 44 |
+
3. **Update the RAG System (Completed):** The core logic in `src/groq_medical_rag.py` has been refactored to accommodate this new two-stage process. The confidence calculation has also been updated to use the re-ranked scores.
|
| 45 |
+
|
| 46 |
+
### **Phase 3: Dynamic and Natural LLM Interaction**
|
| 47 |
+
|
| 48 |
+
With high-quality context, we can "unleash" the LLM to provide more human-like responses.
|
| 49 |
+
|
| 50 |
+
* **Technology:** **Advanced Prompt Engineering**.
|
| 51 |
+
* **Why a new prompt?** To move the LLM from a "template filler" to a "reasoning engine." We will give it a persona and a goal, rather than a rigid set of formatting rules.
|
| 52 |
+
* **Implementation Steps:**
|
| 53 |
+
1. **Rewrite the System Prompt:** The `SYSTEM_PROMPT` in `src/groq_medical_rag.py` will be replaced with a new version.
|
| 54 |
+
2. **Draft of New Prompt:**
|
| 55 |
+
> "You are a world-class medical expert and a compassionate assistant for healthcare professionals in Sri Lanka. Your primary goal is to provide accurate, evidence-based clinical information based *only* on the provided context from Sri Lankan maternal health guidelines. Your tone should be professional, clear, and supportive. While accuracy is paramount, present the information in a natural, easy-to-understand manner. Feel free to use lists, bullet points, or paragraphs to best structure the answer for clarity. **After providing the answer, you must cite the source using the AMA-formatted citation provided with the context.** At the end of every response, include the following disclaimer: 'This information is for clinical reference based on Sri Lankan guidelines and does not replace professional medical judgment.'"
|
| 56 |
+
|
| 57 |
+
### **Phase 4: Standardized Citation Formatting**
|
| 58 |
+
|
| 59 |
+
This phase will address the user's feedback on improving citation quality. The current citations are too long and not in a standard scientific format.
|
| 60 |
+
|
| 61 |
+
* **Goal:** To format the source citations in a consistent, professional, and standardized scientific style (e.g., AMA or Vancouver).
|
| 62 |
+
* **Problem:** The current `source` metadata is just a file path, which is not user-friendly. The LLM needs structured metadata to create proper citations.
|
| 63 |
+
* **Implementation Steps:**
|
| 64 |
+
1. **Extract Citation Metadata:** Modify the document processing script (`src/enhanced_pdf_processor.py`) to extract structured citation information (e.g., authors, title, journal, year, page numbers) from each document. This could involve looking for patterns or specific text on the first few pages of each PDF. If not available, we will use the filename as a fallback.
|
| 65 |
+
2. **Store Metadata:** Add the extracted metadata to the `metadata` field of each document chunk created in `src/groq_medical_rag.py`.
|
| 66 |
+
3. **Create Citation Formatting Prompt:** Develop a new system prompt or enhance the existing one in `src/groq_medical_rag.py` to instruct the LLM on how to format the citation using the provided metadata. We will ask it to generate a citation in a standard style like AMA.
|
| 67 |
+
4. **Testing and Refinement:** Test the new citation generation with various documents and queries to ensure it is robust and consistently produces well-formatted citations.
|
| 68 |
+
|
| 69 |
+
---
|
| 70 |
+
|
| 71 |
+
## 4. Expected Outcome
|
| 72 |
+
|
| 73 |
+
By the end of this implementation, the chatbot should be able to:
|
| 74 |
+
|
| 75 |
+
* Answer questions that require information from complex tables and flowcharts.
|
| 76 |
+
* Provide more accurate and relevant answers due to the high-precision retrieval pipeline.
|
| 77 |
+
* Include proper AMA-style citations for all retrieved information, enhancing trustworthiness.
|
| 78 |
+
* Interact with users in a more natural, helpful, and less robotic tone.
|
| 79 |
+
* Have a robust, state-of-the-art foundation for any future enhancements.
|
| 80 |
+
|
| 81 |
+
---
|
| 82 |
+
|
| 83 |
+
## 5. Project Status Board
|
| 84 |
+
|
| 85 |
+
- [ ] **Phase 3: Dynamic and Natural LLM Interaction**
|
| 86 |
+
- [ ] Rewrite the `SYSTEM_PROMPT` in `src/groq_medical_rag.py`.
|
| 87 |
+
- [ ] **Phase 4: Standardized Citation Formatting**
|
| 88 |
+
- [ ] Modify `src/enhanced_pdf_processor.py` to extract structured citation metadata.
|
| 89 |
+
- [ ] Update `src/groq_medical_rag.py` to store this metadata in document chunks.
|
| 90 |
+
- [ ] Enhance the system prompt in `src/groq_medical_rag.py` to instruct the LLM on citation formatting.
|
| 91 |
+
- [ ] Test and refine the citation generation.
|
| 92 |
+
|
| 93 |
+
---
|
| 94 |
+
|
| 95 |
+
## 6. Executor's Feedback or Assistance Requests
|
| 96 |
+
|
| 97 |
+
*No feedback at this time.*
|
| 98 |
+
|
| 99 |
+
---
|
| 100 |
+
|
| 101 |
+
## 7. Branch Name
|
| 102 |
+
|
| 103 |
+
`feature/standard-citations`
|
| 104 |
+
|
| 105 |
+
## Current Status / Progress Tracking
|
| 106 |
+
|
| 107 |
+
- [x] Initial deployment to Hugging Face Spaces
|
| 108 |
+
- [x] Fixed import issues
|
| 109 |
+
- [x] Added environment variables
|
| 110 |
+
- [x] Implemented memory optimization
|
| 111 |
+
- [ ] Fix Gradio version compatibility issue
|
| 112 |
+
|
| 113 |
+
## Key Challenges and Analysis
|
| 114 |
+
|
| 115 |
+
### Gradio Version Compatibility Issue (2024-03-21)
|
| 116 |
+
- Current deployment is using Gradio 4.0.0 which has security vulnerabilities
|
| 117 |
+
- The error occurs after successful embedding creation (825 embeddings)
|
| 118 |
+
- Need to update Gradio to latest version (4.x) to resolve security issues
|
| 119 |
+
- Proposed solution:
|
| 120 |
+
1. Update requirements.txt to specify latest Gradio version
|
| 121 |
+
2. Add explicit Gradio version to Hugging Face Space configuration
|
| 122 |
+
3. Clear cache and redeploy
|
| 123 |
+
|
| 124 |
+
### Vector Store Persistence Issue (2024-03-21)
|
| 125 |
+
- Current implementation recreates vector store on every Space startup
|
| 126 |
+
- We already have processed and embedded documents locally
|
| 127 |
+
- Need to:
|
| 128 |
+
1. Package pre-computed vector store with deployment
|
| 129 |
+
2. Modify initialization to use pre-computed store
|
| 130 |
+
3. Only recreate if vector store is missing/corrupted
|
| 131 |
+
|
| 132 |
+
## High-level Task Breakdown
|
| 133 |
+
|
| 134 |
+
1. Update Gradio Version
|
| 135 |
+
- Update requirements.txt to use latest Gradio version
|
| 136 |
+
- Success Criteria: requirements.txt shows updated version
|
| 137 |
+
|
| 138 |
+
2. Update Hugging Face Space Configuration
|
| 139 |
+
- Add explicit Gradio version in Space configuration
|
| 140 |
+
- Success Criteria: Space configuration shows correct version
|
| 141 |
+
|
| 142 |
+
3. Clear Cache and Redeploy
|
| 143 |
+
- Clear Hugging Face Space cache
|
| 144 |
+
- Redeploy application
|
| 145 |
+
- Success Criteria: No Gradio version warning in logs
|
| 146 |
+
|
| 147 |
+
1. Package Pre-computed Vector Store
|
| 148 |
+
- Create vector store locally
|
| 149 |
+
- Add vector store files to git
|
| 150 |
+
- Success Criteria: Vector store files committed to repository
|
| 151 |
+
|
| 152 |
+
2. Modify Vector Store Initialization
|
| 153 |
+
- Update `_initialize_system()` to prioritize pre-computed store
|
| 154 |
+
- Add error handling for corrupted stores
|
| 155 |
+
- Success Criteria: System uses pre-computed store without recreation
|
| 156 |
+
|
| 157 |
+
3. Update Deployment Process
|
| 158 |
+
- Include vector store in Space deployment
|
| 159 |
+
- Add vector store path to Space configuration
|
| 160 |
+
- Success Criteria: Space starts without recreating embeddings
|
docs/implementation-plan/maternal-health-rag-chatbot.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Maternal Health RAG Chatbot Implementation Plan
|
| 2 |
+
|
| 3 |
+
## Branch Name
|
| 4 |
+
`feature/maternal-health-rag-chatbot`
|
| 5 |
+
|
| 6 |
+
## Background and Motivation
|
| 7 |
+
We're building a Retrieval-Augmented-Generation (RAG) chatbot specifically for **maternal health** using Sri Lankan clinical guidelines. The goal is to create an AI assistant that can help healthcare professionals access evidence-based maternal health information quickly and accurately.
|
| 8 |
+
|
| 9 |
+
**Available Guidelines Identified:**
|
| 10 |
+
- National maternal care guidelines (2 volumes)
|
| 11 |
+
- Management of normal labour
|
| 12 |
+
- Puerperal sepsis management
|
| 13 |
+
- Thrombocytopenia in pregnancy
|
| 14 |
+
- RhESUS guidelines
|
| 15 |
+
- Postnatal care protocols
|
| 16 |
+
- Intrapartum fever management
|
| 17 |
+
- Assisted vaginal delivery
|
| 18 |
+
- Breech presentation management
|
| 19 |
+
- SLJOG obstetrics guidelines
|
| 20 |
+
|
| 21 |
+
**Key Enhancement**: Using **pdfplumber** instead of pymupdf4llm for superior table and flowchart extraction in medical documents.
|
| 22 |
+
|
| 23 |
+
## Key Challenges and Analysis
|
| 24 |
+
1. **Complex Medical Tables**: Dosing charts, contraindication tables require precise extraction
|
| 25 |
+
2. **Flowcharts**: Decision trees and clinical pathways need structural preservation
|
| 26 |
+
3. **Multi-document corpus**: ~15 maternal health documents with varying formats
|
| 27 |
+
4. **Clinical accuracy**: Maternal health decisions are critical - citations essential
|
| 28 |
+
5. **Specialized terminology**: Obstetric terms requiring careful processing
|
| 29 |
+
|
| 30 |
+
## High-level Task Breakdown
|
| 31 |
+
|
| 32 |
+
### Task 1: Environment Setup & Branch Creation
|
| 33 |
+
- Create feature branch `feature/maternal-health-rag-chatbot`
|
| 34 |
+
- Set up Python environment with enhanced dependencies (pdfplumber, etc.)
|
| 35 |
+
- Install and configure all required packages
|
| 36 |
+
- **Success Criteria**: Environment activated, all packages installed, branch created and switched
|
| 37 |
+
|
| 38 |
+
### Task 2: Enhanced PDF Processing Pipeline
|
| 39 |
+
- Implement pdfplumber-based extraction for better table/flowchart handling
|
| 40 |
+
- Create custom extraction logic for medical content
|
| 41 |
+
- Add fallback parsing for complex layouts
|
| 42 |
+
- Test with sample maternal health documents
|
| 43 |
+
- **Success Criteria**: All maternal health PDFs successfully parsed with preserved table structure
|
| 44 |
+
|
| 45 |
+
### Task 3: Specialized Medical Document Chunking
|
| 46 |
+
- Implement medical-document-aware chunking strategy
|
| 47 |
+
- Preserve table integrity and flowchart relationships
|
| 48 |
+
- Handle multi-column layouts common in guidelines
|
| 49 |
+
- Test chunk quality with clinical context preservation
|
| 50 |
+
- **Success Criteria**: Chunked documents maintain clinical coherence and table structure
|
| 51 |
+
|
| 52 |
+
### Task 4: Enhanced Embedding & Vector Store Creation
|
| 53 |
+
- Set up medical-focused embeddings if available
|
| 54 |
+
- Create FAISS vector database from all processed chunks
|
| 55 |
+
- Implement hybrid search with table/text separation
|
| 56 |
+
- Test retrieval quality with maternal health queries
|
| 57 |
+
- **Success Criteria**: Vector store created, retrieval working with high clinical relevance
|
| 58 |
+
|
| 59 |
+
### Task 5: Medical-Focused LLM Integration
|
| 60 |
+
- Configure LLM for medical/clinical responses
|
| 61 |
+
- Implement clinical-focused prompting strategies
|
| 62 |
+
- Add medical safety disclaimers and limitations
|
| 63 |
+
- Test with obstetric queries
|
| 64 |
+
- **Success Criteria**: LLM responding appropriately to maternal health queries with proper cautions
|
| 65 |
+
|
| 66 |
+
### Task 6: Enhanced RAG Chain Development
|
| 67 |
+
- Build retrieval-augmented chain with medical focus
|
| 68 |
+
- Implement clinical citation system (document + page)
|
| 69 |
+
- Add medical terminology handling
|
| 70 |
+
- Include confidence scoring for clinical recommendations
|
| 71 |
+
- **Success Criteria**: RAG chain returns accurate answers with proper medical citations
|
| 72 |
+
|
| 73 |
+
### Task 7: Maternal Health Gradio Interface
|
| 74 |
+
- Create specialized interface for healthcare professionals
|
| 75 |
+
- Add medical query examples and templates
|
| 76 |
+
- Include disclaimer about professional medical advice
|
| 77 |
+
- Test with maternal health scenarios
|
| 78 |
+
- **Success Criteria**: Working interface with medical-appropriate UX and disclaimers
|
| 79 |
+
|
| 80 |
+
### Task 8: Medical Content Testing & Validation
|
| 81 |
+
- Test with comprehensive maternal health query set
|
| 82 |
+
- Validate medical accuracy with sample scenarios
|
| 83 |
+
- Test table extraction quality (dosing charts, etc.)
|
| 84 |
+
- Document clinical limitations and accuracy bounds
|
| 85 |
+
- **Success Criteria**: Comprehensive testing completed, accuracy validated, limitations documented
|
| 86 |
+
|
| 87 |
+
### Task 9: Clinical Documentation & Deployment Preparation
|
| 88 |
+
- Document medical use cases and limitations
|
| 89 |
+
- Create healthcare professional user guide
|
| 90 |
+
- Prepare clinical validation guidelines
|
| 91 |
+
- **Success Criteria**: Complete medical documentation, deployment-ready with appropriate disclaimers
|
| 92 |
+
|
| 93 |
+
### Task 10: Final Integration & Handoff
|
| 94 |
+
- Complete end-to-end testing
|
| 95 |
+
- Final documentation review
|
| 96 |
+
- Prepare for clinical validation phase
|
| 97 |
+
- **Success Criteria**: Complete system ready for clinical review and validation
|
| 98 |
+
|
| 99 |
+
## Project Status Board
|
| 100 |
+
|
| 101 |
+
### ✅ Completed Tasks
|
| 102 |
+
- [x] **Task 1: Environment Setup & Branch Creation**
|
| 103 |
+
- ✅ Created feature branch `feature/maternal-health-rag-chatbot`
|
| 104 |
+
- ✅ Enhanced requirements.txt with comprehensive dependencies
|
| 105 |
+
- ✅ Successfully installed all dependencies
|
| 106 |
+
- ✅ Connected to GitHub repository
|
| 107 |
+
|
| 108 |
+
- [x] **Task 2: Enhanced PDF Processing Pipeline**
|
| 109 |
+
- ✅ Created enhanced_pdf_processor.py using pdfplumber
|
| 110 |
+
- ✅ Processed all 15 maternal health PDFs with 100% success rate
|
| 111 |
+
- ✅ Extracted 479 pages, 48 tables, 107,010 words
|
| 112 |
+
- ✅ Created comprehensive test suite (all tests passing)
|
| 113 |
+
|
| 114 |
+
- [x] **Task 3: Specialized Medical Document Chunking**
|
| 115 |
+
- ✅ Created comprehensive_medical_chunker.py with medical-aware chunking
|
| 116 |
+
- ✅ Generated 542 medically-aware chunks with clinical importance scoring
|
| 117 |
+
- ✅ Achieved 100% clinical importance coverage (442 critical + 100 high importance)
|
| 118 |
+
- ✅ Created robust test suite with 6 validation tests (all passing)
|
| 119 |
+
- ✅ Generated LangChain-compatible documents for vector store integration
|
| 120 |
+
|
| 121 |
+
- [x] **Task 4: Vector Store Setup and Embeddings**
|
| 122 |
+
- ✅ **Task 4.1: Embedding Model Evaluation (COMPLETED)**
|
| 123 |
+
- ✅ Created embedding_evaluator.py for comprehensive model testing
|
| 124 |
+
- ✅ Evaluated 5 embedding models with medical content evaluation
|
| 125 |
+
- ✅ **Selected optimal model: all-MiniLM-L6-v2 (1.000 overall score)**
|
| 126 |
+
- ✅ Metrics: search quality, clustering, speed, medical relevance
|
| 127 |
+
|
| 128 |
+
- [x] **Task 4.2: Local Vector Store Implementation (COMPLETED)**
|
| 129 |
+
- ✅ Created vector_store_manager.py using FAISS with optimal embedding model
|
| 130 |
+
- ✅ **Implemented 542 embeddings in 3.68 seconds (super fast!)**
|
| 131 |
+
- ✅ Vector store size: 0.8 MB (very efficient)
|
| 132 |
+
- ✅ **Created comprehensive test suite: 9/9 tests passing**
|
| 133 |
+
- ✅ Validated search functionality, medical filtering, performance
|
| 134 |
+
- ✅ Search performance: <1 second with excellent relevance scores
|
| 135 |
+
- ✅ Medical context filtering working perfectly
|
| 136 |
+
|
| 137 |
+
### 🔄 In Progress
|
| 138 |
+
- [ ] **Task 5: RAG Query Engine Implementation**
|
| 139 |
+
- [ ] Task 5.1: LangChain integration with vector store
|
| 140 |
+
- [ ] Task 5.2: Query processing and context retrieval
|
| 141 |
+
- [ ] Task 5.3: Response generation with medical grounding
|
| 142 |
+
- [ ] Task 5.4: Query engine testing and validation
|
| 143 |
+
|
| 144 |
+
### 📋 Pending Tasks
|
| 145 |
+
- [ ] **Task 6: LLM Integration**
|
| 146 |
+
- [ ] **Task 7: Gradio Interface Development**
|
| 147 |
+
- [ ] **Task 8: Integration Testing**
|
| 148 |
+
- [ ] **Task 9: Documentation & Deployment**
|
| 149 |
+
|
| 150 |
+
## Executor's Feedback or Assistance Requests
|
| 151 |
+
|
| 152 |
+
### ✅ Task 4.2 Completion Report
|
| 153 |
+
**Outstanding Success! Vector Store Implementation Completed**
|
| 154 |
+
|
| 155 |
+
**📊 Final Results:**
|
| 156 |
+
- ✅ **542 medical embeddings** created from all maternal health documents
|
| 157 |
+
- ⚡ **3.68 seconds** embedding generation time (highly optimized)
|
| 158 |
+
- 💾 **0.8 MB** storage footprint (very efficient)
|
| 159 |
+
- 🎯 **384-dimensional** embeddings using optimal all-MiniLM-L6-v2 model
|
| 160 |
+
- 🧪 **9/9 comprehensive tests passing** (100% test success)
|
| 161 |
+
|
| 162 |
+
**🔍 Search Quality Validation:**
|
| 163 |
+
- **Magnesium sulfate queries**: 0.809 relevance score (excellent)
|
| 164 |
+
- **Postpartum hemorrhage**: 0.55+ relevance scores (very good)
|
| 165 |
+
- **Fetal heart rate monitoring**: 0.605 relevance score (excellent)
|
| 166 |
+
- **Search performance**: <1 second response time
|
| 167 |
+
|
| 168 |
+
**🛠️ Technical Features Implemented:**
|
| 169 |
+
- ✅ FAISS-based vector index with cosine similarity
|
| 170 |
+
- ✅ Medical content type filtering (dosage, emergency, maternal, procedure)
|
| 171 |
+
- ✅ Clinical importance scoring and filtering
|
| 172 |
+
- ✅ Comprehensive metadata preservation
|
| 173 |
+
- ✅ Efficient save/load functionality
|
| 174 |
+
- ✅ Robust error handling and edge case management
|
| 175 |
+
|
| 176 |
+
**🎉 Ready to Proceed to Task 5: RAG Query Engine**
|
| 177 |
+
The vector store is now production-ready with excellent search capabilities and full medical context awareness. All tests validate perfect functionality.
|
| 178 |
+
|
| 179 |
+
**Request:** Ready to implement Task 5.1 - LangChain integration for RAG query engine development.
|
| 180 |
+
|
| 181 |
+
## Enhanced Dependencies
|
| 182 |
+
|
| 183 |
+
```bash
|
| 184 |
+
# Enhanced PDF parsing stack
|
| 185 |
+
pip install pdfplumber # Primary tool for table extraction
|
| 186 |
+
pip install unstructured[local-inference] # Fallback for complex layouts
|
| 187 |
+
pip install pillow # Image processing support
|
| 188 |
+
|
| 189 |
+
# Core RAG stack
|
| 190 |
+
pip install langchain-community langchain-text-splitters
|
| 191 |
+
pip install sentence-transformers faiss-cpu
|
| 192 |
+
pip install transformers accelerate
|
| 193 |
+
pip install gradio
|
| 194 |
+
|
| 195 |
+
# Additional medical/clinical utilities
|
| 196 |
+
pip install pandas # For table processing
|
| 197 |
+
pip install beautifulsoup4 # For HTML table handling
|
| 198 |
+
```
|
| 199 |
+
|
| 200 |
+
## Lessons Learned
|
| 201 |
+
*[To be updated throughout implementation]*
|
docs/implementation-plan/netlify-frontend-deployment.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Netlify Frontend Deployment with Hugging Face API Integration
|
| 2 |
+
|
| 3 |
+
## Background and Motivation
|
| 4 |
+
The Sri Lankan Clinical Assistant's frontend needs to be deployed to Netlify while maintaining connection to our existing Hugging Face Spaces backend. This will provide a production-ready, scalable frontend hosting solution with automatic deployments.
|
| 5 |
+
|
| 6 |
+
## Branch Name
|
| 7 |
+
`feat/netlify-deployment`
|
| 8 |
+
|
| 9 |
+
## Key Challenges and Analysis
|
| 10 |
+
1. Environment Variables Management
|
| 11 |
+
- Need to securely handle Hugging Face API tokens
|
| 12 |
+
- Configure CORS settings on Hugging Face Space
|
| 13 |
+
- Set up environment variables in Netlify
|
| 14 |
+
|
| 15 |
+
2. API Integration
|
| 16 |
+
- Create API client for Hugging Face Spaces
|
| 17 |
+
- Handle API responses and errors
|
| 18 |
+
- Implement proper error handling and loading states
|
| 19 |
+
|
| 20 |
+
3. Build Configuration
|
| 21 |
+
- Configure Next.js for production build
|
| 22 |
+
- Set up Netlify build settings
|
| 23 |
+
- Ensure all dependencies are properly handled
|
| 24 |
+
|
| 25 |
+
## High-level Task Breakdown
|
| 26 |
+
|
| 27 |
+
### 1. Frontend API Configuration
|
| 28 |
+
- [ ] Create API client configuration
|
| 29 |
+
- Success Criteria: API client properly configured with environment variables
|
| 30 |
+
- Files to modify: `frontend/src/lib/api.ts`
|
| 31 |
+
|
| 32 |
+
### 2. Environment Setup
|
| 33 |
+
- [ ] Create environment variable files
|
| 34 |
+
- Success Criteria: `.env.local` and `.env.production` files created with proper variables
|
| 35 |
+
- Files to create:
|
| 36 |
+
- `frontend/.env.local`
|
| 37 |
+
- `frontend/.env.production`
|
| 38 |
+
|
| 39 |
+
### 3. Netlify Configuration
|
| 40 |
+
- [ ] Create Netlify configuration files
|
| 41 |
+
- Success Criteria: Netlify build settings properly configured
|
| 42 |
+
- Files to create:
|
| 43 |
+
- `frontend/netlify.toml`
|
| 44 |
+
|
| 45 |
+
### 4. CORS Configuration
|
| 46 |
+
- [ ] Update Hugging Face Space CORS settings
|
| 47 |
+
- Success Criteria: API accessible from Netlify domain
|
| 48 |
+
- Location: Hugging Face Space settings
|
| 49 |
+
|
| 50 |
+
### 5. Frontend Build and Test
|
| 51 |
+
- [ ] Test production build locally
|
| 52 |
+
- Success Criteria: `npm run build` succeeds without errors
|
| 53 |
+
- Command: `cd frontend && npm run build`
|
| 54 |
+
|
| 55 |
+
### 6. Netlify Deployment
|
| 56 |
+
- [ ] Deploy to Netlify
|
| 57 |
+
- Success Criteria: Site successfully deployed and accessible
|
| 58 |
+
- Steps documented in deployment section
|
| 59 |
+
|
| 60 |
+
## Project Status Board
|
| 61 |
+
- [ ] Task 1: Frontend API Configuration
|
| 62 |
+
- [ ] Task 2: Environment Setup
|
| 63 |
+
- [ ] Task 3: Netlify Configuration
|
| 64 |
+
- [ ] Task 4: CORS Configuration
|
| 65 |
+
- [ ] Task 5: Frontend Build and Test
|
| 66 |
+
- [ ] Task 6: Netlify Deployment
|
| 67 |
+
|
| 68 |
+
## Detailed Implementation Steps
|
| 69 |
+
|
| 70 |
+
### 1. Frontend API Configuration
|
| 71 |
+
1. Create new API client file:
|
| 72 |
+
```typescript
|
| 73 |
+
// frontend/src/lib/api.ts
|
| 74 |
+
const HF_API_URL = process.env.NEXT_PUBLIC_HF_API_URL;
|
| 75 |
+
const HF_API_TOKEN = process.env.NEXT_PUBLIC_HF_API_TOKEN;
|
| 76 |
+
|
| 77 |
+
export async function queryAPI(input: string) {
|
| 78 |
+
try {
|
| 79 |
+
const response = await fetch(HF_API_URL!, {
|
| 80 |
+
method: 'POST',
|
| 81 |
+
headers: {
|
| 82 |
+
'Authorization': `Bearer ${HF_API_TOKEN}`,
|
| 83 |
+
'Content-Type': 'application/json',
|
| 84 |
+
},
|
| 85 |
+
body: JSON.stringify({ inputs: input }),
|
| 86 |
+
});
|
| 87 |
+
|
| 88 |
+
if (!response.ok) {
|
| 89 |
+
throw new Error(`API error: ${response.status}`);
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
return await response.json();
|
| 93 |
+
} catch (error) {
|
| 94 |
+
console.error('API Error:', error);
|
| 95 |
+
throw error;
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
### 2. Environment Setup
|
| 101 |
+
1. Create `.env.local`:
|
| 102 |
+
```env
|
| 103 |
+
NEXT_PUBLIC_HF_API_URL=https://your-space-name.hf.space/api/predict
|
| 104 |
+
NEXT_PUBLIC_HF_API_TOKEN=your_token_here
|
| 105 |
+
```
|
| 106 |
+
|
| 107 |
+
2. Create `.env.production`:
|
| 108 |
+
```env
|
| 109 |
+
NEXT_PUBLIC_HF_API_URL=https://your-space-name.hf.space/api/predict
|
| 110 |
+
```
|
| 111 |
+
|
| 112 |
+
### 3. Netlify Configuration
|
| 113 |
+
1. Create `netlify.toml`:
|
| 114 |
+
```toml
|
| 115 |
+
[build]
|
| 116 |
+
command = "npm run build"
|
| 117 |
+
publish = ".next"
|
| 118 |
+
|
| 119 |
+
[[plugins]]
|
| 120 |
+
package = "@netlify/plugin-nextjs"
|
| 121 |
+
|
| 122 |
+
[build.environment]
|
| 123 |
+
NEXT_USE_NETLIFY_EDGE = "true"
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
### 4. CORS Configuration
|
| 127 |
+
1. Add Netlify domain to Hugging Face Space CORS settings:
|
| 128 |
+
- Navigate to Space settings
|
| 129 |
+
- Add `*.netlify.app` to allowed origins
|
| 130 |
+
- Add your custom domain if using one
|
| 131 |
+
|
| 132 |
+
### 5. Frontend Build and Test
|
| 133 |
+
1. Install dependencies:
|
| 134 |
+
```bash
|
| 135 |
+
cd frontend
|
| 136 |
+
npm install
|
| 137 |
+
```
|
| 138 |
+
|
| 139 |
+
2. Test build:
|
| 140 |
+
```bash
|
| 141 |
+
npm run build
|
| 142 |
+
```
|
| 143 |
+
|
| 144 |
+
### 6. Netlify Deployment
|
| 145 |
+
1. Install Netlify CLI:
|
| 146 |
+
```bash
|
| 147 |
+
npm install -g netlify-cli
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
2. Initialize Netlify:
|
| 151 |
+
```bash
|
| 152 |
+
netlify init
|
| 153 |
+
```
|
| 154 |
+
|
| 155 |
+
3. Deploy:
|
| 156 |
+
```bash
|
| 157 |
+
netlify deploy --prod
|
| 158 |
+
```
|
| 159 |
+
|
| 160 |
+
## Executor's Feedback or Assistance Requests
|
| 161 |
+
- Note any build issues encountered
|
| 162 |
+
- Document any CORS-related problems
|
| 163 |
+
- Record deployment URLs and status
|
| 164 |
+
|
| 165 |
+
## Lessons Learned
|
| 166 |
+
- Document any issues encountered during deployment
|
| 167 |
+
- Note any optimizations needed
|
| 168 |
+
- Record successful configuration patterns
|
docs/implementation-plan/stable-deployment-plan.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Stable Deployment Plan: Public Testing
|
| 2 |
+
|
| 3 |
+
This document outlines a reliable and robust strategy for deploying the VedaMD Clinical Assistant for public testing, with the backend hosted on Hugging Face Spaces and the frontend on Netlify.
|
| 4 |
+
|
| 5 |
+
## 1. Background and Motivation
|
| 6 |
+
|
| 7 |
+
Previous deployment attempts have been plagued by resource exhaustion and dependency conflicts on Hugging Face Spaces. The primary issue was attempting to perform a heavy, one-time build task (creating the vector store) during application startup in a resource-constrained environment.
|
| 8 |
+
|
| 9 |
+
This new plan decouples the build process from the runtime process, which is a standard best practice for deploying ML applications.
|
| 10 |
+
|
| 11 |
+
## 2. High-Level Architecture
|
| 12 |
+
|
| 13 |
+
- **Vector Store Creation**: A local script will generate the FAISS index and associated metadata.
|
| 14 |
+
- **Artifact Hosting**: The generated vector store artifacts will be uploaded to a new model repository on the Hugging Face Hub using Git LFS.
|
| 15 |
+
- **Backend (Hugging Face Space)**: A lightweight FastAPI application that downloads the vector store from the Hub and serves the RAG API. It will not perform any on-the-fly processing.
|
| 16 |
+
- **Frontend (Netlify)**: The existing Next.js application, configured to point to the new, stable backend API endpoint.
|
| 17 |
+
|
| 18 |
+
## 3. Key Advantages of This Approach
|
| 19 |
+
|
| 20 |
+
- **Reliability**: The backend will have a fast and predictable startup time, as it's only downloading files, not computing them.
|
| 21 |
+
- **Scalability**: The heavy lifting is done offline. The online component is lightweight and can handle API requests efficiently.
|
| 22 |
+
- **Maintainability**: Separating concerns makes debugging and updating each component (vector store, backend, frontend) much easier.
|
| 23 |
+
- **Cost-Effectiveness**: We can continue to use the free tiers for both Hugging Face Spaces and Netlify.
|
| 24 |
+
|
| 25 |
+
## 4. High-level Task Breakdown
|
| 26 |
+
|
| 27 |
+
This plan is broken down into clear, verifiable steps. We will proceed one step at a time.
|
| 28 |
+
|
| 29 |
+
- [x] **Task 1: Pre-compute Vector Store Locally**
|
| 30 |
+
- *Update*: A complete vector store was found at `src/vector_store`. We can use this existing artifact and do not need to re-compute it.
|
| 31 |
+
- [x] **Task 2: Upload Vector Store to Hugging Face Hub**
|
| 32 |
+
- *Update*: Successfully uploaded the vector store files to the `sniro23/VedaMD-Vector-Store` repository on the Hugging Face Hub.
|
| 33 |
+
- [x] **Task 3: Refactor Backend to Load from Hub**
|
| 34 |
+
- *Update*: The backend has been successfully refactored. The `simple_vector_store.py` and `groq_medical_rag.py` modules now load the pre-computed index directly from the Hub. The `Dockerfile` and `requirements.txt` have been streamlined, removing all build-time dependencies.
|
| 35 |
+
- [x] **Task 4: Deploy a New, Clean Backend Space**
|
| 36 |
+
- *Update*: Successfully created and deployed a new, private Docker-based Space at `sniro23/VedaMD-Backend-v2`. The application is now running and logs can be monitored on the Hub.
|
| 37 |
+
- [x] **Task 5: Configure and Deploy Frontend to Netlify**
|
| 38 |
+
- *Update*: The frontend has been configured to connect to the new backend endpoint. The changes have been pushed, and a new deployment has been triggered on Netlify. The application should now be fully operational.
|
| 39 |
+
|
| 40 |
+
---
|
| 41 |
+
|
| 42 |
+
**Deployment Complete!** The VedaMD Clinical Assistant is now running with a stable, decoupled architecture.
|
| 43 |
+
|
| 44 |
+
## 5. Post-Deployment Issues & Fixes
|
| 45 |
+
|
| 46 |
+
- **Issue (2024-07-26):** Encountered a persistent `PermissionError: [Errno 13] Permission denied` on Hugging Face Spaces. The application, running as a non-root user, could not write to the cache directory (`/app/data`) because it was created by the `root` user during the Docker build.
|
| 47 |
+
- **Solution:** The `Dockerfile` was updated to explicitly create a non-root `user`, create the `/app/data` directory, and then transfer ownership of that directory to the `user` with `chown`. This ensures the application has the necessary write permissions at runtime.
|
docs/implementation-plan/system-redesign-and-refinement.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Implementation Plan: System Redesign and Refinement
|
| 2 |
+
|
| 3 |
+
## 1. Background and Motivation
|
| 4 |
+
|
| 5 |
+
The current system has several issues that are negatively impacting user experience and functionality:
|
| 6 |
+
1. **UI/UX:** The user interface is outdated and does not match the new, improved design specification.
|
| 7 |
+
2. **Document Ingestion:** The document processing pipeline is fragmented, with processed files scattered across two separate directories (`src/processed_docs` and `src/processed_markdown`). This is causing inconsistent and incomplete data to be loaded into the retrieval system.
|
| 8 |
+
3. **Answer Quality:** The chatbot's responses are poorly formatted. They lack professional structure, such as bullet points for lists, bolding for key terms, and clearly separated citations, making them difficult to read and interpret.
|
| 9 |
+
|
| 10 |
+
This plan outlines the necessary steps to perform a comprehensive redesign and refinement of the entire system, addressing these critical issues to create a robust, user-friendly, and reliable clinical assistant.
|
| 11 |
+
|
| 12 |
+
## 2. Branch Name
|
| 13 |
+
|
| 14 |
+
`refactor/system-redesign-v1`
|
| 15 |
+
|
| 16 |
+
## 3. Key Challenges and Analysis
|
| 17 |
+
|
| 18 |
+
### 3.1. UI Redesign
|
| 19 |
+
- **Challenge:** The new design is provided as a static HTML file. It needs to be broken down into reusable React components and integrated with the existing Next.js application logic.
|
| 20 |
+
- **Analysis:** The current `frontend/src/app/page.tsx` file contains all the necessary state management and event handlers. The core task is to replace the JSX structure and Tailwind CSS classes with those from `docs/design`, while ensuring all interactive elements are correctly wired.
|
| 21 |
+
|
| 22 |
+
### 3.2. Document Pipeline Consolidation
|
| 23 |
+
- **Challenge:** There are two directories with processed documents, and multiple scripts referencing the old `src/processed_docs` location.
|
| 24 |
+
- **Analysis:** The investigation revealed that `src/groq_medical_rag.py` (the current RAG implementation) exclusively uses `src/processed_markdown`. The `src/processed_docs` directory and the scripts that use it appear to be remnants of a previous implementation.
|
| 25 |
+
- **Solution:**
|
| 26 |
+
- Standardize on `src/processed_markdown` as the single source of truth for processed documents.
|
| 27 |
+
- Purge the obsolete `src/processed_docs` directory and associated scripts.
|
| 28 |
+
- Ensure all document processing scripts write their output to the correct location.
|
| 29 |
+
|
| 30 |
+
### 3.3. Answer Formatting
|
| 31 |
+
- **Challenge:** The AI-generated answers lack structured formatting.
|
| 32 |
+
- **Analysis:** The frontend already uses `react-markdown`, so it is capable of rendering markdown. The issue lies in the backend prompt sent to the LLM, which does not explicitly request markdown output.
|
| 33 |
+
- **Solution:** The system prompt in `src/groq_medical_rag.py` must be updated to include specific instructions for the LLM to use markdown for lists, bolding, and citations.
|
| 34 |
+
|
| 35 |
+
## 4. High-level Task Breakdown
|
| 36 |
+
|
| 37 |
+
The project will be executed in the following order, focusing on one major area at a time.
|
| 38 |
+
|
| 39 |
+
### **Phase 1: Backend Refinement**
|
| 40 |
+
* **Task 1.1: Consolidate Document Pipeline.**
|
| 41 |
+
- **Success Criteria:**
|
| 42 |
+
- All processing scripts (`enhanced_pdf_processor.py`, `nougat_pdf_processor.py`) are confirmed to write to `src/processed_markdown`.
|
| 43 |
+
- The `src/processed_docs` directory is deleted.
|
| 44 |
+
- Obsolete chunking scripts referencing `processed_docs` are deleted.
|
| 45 |
+
- The RAG system successfully builds a vector store from *only* the `src/processed_markdown` directory.
|
| 46 |
+
* **Task 1.2: Improve Answer Formatting.**
|
| 47 |
+
- **Success Criteria:**
|
| 48 |
+
- The system prompt in `src/groq_medical_rag.py` is updated to explicitly request markdown formatting.
|
| 49 |
+
- Queries to the chatbot from the command line (using the `main` function in the script) produce well-formatted markdown answers with lists, bold text, and clear source citations.
|
| 50 |
+
|
| 51 |
+
### **Phase 2: Frontend Redesign**
|
| 52 |
+
* **Task 2.1: Re-implement the UI based on the new design.**
|
| 53 |
+
- **Success Criteria:**
|
| 54 |
+
- The `frontend/src/app/page.tsx` file is refactored to match the layout and styling of `docs/design`.
|
| 55 |
+
- The UI is broken down into logical React components.
|
| 56 |
+
- The application is fully interactive: users can send messages, receive responses, and the chat history is displayed correctly.
|
| 57 |
+
- The new UI is responsive and looks good on different screen sizes.
|
| 58 |
+
|
| 59 |
+
### **Phase 3: Final Integration and Testing**
|
| 60 |
+
* **Task 3.1: End-to-End Testing.**
|
| 61 |
+
- **Success Criteria:**
|
| 62 |
+
- A full user flow test is completed: asking a question from the new UI, receiving a well-formatted answer from the refined backend, and seeing it displayed correctly.
|
| 63 |
+
- The application is stable and free of critical bugs.
|
| 64 |
+
|
| 65 |
+
## 5. Project Status Board
|
| 66 |
+
|
| 67 |
+
- [ ] **Phase 1: Backend Refinement**
|
| 68 |
+
- [ ] Task 1.1: Consolidate Document Pipeline.
|
| 69 |
+
- [ ] Task 1.2: Improve Answer Formatting.
|
| 70 |
+
- [ ] **Phase 2: Frontend Redesign**
|
| 71 |
+
- [ ] Task 2.1: Re-implement the UI based on the new design.
|
| 72 |
+
- [ ] **Phase 3: Final Integration and Testing**
|
| 73 |
+
- [ ] Task 3.1: End-to-End Testing.
|
| 74 |
+
|
| 75 |
+
## 6. Executor's Feedback or Assistance Requests
|
| 76 |
+
*This section will be updated by the Executor during implementation.*
|
docs/implementation-plan/web-ui-for-chatbot.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Implementation Plan: UI & Backend Reliability Overhaul
|
| 2 |
+
|
| 3 |
+
## 1. Project Goal
|
| 4 |
+
|
| 5 |
+
To deliver a stable, polished, and professional chat application by:
|
| 6 |
+
1. **Fixing the Backend:** Making the API resilient to external service failures.
|
| 7 |
+
2. **Fixing the Frontend:** Implementing a high-fidelity UI that accurately matches the provided Figma design.
|
| 8 |
+
3. **Ensuring Reliable Communication:** Debugging and fixing backend-frontend connection issues.
|
| 9 |
+
|
| 10 |
+
## 2. Key Challenges and Analysis
|
| 11 |
+
|
| 12 |
+
* **Backend Resilience:** The API must not crash if an external dependency like the Groq API is unavailable on startup. It needs to handle this gracefully and report the issue to the user through the UI.
|
| 13 |
+
* **High-Fidelity UI:** Translating a design into code requires meticulous attention to detail. The previous attempt failed because it only created the HTML structure without the specific Tailwind CSS classes for spacing, colors, fonts, shadows, and layout.
|
| 14 |
+
* **Conversational State:** The solution must maintain the previously implemented conversational memory.
|
| 15 |
+
* **Backend-Frontend Communication:** The frontend is receiving 500 errors when trying to communicate with the backend, indicating potential issues with API initialization, CORS, or environment configuration.
|
| 16 |
+
|
| 17 |
+
## 3. High-level Task Breakdown
|
| 18 |
+
|
| 19 |
+
### Phase 0: Backend-Frontend Connection Debugging (HIGHEST Priority)
|
| 20 |
+
|
| 21 |
+
* **Goal:** Fix the 500 errors occurring during frontend-backend communication
|
| 22 |
+
* **Tasks:**
|
| 23 |
+
1. **Environment Configuration Check:**
|
| 24 |
+
- Verify GROQ_API_KEY is properly set in the backend environment
|
| 25 |
+
- Ensure all required Python packages are installed and up to date
|
| 26 |
+
- Check that the backend server is running on the expected port (8000)
|
| 27 |
+
|
| 28 |
+
2. **Backend API Verification:**
|
| 29 |
+
- Add detailed logging to track API request/response cycle
|
| 30 |
+
- Implement proper error handling in the `/query` endpoint
|
| 31 |
+
- Add health check endpoint (`/health`) to verify API status
|
| 32 |
+
- Test API endpoints independently using curl/Postman
|
| 33 |
+
|
| 34 |
+
3. **Frontend API Integration:**
|
| 35 |
+
- Update frontend API call to include proper error handling
|
| 36 |
+
- Add retry logic for transient failures
|
| 37 |
+
- Implement proper loading states during API calls
|
| 38 |
+
- Add detailed console logging for debugging
|
| 39 |
+
|
| 40 |
+
4. **CORS and Network Configuration:**
|
| 41 |
+
- Verify CORS configuration is working correctly
|
| 42 |
+
- Ensure backend is accessible from frontend origin
|
| 43 |
+
- Test with explicit CORS configuration instead of wildcard
|
| 44 |
+
- Add proper error messages for CORS issues
|
| 45 |
+
|
| 46 |
+
### Phase 1: Backend Stabilization (Immediate Priority)
|
| 47 |
+
|
| 48 |
+
* **Goal:** Ensure the backend API can always start and respond, even if the Groq RAG system fails to initialize.
|
| 49 |
+
* **Tasks:**
|
| 50 |
+
1. **Add `tenacity` library:** Update `requirements.txt` to include the `tenacity` library for robust retry logic.
|
| 51 |
+
2. **Graceful RAG Initialization:** In `src/groq_medical_rag.py`, modify `_test_groq_connection` to use `@retry` from `tenacity`. This will automatically handle transient network errors during startup.
|
| 52 |
+
3. **Fault-Tolerant API:** In `src/api/main.py`, modify the `lifespan` manager. If the RAG system fails to initialize after all retries, the API should still start but log the critical error. The `rag_system` global will remain `None`.
|
| 53 |
+
4. **User-Friendly Error Response:** In the `/query` endpoint, check if `rag_system` is `None`. If it is, return a `200 OK` with a clear JSON error message (e.g., `{ "response": "Sorry, the clinical assistant is currently offline. Please try again later." }`) instead of a `503` error. This allows the frontend to handle the error gracefully.
|
| 54 |
+
|
| 55 |
+
### Phase 2: High-Fidelity Frontend Implementation
|
| 56 |
+
|
| 57 |
+
* **Goal:** Overhaul `frontend/src/app/page.tsx` to be a pixel-perfect implementation of the Figma design.
|
| 58 |
+
* **Tasks:**
|
| 59 |
+
1. **Add `clsx` utility:** Install the `clsx` library (`npm install clsx`) in the `frontend` directory to make conditional styling cleaner.
|
| 60 |
+
2. **Full UI Overhaul (`page.tsx`):** Replace the entire component with a new version that meticulously applies Tailwind CSS to match the design.
|
| 61 |
+
* **Layout:** Use flexbox to create the main `header`, `main` (chat), and `footer` (input) structure.
|
| 62 |
+
* **Welcome Screen:**
|
| 63 |
+
* Use correct font sizes (`text-5xl`, `text-4xl`, `text-lg`), weights (`font-bold`, `font-semibold`), and colors (`text-gray-800`, `text-gray-600`).
|
| 64 |
+
* Implement the vertical list of template questions with correct borders, padding, and hover effects.
|
| 65 |
+
* **Chat Form:**
|
| 66 |
+
* Style the `textarea` and `button` to exactly match the design, including borders, rounded corners, shadows, and the new "N" icon for the send button.
|
| 67 |
+
* **Chat History:**
|
| 68 |
+
* Style user and assistant messages as distinct "chat bubbles" with different background colors.
|
| 69 |
+
* Ensure the `prose` class is used on the markdown renderer for beautiful typography of the bot's response.
|
| 70 |
+
3. **Error Handling:** Update the `handleSubmit` function in the frontend to gracefully handle the new error message from the backend in case the RAG system is offline.
|
| 71 |
+
|
| 72 |
+
## 4. Project Status Board
|
| 73 |
+
|
| 74 |
+
- [ ] **Phase 0: Backend-Frontend Connection Debugging**
|
| 75 |
+
- [ ] Environment Configuration Check
|
| 76 |
+
- [ ] Verify GROQ_API_KEY
|
| 77 |
+
- [ ] Update Python dependencies
|
| 78 |
+
- [ ] Verify server port configuration
|
| 79 |
+
- [ ] Backend API Verification
|
| 80 |
+
- [ ] Add detailed logging
|
| 81 |
+
- [ ] Implement error handling
|
| 82 |
+
- [ ] Add health check endpoint
|
| 83 |
+
- [ ] Test API independently
|
| 84 |
+
- [ ] Frontend API Integration
|
| 85 |
+
- [ ] Update error handling
|
| 86 |
+
- [ ] Add retry logic
|
| 87 |
+
- [ ] Implement loading states
|
| 88 |
+
- [ ] Add debug logging
|
| 89 |
+
- [ ] CORS and Network Configuration
|
| 90 |
+
- [ ] Verify CORS setup
|
| 91 |
+
- [ ] Test backend accessibility
|
| 92 |
+
- [ ] Update CORS configuration
|
| 93 |
+
- [ ] Add error messages
|
| 94 |
+
- [x] **Phase 1: Backend Stabilization**
|
| 95 |
+
- [x] Add `tenacity` to `requirements.txt`.
|
| 96 |
+
- [x] Implement retry logic in `groq_medical_rag.py`.
|
| 97 |
+
- [x] Make API startup fault-tolerant in `api/main.py`.
|
| 98 |
+
- [x] Implement user-friendly error response in `/query`.
|
| 99 |
+
- [ ] **Phase 2: Frontend UI Overhaul**
|
| 100 |
+
- [ ] Install `clsx` utility.
|
| 101 |
+
- [ ] Re-implement `page.tsx` with high-fidelity styling.
|
| 102 |
+
- [ ] Implement frontend error handling for offline RAG system.
|
| 103 |
+
|
| 104 |
+
## 5. Branch Name
|
| 105 |
+
|
| 106 |
+
`fix/ui-and-backend-stability`
|
docs/scratchpad.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Scratchpad
|
| 2 |
+
|
| 3 |
+
This document is a running log of the high-level tasks and the current focus.
|
| 4 |
+
|
| 5 |
+
## Current Active Implementation Plan
|
| 6 |
+
|
| 7 |
+
- **File:** `docs/implementation-plan/rag-quality-enhancement.md`
|
| 8 |
+
- **Goal:** 🏥 **MEDICAL RAG ENHANCEMENT** - Enhanced medical context preparation + verification layers with medical-grade safety protocols
|
| 9 |
+
- **Status:** ✅ **PHASE 1 COMPLETED** | ✅ **PHASE 2 COMPLETED SUCCESSFULLY** | 🚀 **READY FOR PHASE 3**
|
| 10 |
+
- **Strategic Success**: Enhanced Medical RAG System with strict safety protocols now fully operational
|
| 11 |
+
- **Phase 1 Results**:
|
| 12 |
+
- ✅ Clinical ModernBERT: 60.3% medical domain improvement, 768-dim embeddings
|
| 13 |
+
- ✅ Enhanced PDF Processing: Unstructured hi_res validated, clinical terminology preserved
|
| 14 |
+
- ✅ Llama3-70B via Groq API: Superior instruction following with medical-grade context adherence
|
| 15 |
+
- ✅ Resource Efficient: ~2GB local VRAM + proven medical safety protocols
|
| 16 |
+
- **Phase 2 Results - COMPLETED SUCCESSFULLY**:
|
| 17 |
+
- ✅ **Task 2.1**: Enhanced Medical Context Preparation - Medical entity extraction operational (1-6 entities per document)
|
| 18 |
+
- ✅ **Task 2.2**: Medical Response Verification Layer - 100% source traceability and medical safety validation
|
| 19 |
+
- ✅ **Task 2.3**: Advanced Medical System Prompt - Clinical safety protocols active, vector compatibility resolved
|
| 20 |
+
- ✅ **Task 2.4**: Enhanced Medical Vector Store - Hybrid 384d + 768d Clinical ModernBERT architecture operational
|
| 21 |
+
- **Integrated Medical RAG Performance**:
|
| 22 |
+
- ⚡ Processing Speed: 0.72-2.16s per query | 📚 5 enhanced documents per query | 🛡️ 100% SAFE responses
|
| 23 |
+
- 🔒 Medical Safety: 100% source traceability, comprehensive claim verification, strict context adherence
|
| 24 |
+
- 🏥 Clinical Enhancement: High medical similarity scores (0.7+), medical entity extraction, terminology enhancement
|
| 25 |
+
- **Next Phase**: **PHASE 3 - Production Integration & Optimization**
|
| 26 |
+
- **Next Action**: **PLANNER MODE** - Review Phase 2 achievements and plan Phase 3 production deployment strategy
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
## Completed Implementation Plans
|
| 31 |
+
|
| 32 |
+
- `docs/implementation-plan/stable-deployment-plan.md`
|
| 33 |
+
- `docs/implementation-plan/web-ui-for-chatbot.md`
|
| 34 |
+
- `docs/implementation-plan/maternal-health-rag-chatbot-v3.md`
|
| 35 |
+
|
| 36 |
+
---
|
| 37 |
+
## Lessons Learned
|
| 38 |
+
- **[2024-07-28]** The `groq` python client can have issues with proxies when running in certain environments (like Hugging Face Spaces). The fix is to instantiate a separate `httpx.Client` and pass it to the `groq.Groq` constructor to ensure it uses a clean, isolated network configuration.
|
| 39 |
+
- **[2024-07-28]** When deploying Docker containers to services like Hugging Face Spaces, pay close attention to file ownership and permissions. The user running the application at runtime (`user`) may not be the same as the user that built the container (`root`). Ensure application directories, especially those used for caching (`HF_HOME`), are owned by the runtime user. Use `chown` in the Dockerfile to set permissions correctly.
|
| 40 |
+
- **[2024-07-28]** Gradio's `gr.ChatInterface` expects the function to return a single string response. Returning a tuple or other data structure will cause a `ValidationError`.
|
| 41 |
+
- **[2025-01-XX]** **Strategic Architecture Decision**: AI engineer's resource-friendly approach (Mistral 7B + LoRA) proved superior to large model approach (Me-LLaMA) for infrastructure-constrained environments. Specialized small models with domain fine-tuning often outperform generic large models in specific domains.
|
| 42 |
+
- **[2025-01-XX]** **Medical PDF Processing**: Unstructured hi_res strategy is optimal for medical documents containing scanned PDFs, complex clinical tables, and multi-modal content. pdfplumber fails completely on scanned documents, making unstructured the only viable option for comprehensive medical document processing.
|
| 43 |
+
- **[2025-01-XX]** **Medical Domain Embeddings**: Clinical ModernBERT provides significant advantages over general embeddings (BAAI/bge-large-en-v1.5) for medical concept representation with 8K context length (4x improvement) and clinical terminology understanding.
|
| 44 |
+
- **[2025-01-XX]** **Resource Optimization**: Constraint-driven design often leads to better solutions. Working within 16GB VRAM limits forced optimization that resulted in a more maintainable, cost-effective, and deployable architecture than resource-intensive alternatives.
|
| 45 |
+
- **[2025-01-XX]** **Phase 2 Medical Safety Architecture**: The hybrid approach combining enhanced medical context preparation + medical response verification + maintained Llama3-70B proved superior to model switching. This architecture achieves medical-grade safety (100% source traceability, comprehensive claim verification) while maintaining excellent performance (0.72-2.16s per query) and clinical enhancement (0.7+ similarity scores with Clinical ModernBERT).
|
| 46 |
+
- **[2024-07-28]** For RAG, increasing the number of documents sent to the LLM (e.g., from 3 to 5) and using a very strict system prompt that forbids outside knowledge and mandates citations can significantly improve answer quality and reduce hallucinations.
|
| 47 |
+
- **[2024-07-28]** Ensure document metadata is complete *during data creation*. If a `citation` field is missing, create a sensible default from the file path. This prevents "Unknown Source" issues downstream.
|
| 48 |
+
- **[2024-07-28]** Enforce a strict, structured output format (e.g., using Markdown headings like `## Summary` and `## References`) via the system prompt to ensure consistent and professional-looking responses from the LLM.
|
| 49 |
+
- **[2025-01-03]** Me-LLaMA models require PhysioNet credentialed health data use agreement and substantial computational resources (24GB+ VRAM for 13B model, 130GB+ for 70B). No commercial API providers currently offer Me-LLaMA access. For medical domain enhancement, Clinical ModernBERT embeddings (8K context) + smaller medical LLMs like medicine-Llama3-8B provide a more practical alternative with significant medical domain improvement while remaining infrastructure-compatible.
|
| 50 |
+
|
| 51 |
+
## Planner Analysis - Medical Models Integration
|
| 52 |
+
|
| 53 |
+
**STRATEGIC RECOMMENDATION**: ✅ **APPROVE with Modifications**
|
| 54 |
+
|
| 55 |
+
### Key Insights:
|
| 56 |
+
1. **Medical Domain Specialization**: Me-LLaMA + Clinical ModernBERT will significantly improve clinical relevance
|
| 57 |
+
2. **Resource Challenge**: Me-LLaMA requires substantial compute - need deployment strategy before proceeding
|
| 58 |
+
3. **Architecture Enhancement**: Medical models enable semantic understanding vs. basic text processing
|
| 59 |
+
|
| 60 |
+
### Critical Decisions Required:
|
| 61 |
+
- **Me-LLaMA Deployment**: Determine if we use API access, local deployment, or cloud service
|
| 62 |
+
- **Compute Resources**: Assess if current infrastructure can handle medical model requirements
|
| 63 |
+
- **Migration Strategy**: How to transition from current general-purpose pipeline to medical-specific one
|
| 64 |
+
|
| 65 |
+
**NEXT STEP**: Executor should research Me-LLaMA deployment options and resource requirements before implementation begins.
|
frontend/.eslintrc.json
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"extends": "next/core-web-vitals",
|
| 3 |
+
"rules": {
|
| 4 |
+
"@typescript-eslint/no-unused-vars": "off",
|
| 5 |
+
"@next/next/no-page-custom-font": "off"
|
| 6 |
+
}
|
| 7 |
+
}
|
frontend/.gitignore
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
| 2 |
+
|
| 3 |
+
# dependencies
|
| 4 |
+
/node_modules
|
| 5 |
+
/.pnp
|
| 6 |
+
.pnp.*
|
| 7 |
+
.yarn/*
|
| 8 |
+
!.yarn/patches
|
| 9 |
+
!.yarn/plugins
|
| 10 |
+
!.yarn/releases
|
| 11 |
+
!.yarn/versions
|
| 12 |
+
|
| 13 |
+
# testing
|
| 14 |
+
/coverage
|
| 15 |
+
|
| 16 |
+
# next.js
|
| 17 |
+
/.next/
|
| 18 |
+
/out/
|
| 19 |
+
|
| 20 |
+
# production
|
| 21 |
+
/build
|
| 22 |
+
|
| 23 |
+
# misc
|
| 24 |
+
.DS_Store
|
| 25 |
+
*.pem
|
| 26 |
+
|
| 27 |
+
# debug
|
| 28 |
+
npm-debug.log*
|
| 29 |
+
yarn-debug.log*
|
| 30 |
+
yarn-error.log*
|
| 31 |
+
.pnpm-debug.log*
|
| 32 |
+
|
| 33 |
+
# env files (can opt-in for committing if needed)
|
| 34 |
+
.env*
|
| 35 |
+
|
| 36 |
+
# vercel
|
| 37 |
+
.vercel
|
| 38 |
+
|
| 39 |
+
# typescript
|
| 40 |
+
*.tsbuildinfo
|
| 41 |
+
next-env.d.ts
|
frontend/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
| 2 |
+
|
| 3 |
+
## Getting Started
|
| 4 |
+
|
| 5 |
+
First, run the development server:
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
npm run dev
|
| 9 |
+
# or
|
| 10 |
+
yarn dev
|
| 11 |
+
# or
|
| 12 |
+
pnpm dev
|
| 13 |
+
# or
|
| 14 |
+
bun dev
|
| 15 |
+
```
|
| 16 |
+
|
| 17 |
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
| 18 |
+
|
| 19 |
+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
| 20 |
+
|
| 21 |
+
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
| 22 |
+
|
| 23 |
+
## Learn More
|
| 24 |
+
|
| 25 |
+
To learn more about Next.js, take a look at the following resources:
|
| 26 |
+
|
| 27 |
+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
| 28 |
+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
| 29 |
+
|
| 30 |
+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
| 31 |
+
|
| 32 |
+
## Deploy on Vercel
|
| 33 |
+
|
| 34 |
+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
| 35 |
+
|
| 36 |
+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
frontend/eslint.config.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { dirname } from "path";
|
| 2 |
+
import { fileURLToPath } from "url";
|
| 3 |
+
import { FlatCompat } from "@eslint/eslintrc";
|
| 4 |
+
|
| 5 |
+
const __filename = fileURLToPath(import.meta.url);
|
| 6 |
+
const __dirname = dirname(__filename);
|
| 7 |
+
|
| 8 |
+
const compat = new FlatCompat({
|
| 9 |
+
baseDirectory: __dirname,
|
| 10 |
+
});
|
| 11 |
+
|
| 12 |
+
const eslintConfig = [
|
| 13 |
+
...compat.extends("next/core-web-vitals", "next/typescript"),
|
| 14 |
+
];
|
| 15 |
+
|
| 16 |
+
export default eslintConfig;
|
frontend/netlify.toml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[build]
|
| 2 |
+
command = "npm run build"
|
| 3 |
+
publish = ".next"
|
| 4 |
+
|
| 5 |
+
[[plugins]]
|
| 6 |
+
package = "@netlify/plugin-nextjs"
|
| 7 |
+
|
| 8 |
+
[build.environment]
|
| 9 |
+
NEXT_PUBLIC_HF_API_URL = "https://sniro23-vedamd-backend-v2.hf.space"
|
| 10 |
+
NEXT_USE_NETLIFY_EDGE = "true"
|
frontend/next.config.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/** @type {import('next').NextConfig} */
|
| 2 |
+
const nextConfig = {
|
| 3 |
+
eslint: {
|
| 4 |
+
// Warning: This allows production builds to successfully complete even if
|
| 5 |
+
// your project has ESLint errors.
|
| 6 |
+
ignoreDuringBuilds: true,
|
| 7 |
+
},
|
| 8 |
+
typescript: {
|
| 9 |
+
// Warning: This allows production builds to successfully complete even if
|
| 10 |
+
// your project has type errors.
|
| 11 |
+
ignoreBuildErrors: true,
|
| 12 |
+
},
|
| 13 |
+
};
|
| 14 |
+
|
| 15 |
+
export default nextConfig;
|
frontend/package-lock.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
frontend/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "frontend",
|
| 3 |
+
"version": "0.1.0",
|
| 4 |
+
"private": true,
|
| 5 |
+
"scripts": {
|
| 6 |
+
"dev": "next dev",
|
| 7 |
+
"build": "DISABLE_ESLINT_PLUGIN=true next build",
|
| 8 |
+
"start": "next start",
|
| 9 |
+
"lint": "next lint"
|
| 10 |
+
},
|
| 11 |
+
"dependencies": {
|
| 12 |
+
"clsx": "^2.1.0",
|
| 13 |
+
"next": "^14.2.30",
|
| 14 |
+
"react": "^18.2.0",
|
| 15 |
+
"react-dom": "^18.2.0",
|
| 16 |
+
"react-markdown": "^9.0.1",
|
| 17 |
+
"remark-gfm": "^4.0.0"
|
| 18 |
+
},
|
| 19 |
+
"devDependencies": {
|
| 20 |
+
"@netlify/plugin-nextjs": "^5.11.4",
|
| 21 |
+
"@tailwindcss/typography": "^0.5.10",
|
| 22 |
+
"@types/node": "^20.11.0",
|
| 23 |
+
"@types/react": "^18.2.0",
|
| 24 |
+
"@types/react-dom": "^18.2.0",
|
| 25 |
+
"autoprefixer": "^10.4.17",
|
| 26 |
+
"eslint": "^8.56.0",
|
| 27 |
+
"eslint-config-next": "14.1.0",
|
| 28 |
+
"postcss": "^8.4.35",
|
| 29 |
+
"tailwindcss": "^3.4.1",
|
| 30 |
+
"typescript": "^5.3.3"
|
| 31 |
+
}
|
| 32 |
+
}
|
frontend/postcss.config.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
export default {
|
| 2 |
+
plugins: {
|
| 3 |
+
tailwindcss: {},
|
| 4 |
+
autoprefixer: {},
|
| 5 |
+
},
|
| 6 |
+
};
|
frontend/public/file.svg
ADDED
|
|
frontend/public/globe.svg
ADDED
|
|
frontend/public/next.svg
ADDED
|
|
frontend/public/vercel.svg
ADDED
|
|
frontend/public/window.svg
ADDED
|
|
frontend/src/app/favicon.ico
ADDED
|
|
frontend/src/app/globals.css
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@tailwind base;
|
| 2 |
+
@tailwind components;
|
| 3 |
+
@tailwind utilities;
|
| 4 |
+
|
| 5 |
+
@layer base {
|
| 6 |
+
body {
|
| 7 |
+
@apply antialiased text-text-primary bg-slate-50;
|
| 8 |
+
}
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
@layer components {
|
| 12 |
+
.chat-bubble {
|
| 13 |
+
@apply relative rounded-2xl p-6 transition-all duration-300 ease-in-out;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
.chat-bubble-user {
|
| 17 |
+
@apply bg-white shadow-sm;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
.chat-bubble-assistant {
|
| 21 |
+
@apply bg-secondary/30;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
.button-primary {
|
| 25 |
+
@apply flex items-center justify-center px-6 py-3 rounded-full
|
| 26 |
+
bg-primary hover:bg-primary-dark text-white font-semibold
|
| 27 |
+
transition-all duration-200 ease-in-out
|
| 28 |
+
disabled:opacity-50 disabled:cursor-not-allowed;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
.button-secondary {
|
| 32 |
+
@apply flex items-center justify-center px-6 py-3 rounded-full
|
| 33 |
+
bg-secondary hover:bg-secondary/80 text-text-primary font-semibold
|
| 34 |
+
transition-all duration-200 ease-in-out;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.input-primary {
|
| 38 |
+
@apply w-full px-6 py-4 rounded-2xl bg-secondary
|
| 39 |
+
text-text-primary placeholder:text-text-secondary
|
| 40 |
+
focus:outline-none focus:ring-2 focus:ring-primary/20
|
| 41 |
+
transition-all duration-200 ease-in-out;
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
/* Custom animations */
|
| 46 |
+
@keyframes fadeIn {
|
| 47 |
+
from { opacity: 0; transform: translateY(10px); }
|
| 48 |
+
to { opacity: 1; transform: translateY(0); }
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
.animate-fade-in {
|
| 52 |
+
animation: fadeIn 0.3s ease-out forwards;
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
/* Markdown content styling */
|
| 56 |
+
.prose pre {
|
| 57 |
+
@apply bg-slate-800 text-white rounded-xl p-4 my-4 overflow-x-auto;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
.prose code {
|
| 61 |
+
@apply bg-slate-100 text-slate-800 rounded px-1.5 py-0.5 text-sm font-mono;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
.prose ul {
|
| 65 |
+
@apply list-disc pl-6 my-4;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
.prose ol {
|
| 69 |
+
@apply list-decimal pl-6 my-4;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
.prose a {
|
| 73 |
+
@apply text-primary hover:text-primary-dark underline;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
.prose blockquote {
|
| 77 |
+
@apply border-l-4 border-secondary pl-4 italic my-4;
|
| 78 |
+
}
|
frontend/src/app/layout.tsx
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { Metadata } from "next";
|
| 2 |
+
import { Inter } from 'next/font/google';
|
| 3 |
+
import "./globals.css";
|
| 4 |
+
|
| 5 |
+
// Initialize the Inter font with a specific subset
|
| 6 |
+
const inter = Inter({
|
| 7 |
+
subsets: ['latin'],
|
| 8 |
+
display: 'swap',
|
| 9 |
+
preload: true,
|
| 10 |
+
fallback: ['system-ui', 'arial'],
|
| 11 |
+
adjustFontFallback: true,
|
| 12 |
+
});
|
| 13 |
+
|
| 14 |
+
export const metadata: Metadata = {
|
| 15 |
+
title: "VedaMD - Sri Lankan Health Guidelines Assistant",
|
| 16 |
+
description: "Get trusted clinical answers based on Sri Lankan health guidelines",
|
| 17 |
+
icons: {
|
| 18 |
+
icon: '/favicon.ico',
|
| 19 |
+
},
|
| 20 |
+
};
|
| 21 |
+
|
| 22 |
+
export default function RootLayout({
|
| 23 |
+
children,
|
| 24 |
+
}: {
|
| 25 |
+
children: React.ReactNode
|
| 26 |
+
}) {
|
| 27 |
+
return (
|
| 28 |
+
<html lang="en">
|
| 29 |
+
<body className={`${inter.className} font-sans antialiased`}>{children}</body>
|
| 30 |
+
</html>
|
| 31 |
+
);
|
| 32 |
+
}
|
frontend/src/app/page.tsx
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client";
|
| 2 |
+
|
| 3 |
+
import { useState, useRef, useEffect, FC } from 'react';
|
| 4 |
+
import ReactMarkdown from 'react-markdown';
|
| 5 |
+
import remarkGfm from 'remark-gfm';
|
| 6 |
+
import clsx from 'clsx';
|
| 7 |
+
|
| 8 |
+
// --- TYPE DEFINITIONS ---
|
| 9 |
+
interface Message {
|
| 10 |
+
role: 'user' | 'assistant';
|
| 11 |
+
content: string;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
// --- SVG ICONS ---
|
| 15 |
+
const VedaMDLogo: FC = () => (
|
| 16 |
+
<div className="flex items-center gap-4">
|
| 17 |
+
<div className="size-6">
|
| 18 |
+
<svg viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 19 |
+
<path d="M4 4H17.3334V17.3334H30.6666V30.6666H44V44H4V4Z" fill="currentColor"></path>
|
| 20 |
+
</svg>
|
| 21 |
+
</div>
|
| 22 |
+
<h2 className="text-xl font-bold leading-tight tracking-tight">VedaMD</h2>
|
| 23 |
+
</div>
|
| 24 |
+
);
|
| 25 |
+
|
| 26 |
+
const SettingsIcon: FC = () => (
|
| 27 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">
|
| 28 |
+
<path d="M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"></path>
|
| 29 |
+
</svg>
|
| 30 |
+
);
|
| 31 |
+
|
| 32 |
+
const ArrowRightIcon: FC = () => (
|
| 33 |
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256" className="text-white">
|
| 34 |
+
<path d="M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z"></path>
|
| 35 |
+
</svg>
|
| 36 |
+
);
|
| 37 |
+
|
| 38 |
+
// --- UI COMPONENTS ---
|
| 39 |
+
const Header: FC = () => (
|
| 40 |
+
<header className="sticky top-0 z-50 flex items-center justify-between border-b border-secondary/50 bg-white/80 px-6 py-4 backdrop-blur-sm">
|
| 41 |
+
<VedaMDLogo />
|
| 42 |
+
<button className="button-secondary">
|
| 43 |
+
<SettingsIcon />
|
| 44 |
+
</button>
|
| 45 |
+
</header>
|
| 46 |
+
);
|
| 47 |
+
|
| 48 |
+
const WelcomeScreen: FC<{ onTemplateClick: (query: string) => void }> = ({ onTemplateClick }) => {
|
| 49 |
+
const templates = [
|
| 50 |
+
"What is the recommended antibiotic regimen for puerperal sepsis according to national guidelines?",
|
| 51 |
+
"What are the steps for active management of the third stage of labor (AMTSL)",
|
| 52 |
+
];
|
| 53 |
+
|
| 54 |
+
return (
|
| 55 |
+
<div className="flex flex-col items-center justify-center px-6 py-12 animate-fade-in">
|
| 56 |
+
<div className="max-w-2xl text-center">
|
| 57 |
+
<h1 className="text-4xl font-bold tracking-tight mb-4">
|
| 58 |
+
Welcome to VedaMD
|
| 59 |
+
</h1>
|
| 60 |
+
<p className="text-xl text-text-secondary mb-8">
|
| 61 |
+
Get trusted clinical answers based on Sri Lankan health guidelines
|
| 62 |
+
</p>
|
| 63 |
+
<div className="flex flex-col gap-4">
|
| 64 |
+
{templates.map((query) => (
|
| 65 |
+
<button
|
| 66 |
+
key={query}
|
| 67 |
+
onClick={() => onTemplateClick(query)}
|
| 68 |
+
className="button-secondary text-left"
|
| 69 |
+
>
|
| 70 |
+
{query}
|
| 71 |
+
</button>
|
| 72 |
+
))}
|
| 73 |
+
</div>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
);
|
| 77 |
+
};
|
| 78 |
+
|
| 79 |
+
const ChatMessage: FC<{ message: Message }> = ({ message }) => {
|
| 80 |
+
const isUser = message.role === 'user';
|
| 81 |
+
|
| 82 |
+
return (
|
| 83 |
+
<div className={clsx(
|
| 84 |
+
"py-6 px-4 animate-fade-in",
|
| 85 |
+
isUser ? 'bg-white' : 'bg-slate-50'
|
| 86 |
+
)}>
|
| 87 |
+
<div className="max-w-3xl mx-auto flex gap-6">
|
| 88 |
+
<div className={clsx(
|
| 89 |
+
"size-10 rounded-full flex-shrink-0 flex items-center justify-center font-semibold text-white",
|
| 90 |
+
isUser ? 'bg-text-primary' : 'bg-primary'
|
| 91 |
+
)}>
|
| 92 |
+
{isUser ? 'U' : 'V'}
|
| 93 |
+
</div>
|
| 94 |
+
<div className="flex-grow space-y-4">
|
| 95 |
+
<div className={clsx(
|
| 96 |
+
'chat-bubble',
|
| 97 |
+
isUser ? 'chat-bubble-user' : 'chat-bubble-assistant'
|
| 98 |
+
)}>
|
| 99 |
+
<div className="prose prose-lg max-w-none">
|
| 100 |
+
<ReactMarkdown remarkPlugins={[remarkGfm]}>
|
| 101 |
+
{message.content}
|
| 102 |
+
</ReactMarkdown>
|
| 103 |
+
</div>
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
);
|
| 109 |
+
};
|
| 110 |
+
|
| 111 |
+
const ChatForm: FC<{
|
| 112 |
+
input: string;
|
| 113 |
+
setInput: (value: string) => void;
|
| 114 |
+
handleSubmit: (e: React.SyntheticEvent | string) => void;
|
| 115 |
+
isLoading: boolean;
|
| 116 |
+
}> = ({ input, setInput, handleSubmit, isLoading }) => (
|
| 117 |
+
<div className="sticky bottom-0 border-t border-secondary/50 bg-white/80 backdrop-blur-sm">
|
| 118 |
+
<form onSubmit={(e) => { e.preventDefault(); handleSubmit(e); }} className="max-w-3xl mx-auto p-4 flex gap-4">
|
| 119 |
+
<textarea
|
| 120 |
+
placeholder="Ask VedaMD anything..."
|
| 121 |
+
value={input}
|
| 122 |
+
onChange={(e) => setInput(e.target.value)}
|
| 123 |
+
className="input-primary"
|
| 124 |
+
onKeyDown={(e) => {
|
| 125 |
+
if (e.key === 'Enter' && !e.shiftKey) {
|
| 126 |
+
e.preventDefault();
|
| 127 |
+
handleSubmit(e);
|
| 128 |
+
}
|
| 129 |
+
}}
|
| 130 |
+
disabled={isLoading}
|
| 131 |
+
rows={1}
|
| 132 |
+
/>
|
| 133 |
+
<button
|
| 134 |
+
type="submit"
|
| 135 |
+
disabled={isLoading || !input.trim()}
|
| 136 |
+
className="button-primary whitespace-nowrap"
|
| 137 |
+
>
|
| 138 |
+
{isLoading ? (
|
| 139 |
+
<div className="size-6 border-4 border-t-transparent border-white rounded-full animate-spin" />
|
| 140 |
+
) : (
|
| 141 |
+
<ArrowRightIcon />
|
| 142 |
+
)}
|
| 143 |
+
</button>
|
| 144 |
+
</form>
|
| 145 |
+
</div>
|
| 146 |
+
);
|
| 147 |
+
|
| 148 |
+
const Footer: FC = () => (
|
| 149 |
+
<footer className="py-6 px-4 text-center text-text-secondary text-sm">
|
| 150 |
+
© 2024 VedaMD. All rights reserved.
|
| 151 |
+
</footer>
|
| 152 |
+
);
|
| 153 |
+
|
| 154 |
+
// --- MAIN PAGE COMPONENT ---
|
| 155 |
+
export default function Home() {
|
| 156 |
+
const [conversation, setConversation] = useState<Message[]>([]);
|
| 157 |
+
const [input, setInput] = useState('');
|
| 158 |
+
const [isLoading, setIsLoading] = useState(false);
|
| 159 |
+
const [error, setError] = useState<string | null>(null);
|
| 160 |
+
const messagesEndRef = useRef<HTMLDivElement>(null);
|
| 161 |
+
|
| 162 |
+
const scrollToBottom = () => {
|
| 163 |
+
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
| 164 |
+
};
|
| 165 |
+
|
| 166 |
+
useEffect(() => {
|
| 167 |
+
const timeoutId = setTimeout(scrollToBottom, 100);
|
| 168 |
+
return () => clearTimeout(timeoutId);
|
| 169 |
+
}, [conversation]);
|
| 170 |
+
|
| 171 |
+
const handleSubmit = async (e: React.SyntheticEvent | string) => {
|
| 172 |
+
const query = (typeof e === 'string' ? e : input).trim();
|
| 173 |
+
if (typeof e !== 'string') e.preventDefault();
|
| 174 |
+
|
| 175 |
+
if (!query || isLoading) return;
|
| 176 |
+
|
| 177 |
+
setIsLoading(true);
|
| 178 |
+
setError(null);
|
| 179 |
+
if (typeof e !== 'string') setInput('');
|
| 180 |
+
|
| 181 |
+
const userMessage: Message = { role: 'user', content: query };
|
| 182 |
+
const currentConversation = [...conversation, userMessage];
|
| 183 |
+
setConversation(currentConversation);
|
| 184 |
+
|
| 185 |
+
try {
|
| 186 |
+
const history = currentConversation.slice(0, -1).map(({ role, content }) => ({ role, content }));
|
| 187 |
+
|
| 188 |
+
const response = await fetch(process.env.NEXT_PUBLIC_HF_API_URL!, {
|
| 189 |
+
method: 'POST',
|
| 190 |
+
headers: {
|
| 191 |
+
'Content-Type': 'application/json',
|
| 192 |
+
'Authorization': `Bearer ${process.env.NEXT_PUBLIC_HF_API_TOKEN}`
|
| 193 |
+
},
|
| 194 |
+
body: JSON.stringify({ query, history }),
|
| 195 |
+
});
|
| 196 |
+
|
| 197 |
+
if (!response.ok) {
|
| 198 |
+
const errorData = await response.json().catch(() => ({ detail: 'An unknown error occurred.' }));
|
| 199 |
+
throw new Error(errorData.detail || 'Network response was not ok');
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
const data = await response.json();
|
| 203 |
+
const botMessage: Message = {
|
| 204 |
+
role: 'assistant',
|
| 205 |
+
content: data.response
|
| 206 |
+
};
|
| 207 |
+
setConversation([...currentConversation, botMessage]);
|
| 208 |
+
} catch (err: any) {
|
| 209 |
+
const errorMessageText = err.message || "An unexpected error occurred.";
|
| 210 |
+
setError(errorMessageText);
|
| 211 |
+
const errorMessage: Message = { role: 'assistant', content: errorMessageText };
|
| 212 |
+
setConversation([...currentConversation, errorMessage]);
|
| 213 |
+
} finally {
|
| 214 |
+
setIsLoading(false);
|
| 215 |
+
}
|
| 216 |
+
};
|
| 217 |
+
|
| 218 |
+
return (
|
| 219 |
+
<div className="min-h-screen flex flex-col bg-slate-50">
|
| 220 |
+
<Header />
|
| 221 |
+
<main className="flex-1 flex flex-col">
|
| 222 |
+
<div className="flex-1 overflow-y-auto">
|
| 223 |
+
{conversation.length === 0 ? (
|
| 224 |
+
<WelcomeScreen onTemplateClick={handleSubmit} />
|
| 225 |
+
) : (
|
| 226 |
+
<div className="pb-20">
|
| 227 |
+
{conversation.map((message, index) => (
|
| 228 |
+
<ChatMessage key={index} message={message} />
|
| 229 |
+
))}
|
| 230 |
+
<div ref={messagesEndRef} />
|
| 231 |
+
</div>
|
| 232 |
+
)}
|
| 233 |
+
</div>
|
| 234 |
+
<ChatForm
|
| 235 |
+
input={input}
|
| 236 |
+
setInput={setInput}
|
| 237 |
+
handleSubmit={handleSubmit}
|
| 238 |
+
isLoading={isLoading}
|
| 239 |
+
/>
|
| 240 |
+
</main>
|
| 241 |
+
<Footer />
|
| 242 |
+
</div>
|
| 243 |
+
);
|
| 244 |
+
}
|
frontend/src/lib/api.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { useState } from 'react';
|
| 2 |
+
|
| 3 |
+
const HF_API_URL = process.env.NEXT_PUBLIC_HF_API_URL;
|
| 4 |
+
const HF_API_TOKEN = process.env.NEXT_PUBLIC_HF_API_TOKEN;
|
| 5 |
+
|
| 6 |
+
export interface ChatMessage {
|
| 7 |
+
role: 'user' | 'assistant';
|
| 8 |
+
content: string;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
export interface APIResponse {
|
| 12 |
+
answer: string;
|
| 13 |
+
sources?: string[];
|
| 14 |
+
error?: string;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
export async function queryAPI(input: string): Promise<APIResponse> {
|
| 18 |
+
try {
|
| 19 |
+
if (!HF_API_URL) {
|
| 20 |
+
throw new Error('HF_API_URL is not configured');
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
const response = await fetch(HF_API_URL, {
|
| 24 |
+
method: 'POST',
|
| 25 |
+
headers: {
|
| 26 |
+
'Authorization': HF_API_TOKEN ? `Bearer ${HF_API_TOKEN}` : '',
|
| 27 |
+
'Content-Type': 'application/json',
|
| 28 |
+
},
|
| 29 |
+
body: JSON.stringify({ inputs: input }),
|
| 30 |
+
});
|
| 31 |
+
|
| 32 |
+
if (!response.ok) {
|
| 33 |
+
throw new Error(`API error: ${response.status}`);
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
const data = await response.json();
|
| 37 |
+
return {
|
| 38 |
+
answer: data.answer || data.output || data.generated_text || '',
|
| 39 |
+
sources: data.sources || [],
|
| 40 |
+
};
|
| 41 |
+
} catch (error) {
|
| 42 |
+
console.error('API Error:', error);
|
| 43 |
+
return {
|
| 44 |
+
answer: '',
|
| 45 |
+
error: error instanceof Error ? error.message : 'An unknown error occurred',
|
| 46 |
+
};
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
export function useChatQuery() {
|
| 51 |
+
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
| 52 |
+
const [isLoading, setIsLoading] = useState(false);
|
| 53 |
+
const [error, setError] = useState<string | null>(null);
|
| 54 |
+
|
| 55 |
+
const sendMessage = async (input: string) => {
|
| 56 |
+
try {
|
| 57 |
+
setIsLoading(true);
|
| 58 |
+
setError(null);
|
| 59 |
+
|
| 60 |
+
// Add user message
|
| 61 |
+
const userMessage: ChatMessage = { role: 'user', content: input };
|
| 62 |
+
setMessages(prev => [...prev, userMessage]);
|
| 63 |
+
|
| 64 |
+
// Query API
|
| 65 |
+
const response = await queryAPI(input);
|
| 66 |
+
|
| 67 |
+
if (response.error) {
|
| 68 |
+
throw new Error(response.error);
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
// Add assistant message
|
| 72 |
+
const assistantMessage: ChatMessage = {
|
| 73 |
+
role: 'assistant',
|
| 74 |
+
content: response.answer,
|
| 75 |
+
};
|
| 76 |
+
setMessages(prev => [...prev, assistantMessage]);
|
| 77 |
+
|
| 78 |
+
} catch (err) {
|
| 79 |
+
setError(err instanceof Error ? err.message : 'An unknown error occurred');
|
| 80 |
+
} finally {
|
| 81 |
+
setIsLoading(false);
|
| 82 |
+
}
|
| 83 |
+
};
|
| 84 |
+
|
| 85 |
+
return {
|
| 86 |
+
messages,
|
| 87 |
+
isLoading,
|
| 88 |
+
error,
|
| 89 |
+
sendMessage,
|
| 90 |
+
};
|
| 91 |
+
}
|
frontend/tailwind.config.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { Config } from "tailwindcss";
|
| 2 |
+
|
| 3 |
+
const config: Config = {
|
| 4 |
+
content: [
|
| 5 |
+
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
|
| 6 |
+
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
|
| 7 |
+
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
|
| 8 |
+
],
|
| 9 |
+
theme: {
|
| 10 |
+
extend: {
|
| 11 |
+
colors: {
|
| 12 |
+
'primary': '#3490f3',
|
| 13 |
+
'primary-dark': '#2563eb',
|
| 14 |
+
'secondary': '#e7edf4',
|
| 15 |
+
'text': {
|
| 16 |
+
'primary': '#0d141c',
|
| 17 |
+
'secondary': '#49719c'
|
| 18 |
+
},
|
| 19 |
+
},
|
| 20 |
+
animation: {
|
| 21 |
+
'fade-in': 'fadeIn 0.3s ease-out forwards',
|
| 22 |
+
},
|
| 23 |
+
keyframes: {
|
| 24 |
+
fadeIn: {
|
| 25 |
+
'0%': { opacity: '0', transform: 'translateY(10px)' },
|
| 26 |
+
'100%': { opacity: '1', transform: 'translateY(0)' },
|
| 27 |
+
},
|
| 28 |
+
},
|
| 29 |
+
typography: {
|
| 30 |
+
DEFAULT: {
|
| 31 |
+
css: {
|
| 32 |
+
maxWidth: 'none',
|
| 33 |
+
color: '#0d141c',
|
| 34 |
+
a: {
|
| 35 |
+
color: '#3490f3',
|
| 36 |
+
'&:hover': {
|
| 37 |
+
color: '#2563eb',
|
| 38 |
+
},
|
| 39 |
+
},
|
| 40 |
+
strong: {
|
| 41 |
+
color: '#0d141c',
|
| 42 |
+
},
|
| 43 |
+
h1: {
|
| 44 |
+
color: '#0d141c',
|
| 45 |
+
},
|
| 46 |
+
h2: {
|
| 47 |
+
color: '#0d141c',
|
| 48 |
+
},
|
| 49 |
+
h3: {
|
| 50 |
+
color: '#0d141c',
|
| 51 |
+
},
|
| 52 |
+
h4: {
|
| 53 |
+
color: '#0d141c',
|
| 54 |
+
},
|
| 55 |
+
},
|
| 56 |
+
},
|
| 57 |
+
},
|
| 58 |
+
},
|
| 59 |
+
},
|
| 60 |
+
plugins: [
|
| 61 |
+
require("@tailwindcss/typography"),
|
| 62 |
+
],
|
| 63 |
+
};
|
| 64 |
+
export default config;
|
frontend/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"compilerOptions": {
|
| 3 |
+
"target": "ES2017",
|
| 4 |
+
"lib": ["dom", "dom.iterable", "esnext"],
|
| 5 |
+
"allowJs": true,
|
| 6 |
+
"skipLibCheck": true,
|
| 7 |
+
"strict": true,
|
| 8 |
+
"noEmit": true,
|
| 9 |
+
"esModuleInterop": true,
|
| 10 |
+
"module": "esnext",
|
| 11 |
+
"moduleResolution": "bundler",
|
| 12 |
+
"resolveJsonModule": true,
|
| 13 |
+
"isolatedModules": true,
|
| 14 |
+
"jsx": "preserve",
|
| 15 |
+
"incremental": true,
|
| 16 |
+
"plugins": [
|
| 17 |
+
{
|
| 18 |
+
"name": "next"
|
| 19 |
+
}
|
| 20 |
+
],
|
| 21 |
+
"paths": {
|
| 22 |
+
"@/*": ["./src/*"]
|
| 23 |
+
}
|
| 24 |
+
},
|
| 25 |
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
| 26 |
+
"exclude": ["node_modules"]
|
| 27 |
+
}
|
requirements.txt
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# VedaMD Enhanced - Hugging Face Spaces Requirements
|
| 2 |
+
# Essential dependencies for Enhanced Medical RAG System
|
| 3 |
+
|
| 4 |
+
# Core framework
|
| 5 |
+
gradio>=4.0.0
|
| 6 |
+
|
| 7 |
+
# LLM and API
|
| 8 |
+
groq>=0.5.0
|
| 9 |
+
httpx>=0.24.0
|
| 10 |
+
|
| 11 |
+
# RAG and NLP
|
| 12 |
+
sentence-transformers>=2.2.0
|
| 13 |
+
transformers>=4.30.0
|
| 14 |
+
torch>=2.0.0
|
| 15 |
+
faiss-cpu>=1.7.0
|
| 16 |
+
|
| 17 |
+
# Cross-encoder for re-ranking
|
| 18 |
+
cross-encoder
|
| 19 |
+
|
| 20 |
+
# Data processing
|
| 21 |
+
numpy>=1.24.0
|
| 22 |
+
pandas>=2.0.0
|
| 23 |
+
|
| 24 |
+
# Environment and configuration
|
| 25 |
+
python-dotenv>=1.0.0
|
| 26 |
+
|
| 27 |
+
# Utilities
|
| 28 |
+
tenacity>=8.0.0
|
| 29 |
+
typing-extensions>=4.0.0
|
| 30 |
+
|
| 31 |
+
# HuggingFace integration
|
| 32 |
+
huggingface-hub>=0.16.0
|
| 33 |
+
|
| 34 |
+
# Text processing (for markdown)
|
| 35 |
+
markdown>=3.4.0
|
| 36 |
+
|
src/__init__.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Sri Lankan Clinical Assistant - Medical RAG System
|
| 3 |
+
"""
|
| 4 |
+
|
| 5 |
+
__version__ = "2.0.0"
|
src/enhanced_groq_medical_rag.py
ADDED
|
@@ -0,0 +1,626 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Enhanced Groq Medical RAG System - Production Ready
|
| 4 |
+
VedaMD Medical RAG - Production Integration
|
| 5 |
+
|
| 6 |
+
This system integrates our Phase 2 medical enhancements with the production Groq API system:
|
| 7 |
+
1. Enhanced Medical Context Preparation (Task 2.1) ✅
|
| 8 |
+
2. Medical Response Verification Layer (Task 2.2) ✅
|
| 9 |
+
3. Compatible Vector Store with Clinical ModernBERT enhancement ✅
|
| 10 |
+
4. Groq API with Llama3-70B for medical-grade generation
|
| 11 |
+
5. 100% source traceability and context adherence validation
|
| 12 |
+
|
| 13 |
+
PRODUCTION MEDICAL SAFETY ARCHITECTURE:
|
| 14 |
+
Query → Enhanced Context → Groq/Llama3-70B → Medical Verification → Safe Response
|
| 15 |
+
|
| 16 |
+
CRITICAL SAFETY GUARANTEES:
|
| 17 |
+
- Every medical fact traceable to provided Sri Lankan guidelines
|
| 18 |
+
- Comprehensive medical claim verification before response delivery
|
| 19 |
+
- Safety warnings for unverified medical information
|
| 20 |
+
- Medical-grade regulatory compliance protocols
|
| 21 |
+
"""
|
| 22 |
+
|
| 23 |
+
import os
|
| 24 |
+
import time
|
| 25 |
+
import logging
|
| 26 |
+
import re
|
| 27 |
+
import numpy as np
|
| 28 |
+
from typing import List, Dict, Any, Optional, Set
|
| 29 |
+
from dataclasses import dataclass
|
| 30 |
+
from dotenv import load_dotenv
|
| 31 |
+
import httpx
|
| 32 |
+
|
| 33 |
+
from sentence_transformers import CrossEncoder
|
| 34 |
+
from groq import Groq
|
| 35 |
+
from tenacity import retry, stop_after_attempt, wait_fixed, before_sleep_log
|
| 36 |
+
|
| 37 |
+
# Import our enhanced medical components
|
| 38 |
+
from enhanced_medical_context import MedicalContextEnhancer, EnhancedMedicalContext
|
| 39 |
+
from medical_response_verifier import MedicalResponseVerifier, MedicalResponseVerification
|
| 40 |
+
from vector_store_compatibility import CompatibleMedicalVectorStore
|
| 41 |
+
from simple_vector_store import SearchResult
|
| 42 |
+
|
| 43 |
+
load_dotenv()
|
| 44 |
+
|
| 45 |
+
@dataclass
|
| 46 |
+
class EnhancedMedicalResponse:
|
| 47 |
+
"""Enhanced medical response with verification and safety protocols"""
|
| 48 |
+
answer: str
|
| 49 |
+
confidence: float
|
| 50 |
+
sources: List[str]
|
| 51 |
+
query_time: float
|
| 52 |
+
# Enhanced medical safety fields
|
| 53 |
+
verification_result: Optional[MedicalResponseVerification]
|
| 54 |
+
safety_status: str
|
| 55 |
+
medical_entities_count: int
|
| 56 |
+
clinical_similarity_scores: List[float]
|
| 57 |
+
context_adherence_score: float
|
| 58 |
+
|
| 59 |
+
class EnhancedGroqMedicalRAG:
|
| 60 |
+
"""
|
| 61 |
+
Enhanced production Groq-powered RAG system with medical-grade safety protocols
|
| 62 |
+
"""
|
| 63 |
+
|
| 64 |
+
def __init__(self,
|
| 65 |
+
vector_store_repo_id: str = "sniro23/VedaMD-Vector-Store",
|
| 66 |
+
groq_api_key: Optional[str] = None):
|
| 67 |
+
"""
|
| 68 |
+
Initialize the enhanced medical RAG system with safety protocols
|
| 69 |
+
"""
|
| 70 |
+
self.setup_logging()
|
| 71 |
+
|
| 72 |
+
# Initialize Groq client for medical generation
|
| 73 |
+
self.groq_api_key = groq_api_key or os.getenv("GROQ_API_KEY")
|
| 74 |
+
if not self.groq_api_key:
|
| 75 |
+
raise ValueError("GROQ_API_KEY environment variable not set.")
|
| 76 |
+
|
| 77 |
+
# Explicitly create an isolated httpx client for Groq to avoid conflicts
|
| 78 |
+
http_client = httpx.Client()
|
| 79 |
+
self.groq_client = Groq(api_key=self.groq_api_key, http_client=http_client)
|
| 80 |
+
self.model_name = "llama3-70b-8192"
|
| 81 |
+
|
| 82 |
+
# Initialize medical enhancement components
|
| 83 |
+
self.logger.info("🏥 Initializing Enhanced Medical RAG System...")
|
| 84 |
+
|
| 85 |
+
# Enhanced medical context preparation
|
| 86 |
+
self.context_enhancer = MedicalContextEnhancer()
|
| 87 |
+
self.logger.info("✅ Enhanced Medical Context Preparation loaded")
|
| 88 |
+
|
| 89 |
+
# Medical response verification layer
|
| 90 |
+
self.response_verifier = MedicalResponseVerifier()
|
| 91 |
+
self.logger.info("✅ Medical Response Verification Layer loaded")
|
| 92 |
+
|
| 93 |
+
# Compatible vector store with Clinical ModernBERT enhancement
|
| 94 |
+
self.vector_store = CompatibleMedicalVectorStore(repo_id=vector_store_repo_id)
|
| 95 |
+
self.logger.info("✅ Compatible Medical Vector Store loaded")
|
| 96 |
+
|
| 97 |
+
# Initialize Cross-Encoder for re-ranking
|
| 98 |
+
self.reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
|
| 99 |
+
self.logger.info("✅ Cross-Encoder Re-ranker loaded")
|
| 100 |
+
|
| 101 |
+
self.logger.info("🎯 Enhanced Medical RAG System ready - Medical-grade safety protocols active")
|
| 102 |
+
self._test_groq_connection()
|
| 103 |
+
|
| 104 |
+
def setup_logging(self):
|
| 105 |
+
"""Setup logging for the enhanced medical RAG system"""
|
| 106 |
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
| 107 |
+
self.logger = logging.getLogger(__name__)
|
| 108 |
+
|
| 109 |
+
@retry(
|
| 110 |
+
stop=stop_after_attempt(3),
|
| 111 |
+
wait=wait_fixed(2),
|
| 112 |
+
before_sleep=before_sleep_log(logging.getLogger(__name__), logging.INFO)
|
| 113 |
+
)
|
| 114 |
+
def _test_groq_connection(self):
|
| 115 |
+
"""Test Groq API connection with retry logic."""
|
| 116 |
+
try:
|
| 117 |
+
self.groq_client.chat.completions.create(model=self.model_name, messages=[{"role": "user", "content": "Test"}], max_tokens=10)
|
| 118 |
+
self.logger.info("✅ Groq API connection successful")
|
| 119 |
+
except Exception as e:
|
| 120 |
+
self.logger.error(f"❌ Groq API connection failed: {e}")
|
| 121 |
+
raise
|
| 122 |
+
|
| 123 |
+
def prepare_enhanced_medical_context(self, retrieved_docs: List[SearchResult]) -> tuple:
|
| 124 |
+
"""
|
| 125 |
+
Prepare enhanced medical context from retrieved documents with medical entity extraction
|
| 126 |
+
"""
|
| 127 |
+
enhanced_contexts = []
|
| 128 |
+
all_medical_entities = []
|
| 129 |
+
all_clinical_similarities = []
|
| 130 |
+
|
| 131 |
+
for doc in retrieved_docs:
|
| 132 |
+
# Get source document name from metadata
|
| 133 |
+
source_doc = doc.metadata.get('citation', 'Unknown Source')
|
| 134 |
+
|
| 135 |
+
# Enhance medical context while maintaining source boundaries
|
| 136 |
+
enhanced_context = self.context_enhancer.enhance_medical_context(
|
| 137 |
+
content=doc.content,
|
| 138 |
+
source_document=source_doc,
|
| 139 |
+
metadata=doc.metadata
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
# Track medical entities for analysis
|
| 143 |
+
all_medical_entities.extend(enhanced_context.medical_entities)
|
| 144 |
+
|
| 145 |
+
# Track clinical similarity if available
|
| 146 |
+
if 'clinical_similarity' in doc.metadata:
|
| 147 |
+
all_clinical_similarities.append(doc.metadata['clinical_similarity'])
|
| 148 |
+
|
| 149 |
+
# Create enhanced context string with medical entity information
|
| 150 |
+
context_parts = [enhanced_context.original_content]
|
| 151 |
+
|
| 152 |
+
# Add medical terminology clarifications found in the same document
|
| 153 |
+
if enhanced_context.medical_entities:
|
| 154 |
+
medical_terms = []
|
| 155 |
+
for entity in enhanced_context.medical_entities:
|
| 156 |
+
if entity.confidence > 0.7: # High-confidence entities only
|
| 157 |
+
medical_terms.append(f"{entity.text} ({entity.entity_type})")
|
| 158 |
+
|
| 159 |
+
if medical_terms:
|
| 160 |
+
context_parts.append(f"\nMedical terms in this document: {', '.join(medical_terms[:5])}")
|
| 161 |
+
|
| 162 |
+
# Add evidence level if detected
|
| 163 |
+
if enhanced_context.evidence_level:
|
| 164 |
+
context_parts.append(f"\nEvidence Level: {enhanced_context.evidence_level}")
|
| 165 |
+
|
| 166 |
+
enhanced_contexts.append("\n".join(context_parts))
|
| 167 |
+
|
| 168 |
+
return enhanced_contexts, all_medical_entities, all_clinical_similarities
|
| 169 |
+
|
| 170 |
+
|
| 171 |
+
def analyze_medical_query(self, query: str) -> Dict[str, Any]:
|
| 172 |
+
"""Comprehensive medical query analysis for better retrieval"""
|
| 173 |
+
self.logger.info(f"🔍 Analyzing medical query: {query[:100]}...")
|
| 174 |
+
|
| 175 |
+
# Extract medical entities from query using existing enhancer
|
| 176 |
+
query_context = self.context_enhancer.enhance_medical_context(query, "query_analysis")
|
| 177 |
+
medical_entities = [entity.text for entity in query_context.medical_entities]
|
| 178 |
+
|
| 179 |
+
# Classify query type
|
| 180 |
+
query_type = self._classify_query_type(query)
|
| 181 |
+
|
| 182 |
+
# Generate query expansions
|
| 183 |
+
expanded_queries = self._generate_medical_expansions(query, medical_entities)
|
| 184 |
+
|
| 185 |
+
# Extract key medical concepts that must be covered
|
| 186 |
+
key_concepts = self._extract_key_medical_concepts(query, medical_entities)
|
| 187 |
+
|
| 188 |
+
analysis = {
|
| 189 |
+
'original_query': query,
|
| 190 |
+
'medical_entities': medical_entities,
|
| 191 |
+
'query_type': query_type,
|
| 192 |
+
'expanded_queries': expanded_queries,
|
| 193 |
+
'key_concepts': key_concepts,
|
| 194 |
+
'complexity_score': len(medical_entities) + len(key_concepts)
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
self.logger.info(f"📊 Query Analysis: Type={query_type}, Entities={len(medical_entities)}, Concepts={len(key_concepts)}")
|
| 198 |
+
return analysis
|
| 199 |
+
|
| 200 |
+
def _classify_query_type(self, query: str) -> str:
|
| 201 |
+
"""Classify medical query type for targeted retrieval"""
|
| 202 |
+
query_lower = query.lower()
|
| 203 |
+
|
| 204 |
+
patterns = {
|
| 205 |
+
'management': [r'\b(?:manage|treatment|therapy|protocol)\b', r'\bhow\s+(?:to\s+)?(?:treat|manage)\b'],
|
| 206 |
+
'diagnosis': [r'\b(?:diagnos|identify|detect|screen|test)\b', r'\bwhat is\b', r'\bsigns?\s+of\b'],
|
| 207 |
+
'protocol': [r'\b(?:protocol|guideline|procedure|algorithm|steps?)\b'],
|
| 208 |
+
'complications': [r'\b(?:complication|adverse|side\s+effect|risk)\b'],
|
| 209 |
+
'medication': [r'\b(?:drug|medication|dose|dosage|prescription)\b']
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
for query_type, type_patterns in patterns.items():
|
| 213 |
+
if any(re.search(pattern, query_lower) for pattern in type_patterns):
|
| 214 |
+
return query_type
|
| 215 |
+
|
| 216 |
+
return 'general'
|
| 217 |
+
|
| 218 |
+
def _generate_medical_expansions(self, query: str, entities: List[str]) -> List[str]:
|
| 219 |
+
"""Generate medical query expansions for comprehensive retrieval"""
|
| 220 |
+
expansions = []
|
| 221 |
+
|
| 222 |
+
# Medical synonym mappings for Sri Lankan guidelines
|
| 223 |
+
medical_synonyms = {
|
| 224 |
+
'pregnancy': ['gestation', 'prenatal', 'antenatal', 'obstetric', 'maternal'],
|
| 225 |
+
'hypertension': ['high blood pressure', 'elevated BP', 'HTN'],
|
| 226 |
+
'hemorrhage': ['bleeding', 'blood loss', 'PPH'],
|
| 227 |
+
'preeclampsia': ['pregnancy-induced hypertension', 'PIH'],
|
| 228 |
+
'delivery': ['birth', 'labor', 'parturition', 'childbirth'],
|
| 229 |
+
'cesarean': ['C-section', 'surgical delivery']
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
# Generate expansions
|
| 233 |
+
for entity in entities:
|
| 234 |
+
entity_lower = entity.lower()
|
| 235 |
+
if entity_lower in medical_synonyms:
|
| 236 |
+
for synonym in medical_synonyms[entity_lower]:
|
| 237 |
+
expanded_query = query.replace(entity, synonym)
|
| 238 |
+
expansions.append(expanded_query)
|
| 239 |
+
|
| 240 |
+
# Add Sri Lankan context expansions
|
| 241 |
+
expansions.extend([
|
| 242 |
+
f"Sri Lankan guidelines {query}",
|
| 243 |
+
f"management protocol {query}",
|
| 244 |
+
f"clinical approach {query}"
|
| 245 |
+
])
|
| 246 |
+
|
| 247 |
+
return expansions[:5] # Top 5 expansions
|
| 248 |
+
|
| 249 |
+
def _extract_key_medical_concepts(self, query: str, entities: List[str]) -> List[str]:
|
| 250 |
+
"""Extract key concepts that must be covered in retrieval"""
|
| 251 |
+
concepts = set(entities)
|
| 252 |
+
|
| 253 |
+
# Add critical medical terms from query
|
| 254 |
+
medical_terms = re.findall(
|
| 255 |
+
r'\b(?:blood pressure|dosage|protocol|guideline|procedure|medication|treatment|'
|
| 256 |
+
r'diagnosis|management|prevention|complication|contraindication|indication)\b',
|
| 257 |
+
query.lower()
|
| 258 |
+
)
|
| 259 |
+
concepts.update(medical_terms)
|
| 260 |
+
|
| 261 |
+
# Add pregnancy-specific concepts if relevant
|
| 262 |
+
if any(term in query.lower() for term in ['pregnan', 'maternal', 'obstetric']):
|
| 263 |
+
pregnancy_concepts = ['pregnancy', 'maternal', 'fetal', 'delivery', 'antenatal']
|
| 264 |
+
concepts.update([c for c in pregnancy_concepts if c in query.lower()])
|
| 265 |
+
|
| 266 |
+
return list(concepts)
|
| 267 |
+
|
| 268 |
+
def _advanced_medical_reranking(self, query_analysis: Dict[str, Any], documents: List[SearchResult]) -> List[SearchResult]:
|
| 269 |
+
"""Advanced re-ranking with medical relevance scoring"""
|
| 270 |
+
if not documents:
|
| 271 |
+
return []
|
| 272 |
+
|
| 273 |
+
# Cross-encoder re-ranking
|
| 274 |
+
query_doc_pairs = [[query_analysis['original_query'], doc.content] for doc in documents]
|
| 275 |
+
cross_encoder_scores = self.reranker.predict(query_doc_pairs)
|
| 276 |
+
|
| 277 |
+
# Medical relevance scoring
|
| 278 |
+
medical_scores = []
|
| 279 |
+
for doc in documents:
|
| 280 |
+
score = 0.0
|
| 281 |
+
doc_lower = doc.content.lower()
|
| 282 |
+
|
| 283 |
+
# Entity coverage scoring
|
| 284 |
+
for entity in query_analysis['medical_entities']:
|
| 285 |
+
if entity.lower() in doc_lower:
|
| 286 |
+
score += 0.3
|
| 287 |
+
|
| 288 |
+
# Key concept coverage
|
| 289 |
+
for concept in query_analysis['key_concepts']:
|
| 290 |
+
if concept.lower() in doc_lower:
|
| 291 |
+
score += 0.2
|
| 292 |
+
|
| 293 |
+
# Query type relevance
|
| 294 |
+
if query_analysis['query_type'] in doc_lower:
|
| 295 |
+
score += 0.1
|
| 296 |
+
|
| 297 |
+
medical_scores.append(min(score, 1.0))
|
| 298 |
+
|
| 299 |
+
# Combine scores (40% cross-encoder, 60% medical relevance)
|
| 300 |
+
final_scores = []
|
| 301 |
+
for i, doc in enumerate(documents):
|
| 302 |
+
combined_score = 0.4 * cross_encoder_scores[i] + 0.6 * medical_scores[i]
|
| 303 |
+
final_scores.append((combined_score, doc))
|
| 304 |
+
|
| 305 |
+
# Sort by combined score
|
| 306 |
+
final_scores.sort(key=lambda x: x[0], reverse=True)
|
| 307 |
+
return [doc for score, doc in final_scores]
|
| 308 |
+
|
| 309 |
+
def _verify_query_coverage(self, query_analysis: Dict[str, Any], documents: List[SearchResult]) -> float:
|
| 310 |
+
"""Verify how well documents cover the query requirements"""
|
| 311 |
+
if not documents or not query_analysis['key_concepts']:
|
| 312 |
+
return 0.5
|
| 313 |
+
|
| 314 |
+
all_content = ' '.join([doc.content.lower() for doc in documents])
|
| 315 |
+
covered_concepts = 0
|
| 316 |
+
|
| 317 |
+
for concept in query_analysis['key_concepts']:
|
| 318 |
+
if concept.lower() in all_content:
|
| 319 |
+
covered_concepts += 1
|
| 320 |
+
|
| 321 |
+
return covered_concepts / len(query_analysis['key_concepts'])
|
| 322 |
+
|
| 323 |
+
def _retrieve_missing_context(self, query_analysis: Dict[str, Any], current_docs: List[SearchResult], seen_content: Set[str]) -> List[SearchResult]:
|
| 324 |
+
"""Retrieve additional context for missing concepts"""
|
| 325 |
+
missing_docs = []
|
| 326 |
+
|
| 327 |
+
# Find uncovered concepts
|
| 328 |
+
all_content = ' '.join([doc.content.lower() for doc in current_docs])
|
| 329 |
+
missing_concepts = [concept for concept in query_analysis['key_concepts']
|
| 330 |
+
if concept.lower() not in all_content]
|
| 331 |
+
|
| 332 |
+
# Search for missing concepts
|
| 333 |
+
for concept in missing_concepts[:3]: # Top 3 missing
|
| 334 |
+
concept_docs = self.vector_store.search(concept, k=8)
|
| 335 |
+
for doc in concept_docs:
|
| 336 |
+
if doc.content not in seen_content and len(missing_docs) < 5:
|
| 337 |
+
missing_docs.append(doc)
|
| 338 |
+
seen_content.add(doc.content)
|
| 339 |
+
|
| 340 |
+
return missing_docs
|
| 341 |
+
|
| 342 |
+
def query(self, query: str, history: Optional[List[Dict[str, str]]] = None, use_llm: bool = True) -> EnhancedMedicalResponse:
|
| 343 |
+
"""ENHANCED multi-stage medical query processing with comprehensive retrieval"""
|
| 344 |
+
start_time = time.time()
|
| 345 |
+
self.logger.info(f"🔍 Processing enhanced medical query: {query[:50]}...")
|
| 346 |
+
|
| 347 |
+
# Step 1: Analyze query for comprehensive understanding
|
| 348 |
+
query_analysis = self.analyze_medical_query(query)
|
| 349 |
+
|
| 350 |
+
# Step 2: Multi-stage comprehensive retrieval
|
| 351 |
+
all_documents = []
|
| 352 |
+
seen_content = set()
|
| 353 |
+
|
| 354 |
+
# Stage 2a: Original query retrieval (increased from 15 to 25)
|
| 355 |
+
stage1_docs = self.vector_store.search(query=query, k=25)
|
| 356 |
+
for doc in stage1_docs:
|
| 357 |
+
if doc.content not in seen_content:
|
| 358 |
+
all_documents.append(doc)
|
| 359 |
+
seen_content.add(doc.content)
|
| 360 |
+
|
| 361 |
+
# Stage 2b: Expanded query retrieval
|
| 362 |
+
for expanded_query in query_analysis['expanded_queries']:
|
| 363 |
+
expanded_docs = self.vector_store.search(expanded_query, k=15)
|
| 364 |
+
for doc in expanded_docs:
|
| 365 |
+
if doc.content not in seen_content and len(all_documents) < 50:
|
| 366 |
+
all_documents.append(doc)
|
| 367 |
+
seen_content.add(doc.content)
|
| 368 |
+
|
| 369 |
+
# Stage 2c: Entity-specific retrieval
|
| 370 |
+
for entity in query_analysis['medical_entities']:
|
| 371 |
+
entity_docs = self.vector_store.search(entity, k=10)
|
| 372 |
+
for doc in entity_docs:
|
| 373 |
+
if doc.content not in seen_content and len(all_documents) < 60:
|
| 374 |
+
all_documents.append(doc)
|
| 375 |
+
seen_content.add(doc.content)
|
| 376 |
+
|
| 377 |
+
if not all_documents:
|
| 378 |
+
return self._create_no_results_response(query, start_time)
|
| 379 |
+
|
| 380 |
+
# Step 3: Advanced multi-criteria re-ranking
|
| 381 |
+
reranked_docs = self._advanced_medical_reranking(query_analysis, all_documents)
|
| 382 |
+
|
| 383 |
+
# Step 4: Select optimal number of documents (increased from 5 to 10-15)
|
| 384 |
+
optimal_doc_count = min(15, max(10, query_analysis['complexity_score'] + 5))
|
| 385 |
+
final_docs = reranked_docs[:optimal_doc_count]
|
| 386 |
+
|
| 387 |
+
# Step 5: Verify coverage and add missing context if needed
|
| 388 |
+
coverage_score = self._verify_query_coverage(query_analysis, final_docs)
|
| 389 |
+
if coverage_score < 0.7: # Less than 70% coverage
|
| 390 |
+
additional_docs = self._retrieve_missing_context(query_analysis, final_docs, seen_content)
|
| 391 |
+
final_docs.extend(additional_docs[:5]) # Add up to 5 more docs
|
| 392 |
+
|
| 393 |
+
self.logger.info(f"📚 Final retrieval: {len(final_docs)} documents, Coverage: {coverage_score:.1%}")
|
| 394 |
+
|
| 395 |
+
# Step 6: Enhanced context preparation (using existing method)
|
| 396 |
+
enhanced_contexts, medical_entities, clinical_similarities = self.prepare_enhanced_medical_context(final_docs)
|
| 397 |
+
self.logger.info(f"🏥 Enhanced medical context prepared: {len(medical_entities)} entities extracted")
|
| 398 |
+
|
| 399 |
+
# Step 7: Format comprehensive context for LLM
|
| 400 |
+
context_parts = []
|
| 401 |
+
for i, (doc, enhanced_context) in enumerate(zip(final_docs, enhanced_contexts), 1):
|
| 402 |
+
citation = doc.metadata.get('citation', 'Unknown Source')
|
| 403 |
+
context_parts.append(f"[{i}] Citation: {citation}\n\nContent: {enhanced_context}")
|
| 404 |
+
|
| 405 |
+
formatted_context = "\n\n---\n\n".join(context_parts)
|
| 406 |
+
|
| 407 |
+
# Continue with existing LLM generation and verification...
|
| 408 |
+
confidence = self._calculate_confidence([1.0] * len(final_docs), use_llm)
|
| 409 |
+
sources = list(set([doc.metadata.get('citation', 'Unknown Source') for doc in final_docs]))
|
| 410 |
+
|
| 411 |
+
if use_llm:
|
| 412 |
+
system_prompt = self._create_enhanced_medical_system_prompt()
|
| 413 |
+
raw_response = self._generate_groq_response(system_prompt, formatted_context, query, history)
|
| 414 |
+
|
| 415 |
+
verification_result = self.response_verifier.verify_medical_response(
|
| 416 |
+
response=raw_response,
|
| 417 |
+
provided_context=enhanced_contexts
|
| 418 |
+
)
|
| 419 |
+
self.logger.info(f"✅ Medical verification completed: {verification_result.verified_claims}/{verification_result.total_claims} claims verified")
|
| 420 |
+
|
| 421 |
+
final_response, safety_status = self._create_verified_medical_response(raw_response, verification_result)
|
| 422 |
+
else:
|
| 423 |
+
final_response = formatted_context
|
| 424 |
+
verification_result = None
|
| 425 |
+
safety_status = "CONTEXT_ONLY"
|
| 426 |
+
|
| 427 |
+
context_adherence_score = verification_result.verification_score if verification_result else 1.0
|
| 428 |
+
query_time = time.time() - start_time
|
| 429 |
+
|
| 430 |
+
enhanced_response = EnhancedMedicalResponse(
|
| 431 |
+
answer=final_response,
|
| 432 |
+
confidence=confidence,
|
| 433 |
+
sources=sources,
|
| 434 |
+
query_time=query_time,
|
| 435 |
+
verification_result=verification_result,
|
| 436 |
+
safety_status=safety_status,
|
| 437 |
+
medical_entities_count=len(medical_entities),
|
| 438 |
+
clinical_similarity_scores=clinical_similarities,
|
| 439 |
+
context_adherence_score=context_adherence_score
|
| 440 |
+
)
|
| 441 |
+
|
| 442 |
+
self.logger.info(f"🎯 Enhanced medical query completed in {query_time:.2f}s - Safety: {safety_status}")
|
| 443 |
+
return enhanced_response
|
| 444 |
+
|
| 445 |
+
|
| 446 |
+
def _create_enhanced_medical_system_prompt(self) -> str:
|
| 447 |
+
"""Create enhanced medical system prompt with natural conversational style"""
|
| 448 |
+
return (
|
| 449 |
+
"You are VedaMD, a knowledgeable medical assistant supporting Sri Lankan healthcare professionals. "
|
| 450 |
+
"Your role is to provide clear, professional, and evidence-based medical information from Sri Lankan clinical guidelines. "
|
| 451 |
+
"Communicate naturally and conversationally while maintaining medical accuracy.\n\n"
|
| 452 |
+
|
| 453 |
+
"**Core Principles:**\n"
|
| 454 |
+
"• Use only information from the provided Sri Lankan clinical guidelines\n"
|
| 455 |
+
"• Write in a natural, professional tone that healthcare providers appreciate\n"
|
| 456 |
+
"• Include relevant citations [1], [2] naturally within your response\n"
|
| 457 |
+
"• Structure information logically but naturally - no rigid formatting required\n"
|
| 458 |
+
"• Focus on practical, actionable medical information\n\n"
|
| 459 |
+
|
| 460 |
+
"**Response Style:**\n"
|
| 461 |
+
"• Provide comprehensive answers that directly address the clinical question\n"
|
| 462 |
+
"• Include specific medical details like dosages, procedures, and protocols when available\n"
|
| 463 |
+
"• Explain medical concepts and rationale clearly\n"
|
| 464 |
+
"• If guidelines don't contain specific information, clearly state this and suggest next steps\n"
|
| 465 |
+
"• For complex cases beyond guidelines, recommend specialist consultation\n"
|
| 466 |
+
"• Include evidence levels and Sri Lankan guideline compliance when relevant\n\n"
|
| 467 |
+
|
| 468 |
+
"Write a thorough, naturally-flowing response that addresses the medical question using the available guideline information. "
|
| 469 |
+
"Be detailed where helpful, concise where appropriate, and always maintain focus on practical clinical utility. "
|
| 470 |
+
"Include appropriate medical disclaimers when clinically relevant."
|
| 471 |
+
)
|
| 472 |
+
|
| 473 |
+
def _generate_groq_response(self, system_prompt: str, context: str, query: str, history: Optional[List[Dict[str, str]]] = None) -> str:
|
| 474 |
+
"""Generate response using Groq API with enhanced medical prompt"""
|
| 475 |
+
try:
|
| 476 |
+
messages = [
|
| 477 |
+
{
|
| 478 |
+
"role": "system",
|
| 479 |
+
"content": system_prompt,
|
| 480 |
+
}
|
| 481 |
+
]
|
| 482 |
+
|
| 483 |
+
# Add conversation history to the messages
|
| 484 |
+
if history:
|
| 485 |
+
messages.extend(history)
|
| 486 |
+
|
| 487 |
+
# Add the current query with enhanced context
|
| 488 |
+
messages.append({"role": "user", "content": f"Clinical Context:\n{context}\n\nMedical Query: {query}"})
|
| 489 |
+
|
| 490 |
+
chat_completion = self.groq_client.chat.completions.create(
|
| 491 |
+
messages=messages,
|
| 492 |
+
model=self.model_name,
|
| 493 |
+
temperature=0.7,
|
| 494 |
+
max_tokens=2048,
|
| 495 |
+
top_p=1,
|
| 496 |
+
stream=False
|
| 497 |
+
)
|
| 498 |
+
|
| 499 |
+
return chat_completion.choices[0].message.content
|
| 500 |
+
|
| 501 |
+
except Exception as e:
|
| 502 |
+
self.logger.error(f"Error during Groq API call: {e}")
|
| 503 |
+
return f"Sorry, I encountered an error while generating the medical response: {e}"
|
| 504 |
+
|
| 505 |
+
def _create_verified_medical_response(self, raw_response: str, verification: MedicalResponseVerification) -> tuple:
|
| 506 |
+
"""Create final verified medical response with safety protocols"""
|
| 507 |
+
if verification.is_safe_for_medical_use:
|
| 508 |
+
safety_status = "SAFE"
|
| 509 |
+
final_response = raw_response
|
| 510 |
+
else:
|
| 511 |
+
safety_status = "REQUIRES_MEDICAL_REVIEW"
|
| 512 |
+
|
| 513 |
+
# Add medical safety warnings to response
|
| 514 |
+
warning_section = "\n\n⚠️ **MEDICAL SAFETY NOTICE:**\n"
|
| 515 |
+
if verification.safety_warnings:
|
| 516 |
+
for warning in verification.safety_warnings:
|
| 517 |
+
warning_section += f"- {warning}\n"
|
| 518 |
+
|
| 519 |
+
warning_section += f"\n**Medical Verification Score:** {verification.verification_score:.1%} "
|
| 520 |
+
warning_section += f"({verification.verified_claims}/{verification.total_claims} medical claims verified)\n"
|
| 521 |
+
warning_section += "\n_This response requires medical professional review before clinical use._"
|
| 522 |
+
|
| 523 |
+
final_response = raw_response + warning_section
|
| 524 |
+
|
| 525 |
+
return final_response, safety_status
|
| 526 |
+
|
| 527 |
+
def _create_no_results_response(self, query: str, start_time: float) -> EnhancedMedicalResponse:
|
| 528 |
+
"""Create response when no documents are retrieved"""
|
| 529 |
+
no_results_response = """
|
| 530 |
+
## Clinical Summary
|
| 531 |
+
No relevant clinical information found in the provided Sri Lankan guidelines for this medical query.
|
| 532 |
+
|
| 533 |
+
## Key Clinical Recommendations
|
| 534 |
+
- Consult senior medical staff or specialist guidelines for this clinical scenario
|
| 535 |
+
- This query may require medical information beyond current available guidelines
|
| 536 |
+
- Consider referral to appropriate medical specialist
|
| 537 |
+
|
| 538 |
+
## Clinical References
|
| 539 |
+
No applicable Sri Lankan guidelines found in current database
|
| 540 |
+
|
| 541 |
+
_This clinical situation requires specialist consultation beyond current guidelines._
|
| 542 |
+
"""
|
| 543 |
+
|
| 544 |
+
return EnhancedMedicalResponse(
|
| 545 |
+
answer=no_results_response,
|
| 546 |
+
confidence=0.0,
|
| 547 |
+
sources=[],
|
| 548 |
+
query_time=time.time() - start_time,
|
| 549 |
+
verification_result=None,
|
| 550 |
+
safety_status="NO_CONTEXT",
|
| 551 |
+
medical_entities_count=0,
|
| 552 |
+
clinical_similarity_scores=[],
|
| 553 |
+
context_adherence_score=0.0
|
| 554 |
+
)
|
| 555 |
+
|
| 556 |
+
def _calculate_confidence(self, scores: List[float], use_llm: bool) -> float:
|
| 557 |
+
"""Calculate confidence score based on retrieval and re-ranking scores"""
|
| 558 |
+
if not scores:
|
| 559 |
+
return 0.0
|
| 560 |
+
|
| 561 |
+
# Base confidence from average re-ranking scores
|
| 562 |
+
base_confidence = np.mean(scores)
|
| 563 |
+
|
| 564 |
+
# Adjust confidence based on score consistency
|
| 565 |
+
score_std = np.std(scores) if len(scores) > 1 else 0
|
| 566 |
+
consistency_bonus = max(0, 0.1 - score_std)
|
| 567 |
+
|
| 568 |
+
# Medical context bonus for clinical queries
|
| 569 |
+
medical_bonus = 0.05 if use_llm else 0
|
| 570 |
+
|
| 571 |
+
final_confidence = min(base_confidence + consistency_bonus + medical_bonus, 1.0)
|
| 572 |
+
return final_confidence
|
| 573 |
+
|
| 574 |
+
def test_enhanced_groq_medical_rag():
|
| 575 |
+
"""Test the enhanced production medical RAG system"""
|
| 576 |
+
print("🧪 Testing Enhanced Groq Medical RAG System")
|
| 577 |
+
print("=" * 60)
|
| 578 |
+
|
| 579 |
+
try:
|
| 580 |
+
# Initialize enhanced system
|
| 581 |
+
enhanced_rag = EnhancedGroqMedicalRAG()
|
| 582 |
+
|
| 583 |
+
# Test medical queries
|
| 584 |
+
test_queries = [
|
| 585 |
+
"What is the management protocol for severe preeclampsia?",
|
| 586 |
+
"How should postpartum hemorrhage be managed according to Sri Lankan guidelines?",
|
| 587 |
+
"What are the contraindicated medications in pregnancy?"
|
| 588 |
+
]
|
| 589 |
+
|
| 590 |
+
for i, query in enumerate(test_queries, 1):
|
| 591 |
+
print(f"\n📋 Test Query {i}: {query}")
|
| 592 |
+
print("-" * 50)
|
| 593 |
+
|
| 594 |
+
# Process medical query
|
| 595 |
+
response = enhanced_rag.query(query)
|
| 596 |
+
|
| 597 |
+
# Display results
|
| 598 |
+
print(f"🔍 Processing Time: {response.query_time:.2f}s")
|
| 599 |
+
print(f"🛡️ Safety Status: {response.safety_status}")
|
| 600 |
+
print(f"📊 Medical Entities: {response.medical_entities_count}")
|
| 601 |
+
print(f"✅ Context Adherence: {response.context_adherence_score:.1%}")
|
| 602 |
+
print(f"📈 Confidence: {response.confidence:.1%}")
|
| 603 |
+
|
| 604 |
+
if response.verification_result:
|
| 605 |
+
print(f"🔬 Medical Claims Verified: {response.verification_result.verified_claims}/{response.verification_result.total_claims}")
|
| 606 |
+
|
| 607 |
+
if response.clinical_similarity_scores:
|
| 608 |
+
avg_similarity = np.mean(response.clinical_similarity_scores)
|
| 609 |
+
print(f"🏥 Clinical Similarity: {avg_similarity:.3f}")
|
| 610 |
+
|
| 611 |
+
print(f"\n💬 Response Preview:")
|
| 612 |
+
print(f" {response.answer[:250]}...")
|
| 613 |
+
|
| 614 |
+
if response.verification_result and response.verification_result.safety_warnings:
|
| 615 |
+
print(f"\n⚠️ Safety Warnings: {len(response.verification_result.safety_warnings)}")
|
| 616 |
+
|
| 617 |
+
print(f"\n✅ Enhanced Groq Medical RAG System Test Completed")
|
| 618 |
+
print("🏥 Medical-grade safety protocols validated with Groq API integration")
|
| 619 |
+
|
| 620 |
+
except Exception as e:
|
| 621 |
+
print(f"❌ Test failed: {e}")
|
| 622 |
+
import traceback
|
| 623 |
+
traceback.print_exc()
|
| 624 |
+
|
| 625 |
+
if __name__ == "__main__":
|
| 626 |
+
test_enhanced_groq_medical_rag()
|
src/enhanced_medical_context.py
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Enhanced Medical Context Preparation System
|
| 4 |
+
VedaMD Medical RAG - Phase 2: Task 2.1
|
| 5 |
+
|
| 6 |
+
This module enhances medical context preparation by:
|
| 7 |
+
1. Extracting medical entities from PROVIDED documents only
|
| 8 |
+
2. Creating clinical relationship mappings within source guidelines
|
| 9 |
+
3. Standardizing medical terminology from source documents
|
| 10 |
+
4. Adding medical metadata while maintaining strict context boundaries
|
| 11 |
+
|
| 12 |
+
CRITICAL SAFETY PROTOCOL:
|
| 13 |
+
- NO external medical knowledge injection
|
| 14 |
+
- ALL enhancements derived from provided Sri Lankan guidelines
|
| 15 |
+
- Maintains 100% source traceability for regulatory compliance
|
| 16 |
+
"""
|
| 17 |
+
|
| 18 |
+
import re
|
| 19 |
+
import logging
|
| 20 |
+
from typing import List, Dict, Set, Tuple, Optional, Any
|
| 21 |
+
from dataclasses import dataclass
|
| 22 |
+
from pathlib import Path
|
| 23 |
+
import json
|
| 24 |
+
from collections import defaultdict, Counter
|
| 25 |
+
|
| 26 |
+
# Medical entity patterns for Sri Lankan clinical guidelines
|
| 27 |
+
MEDICAL_ENTITY_PATTERNS = {
|
| 28 |
+
# Medications and dosages (extract from provided context only)
|
| 29 |
+
'medications': [
|
| 30 |
+
r'\b(?:magnesium sulfate|MgSO4|oxytocin|methyldopa|nifedipine|labetalol|hydralazine)\b',
|
| 31 |
+
r'\b(?:ampicillin|gentamicin|ceftriaxone|azithromycin|doxycycline)\b',
|
| 32 |
+
r'\b(?:insulin|metformin|glibenclamide|aspirin|atorvastatin)\b'
|
| 33 |
+
],
|
| 34 |
+
'dosages': [
|
| 35 |
+
r'\b\d+(?:\.\d+)?\s*(?:mg|g|ml|units?|tablets?|caps)\b',
|
| 36 |
+
r'\b(?:low|moderate|high|maximum|minimum)\s+dose\b'
|
| 37 |
+
],
|
| 38 |
+
# Clinical conditions (from Sri Lankan guidelines)
|
| 39 |
+
'conditions': [
|
| 40 |
+
r'\b(?:preeclampsia|eclampsia|HELLP syndrome|gestational hypertension)\b',
|
| 41 |
+
r'\b(?:postpartum hemorrhage|PPH|retained placenta|uterine atony)\b',
|
| 42 |
+
r'\b(?:puerperal sepsis|endometritis|wound infection)\b',
|
| 43 |
+
r'\b(?:gestational diabetes|GDM|diabetes mellitus)\b'
|
| 44 |
+
],
|
| 45 |
+
# Procedures and interventions
|
| 46 |
+
'procedures': [
|
| 47 |
+
r'\b(?:cesarean section|C-section|vaginal delivery|assisted delivery)\b',
|
| 48 |
+
r'\b(?:blood pressure monitoring|fetal monitoring|CTG)\b',
|
| 49 |
+
r'\b(?:IV access|urinary catheter|nasogastric tube)\b'
|
| 50 |
+
],
|
| 51 |
+
# Vital signs and measurements
|
| 52 |
+
'vitals': [
|
| 53 |
+
r'\b(?:blood pressure|BP)\s*(?:≥|>=|>|<|≤|<=)?\s*\d+/\d+\s*mmHg\b',
|
| 54 |
+
r'\b(?:heart rate|HR|pulse)\s*\d+\s*bpm\b',
|
| 55 |
+
r'\b(?:temperature|temp)\s*\d+(?:\.\d+)?\s*°?[CF]\b'
|
| 56 |
+
],
|
| 57 |
+
# Evidence levels (from Sri Lankan guidelines)
|
| 58 |
+
'evidence_levels': [
|
| 59 |
+
r'\b(?:Level I|Level II|Level III|Grade A|Grade B|Grade C)\s+evidence\b',
|
| 60 |
+
r'\b(?:Expert consensus|Clinical recommendation|Strong recommendation)\b'
|
| 61 |
+
]
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
# Clinical relationship indicators (extract relationships from provided docs)
|
| 65 |
+
CLINICAL_RELATIONSHIPS = {
|
| 66 |
+
'causes': [r'\bcause[sd]?\s+by\b', r'\bdue to\b', r'\bresult[s]?\s+from\b'],
|
| 67 |
+
'treatments': [r'\btreat(?:ed|ment)?\s+with\b', r'\bmanage[d]?\s+with\b', r'\badminister\b'],
|
| 68 |
+
'contraindications': [r'\bcontraindicated\b', r'\bavoid\b', r'\bdo not\b'],
|
| 69 |
+
'indications': [r'\bindicated\s+for\b', r'\brecommended\s+for\b', r'\bused\s+to\s+treat\b'],
|
| 70 |
+
'side_effects': [r'\bside effects?\b', r'\badverse\s+(?:effects?|reactions?)\b', r'\bcomplications?\b'],
|
| 71 |
+
'dosing': [r'\bdose\b', r'\bdosage\b', r'\badminister\s+\d+', r'\bgive\s+\d+']
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
@dataclass
|
| 75 |
+
class MedicalEntity:
|
| 76 |
+
"""Medical entity extracted from source documents"""
|
| 77 |
+
text: str
|
| 78 |
+
entity_type: str
|
| 79 |
+
source_document: str
|
| 80 |
+
context: str
|
| 81 |
+
confidence: float
|
| 82 |
+
line_number: Optional[int] = None
|
| 83 |
+
|
| 84 |
+
@dataclass
|
| 85 |
+
class ClinicalRelationship:
|
| 86 |
+
"""Clinical relationship between medical entities within source documents"""
|
| 87 |
+
entity1: str
|
| 88 |
+
relationship_type: str
|
| 89 |
+
entity2: str
|
| 90 |
+
source_document: str
|
| 91 |
+
context: str
|
| 92 |
+
confidence: float
|
| 93 |
+
|
| 94 |
+
@dataclass
|
| 95 |
+
class EnhancedMedicalContext:
|
| 96 |
+
"""Enhanced medical context with entities and relationships from source docs"""
|
| 97 |
+
original_content: str
|
| 98 |
+
medical_entities: List[MedicalEntity]
|
| 99 |
+
clinical_relationships: List[ClinicalRelationship]
|
| 100 |
+
medical_concepts: Dict[str, List[str]]
|
| 101 |
+
terminology_mappings: Dict[str, str]
|
| 102 |
+
evidence_level: Optional[str]
|
| 103 |
+
source_metadata: Dict[str, Any]
|
| 104 |
+
|
| 105 |
+
class MedicalContextEnhancer:
|
| 106 |
+
"""
|
| 107 |
+
Enhanced medical context preparation system that maintains strict source boundaries
|
| 108 |
+
"""
|
| 109 |
+
|
| 110 |
+
def __init__(self):
|
| 111 |
+
self.setup_logging()
|
| 112 |
+
self.medical_terminology_db = self._load_terminology_mappings()
|
| 113 |
+
|
| 114 |
+
def setup_logging(self):
|
| 115 |
+
"""Setup logging for medical context enhancement"""
|
| 116 |
+
logging.basicConfig(level=logging.INFO,
|
| 117 |
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
| 118 |
+
self.logger = logging.getLogger(__name__)
|
| 119 |
+
|
| 120 |
+
def _load_terminology_mappings(self) -> Dict[str, str]:
|
| 121 |
+
"""Load medical terminology mappings from processed documents"""
|
| 122 |
+
# This will be populated from actual Sri Lankan guideline terminology
|
| 123 |
+
return {
|
| 124 |
+
# Abbreviation mappings found in source documents
|
| 125 |
+
'PPH': 'Postpartum Hemorrhage',
|
| 126 |
+
'MgSO4': 'Magnesium Sulfate',
|
| 127 |
+
'BP': 'Blood Pressure',
|
| 128 |
+
'CTG': 'Cardiotocography',
|
| 129 |
+
'IV': 'Intravenous',
|
| 130 |
+
'GDM': 'Gestational Diabetes Mellitus',
|
| 131 |
+
'HELLP': 'Hemolysis, Elevated Liver enzymes, Low Platelets'
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
def extract_medical_entities(self, content: str, source_document: str) -> List[MedicalEntity]:
|
| 135 |
+
"""
|
| 136 |
+
Extract medical entities from provided document content only
|
| 137 |
+
"""
|
| 138 |
+
entities = []
|
| 139 |
+
lines = content.split('\n')
|
| 140 |
+
|
| 141 |
+
for line_num, line in enumerate(lines, 1):
|
| 142 |
+
line_lower = line.lower()
|
| 143 |
+
|
| 144 |
+
for entity_type, patterns in MEDICAL_ENTITY_PATTERNS.items():
|
| 145 |
+
for pattern in patterns:
|
| 146 |
+
matches = re.finditer(pattern, line, re.IGNORECASE)
|
| 147 |
+
for match in matches:
|
| 148 |
+
entity = MedicalEntity(
|
| 149 |
+
text=match.group(),
|
| 150 |
+
entity_type=entity_type,
|
| 151 |
+
source_document=source_document,
|
| 152 |
+
context=line.strip(),
|
| 153 |
+
confidence=self._calculate_entity_confidence(match.group(), line),
|
| 154 |
+
line_number=line_num
|
| 155 |
+
)
|
| 156 |
+
entities.append(entity)
|
| 157 |
+
|
| 158 |
+
self.logger.info(f"Extracted {len(entities)} medical entities from {source_document}")
|
| 159 |
+
return entities
|
| 160 |
+
|
| 161 |
+
def extract_clinical_relationships(self, content: str, source_document: str,
|
| 162 |
+
entities: List[MedicalEntity]) -> List[ClinicalRelationship]:
|
| 163 |
+
"""
|
| 164 |
+
Extract clinical relationships between entities within the same source document
|
| 165 |
+
"""
|
| 166 |
+
relationships = []
|
| 167 |
+
lines = content.split('\n')
|
| 168 |
+
|
| 169 |
+
# Create entity lookup for this document
|
| 170 |
+
entity_texts = {entity.text.lower() for entity in entities
|
| 171 |
+
if entity.source_document == source_document}
|
| 172 |
+
|
| 173 |
+
for line_num, line in enumerate(lines, 1):
|
| 174 |
+
line_lower = line.lower()
|
| 175 |
+
|
| 176 |
+
# Find entities in this line
|
| 177 |
+
line_entities = [text for text in entity_texts if text in line_lower]
|
| 178 |
+
|
| 179 |
+
if len(line_entities) >= 2:
|
| 180 |
+
# Look for relationship indicators
|
| 181 |
+
for rel_type, patterns in CLINICAL_RELATIONSHIPS.items():
|
| 182 |
+
for pattern in patterns:
|
| 183 |
+
if re.search(pattern, line, re.IGNORECASE):
|
| 184 |
+
# Create relationships between entities in this line
|
| 185 |
+
for i, entity1 in enumerate(line_entities):
|
| 186 |
+
for entity2 in line_entities[i+1:]:
|
| 187 |
+
relationship = ClinicalRelationship(
|
| 188 |
+
entity1=entity1,
|
| 189 |
+
relationship_type=rel_type,
|
| 190 |
+
entity2=entity2,
|
| 191 |
+
source_document=source_document,
|
| 192 |
+
context=line.strip(),
|
| 193 |
+
confidence=self._calculate_relationship_confidence(pattern, line)
|
| 194 |
+
)
|
| 195 |
+
relationships.append(relationship)
|
| 196 |
+
|
| 197 |
+
self.logger.info(f"Extracted {len(relationships)} clinical relationships from {source_document}")
|
| 198 |
+
return relationships
|
| 199 |
+
|
| 200 |
+
def standardize_medical_terminology(self, content: str) -> str:
|
| 201 |
+
"""
|
| 202 |
+
Standardize medical terminology based on mappings found in source documents
|
| 203 |
+
"""
|
| 204 |
+
standardized_content = content
|
| 205 |
+
|
| 206 |
+
for abbreviation, full_form in self.medical_terminology_db.items():
|
| 207 |
+
# Only standardize if both forms appear in the source documents
|
| 208 |
+
pattern = r'\b' + re.escape(abbreviation) + r'\b'
|
| 209 |
+
standardized_content = re.sub(pattern, f"{abbreviation} ({full_form})",
|
| 210 |
+
standardized_content, flags=re.IGNORECASE)
|
| 211 |
+
|
| 212 |
+
return standardized_content
|
| 213 |
+
|
| 214 |
+
def extract_medical_concepts(self, entities: List[MedicalEntity]) -> Dict[str, List[str]]:
|
| 215 |
+
"""
|
| 216 |
+
Group medical entities into conceptual categories from source documents
|
| 217 |
+
"""
|
| 218 |
+
concepts = defaultdict(list)
|
| 219 |
+
|
| 220 |
+
for entity in entities:
|
| 221 |
+
concepts[entity.entity_type].append(entity.text)
|
| 222 |
+
|
| 223 |
+
# Remove duplicates and sort
|
| 224 |
+
for concept_type in concepts:
|
| 225 |
+
concepts[concept_type] = sorted(list(set(concepts[concept_type])))
|
| 226 |
+
|
| 227 |
+
return dict(concepts)
|
| 228 |
+
|
| 229 |
+
def detect_evidence_level(self, content: str) -> Optional[str]:
|
| 230 |
+
"""
|
| 231 |
+
Detect evidence level mentioned in the source document
|
| 232 |
+
"""
|
| 233 |
+
for pattern in MEDICAL_ENTITY_PATTERNS['evidence_levels']:
|
| 234 |
+
match = re.search(pattern, content, re.IGNORECASE)
|
| 235 |
+
if match:
|
| 236 |
+
return match.group()
|
| 237 |
+
return None
|
| 238 |
+
|
| 239 |
+
def enhance_medical_context(self, content: str, source_document: str,
|
| 240 |
+
metadata: Dict[str, Any] = None) -> EnhancedMedicalContext:
|
| 241 |
+
"""
|
| 242 |
+
Main method to enhance medical context while maintaining source boundaries
|
| 243 |
+
"""
|
| 244 |
+
self.logger.info(f"🏥 Enhancing medical context for: {source_document}")
|
| 245 |
+
|
| 246 |
+
# Extract medical entities from provided document only
|
| 247 |
+
medical_entities = self.extract_medical_entities(content, source_document)
|
| 248 |
+
|
| 249 |
+
# Extract clinical relationships within the same document
|
| 250 |
+
clinical_relationships = self.extract_clinical_relationships(
|
| 251 |
+
content, source_document, medical_entities
|
| 252 |
+
)
|
| 253 |
+
|
| 254 |
+
# Standardize terminology based on source document mappings
|
| 255 |
+
standardized_content = self.standardize_medical_terminology(content)
|
| 256 |
+
|
| 257 |
+
# Group entities into medical concepts
|
| 258 |
+
medical_concepts = self.extract_medical_concepts(medical_entities)
|
| 259 |
+
|
| 260 |
+
# Detect evidence level if mentioned in source
|
| 261 |
+
evidence_level = self.detect_evidence_level(content)
|
| 262 |
+
|
| 263 |
+
# Create enhanced medical context
|
| 264 |
+
enhanced_context = EnhancedMedicalContext(
|
| 265 |
+
original_content=content,
|
| 266 |
+
medical_entities=medical_entities,
|
| 267 |
+
clinical_relationships=clinical_relationships,
|
| 268 |
+
medical_concepts=medical_concepts,
|
| 269 |
+
terminology_mappings=self.medical_terminology_db,
|
| 270 |
+
evidence_level=evidence_level,
|
| 271 |
+
source_metadata=metadata or {}
|
| 272 |
+
)
|
| 273 |
+
|
| 274 |
+
self.logger.info(f"✅ Enhanced medical context created: "
|
| 275 |
+
f"{len(medical_entities)} entities, {len(clinical_relationships)} relationships")
|
| 276 |
+
|
| 277 |
+
return enhanced_context
|
| 278 |
+
|
| 279 |
+
def _calculate_entity_confidence(self, entity_text: str, context_line: str) -> float:
|
| 280 |
+
"""Calculate confidence score for medical entity extraction"""
|
| 281 |
+
confidence = 0.5 # Base confidence
|
| 282 |
+
|
| 283 |
+
# Higher confidence for entities with dosage/numerical information
|
| 284 |
+
if re.search(r'\d+', entity_text):
|
| 285 |
+
confidence += 0.2
|
| 286 |
+
|
| 287 |
+
# Higher confidence for entities in clinical context
|
| 288 |
+
clinical_context_indicators = ['patient', 'treatment', 'diagnosis', 'management']
|
| 289 |
+
if any(indicator in context_line.lower() for indicator in clinical_context_indicators):
|
| 290 |
+
confidence += 0.2
|
| 291 |
+
|
| 292 |
+
# Higher confidence for known medical abbreviations
|
| 293 |
+
if entity_text.upper() in self.medical_terminology_db:
|
| 294 |
+
confidence += 0.1
|
| 295 |
+
|
| 296 |
+
return min(confidence, 1.0)
|
| 297 |
+
|
| 298 |
+
def _calculate_relationship_confidence(self, pattern: str, context_line: str) -> float:
|
| 299 |
+
"""Calculate confidence score for clinical relationship extraction"""
|
| 300 |
+
confidence = 0.6 # Base confidence for relationships
|
| 301 |
+
|
| 302 |
+
# Higher confidence for explicit relationship words
|
| 303 |
+
explicit_indicators = ['indicated', 'contraindicated', 'treatment', 'management']
|
| 304 |
+
if any(indicator in context_line.lower() for indicator in explicit_indicators):
|
| 305 |
+
confidence += 0.2
|
| 306 |
+
|
| 307 |
+
# Higher confidence for dosage-related relationships
|
| 308 |
+
if re.search(r'\d+(?:\.\d+)?\s*(?:mg|g|ml|units)', context_line):
|
| 309 |
+
confidence += 0.1
|
| 310 |
+
|
| 311 |
+
return min(confidence, 1.0)
|
| 312 |
+
|
| 313 |
+
def test_enhanced_medical_context():
|
| 314 |
+
"""Test the enhanced medical context preparation system"""
|
| 315 |
+
print("🧪 Testing Enhanced Medical Context Preparation System")
|
| 316 |
+
|
| 317 |
+
# Sample Sri Lankan clinical guideline content
|
| 318 |
+
test_content = """
|
| 319 |
+
Management of Preeclampsia in Pregnancy:
|
| 320 |
+
|
| 321 |
+
Preeclampsia is diagnosed when blood pressure ≥140/90 mmHg with proteinuria after 20 weeks.
|
| 322 |
+
Severe features include BP ≥160/110 mmHg, severe headache, visual disturbances.
|
| 323 |
+
|
| 324 |
+
Treatment Protocol:
|
| 325 |
+
- Administer magnesium sulfate (MgSO4) 4g IV bolus for seizure prophylaxis
|
| 326 |
+
- Control BP with methyldopa 250mg orally every 8 hours
|
| 327 |
+
- Monitor fetal heart rate with CTG every 4 hours
|
| 328 |
+
|
| 329 |
+
Evidence Level: Expert consensus based on Sri Lankan clinical experience.
|
| 330 |
+
Contraindicated: Do not use ACE inhibitors in pregnancy.
|
| 331 |
+
"""
|
| 332 |
+
|
| 333 |
+
enhancer = MedicalContextEnhancer()
|
| 334 |
+
|
| 335 |
+
enhanced = enhancer.enhance_medical_context(
|
| 336 |
+
content=test_content,
|
| 337 |
+
source_document="SL-Preeclampsia-Guidelines-2024.md",
|
| 338 |
+
metadata={"specialty": "Obstetrics", "country": "Sri Lanka"}
|
| 339 |
+
)
|
| 340 |
+
|
| 341 |
+
print(f"\n📊 Enhancement Results:")
|
| 342 |
+
print(f" Medical Entities: {len(enhanced.medical_entities)}")
|
| 343 |
+
print(f" Clinical Relationships: {len(enhanced.clinical_relationships)}")
|
| 344 |
+
print(f" Medical Concepts: {len(enhanced.medical_concepts)}")
|
| 345 |
+
print(f" Evidence Level: {enhanced.evidence_level}")
|
| 346 |
+
|
| 347 |
+
print(f"\n🏥 Medical Entities Found:")
|
| 348 |
+
for entity in enhanced.medical_entities[:5]: # Show first 5
|
| 349 |
+
print(f" - {entity.text} ({entity.entity_type}) - Confidence: {entity.confidence:.2f}")
|
| 350 |
+
|
| 351 |
+
print(f"\n🔗 Clinical Relationships:")
|
| 352 |
+
for relationship in enhanced.clinical_relationships[:3]: # Show first 3
|
| 353 |
+
print(f" - {relationship.entity1} --{relationship.relationship_type}--> {relationship.entity2}")
|
| 354 |
+
|
| 355 |
+
print(f"\n✅ Enhanced Medical Context Preparation Test Completed")
|
| 356 |
+
|
| 357 |
+
if __name__ == "__main__":
|
| 358 |
+
test_enhanced_medical_context()
|
src/medical_response_verifier.py
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Medical Response Verification Layer
|
| 4 |
+
VedaMD Medical RAG - Phase 2: Task 2.2
|
| 5 |
+
|
| 6 |
+
This module provides comprehensive medical response verification to ensure:
|
| 7 |
+
1. 100% source traceability for all medical claims
|
| 8 |
+
2. Context adherence validation against provided Sri Lankan guidelines
|
| 9 |
+
3. Prevention of medical hallucination and external knowledge injection
|
| 10 |
+
4. Regulatory compliance for medical device applications
|
| 11 |
+
|
| 12 |
+
CRITICAL SAFETY PROTOCOL:
|
| 13 |
+
- Every medical fact MUST be traceable to provided source documents
|
| 14 |
+
- No medical information allowed without explicit context support
|
| 15 |
+
- Strict verification of dosages, procedures, and protocols
|
| 16 |
+
- Comprehensive medical claim validation system
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
import re
|
| 20 |
+
import logging
|
| 21 |
+
from typing import List, Dict, Set, Tuple, Optional, Any, Union
|
| 22 |
+
from dataclasses import dataclass
|
| 23 |
+
from enum import Enum
|
| 24 |
+
import json
|
| 25 |
+
from pathlib import Path
|
| 26 |
+
|
| 27 |
+
class VerificationStatus(Enum):
|
| 28 |
+
"""Verification status for medical claims"""
|
| 29 |
+
VERIFIED = "verified"
|
| 30 |
+
NOT_FOUND = "not_found"
|
| 31 |
+
PARTIAL_MATCH = "partial_match"
|
| 32 |
+
CONTRADICTED = "contradicted"
|
| 33 |
+
INSUFFICIENT_CONTEXT = "insufficient_context"
|
| 34 |
+
|
| 35 |
+
class MedicalClaimType(Enum):
|
| 36 |
+
"""Types of medical claims to verify"""
|
| 37 |
+
DOSAGE = "dosage"
|
| 38 |
+
MEDICATION = "medication"
|
| 39 |
+
PROCEDURE = "procedure"
|
| 40 |
+
CONDITION = "condition"
|
| 41 |
+
VITAL_SIGN = "vital_sign"
|
| 42 |
+
CONTRAINDICATION = "contraindication"
|
| 43 |
+
INDICATION = "indication"
|
| 44 |
+
PROTOCOL = "protocol"
|
| 45 |
+
EVIDENCE_LEVEL = "evidence_level"
|
| 46 |
+
|
| 47 |
+
@dataclass
|
| 48 |
+
class MedicalClaim:
|
| 49 |
+
"""Individual medical claim extracted from LLM response"""
|
| 50 |
+
text: str
|
| 51 |
+
claim_type: MedicalClaimType
|
| 52 |
+
context: str
|
| 53 |
+
confidence: float
|
| 54 |
+
citation_required: bool = True
|
| 55 |
+
extracted_values: Dict[str, str] = None
|
| 56 |
+
|
| 57 |
+
@dataclass
|
| 58 |
+
class VerificationResult:
|
| 59 |
+
"""Result of medical claim verification"""
|
| 60 |
+
claim: MedicalClaim
|
| 61 |
+
status: VerificationStatus
|
| 62 |
+
supporting_sources: List[str]
|
| 63 |
+
confidence_score: float
|
| 64 |
+
verification_details: str
|
| 65 |
+
suggested_correction: Optional[str] = None
|
| 66 |
+
|
| 67 |
+
@dataclass
|
| 68 |
+
class MedicalResponseVerification:
|
| 69 |
+
"""Complete medical response verification result"""
|
| 70 |
+
original_response: str
|
| 71 |
+
total_claims: int
|
| 72 |
+
verified_claims: int
|
| 73 |
+
failed_verifications: List[VerificationResult]
|
| 74 |
+
verification_score: float
|
| 75 |
+
is_safe_for_medical_use: bool
|
| 76 |
+
detailed_results: List[VerificationResult]
|
| 77 |
+
safety_warnings: List[str]
|
| 78 |
+
|
| 79 |
+
class MedicalResponseVerifier:
|
| 80 |
+
"""
|
| 81 |
+
Medical response verification system for context adherence validation
|
| 82 |
+
"""
|
| 83 |
+
|
| 84 |
+
def __init__(self):
|
| 85 |
+
self.setup_logging()
|
| 86 |
+
self.medical_claim_patterns = self._initialize_medical_patterns()
|
| 87 |
+
|
| 88 |
+
def setup_logging(self):
|
| 89 |
+
"""Setup logging for medical response verification"""
|
| 90 |
+
logging.basicConfig(level=logging.INFO,
|
| 91 |
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
| 92 |
+
self.logger = logging.getLogger(__name__)
|
| 93 |
+
|
| 94 |
+
def _initialize_medical_patterns(self) -> Dict[MedicalClaimType, List[str]]:
|
| 95 |
+
"""Initialize patterns for extracting medical claims from responses"""
|
| 96 |
+
return {
|
| 97 |
+
MedicalClaimType.DOSAGE: [
|
| 98 |
+
r'(?:administer|give|prescribe|dose of?)\s+(\d+(?:\.\d+)?)\s*(mg|g|ml|units?|tablets?)',
|
| 99 |
+
r'(\d+(?:\.\d+)?)\s*(mg|g|ml|units?)\s+(?:of |every |per )',
|
| 100 |
+
r'(?:low|moderate|high|maximum|minimum)\s+dose'
|
| 101 |
+
],
|
| 102 |
+
MedicalClaimType.MEDICATION: [
|
| 103 |
+
r'\b(magnesium sulfate|MgSO4|oxytocin|methyldopa|nifedipine|labetalol|hydralazine)\b',
|
| 104 |
+
r'\b(ampicillin|gentamicin|ceftriaxone|azithromycin|doxycycline)\b',
|
| 105 |
+
r'\b(insulin|metformin|glibenclamide|aspirin|atorvastatin)\b'
|
| 106 |
+
],
|
| 107 |
+
MedicalClaimType.PROCEDURE: [
|
| 108 |
+
r'\b(cesarean section|C-section|vaginal delivery|assisted delivery)\b',
|
| 109 |
+
r'\b(IV access|urinary catheter|nasogastric tube|blood transfusion)\b',
|
| 110 |
+
r'\b(blood pressure monitoring|fetal monitoring|CTG)\b'
|
| 111 |
+
],
|
| 112 |
+
MedicalClaimType.CONDITION: [
|
| 113 |
+
r'\b(preeclampsia|eclampsia|HELLP syndrome|gestational hypertension)\b',
|
| 114 |
+
r'\b(postpartum hemorrhage|PPH|retained placenta|uterine atony)\b',
|
| 115 |
+
r'\b(puerperal sepsis|endometritis|wound infection)\b'
|
| 116 |
+
],
|
| 117 |
+
MedicalClaimType.VITAL_SIGN: [
|
| 118 |
+
r'blood pressure.*?(\d+/\d+)\s*mmHg',
|
| 119 |
+
r'BP.*?([<>≤≥]?\s*\d+/\d+)\s*mmHg',
|
| 120 |
+
r'heart rate.*?(\d+)\s*bpm'
|
| 121 |
+
],
|
| 122 |
+
MedicalClaimType.CONTRAINDICATION: [
|
| 123 |
+
r'contraindicated|avoid|do not use|should not be given',
|
| 124 |
+
r'not recommended|prohibited|forbidden'
|
| 125 |
+
],
|
| 126 |
+
MedicalClaimType.INDICATION: [
|
| 127 |
+
r'indicated for|recommended for|used to treat',
|
| 128 |
+
r'first-line treatment|treatment of choice'
|
| 129 |
+
],
|
| 130 |
+
MedicalClaimType.PROTOCOL: [
|
| 131 |
+
r'according to protocol|standard protocol|clinical protocol',
|
| 132 |
+
r'guideline recommends|evidence-based approach'
|
| 133 |
+
]
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
def extract_medical_claims(self, response: str) -> List[MedicalClaim]:
|
| 137 |
+
"""
|
| 138 |
+
Extract all medical claims from LLM response that need verification
|
| 139 |
+
"""
|
| 140 |
+
claims = []
|
| 141 |
+
sentences = re.split(r'[.!?]+', response)
|
| 142 |
+
|
| 143 |
+
for sentence_idx, sentence in enumerate(sentences):
|
| 144 |
+
sentence = sentence.strip()
|
| 145 |
+
if not sentence:
|
| 146 |
+
continue
|
| 147 |
+
|
| 148 |
+
for claim_type, patterns in self.medical_claim_patterns.items():
|
| 149 |
+
for pattern in patterns:
|
| 150 |
+
matches = re.finditer(pattern, sentence, re.IGNORECASE)
|
| 151 |
+
for match in matches:
|
| 152 |
+
# Extract specific values if present
|
| 153 |
+
extracted_values = {}
|
| 154 |
+
if match.groups():
|
| 155 |
+
for i, group in enumerate(match.groups()):
|
| 156 |
+
extracted_values[f'value_{i}'] = group
|
| 157 |
+
|
| 158 |
+
claim = MedicalClaim(
|
| 159 |
+
text=match.group(),
|
| 160 |
+
claim_type=claim_type,
|
| 161 |
+
context=sentence,
|
| 162 |
+
confidence=self._calculate_claim_confidence(match.group(), sentence),
|
| 163 |
+
citation_required=self._requires_citation(claim_type),
|
| 164 |
+
extracted_values=extracted_values
|
| 165 |
+
)
|
| 166 |
+
claims.append(claim)
|
| 167 |
+
|
| 168 |
+
# Remove duplicate claims
|
| 169 |
+
unique_claims = []
|
| 170 |
+
seen_claims = set()
|
| 171 |
+
for claim in claims:
|
| 172 |
+
claim_key = (claim.text.lower(), claim.claim_type)
|
| 173 |
+
if claim_key not in seen_claims:
|
| 174 |
+
unique_claims.append(claim)
|
| 175 |
+
seen_claims.add(claim_key)
|
| 176 |
+
|
| 177 |
+
self.logger.info(f"Extracted {len(unique_claims)} medical claims for verification")
|
| 178 |
+
return unique_claims
|
| 179 |
+
|
| 180 |
+
def verify_claim_against_context(self, claim: MedicalClaim,
|
| 181 |
+
provided_context: List[str]) -> VerificationResult:
|
| 182 |
+
"""
|
| 183 |
+
Verify a medical claim against provided source documents
|
| 184 |
+
"""
|
| 185 |
+
supporting_sources = []
|
| 186 |
+
verification_details = []
|
| 187 |
+
best_match_score = 0.0
|
| 188 |
+
|
| 189 |
+
# Check each context document for supporting evidence
|
| 190 |
+
for source_idx, context_doc in enumerate(provided_context):
|
| 191 |
+
context_lower = context_doc.lower()
|
| 192 |
+
claim_text_lower = claim.text.lower()
|
| 193 |
+
|
| 194 |
+
# Direct text match
|
| 195 |
+
if claim_text_lower in context_lower:
|
| 196 |
+
supporting_sources.append(f"Document_{source_idx + 1}")
|
| 197 |
+
verification_details.append(f"Exact match found in source document")
|
| 198 |
+
best_match_score = max(best_match_score, 1.0)
|
| 199 |
+
continue
|
| 200 |
+
|
| 201 |
+
# Semantic verification for different claim types
|
| 202 |
+
if claim.claim_type == MedicalClaimType.DOSAGE:
|
| 203 |
+
score = self._verify_dosage_claim(claim, context_doc)
|
| 204 |
+
if score > 0.7:
|
| 205 |
+
supporting_sources.append(f"Document_{source_idx + 1}")
|
| 206 |
+
verification_details.append(f"Dosage information supported (confidence: {score:.2f})")
|
| 207 |
+
best_match_score = max(best_match_score, score)
|
| 208 |
+
|
| 209 |
+
elif claim.claim_type == MedicalClaimType.MEDICATION:
|
| 210 |
+
score = self._verify_medication_claim(claim, context_doc)
|
| 211 |
+
if score > 0.8:
|
| 212 |
+
supporting_sources.append(f"Document_{source_idx + 1}")
|
| 213 |
+
verification_details.append(f"Medication information supported (confidence: {score:.2f})")
|
| 214 |
+
best_match_score = max(best_match_score, score)
|
| 215 |
+
|
| 216 |
+
elif claim.claim_type == MedicalClaimType.PROCEDURE:
|
| 217 |
+
score = self._verify_procedure_claim(claim, context_doc)
|
| 218 |
+
if score > 0.7:
|
| 219 |
+
supporting_sources.append(f"Document_{source_idx + 1}")
|
| 220 |
+
verification_details.append(f"Procedure information supported (confidence: {score:.2f})")
|
| 221 |
+
best_match_score = max(best_match_score, score)
|
| 222 |
+
|
| 223 |
+
# Determine verification status
|
| 224 |
+
if best_match_score >= 0.9:
|
| 225 |
+
status = VerificationStatus.VERIFIED
|
| 226 |
+
elif best_match_score >= 0.6:
|
| 227 |
+
status = VerificationStatus.PARTIAL_MATCH
|
| 228 |
+
elif len(supporting_sources) == 0:
|
| 229 |
+
status = VerificationStatus.NOT_FOUND
|
| 230 |
+
else:
|
| 231 |
+
status = VerificationStatus.INSUFFICIENT_CONTEXT
|
| 232 |
+
|
| 233 |
+
return VerificationResult(
|
| 234 |
+
claim=claim,
|
| 235 |
+
status=status,
|
| 236 |
+
supporting_sources=supporting_sources,
|
| 237 |
+
confidence_score=best_match_score,
|
| 238 |
+
verification_details="; ".join(verification_details) if verification_details else "No supporting evidence found",
|
| 239 |
+
suggested_correction=self._generate_correction_suggestion(claim, status)
|
| 240 |
+
)
|
| 241 |
+
|
| 242 |
+
def _verify_dosage_claim(self, claim: MedicalClaim, context: str) -> float:
|
| 243 |
+
"""Verify dosage claims against context"""
|
| 244 |
+
confidence = 0.0
|
| 245 |
+
|
| 246 |
+
if claim.extracted_values:
|
| 247 |
+
for key, value in claim.extracted_values.items():
|
| 248 |
+
if re.search(rf'\b{re.escape(value)}\b', context, re.IGNORECASE):
|
| 249 |
+
confidence += 0.4
|
| 250 |
+
|
| 251 |
+
# Check for dosage-related keywords in context
|
| 252 |
+
dosage_keywords = ['dose', 'administer', 'give', 'mg', 'g', 'units']
|
| 253 |
+
for keyword in dosage_keywords:
|
| 254 |
+
if keyword in context.lower():
|
| 255 |
+
confidence += 0.1
|
| 256 |
+
|
| 257 |
+
return min(confidence, 1.0)
|
| 258 |
+
|
| 259 |
+
def _verify_medication_claim(self, claim: MedicalClaim, context: str) -> float:
|
| 260 |
+
"""Verify medication claims against context"""
|
| 261 |
+
medication_name = claim.text.lower()
|
| 262 |
+
context_lower = context.lower()
|
| 263 |
+
|
| 264 |
+
# Check for exact medication name
|
| 265 |
+
if medication_name in context_lower:
|
| 266 |
+
return 1.0
|
| 267 |
+
|
| 268 |
+
# Check for common medication aliases
|
| 269 |
+
medication_aliases = {
|
| 270 |
+
'mgso4': 'magnesium sulfate',
|
| 271 |
+
'magnesium sulfate': 'mgso4',
|
| 272 |
+
'bp': 'blood pressure'
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
for alias, full_name in medication_aliases.items():
|
| 276 |
+
if medication_name == alias and full_name in context_lower:
|
| 277 |
+
return 0.9
|
| 278 |
+
elif medication_name == full_name and alias in context_lower:
|
| 279 |
+
return 0.9
|
| 280 |
+
|
| 281 |
+
return 0.0
|
| 282 |
+
|
| 283 |
+
def _verify_procedure_claim(self, claim: MedicalClaim, context: str) -> float:
|
| 284 |
+
"""Verify procedure claims against context"""
|
| 285 |
+
procedure_name = claim.text.lower()
|
| 286 |
+
context_lower = context.lower()
|
| 287 |
+
|
| 288 |
+
if procedure_name in context_lower:
|
| 289 |
+
return 1.0
|
| 290 |
+
|
| 291 |
+
# Check for procedure synonyms
|
| 292 |
+
procedure_synonyms = {
|
| 293 |
+
'c-section': 'cesarean section',
|
| 294 |
+
'cesarean section': 'c-section',
|
| 295 |
+
'iv access': 'intravenous access'
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
for synonym, standard_name in procedure_synonyms.items():
|
| 299 |
+
if procedure_name == synonym and standard_name in context_lower:
|
| 300 |
+
return 0.9
|
| 301 |
+
|
| 302 |
+
return 0.0
|
| 303 |
+
|
| 304 |
+
def verify_medical_response(self, response: str,
|
| 305 |
+
provided_context: List[str]) -> MedicalResponseVerification:
|
| 306 |
+
"""
|
| 307 |
+
Comprehensive verification of medical response against provided context
|
| 308 |
+
"""
|
| 309 |
+
self.logger.info("🔍 Starting comprehensive medical response verification")
|
| 310 |
+
|
| 311 |
+
# Extract all medical claims from response
|
| 312 |
+
medical_claims = self.extract_medical_claims(response)
|
| 313 |
+
|
| 314 |
+
# Verify each claim against provided context
|
| 315 |
+
verification_results = []
|
| 316 |
+
verified_count = 0
|
| 317 |
+
failed_verifications = []
|
| 318 |
+
safety_warnings = []
|
| 319 |
+
|
| 320 |
+
for claim in medical_claims:
|
| 321 |
+
result = self.verify_claim_against_context(claim, provided_context)
|
| 322 |
+
verification_results.append(result)
|
| 323 |
+
|
| 324 |
+
if result.status == VerificationStatus.VERIFIED:
|
| 325 |
+
verified_count += 1
|
| 326 |
+
else:
|
| 327 |
+
failed_verifications.append(result)
|
| 328 |
+
|
| 329 |
+
# Generate safety warnings for critical failures
|
| 330 |
+
if claim.claim_type in [MedicalClaimType.DOSAGE, MedicalClaimType.MEDICATION,
|
| 331 |
+
MedicalClaimType.CONTRAINDICATION]:
|
| 332 |
+
safety_warnings.append(f"CRITICAL: {claim.claim_type.value} claim not verified - '{claim.text}'")
|
| 333 |
+
|
| 334 |
+
# Calculate overall verification score
|
| 335 |
+
total_claims = len(medical_claims)
|
| 336 |
+
verification_score = (verified_count / total_claims) if total_claims > 0 else 1.0
|
| 337 |
+
|
| 338 |
+
# Determine if response is safe for medical use
|
| 339 |
+
is_safe = verification_score >= 0.9 and len(safety_warnings) == 0
|
| 340 |
+
|
| 341 |
+
verification_result = MedicalResponseVerification(
|
| 342 |
+
original_response=response,
|
| 343 |
+
total_claims=total_claims,
|
| 344 |
+
verified_claims=verified_count,
|
| 345 |
+
failed_verifications=failed_verifications,
|
| 346 |
+
verification_score=verification_score,
|
| 347 |
+
is_safe_for_medical_use=is_safe,
|
| 348 |
+
detailed_results=verification_results,
|
| 349 |
+
safety_warnings=safety_warnings
|
| 350 |
+
)
|
| 351 |
+
|
| 352 |
+
self.logger.info(f"✅ Medical verification complete: {verified_count}/{total_claims} claims verified "
|
| 353 |
+
f"(Score: {verification_score:.1%}, Safe: {is_safe})")
|
| 354 |
+
|
| 355 |
+
return verification_result
|
| 356 |
+
|
| 357 |
+
def _calculate_claim_confidence(self, claim_text: str, context: str) -> float:
|
| 358 |
+
"""Calculate confidence score for extracted medical claim"""
|
| 359 |
+
confidence = 0.5
|
| 360 |
+
|
| 361 |
+
# Higher confidence for claims with specific numerical values
|
| 362 |
+
if re.search(r'\d+', claim_text):
|
| 363 |
+
confidence += 0.2
|
| 364 |
+
|
| 365 |
+
# Higher confidence for claims in clinical context
|
| 366 |
+
clinical_indicators = ['patient', 'treatment', 'administer', 'protocol', 'guideline']
|
| 367 |
+
if any(indicator in context.lower() for indicator in clinical_indicators):
|
| 368 |
+
confidence += 0.2
|
| 369 |
+
|
| 370 |
+
return min(confidence, 1.0)
|
| 371 |
+
|
| 372 |
+
def _requires_citation(self, claim_type: MedicalClaimType) -> bool:
|
| 373 |
+
"""Determine if claim type requires citation"""
|
| 374 |
+
critical_types = [
|
| 375 |
+
MedicalClaimType.DOSAGE,
|
| 376 |
+
MedicalClaimType.MEDICATION,
|
| 377 |
+
MedicalClaimType.CONTRAINDICATION,
|
| 378 |
+
MedicalClaimType.PROTOCOL
|
| 379 |
+
]
|
| 380 |
+
return claim_type in critical_types
|
| 381 |
+
|
| 382 |
+
def _generate_correction_suggestion(self, claim: MedicalClaim,
|
| 383 |
+
status: VerificationStatus) -> Optional[str]:
|
| 384 |
+
"""Generate correction suggestions for unverified claims"""
|
| 385 |
+
if status == VerificationStatus.NOT_FOUND:
|
| 386 |
+
return f"Remove claim '{claim.text}' - not supported by provided guidelines"
|
| 387 |
+
elif status == VerificationStatus.INSUFFICIENT_CONTEXT:
|
| 388 |
+
return f"Add qualification: 'Based on available guidelines, {claim.text.lower()}' or remove if not essential"
|
| 389 |
+
return None
|
| 390 |
+
|
| 391 |
+
def test_medical_response_verifier():
|
| 392 |
+
"""Test the medical response verification system"""
|
| 393 |
+
print("🧪 Testing Medical Response Verification System")
|
| 394 |
+
|
| 395 |
+
# Test medical response from LLM
|
| 396 |
+
test_response = """
|
| 397 |
+
For preeclampsia management, administer magnesium sulfate 4g IV bolus for seizure prophylaxis.
|
| 398 |
+
Control blood pressure with methyldopa 250mg orally every 8 hours.
|
| 399 |
+
Monitor vital signs including blood pressure ≥140/90 mmHg.
|
| 400 |
+
This medication is contraindicated in patients with myasthenia gravis.
|
| 401 |
+
|
| 402 |
+
Alternative treatment includes nifedipine 10mg sublingually, though this is not mentioned in current guidelines.
|
| 403 |
+
"""
|
| 404 |
+
|
| 405 |
+
# Provided context from Sri Lankan guidelines
|
| 406 |
+
test_context = [
|
| 407 |
+
"""
|
| 408 |
+
Preeclampsia Management Protocol:
|
| 409 |
+
- Administer magnesium sulfate (MgSO4) 4g IV bolus for seizure prophylaxis
|
| 410 |
+
- Control BP with methyldopa 250mg orally every 8 hours
|
| 411 |
+
- Monitor blood pressure ≥140/90 mmHg
|
| 412 |
+
- Contraindicated: magnesium sulfate is contraindicated in myasthenia gravis
|
| 413 |
+
""",
|
| 414 |
+
"""
|
| 415 |
+
Additional clinical guidelines for severe preeclampsia:
|
| 416 |
+
- Immediate delivery considerations for severe cases
|
| 417 |
+
- Laboratory monitoring requirements
|
| 418 |
+
- Multidisciplinary team involvement
|
| 419 |
+
"""
|
| 420 |
+
]
|
| 421 |
+
|
| 422 |
+
verifier = MedicalResponseVerifier()
|
| 423 |
+
|
| 424 |
+
# Perform comprehensive verification
|
| 425 |
+
verification = verifier.verify_medical_response(test_response, test_context)
|
| 426 |
+
|
| 427 |
+
print(f"\n📊 Verification Results:")
|
| 428 |
+
print(f" Total Claims: {verification.total_claims}")
|
| 429 |
+
print(f" Verified Claims: {verification.verified_claims}")
|
| 430 |
+
print(f" Verification Score: {verification.verification_score:.1%}")
|
| 431 |
+
print(f" Safe for Medical Use: {verification.is_safe_for_medical_use}")
|
| 432 |
+
|
| 433 |
+
print(f"\n🔍 Detailed Results:")
|
| 434 |
+
for result in verification.detailed_results:
|
| 435 |
+
status_emoji = "✅" if result.status == VerificationStatus.VERIFIED else "❌"
|
| 436 |
+
print(f" {status_emoji} {result.claim.text} ({result.claim.claim_type.value})")
|
| 437 |
+
print(f" Status: {result.status.value} | Confidence: {result.confidence_score:.2f}")
|
| 438 |
+
if result.verification_details:
|
| 439 |
+
print(f" Details: {result.verification_details}")
|
| 440 |
+
|
| 441 |
+
if verification.safety_warnings:
|
| 442 |
+
print(f"\n⚠️ Safety Warnings:")
|
| 443 |
+
for warning in verification.safety_warnings:
|
| 444 |
+
print(f" - {warning}")
|
| 445 |
+
|
| 446 |
+
print(f"\n✅ Medical Response Verification Test Completed")
|
| 447 |
+
|
| 448 |
+
if __name__ == "__main__":
|
| 449 |
+
test_medical_response_verifier()
|
src/processed_markdown/6-SLJOG-1-Guideline-Page-143-150-1/6-SLJOG-1-Guideline-Page-143-150-1.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "6 SLJOG 1 Guideline Page 143 150 1"\n\n---\n\nSri Lanka Journal of Obstetrics and Gynaecology
|
| 2 |
+
|
| 3 |
+
¥s gies 9 HEA:
|
| 4 |
+
|
| 5 |
+
SLCOG
|
| 6 |
+
|
| 7 |
+
Blood Transfusion in Pregnancy
|
| 8 |
+
|
| 9 |
+
Guideline No: 01
|
| 10 |
+
|
| 11 |
+
September 2023
|
| 12 |
+
|
| 13 |
+
Please cite this paper as: Abeywardane A, Rajapakse L, Marleen S, Kadotgajan T, Lanerolle S, Dodampahala S H, on behalf of the Sri Lanka College of Obstetricians and Gynaecologists. Blood Transfusion in Pregnancy.
|
| 14 |
+
|
| 15 |
+
Sri Lanka College of Obstetricians and Gynaecologists
|
| 16 |
+
|
| 17 |
+
SLCOG Guideline
|
| 18 |
+
|
| 19 |
+
SLCOG Guideline
|
| 20 |
+
|
| 21 |
+
Blood transfusion in pregnancy
|
| 22 |
+
|
| 23 |
+
A Abeywardanea, L Rajapakseb, S Marleenc, T Kadotgajand, S Lanerolled, S H Dodampahalae on behalf of the Sri Lanka College of Obstetricians and Gynaecologists
|
| 24 |
+
|
| 25 |
+
Correspondence: Sri Lanka College of Obstetricians and Gynaecologists, No. 112, Model Farm Road, Colombo 08. E-mail: slcogoffice@gmail.com
|
| 26 |
+
|
| 27 |
+
1. Purpose and scope
|
| 28 |
+
|
| 29 |
+
Blood transfusion is an essential component of emergency obstetric care and, at times, lifesaving, but it is not without risks. This guideline aims to provide guidance on the appropriate use of blood products, which would neither compromise nor expose the patient to unnecessary risks associated with trans- fusion. Strategies to optimise the haemoglobin (Hb) level at delivery and minimise blood loss at delivery are also discussed.
|
| 30 |
+
|
| 31 |
+
2. Introduction
|
| 32 |
+
|
| 33 |
+
Obstetric haemorrhage remains a leading cause of direct maternal deaths in Sri Lanka, accounting for 15.4% of total maternal deaths in 20201. Eventhough a large majority of patients with obstetric haemorrhage survive uneventfully with timely interventions, it re-mains an important cause of severe maternal morbidity.
|
| 34 |
+
|
| 35 |
+
In 2022, the prevalence of anaemia among pregnant women in Sri Lanka was 29.1%2. A significant pro- portion of pregnant women with anaemia may require blood transfusion if it is not addressed in a timely manner. Transfusion services in Sri Lanka are rapidly improving, with all blood components prepared with 100% volunteer donations, which are mandatorily tested for HIV 1 and 2, Hepatitis B, Hepatitis C, Syphilis and Malaria.
|
| 36 |
+
|
| 37 |
+
3. Strategies to minimise the requirement for transfusion\n\n3.1. Optimisation of haemoglobin during the antenatal period
|
| 38 |
+
|
| 39 |
+
3.1.1. Diagnosis
|
| 40 |
+
|
| 41 |
+
All pregnant women should be screened for anaemia at the booking visit and 28 weeks. Anaemia in pregnancy is defined as first-trimester Hb less than 11g/dL, second and third-trimester Hb less than 10.5g/dL, and postpartum Hb less than 10g/dL according to the British Committee for Standards in Haematology3. If the Hb level is less than the relevant thresholds, consider haematinic deficiency once haemoglobin-opathies have been excluded.
|
| 42 |
+
|
| 43 |
+
3.1.2. Treatment and management
|
| 44 |
+
|
| 45 |
+
Oral iron should be the preferred first-line treatment for iron deficiency anaemia. Parenteral iron is indicated when oral iron is not tolerated or absorbed, patient compliance is in doubt or if the woman is approaching term when there is insufficient time for oral supple- mentation to be effective. Women should receive information on improving dietary iron intake and the factors affecting the absorption of dietary iron.
|
| 46 |
+
|
| 47 |
+
Meta-analysis of randomised trials on the antenatal use of iron, with or without folic acid, showed a 50%
|
| 48 |
+
|
| 49 |
+
Sri Lanka Journal of Obstetrics and Gynaecology 2023; 45: 143-150
|
| 50 |
+
|
| 51 |
+
DOI: http://doi.org/
|
| 52 |
+
|
| 53 |
+
a Consultant Transfusion Physician, Sri Jayewardenepura General Hospital, Sri Lanka.
|
| 54 |
+
|
| 55 |
+
b Consultant Obstetrician and Gynaecologist, District General Hospital, Matale, Sri Lanka.
|
| 56 |
+
|
| 57 |
+
c Consultant Obstetrician and Gynaecologist, Sri Jayewardenepura General Hospital, Sri Lanka.
|
| 58 |
+
|
| 59 |
+
d Consultant Obstetrician and Gynaecologist, Castle Street Hospital for Women, Sri Lanka.
|
| 60 |
+
|
| 61 |
+
e Professor in Obstetrics and Gynaecology, Faculty of Medicine, University of Colombo, Sri Lanka.
|
| 62 |
+
|
| 63 |
+
Vol. 45, No. 3, September 2023
|
| 64 |
+
|
| 65 |
+
143
|
| 66 |
+
|
| 67 |
+
SLCOG Guideline
|
| 68 |
+
|
| 69 |
+
reduction in the risk of anaemia in the third trimester or at delivery4,5. Parenteral iron therapy offers a shorter duration of treatment and a quicker response but is more invasive. Intravenous iron preparation should be administered with all resuscitation facilities available immediately, as severe allergic reactions are possible. Anaemia not due to haematinic deficiency should be managed in close conjunction with a haematologist and transfusion physician.\n\n3.2. Strategies to minimise blood loss at delivery
|
| 70 |
+
|
| 71 |
+
Women at high risk of haemorrhage should be delivered in a hospital with facilities to manage massive bleeding. Active management of the third stage of labour is recommended to reduce postpartum blood loss.
|
| 72 |
+
|
| 73 |
+
4. General principles of blood transfusion
|
| 74 |
+
|
| 75 |
+
4.1. Consent
|
| 76 |
+
|
| 77 |
+
Valid informed consent should be obtained where possible before blood transfusion. In case of an emergency, where it is not feasible to get consent prior to transfusion, transfusions should not be delayed, but information on blood transfusion should be provided retrospectively.
|
| 78 |
+
|
| 79 |
+
Where transfusion of all or a specific blood component is refused, or an advanced directive exists, detailed counselling should be arranged with a transfusion physician where available. This should be documented in the patient’s clinical records and communicated to all relevant healthcare professionals. Following detailed counselling, should the patient not consent for transfusion of blood and blood products, legal guidance should be sought.
|
| 80 |
+
|
| 81 |
+
4.2. Requirements for group and screen samples and cross-matching
|
| 82 |
+
|
| 83 |
+
All women should have their blood group and red cell antibody status checked at booking and 28 weeks gestation. If red cell antibodies are detected in the booking sample, further testing of maternal blood should be done to determine the specificity and the titre of antibody/antibodies detected and to assess the likelihood of haemolytic disease of the foetus and newborn.
|
| 84 |
+
|
| 85 |
+
Group and screen samples used for the provision of blood in pregnancy should be less than 3 days old. This should accompany a separate sample for blood
|
| 86 |
+
|
| 87 |
+
144
|
| 88 |
+
|
| 89 |
+
group confirmation if the blood group has not been done before. In a woman at high risk of emergency transfusion, e.g., placenta previa, with no clinically significant alloantibodies, group and screen samples should be sent once a week to exclude or to identify any new antibody formation and to keep blood available if necessary. Close liaison with the transfusion physician/team is essential.
|
| 90 |
+
|
| 91 |
+
4.3. Blood product specifications in pregnancy and puerperium
|
| 92 |
+
|
| 93 |
+
ABO and RhD identical or compatible red cell units should be transfused. If clinically significant red cell antibodies are present, blood negative for the relevant red cell antigen should be cross-matched for transfusion. Where complex antibodies or rare red cell phenotypes are identified, provision of compatible blood may take time, and when transfusions are needed in such instances, inform the transfusion laboratory in advance to avoid potential delays in the provision of blood. All patients receiving transfusions should be closely monitored throughout the transfusion to identify signs of transfusion reactions and adverse events early and act promptly.\n\n4.4. Intraoperative cell salvage
|
| 94 |
+
|
| 95 |
+
Intraoperative cell salvage could be considered in patients who are expected to have a blood loss of more than 500ml or more than 10% of the patient’s estimated blood volume if facilities are available6. However, such facilities are currently unavailable in Sri Lanka.
|
| 96 |
+
|
| 97 |
+
5. Management of obstetric haemorrhage with blood components
|
| 98 |
+
|
| 99 |
+
Clinicians should familiarise themselves with the existing guidelines on the management of PPH and protocols for managing major obstetric haemorrhage, including the mechanical strategies employed to reduce postpartum blood loss7.
|
| 100 |
+
|
| 101 |
+
5.1. When should red cells be used?
|
| 102 |
+
|
| 103 |
+
The decision to transfuse should be made on clinical and haematological grounds. Although the aim of blood transfusion in a bleeding patient is to maintain Hb more than 8g/dL, patients with acute haemorrhage can have normal Hb and clinical evaluation in this situation is extremely important.
|
| 104 |
+
|
| 105 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 106 |
+
|
| 107 |
+
In an emergency where the patient’s blood group is unknown, group O RhD-negative red cells should be given until the blood group is established and then switch to group-specific red cells. In case of a severe haemorrhage, if there is a history of clinically significant red cell antibodies being present, close liaison with the transfusion physician is essential to avoid delay in transfusion. Once bleeding is controlled, restoring Hb to physiological levels with red cell transfusions is not indicated8.
|
| 108 |
+
|
| 109 |
+
5.2. In what circumstances should fresh frozen plasma (FFP) and cryoprecipitate be used?
|
| 110 |
+
|
| 111 |
+
When available, point-of-care testing-guided FFP and cryoprecipitate transfusions are preferable to optimise haemostatic management9. If results of point-of-care or haemostatic testing are unavailable and haemorrhage continues, FFP at a dose of 12-15 ml/kg should be administered for every six units of red cell concentrates (RCC)5. Early use of FFP should be considered for conditions with a suspected coagulopathy, such as placental abruption or amniotic fluid embolism, or where detection of PPH has been delayed10.
|
| 112 |
+
|
| 113 |
+
If the haemorrhage is ongoing, subsequent FFP transfusion should be guided by the results of clotting tests aiming to maintain prothrombin time (PT) and activated partial thromboplastin time (APTT) ratios at less than 1.5 times normal8. It is essential that regular full blood counts and coagulation screens (PT, APTT and fibrinogen) are performed during the bleeding episode. The drawbacks of early FFP are that the majority of women with PPH will have normal coagulation at the time of FFP administration and that it is associated with an increased risk of transfusion- associated circulatory overload (TACO) and trans- fusion-related acute lung injury (TRALI). FFP results in a relatively small increment in fibrinogen level10,11.
|
| 114 |
+
|
| 115 |
+
Cryoprecipitate at a standard dose of 10 units should be administered relatively early in major obstetric haemorrhage. Subsequent cryoprecipitate transfusion should be guided by fibrinogen results, aiming to keep levels above 2g/l. RCTs do not support the early unselected use of fibrinogen replacement therapy, and administering fibrinogen supplementation to women with PPH who have fibrinogen levels of >2 g/l is unlikely to have added benefit8,12,13.
|
| 116 |
+
|
| 117 |
+
Vol. 45, No. 3, September 2023
|
| 118 |
+
|
| 119 |
+
SLCOG Guideline
|
| 120 |
+
|
| 121 |
+
FFP should ideally be of the same ABO group as the recipient. If unavailable, FFP of a compatible ABO group is acceptable. The blood group of cryoprecipitate is not considered in the local context, considering the production method.
|
| 122 |
+
|
| 123 |
+
Clinicians should be aware that these blood components must be ordered as soon as a need for them is anticipated, as there will always be a short delay in supply because of the need for thawing and recons- tituting.\n\n5.3. When should platelets be used?
|
| 124 |
+
|
| 125 |
+
Aim to maintain the platelet count above 50×109/l in an acutely bleeding patient. A platelet transfusion trigger of 75×109/l is recommended to provide a margin of safety. If results of point-of-care testing or haemostatic testing are not available and haemorrhage is continuing, four units of platelet concentrates should be adminis- tered after eight or more units of red cell concentrates14. The platelets should be ABO group identical or compatible. To avoid the development of anti-D antibodies, RhD-negative platelet concentrates should be given where possible to RhD-negative women of childbearing potential.
|
| 126 |
+
|
| 127 |
+
Platelets may not be readily available in some hospitals; therefore, their need should be anticipated, and good communication with the transfusion team should be maintained. The platelet count should not be allowed to fall below 50×109/l in the acutely bleeding patient, as this represents the critical level for haemostasis. Such a low platelet count may be anticipated when approximately two blood volumes have been replaced by fluid or blood components. A platelet transfusion trigger of 75×109/l is recommended in a patient with ongoing bleeding to provide a margin of safety.
|
| 128 |
+
|
| 129 |
+
If RhD-positive platelets are transfused to a RhD- negative woman of childbearing potential, anti-D immunoglobulin should be administered. A dose of 250 iu anti-D immunoglobulin is sufficient to cover 5 adult therapeutic doses of platelets given within a 6-week period. This may be given subcutaneously to minimise bruising and haematomas in thrombocytopenic women.
|
| 130 |
+
|
| 131 |
+
145
|
| 132 |
+
|
| 133 |
+
SLCOG Guideline
|
| 134 |
+
|
| 135 |
+
6. How should intrapartum anaemia be managed?
|
| 136 |
+
|
| 137 |
+
In anaemic women who are not actively bleeding, if the Hb is less than 8g/dL in labour or in the immediate postpartum period, the decision to transfuse should be made according to the individual’s medical history and symptoms. Where transfusion is indicated, transfusion of a single unit of red cell concentrate should be followed by clinical reassessment to determine the need for further transfusions.\n\n7. How should women with postpartum anaemia be managed in the postnatal period?
|
| 138 |
+
|
| 139 |
+
If the Hb is more than 7g/dL in the postnatal period, where there is no ongoing or threat of bleeding, the decision to transfuse should be made on an informed
|
| 140 |
+
|
| 141 |
+
146
|
| 142 |
+
|
| 143 |
+
individual basis. The risk of RBC alloimmunisation and the potential clinical impact should be considered when balancing the risks and benefits of RBC trans- fusion. Non-transfusion therapies, such as iron, should be considered as a part of the treatment of postpartum anaemia.
|
| 144 |
+
|
| 145 |
+
8. How should women who decline blood products be managed?
|
| 146 |
+
|
| 147 |
+
Hb should be optimised prior to delivery to prevent avoidable anaemia. Consent/refusal of blood compo- nents or other transfusion-sparing techniques should be discussed in detail and clearly documented during the antenatal period. The use of pharmacological, mechanical and surgical procedures to avert the use of banked blood and blood components should be considered early. Medicolegally, withholding blood products in life-saving situations is not permitted.
|
| 148 |
+
|
| 149 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 150 |
+
|
| 151 |
+
SLCOG Guideline
|
| 152 |
+
|
| 153 |
+
Appendix 1. Massive obstetric haemorrhage protocol
|
| 154 |
+
|
| 155 |
+
Activation of Massive Obstetric Transfusion Protocol should be considered when: © Bleeding >1000mI, with severe ongoing bleeding with/without signs and symptoms of hypovolemia © Rate of blood loss is >150mi/min © Bleeding which leads to a SBP < 90 mmHg or HR>110 bpm Identification of the requirement of massive transfusion is the responsibility of the attending clinician Give tranexamic acid 1g in 10 ml of 0.9% saline over 10 minutes Send blood for Crossmatch, FBC, Coagulation Screen, ROTEM, Biochemistry & ABG analysis Give 2 units of Red Cell Concentrate © Group O Rh D negative uncrossmatched RCC — when blood group is not known ¢ Switch to ABO group specific uncrossmatched RCC as soon as blood group is known Use crossmatched blood if available This request can be made over the phone - Dial : ....... | Clinician informs the Blood Bank / Consultant Transfusion Physician to activate the Massive Obstetric Transfusion Protocol — Dial .... Monitor coagulation regularly (ROTEM, | BOX ONE : 2 RCC PT, APTT, Fibrinogen, J FBC, Ca”, Arterial blood gases) Therapeutic Goals ROTEM available: ROTEM guided Blood Component Therapy Hb > 8¢/dl FIBTEM AS>12mm | EXTEM AS>35mm | if still bleeding, EXTEM CT < 80 sec Consider second dose of Tranaxamic acid 1g PT/APTT < 1.5 of mid point of after 30 min of first dose J BOX TWO: 4 units RCC, 4 units Continue cycle of clinical & laboratory (12-15mi/kg) FFP, 10 units of monitoring & administration of goal directed Cryoprecipitate blood component therapy until bleeding stops BOX THREE: 4 units RBC, 4 units (12-15mi/kg) FFP, 10 units of Cryoprecipitate 1 adult dose of Platelets if the platelets count is <75 X10°/I to maintain platelets >50 X 10°/ Repeat Box 2 and 3 alternatively until bleeding stops Clinician decides to terminate the MTP and informs the Blood Bank (usually active bleeding has stopped) Any unused components should be returned to the blood bank immediately Sri Lanka College of Transfusion Physicians - 2023,
|
| 156 |
+
|
| 157 |
+
Vol. 45, No. 3, September 2023
|
| 158 |
+
|
| 159 |
+
147
|
| 160 |
+
|
| 161 |
+
SLCOG Guideline\n\nAppendix 2. Algorithm for Rotem-guided PPH management
|
| 162 |
+
|
| 163 |
+
Algorithm for Rotem-guided PPH management Blood loss > 1000m| after delivery Consider Tranexamic acid 1g with ongoing bleeding > YES AS ex< 35mm _— or Givet cacldd bol CTris > 600s or —) we enn ‘n Base olus ML>10% repeat if indicate YES 1or2ATD of Cryo precipitateor Fibrinogen concentrate Target : AS rig> 16mm AS ex< 35mm AS Fis< 12mm NO AS ex< 35mm ASrig> 12mm oo 1 ATD of platelet concentrate YES NO CT ex> 80mm & FFP 12-15ml/kg or 4F-PCC 10-15 IU/kg ASris> 12mm CT in> 240mm —= CT in /CTHeP Consider Protamine 25-50mg >1.25 Consider FFP 12-15ml/kg.or rFVIla 90mcg/kg Ee Recheck after 10-15 min with a new blood sample Maintain Hb > 8g/dl Consider RCC to maintain Hb > 8g/dl PH>7.2 Ca**i >1.0 mmol/I Ongoing bleeding Core body temperature >35°C Sri Lanka College of Transfusion Physicians - 2023
|
| 164 |
+
|
| 165 |
+
148
|
| 166 |
+
|
| 167 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 168 |
+
|
| 169 |
+
SLCOG Guideline
|
| 170 |
+
|
| 171 |
+
Appendix 3. Sample consent form for transfusion of blood and blood components
|
| 172 |
+
|
| 173 |
+
Os Bared MO: ... HE Qos gomea : we 88 Bw mda: Owe : Os / DEG pHs WO MdHGUMS Mdz CAM HSS weesOm CO2MO24,8 O8 gm osfenS. mddeane Bs mdz] CAD Made ow me BOS gm osenS. GBS mdScgame Od / Qed ¢hjO2 WO BgOm awost ACE,® MDCKYS gost 5S. RBS mdSGume eosomO Bs mee godal¥n gHdE ome So mS Ad gm o88. GBS mdBGame Hess 48 a mB eQnh pad ww womEm COrmO2G18 em OBS. Hed / Hed ejHhhoed gaBs aaslOe ehpedst G86 sdHeans 002700 HS Saco mode 8 gost 5S. ©® BOATIDO gar BOO Os WO gqOekdoOast got yd BOs0 Gado got BENG BAO &28Omdo os 5S. 90D Bad mje BEDE 41 Ost HeOst uy, Bode emést eth ® com Od / O2ed §GpOo WO GBS mdHeane sews mOstn emOstn COBst yma mdS. C§HBmecdimdmned enter : eodgnddwmod genta : 0658020 ItdmcqjO BobOO emmmHmn® : wawtBmcjed m®-... Sri Lanka College of Transfusion Physicians - 2023
|
| 174 |
+
|
| 175 |
+
Vol. 45, No. 3, September 2023
|
| 176 |
+
|
| 177 |
+
149
|
| 178 |
+
|
| 179 |
+
SLCOG Guideline\n\nReferences
|
| 180 |
+
|
| 181 |
+
1. Annual Health Bulletin 2020. Ministry of Health, Sri Lanka.
|
| 182 |
+
|
| 183 |
+
2. Amarasinghe GS, Agampodi TC, Mendis V, Malawanage K, Kappagoda C, Agampodi SB. Prevalence and aetiologies of anaemia among first trimester pregnant women in Sri Lanka; the need for revisiting the current control strategies. BMC Pregnancy Childbirth. 2022; 22(1): 16.
|
| 184 |
+
|
| 185 |
+
3. Pavord S, Daru J, Prasannan N, Robinson S, Stanworth S, Girling J, et al. UK guidelines on the management of iron deficiency in pregnancy. Br J Haematol. 2020; 188(6): 819-30.
|
| 186 |
+
|
| 187 |
+
4. Haider BA, Olofin I, Wang M, Spiegelman D, Ezzati M, Fawzi WW. Anaemia, prenatal iron use, and risk of adverse pregnancy outcomes: systematic review and meta-analysis. BMJ: British Medical Journal. 2013; 346: f3443.
|
| 188 |
+
|
| 189 |
+
5. Royal College of Obstetricians and Gynaecologists. Blood Transfusion in Obstetrics. Green-top Guideline No. 47. London: RCOG; 2015.
|
| 190 |
+
|
| 191 |
+
6. Carroll C, Young F. Intraoperative cell salvage. BJA Educ. 2021; 21(3): 95-101.
|
| 192 |
+
|
| 193 |
+
7. Guidelines for the Blood Transfusion Services in the United Kingdom. www.transfusionguidelines.org.uk
|
| 194 |
+
|
| 195 |
+
8. Stanworth SJ, Dowling K, Curry N, Doughty H, Hunt BJ, Fraser L, et al. Haematological management of major haemorrhage: a British
|
| 196 |
+
|
| 197 |
+
150
|
| 198 |
+
|
| 199 |
+
Society for Haematology Guideline. Br J Haematol. 2022; 198(4): 654-67.
|
| 200 |
+
|
| 201 |
+
9. Snegovskikh D, Souza D, Walton Z, Dai F, Rachler R, Garay A, et al. Point-of-care viscoelastic testing improves the outcome of pregnancies complicated by severe postpartum hemorrhage. J Clin Anesth. 2018; 44: 50-6.
|
| 202 |
+
|
| 203 |
+
10. Mavrides E, Allard S, Chandraharan E, Collins P, Green L, Hunt BJ, Riris S, Thomson AJ on behalf of the Royal College of Obstetricians and Gynae- cologists. Prevention and management of post- partum haemorrhage. BJOG 2016; 124: e106-e149.
|
| 204 |
+
|
| 205 |
+
11. McNamara H, Kenyon C, Smith R, Mallaiah S, Barclay P. Four years’ experience of a ROTEM. Anaesthesia. 2019; 74(8): 984-91.
|
| 206 |
+
|
| 207 |
+
12. Collins PW, Cannings-John R, Bruynseels D, Mallaiah S, Dick J, Elton C, et al. Viscoelastometric- guided early fibrinogen concentrate replacement during postpartum haemorrhage: OBS2, a double- blind randomized controlled trial. Br J Anaesth. 2017; 119(3): 411-21.
|
| 208 |
+
|
| 209 |
+
13. Wikkelso AJ, Edwards HM, Afshari A, Stensballe J, Langhoff-Roos J, Albrechtsen C, et al. Pre- emptive treatment with fibrinogen concentrate for postpartum haemorrhage: randomized controlled trial. Br J Anaesth. 2015; 114(4): 623-33.
|
| 210 |
+
|
| 211 |
+
14. Collins P, Abdul-Kadir R, Thachil J, Coagulation SoWsHIiTaHaoDI. Management of coagulopathy associated with postpartum hemorrhage: guidance from the SSC of the ISTH. J Thromb Haemost. 2016; 14(1): 205-10.
|
| 212 |
+
|
| 213 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
src/processed_markdown/Assisted-vaginal-delivery-Dec-1/Assisted-vaginal-delivery-Dec-1.md
ADDED
|
@@ -0,0 +1,611 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "Assisted vaginal delivery Dec 1"\n\n---\n\nSLCOG Guideline
|
| 2 |
+
|
| 3 |
+
SLCOG Guideline
|
| 4 |
+
|
| 5 |
+
Assisted Vaginal Delivery
|
| 6 |
+
|
| 7 |
+
D Senadheeraa, C Jayasundarab, I A Jayawardaneb on behalf of the Sri Lanka College of Obstetricians and Gynaecologists
|
| 8 |
+
|
| 9 |
+
Correspondence: Sri Lanka College of Obstetricians and Gynaecologists, No. 112, Model Farm Road, Colombo 08. E-mail: slcogoffice@gmail.com
|
| 10 |
+
|
| 11 |
+
1. Introduction, background and epidemiology
|
| 12 |
+
|
| 13 |
+
3. Identification and assessment of evidence
|
| 14 |
+
|
| 15 |
+
Management of second stage of labour frequently necessitates assisted birth, to avoid a potentially hazardous second stage caesarean section. In the United Kingdom 10% to 15% of all women undergo assisted vaginal birth, even though rate is much lower in Sri Lanka1. Instrumental delivery when performed correctly by a trained clinician, results in satisfactory feto-maternal outcomes2. However, clinician should be aware that serious and rare complications, such as sub- galeal and intracranial haemorrhage, skull fractures and spinal cord injury, can occur particularly in the untrained hands as well as with repeated failed attempts3. Mastering the art of safe assisted delivery is an essential skill in the modern obstetrician’s armament.
|
| 16 |
+
|
| 17 |
+
Search strategy: External guidelines, systemic reviews and Cochrane revives were searched assessing available evidence and the best practices.
|
| 18 |
+
|
| 19 |
+
4.Summary of recommendations
|
| 20 |
+
|
| 21 |
+
Whenever possible, strive to provide continuous support during labour, one to one care and the choice of a labour companion. Available evidence suggests this can reduce instrumental delivery rate and promote normal vaginal delivery.
|
| 22 |
+
|
| 23 |
+
Epidural analgesia may increase the duration of active second stage and the need for instru- mental vaginal birth.\n\n2. Purpose and scope
|
| 24 |
+
|
| 25 |
+
The aim of this guideline is to provide evidence-based recommendations on the use of forceps and vacuum. This guidance is intended not only for practicing specialists, but also for trainee registrars, senior registrars who are expected to develop competency in the use of both vacuum and forceps for non-rotational birth and at least one technique for rotational birth. Recommendations made in this document may serve for all grades of medical staff involved in women’s health and labour management. The scope of this guideline includes indications, procedures, governance and follow up issues relating to assisted vaginal birth.
|
| 26 |
+
|
| 27 |
+
Encourage upright or lateral positions in second stage of labour (in women not on epidural analgesia). This reduces the need for instru- mentation.
|
| 28 |
+
|
| 29 |
+
Allow delayed pushing (passive second stage) in women with epidural analgesia. This may reduce the need for rotational and mid-pelvic assisted vaginal birth.
|
| 30 |
+
|
| 31 |
+
Do not routinely discontinue epidural analgesia during pushing as this increases the woman’s pain with no evidence of a reduction in the incidence instrumental delivery.
|
| 32 |
+
|
| 33 |
+
Sri Lanka Journal of Obstetrics and Gynaecology 2021; 43: 335-347
|
| 34 |
+
|
| 35 |
+
DOI: http://doi.org/10.4038/sljog.v43i4.8029
|
| 36 |
+
|
| 37 |
+
a Consultant Obstetrician and Gynaecologist, De Soysa Hospital for Women, Colombo, Sri Lanka
|
| 38 |
+
|
| 39 |
+
b Consultant Obstetrician and Gynaecologist, De Soysa Hospital for Women, Senior Lecturer, University of Colombo, Sri Lanka
|
| 40 |
+
|
| 41 |
+
This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License, which permits unrestricted use, distribution and reproduction in any medium provided the original author and source are credited.
|
| 42 |
+
|
| 43 |
+
Vol. 43, No. 4, December 2021
|
| 44 |
+
|
| 45 |
+
335
|
| 46 |
+
|
| 47 |
+
SLCOG Guideline
|
| 48 |
+
|
| 49 |
+
Operators should appreciate that no indication forinstrumental delivery is absolute, and that prudent clinical judgment is required in each situation.
|
| 50 |
+
|
| 51 |
+
Suspected fetal bleeding disorders and pre- disposition to fractures are relative contrain- dications for assisted vaginal birth.
|
| 52 |
+
|
| 53 |
+
Presence of blood borne viral infection in a woman is not an absolute contraindication for assisted vaginal birth.
|
| 54 |
+
|
| 55 |
+
Vacuum is not contraindicated following a fetal blood sampling or application of a fetal scalp electrode.
|
| 56 |
+
|
| 57 |
+
There is a higher risk of sub-galeal haemorrhage and scalp trauma with vacuum extraction compared to forceps at preterm gestation.
|
| 58 |
+
|
| 59 |
+
Vacuum is contraindicated below 32 weeks of gestation and should only be used with extreme caution between 32+0 and 36+0.
|
| 60 |
+
|
| 61 |
+
Safe assisted vaginal birth requires not only technical expertise, but also careful assessment of each clinical situation, clear communication with the woman and other healthcare personnel.
|
| 62 |
+
|
| 63 |
+
Ultrasound assessment of the fetal head position prior to assisted vaginal birth can be attempted where uncertainty exists following clinical examination.
|
| 64 |
+
|
| 65 |
+
Routine use of abdominal or perineal ultrasound for assessment of the station, flexion and descent of the fetal head in the second stage is not recom mended and is not a substitute for clinical examination.
|
| 66 |
+
|
| 67 |
+
For procedures in the labour room, verbal consent should be obtained and documented in the notes.
|
| 68 |
+
|
| 69 |
+
When mid-pelvic or rotational birth is indicated, the risks and benefits of assisted vaginal birth should be compared with the risks and benefits of second stage caesarean section, for the given circu-mstances and skills of the operator.
|
| 70 |
+
|
| 71 |
+
Prior written consent is recommended for a trial of assisted vaginal birth in the operating theatre.
|
| 72 |
+
|
| 73 |
+
Operators must achieve expertise in spon- taneous vaginal birth prior to commencing training on assisted vaginal birth.\n\n336
|
| 74 |
+
|
| 75 |
+
Non-rotational low-pelvic and lift out assisted vaginal births have a low probability of failure, hence most procedures can be attempted safely in the labour room.
|
| 76 |
+
|
| 77 |
+
Assisted vaginal births that have a higher risk of failure should be termed a trial of instru- mental delivery and is best attempted in an operation theater, where immediate CS can be resorted to.
|
| 78 |
+
|
| 79 |
+
The operator should choose the instrument most appropriate to the clinical circumstances and their level of skill.
|
| 80 |
+
|
| 81 |
+
Forceps and vacuum extraction are associated with different benefits and risks.
|
| 82 |
+
|
| 83 |
+
Failure to complete the birth with a single instru- ment is more likely with vacuum extraction, but maternal perineal trauma is more likely with forceps.
|
| 84 |
+
|
| 85 |
+
Soft cup vacuum extractors have a higher rate of failure but a lower incidence of neonatal scalp trauma.
|
| 86 |
+
|
| 87 |
+
Rotational births should be performed by experienced operators; the choice of instrument depending on the clinical circumstances and expertise of the individual.
|
| 88 |
+
|
| 89 |
+
The options include, Manual rotation followed by direct traction with forceps or vacuum, Rotational vacuum extraction or Kielland’s rotational forceps.
|
| 90 |
+
|
| 91 |
+
It is recommended to complete vacuum- assisted birth with not more than three pulls to bring the fetal head on to the perineum. (Additional gentle pulls may be used only to ease the head out of the perineum).
|
| 92 |
+
|
| 93 |
+
If there is minimal descent with the first pull of a vacuum, consider if the application is sub- optimal, the fetal position has been incorrectly diagnosed or if there is cephalopelvic dispro- portion.
|
| 94 |
+
|
| 95 |
+
Discontinue vacuum-assisted birth where there is no evidence of progressive descent with moderate traction during each pull of a correctly applied instrument.
|
| 96 |
+
|
| 97 |
+
Discontinue vacuum-assisted birth if there have been two ‘pop-offs’ of the instrument.
|
| 98 |
+
|
| 99 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 100 |
+
|
| 101 |
+
SLCOG Guideline
|
| 102 |
+
|
| 103 |
+
The use of sequential instruments is associated with an increased risk of trauma to the infant as well as obstetric anal sphincter injury (OASI). Operator needs to balance the risks of caesarean birth vs forceps following failed vacuum and may consider forceps extraction.
|
| 104 |
+
|
| 105 |
+
A single prophylactic dose of intravenous amoxicillin and clavulanic acid should be considered following assisted vaginal birth as it significantly reduces confirmed or suspected maternal infection compared to placebo.
|
| 106 |
+
|
| 107 |
+
Abandon forceps delivery when the forceps cannot be applied easily, the handles do not lock or if there is lack of progressive descent with moderate traction and birth is not imminent following three pulls with a correctly applied instrument by an experienced operator.
|
| 108 |
+
|
| 109 |
+
Discontinue rotational forceps birth if rotation is not easily achieved with gentle pressure.
|
| 110 |
+
|
| 111 |
+
If there is minimal descent with the first pull of theforceps, consider if the application is incorrect, the position has been incorrectly diagnosed or there is cephalopelvic dispro- portion.
|
| 112 |
+
|
| 113 |
+
Reassess women after assisted vaginal birth for venous thromboembolism risk and the need for thromboprophylaxis.
|
| 114 |
+
|
| 115 |
+
Highlight the risk of urinary retention and the importance of bladder emptying in the postpartum period. Timing and volume of the first void urine should be monitored and docu- mented.
|
| 116 |
+
|
| 117 |
+
A post void residual should be measured if urinary retention is suspected.
|
| 118 |
+
|
| 119 |
+
For women who had regional analgesia for a trial in theatre, recommend indwelling catheter in situ following birth, to prevent covert urinary retention.
|
| 120 |
+
|
| 121 |
+
There is increased risk of fetal head impaction at caesarean birth following a failed instrumental delivery and the operator should be prepared to disimpact the fetal head using recognized maneuvers.
|
| 122 |
+
|
| 123 |
+
Review women before hospital discharge with a confirmatory vaginal examination. Discuss the indication for assisted vaginal birth, management of any complications and advice for future births.\n\nMediolateral episiotomy should be discussed with the woman and tailored to the circum- stances.
|
| 124 |
+
|
| 125 |
+
When performing a mediolateral episiotomy, the cut should be at a 60-degree angle to the midline and initiated when the head is crowning the perineum.
|
| 126 |
+
|
| 127 |
+
Documentation for assisted vaginal birth should include information on the assessment, decision making and conduct of the procedure, a plan for post natal care and information for subse- quent pregnancies – standardized proforma is recommended.
|
| 128 |
+
|
| 129 |
+
5. Avoiding assisted vaginal birth
|
| 130 |
+
|
| 131 |
+
Evidence suggests, continuous one to one care and labour companionship can reduce the need for assisted vaginal birth4. Use of epidural analgesia may increase the need for instrumental delivery5. Adopting an upright or lateral position during second stage reduces the need for assisted vaginal delivery6. If on epidural it is not recommended to routinely discontinue during second stage, as this will not reduce need of assisted vaginal delivery but increases pain and distress to the woman7.
|
| 132 |
+
|
| 133 |
+
Vol. 43, No. 4, December 2021
|
| 134 |
+
|
| 135 |
+
337
|
| 136 |
+
|
| 137 |
+
SLCOG Guideline
|
| 138 |
+
|
| 139 |
+
6. Classification of instrumental delivery as outlet, low and mid cavity assisted birth in forceps delivery
|
| 140 |
+
|
| 141 |
+
Outlet Low Mid Fetal scalp visible without Fetal skull is at station Fetal head is no more than one- separating the labia +2cm, but not on the fifth palpable per abdomen Fetal skull has reached the perineum perineum Leading point of the skull is at Rotation does not exceed 45° Two subdivisions: station 0 or +1cm 1. Non-rotational ≤45° Two subdivisions: 2. Rotational >45° 1. Non-rotational ≤45° 2. Rotational >45°
|
| 142 |
+
|
| 143 |
+
7. The performing clinician should take a relevant concise history and carry out systematic examination to identify any contraindications:
|
| 144 |
+
|
| 145 |
+
• Check obstetric, general, and medical history.
|
| 146 |
+
|
| 147 |
+
7.2 Abdominal examination
|
| 148 |
+
|
| 149 |
+
• Estimated fetal weight.
|
| 150 |
+
|
| 151 |
+
• Assessment of engagement of the fetal head, descent, the number of fifths palpable abdo- minally. The head should be ≤1/5 palpable per abdomen.
|
| 152 |
+
|
| 153 |
+
• Birth weight of previous baby/babies and assessment of EFW in the index pregnancy.
|
| 154 |
+
|
| 155 |
+
• Assessment of progress in the first stage (noting secondary arrest).
|
| 156 |
+
|
| 157 |
+
• Identification of the position of the fetal back and sinciput, (This examination is not always possible, but an attempt should be made).
|
| 158 |
+
|
| 159 |
+
• Assessment of second stage of labour.
|
| 160 |
+
|
| 161 |
+
• Assessment of frequency and strength of uterine contractions and noting any contraindications for the use of oxytocin infusion.
|
| 162 |
+
|
| 163 |
+
• Examination for distension of the lower uterine segment or formation of a retraction ring (Bandl’s ring), indicating labour may have become obstructed.\n\n7.1 Assessment of feto-maternal status
|
| 164 |
+
|
| 165 |
+
7.3 Vaginal examination
|
| 166 |
+
|
| 167 |
+
• Evaluation of the physical and emotional state of the mother and her ability to participate actively in birth.
|
| 168 |
+
|
| 169 |
+
• To confirm full dilatation of the cervix and station of the presenting part (should be at or below spines).
|
| 170 |
+
|
| 171 |
+
• Give clear explanation and obtain informed consent and document on her hospital notes.
|
| 172 |
+
|
| 173 |
+
• Grade the degree of moulding as mild, moderate, or severe.
|
| 174 |
+
|
| 175 |
+
• Reduce maternal discomfort by administering appropriate analgesia (Consider local or regional).
|
| 176 |
+
|
| 177 |
+
• Confirm the bladder is empty. If on catheter, remove it or deflate the balloon.
|
| 178 |
+
|
| 179 |
+
• Note the position, extent of de-flexion and asynclitism of fetal head. (see below)
|
| 180 |
+
|
| 181 |
+
• Estimate the capacity of the pelvis relative to the size of the baby. Special note of pubic arch and sacrospinous ligaments.
|
| 182 |
+
|
| 183 |
+
• Note colour of amniotic fluid for the presence of meconium or blood.
|
| 184 |
+
|
| 185 |
+
• Assessment of fetal wellbeing.
|
| 186 |
+
|
| 187 |
+
• Always use aseptic techniques.
|
| 188 |
+
|
| 189 |
+
• Accurate account of the findings should be documented. (Lack of appreciation of the situation and delivery by wrong method in wrong place by inexperienced staff can cause increased fetal and maternal morbidity.)
|
| 190 |
+
|
| 191 |
+
338
|
| 192 |
+
|
| 193 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 194 |
+
|
| 195 |
+
7.4 Preparation of Staff
|
| 196 |
+
|
| 197 |
+
• The operator should have necessary knowledge, experience, and skill.
|
| 198 |
+
|
| 199 |
+
• Confirm the adequacy of facilities and availability of the theatre if a need arises.
|
| 200 |
+
|
| 201 |
+
• Backup plan in case of failure.
|
| 202 |
+
|
| 203 |
+
Inform senior staff.
|
| 204 |
+
|
| 205 |
+
• Consider complications like shoulder dystocia, perineal trauma, and post-partum haemorrhage.
|
| 206 |
+
|
| 207 |
+
• Presence of the Neonatal team.
|
| 208 |
+
|
| 209 |
+
7.5 Recognition of obstructed labour/CPD
|
| 210 |
+
|
| 211 |
+
CPD may be defined as the inability of the fetus to pass safely through the birth canal for mechanical reasons. These mechanical reasons include, relative sizes of maternal pelvis and fetal presenting part, which may vary, considerably in their three-dimensional sizes and shapes and in the degree to which the fetal head may undergo compression without injury to the brain.
|
| 212 |
+
|
| 213 |
+
CPD is either true disproportion, when even the smallest diameters of the presenting part are too big to pass through the pelvis, or relative disproportion caused by larger presenting diameters of the head that are commonly associated with transverse and posterior positions of the occiput, which results from de-flexion and asynclitism of the head.
|
| 214 |
+
|
| 215 |
+
The distinction between the two types of disproportion may be impossible to make but should be attempted because correction of the malposition in the case of relative disproportion, either by enhancing uterine contractions with oxytocin or by manipulating the fetal head with an instrument or manually, may allow safe vaginal delivery of the baby. Unfortunately, there is no reliable test that will diagnose CPD with certainty before the onset of labour. It may be suspected if there is a history of previous difficult labours or from the findings on clinical examination or when delay occurs in the late active phase of the first stage of labour or pelvic (Decent) phase of the second stage.\n\nSigns of obstructed labour
|
| 216 |
+
|
| 217 |
+
1. Significant caput and moulding.
|
| 218 |
+
|
| 219 |
+
2. Tenderness and ‘ballooning��� of lower uterine segment.
|
| 220 |
+
|
| 221 |
+
3. Formation of uterine retraction ring.
|
| 222 |
+
|
| 223 |
+
4. Presence of oedema of cervix and/or vulva.
|
| 224 |
+
|
| 225 |
+
Vol. 43, No. 4, December 2021
|
| 226 |
+
|
| 227 |
+
SLCOG Guideline
|
| 228 |
+
|
| 229 |
+
5. Blood-stained urine.
|
| 230 |
+
|
| 231 |
+
6. Bleeding from the vagina.
|
| 232 |
+
|
| 233 |
+
Note: Severe or increasing moulding of the head that fails to rotate descend despite of strong uterine contractions is also a clinical finding suggestive of CPD/obstructed Labour.
|
| 234 |
+
|
| 235 |
+
• If a diagnosis of obstructed labour is made, delivery should be undertaken immediately by caesarean section.
|
| 236 |
+
|
| 237 |
+
7.6 Estimation of the level of fetal head – Per Abdomen (P/A) and Vaginally (V/E) (This helps in assessment of progress at subsequent examination and on decision regarding mode of delivery)
|
| 238 |
+
|
| 239 |
+
1. P/A- 5/5 the fetal head is completely palpable above upper border of symphysis pubis.
|
| 240 |
+
|
| 241 |
+
V/E-3 cm. digital examination at this stage is hardly possible.
|
| 242 |
+
|
| 243 |
+
2. P/A- 4/5 the lower portion of the head is just below the upper border of the symphysis pubis.
|
| 244 |
+
|
| 245 |
+
V/E -2cm station (difficult examination of head).
|
| 246 |
+
|
| 247 |
+
3. P/A -3/5 Occipitofrontal diameter of the head may be palpable just above the upper border of the symphysis pubis.
|
| 248 |
+
|
| 249 |
+
V/E -1cm station.
|
| 250 |
+
|
| 251 |
+
4. P/A- 2/5 the head is engaged. On one side, usually the side of sinciput, the head may be easily palpable while on the other, the side of the occiput; it may not be so easily palpable.
|
| 252 |
+
|
| 253 |
+
V/E -0 cm station.
|
| 254 |
+
|
| 255 |
+
5. P/A -1/5 the fetal head is engaged; the head, usually the sinciput, may be just palpated with the fingers on one side only.
|
| 256 |
+
|
| 257 |
+
V/E +1cm station.
|
| 258 |
+
|
| 259 |
+
6. P/A 0/5 the head is deeply engaged; neither the occiput nor the sinciput are palpable abdominally. V/E +2cm.
|
| 260 |
+
|
| 261 |
+
• If the station is at the level of ischial spines or higher vaginally, instrumental delivery is contra-indicated4,5.
|
| 262 |
+
|
| 263 |
+
If it is necessary to deliver the baby at this stage, either due to maternal or fetal distress, it should be by a caesarean section.
|
| 264 |
+
|
| 265 |
+
339
|
| 266 |
+
|
| 267 |
+
SLCOG Guideline
|
| 268 |
+
|
| 269 |
+
7.7 Use of oxytocin for slow progress in second stage
|
| 270 |
+
|
| 271 |
+
Use of oxytocin (especially in a nulliparous women) may be better than premature instrumental delivery with a high fetal head station for the treatment of delay in the second stage of labour6,7,8,9.
|
| 272 |
+
|
| 273 |
+
• In a nulliparous woman with inefficient uterine contractions, and with absence of signs of fetal distress, contractions can be stimulated with oxytocin to achieve 4-5 contractions per 10 minutes.
|
| 274 |
+
|
| 275 |
+
• However, in a multiparous woman, inefficient uterine action is less common and caution is required before introducing oxytocin to increase uterine contraction due to risk of hypertonic contractions and uterine rupture. Careful assessment should be made by an experienced clinician/consultant, to exclude disproportion before administering oxytocin for delay in the first or second stages of labour.
|
| 276 |
+
|
| 277 |
+
• Oxytocin should not be routinely used in women with previous caesarean delivery. Need should be discussed with on-call consultant/Senior clinician before aug- mentation.
|
| 278 |
+
|
| 279 |
+
{Rate of uterine rupture doubles with use of Syn- tocinon after previous C/S, compared to non-use of Syntocinon9,10,11. Earliest signs of uterine dehiscence/ rupture can be fetal distress, abdominal pain (in the region of scar), vaginal bleeding and blood-stained urine. If the pain ‘breaks through’ despite epidural analgesia, scar dehiscence should be considered.}\n\n8. Choice of instrument
|
| 280 |
+
|
| 281 |
+
The choice, judgement and the skill of the operator dictates the outcome rather than the instrument itself. Following factors needs to be considered in decision- making:
|
| 282 |
+
|
| 283 |
+
Experience of operator.
|
| 284 |
+
|
| 285 |
+
Station and position of head.
|
| 286 |
+
|
| 287 |
+
Size of the baby.
|
| 288 |
+
|
| 289 |
+
• Degree of caput/moulding.
|
| 290 |
+
|
| 291 |
+
• Maternal exhaustion – physical/mental.
|
| 292 |
+
|
| 293 |
+
340
|
| 294 |
+
|
| 295 |
+
Ventouse is more likely to fail in the presence of excessive caput. The vacuum extraction causes less maternal trauma but may increase the risk of cephal- hematoma, retinal haemorrhage and certain types of intra-cranial haemorrhage in the fetus compared to forceps delivery12. Maternal perineal trauma is more likely with forceps but ability to complete delivery with single instrument is more likely with forceps.
|
| 296 |
+
|
| 297 |
+
Regional analgesia is advisable for difficult forceps delivery when done in theater, and a pudendal block when conducted in the labour room. Ventouse extrac- tion can be performed without regional analgesia. Perineal infiltration for episiotomy would suffice. However, operator should confirm adequacy of analgesia with the woman prior to application of the instruments.
|
| 298 |
+
|
| 299 |
+
• Application of rotational forceps needs training and experience. If not adequately trained/experienced on the technique, manual rotation followed by non- rotational forceps/ vacuum or rotational vacuum delivery or LSCS would be prudent.
|
| 300 |
+
|
| 301 |
+
9. Trial of instrumental delivery
|
| 302 |
+
|
| 303 |
+
Adequate assessment of the case will generally resolve any doubts prior to attempting an instrumental delivery. Operator should first ensure adequate analgesia for examination has been provided. If the operator is uncertain about the position of the fetal head, degree of engagement, instrument delivery should not be undertaken.
|
| 304 |
+
|
| 305 |
+
When the operator is uncertain about the likelihood of success or expect a difficult delivery a formal trial of ventouse/forceps in the operating theater should be attempted where immediate resorting into caesarean section can be done. Failure in the labour room without preparation for immediate C/S), has shown to increase fetal morbidity and mortality13,14.
|
| 306 |
+
|
| 307 |
+
Vacuum and forceps birth has been associated with higher incidence of episiotomy, pelvic floor tearing, levator ani avulsion and obstetric anal sphincter injury compared to spontaneous vaginal birth. Meticulous examination for perineal or obstetric anal sphincter injuries (OASIS) should be undertaken. Care should be taken on the management decision and expert opinion should be sought when in doubt.
|
| 308 |
+
|
| 309 |
+
Sri Lanka Journal of Obstetrics and Gynaecology\n\n9.1 Probable indications for a trial in theatre
|
| 310 |
+
|
| 311 |
+
• Head palpable abdominally 1/5 i.e., station +1 (mid cavity instrumental delivery). (If the station of the head is higher than this, instrumental delivery is contra-indicated. Beware of the caput at the spines, whilst the actual head is much higher.)
|
| 312 |
+
|
| 313 |
+
• Severe caput/moulding
|
| 314 |
+
|
| 315 |
+
• Non occipito-anterior (OA) positions such as OP and OT positions.
|
| 316 |
+
|
| 317 |
+
• Deflexed/Asynclitic head.
|
| 318 |
+
|
| 319 |
+
• Protracted 1st stage of labour, prolonged 7-10cm interval.
|
| 320 |
+
|
| 321 |
+
• Fetal macrosomia/borderline CPD. (HC ≥95th centile / EFW ≥4kg/ BMI above 30.)
|
| 322 |
+
|
| 323 |
+
• Any condition, which may lead to failure of instrumental delivery.
|
| 324 |
+
|
| 325 |
+
10. Vacuum extraction / ventouse delivery
|
| 326 |
+
|
| 327 |
+
Rigid/soft silicon cups can be used for OA positions and posterior cups should be used for non-OA positions. Hand-held vacuum cup (kiwi omni cup) can be used for both OA and non-OA positions.
|
| 328 |
+
|
| 329 |
+
10.1 Indications for ventouse delivery
|
| 330 |
+
|
| 331 |
+
• Delayed second stage
|
| 332 |
+
|
| 333 |
+
•
|
| 334 |
+
|
| 335 |
+
Fetal distress in the second stage with fetal head below ‘0’ station (see above)
|
| 336 |
+
|
| 337 |
+
• Maternal conditions requiring a short second stage (severe PET, cardiac disease)
|
| 338 |
+
|
| 339 |
+
• Delivery of the 2nd twin (only if cephalic).
|
| 340 |
+
|
| 341 |
+
10.2 Contraindications for ventouse delivery
|
| 342 |
+
|
| 343 |
+
Face/brow/breech presentation
|
| 344 |
+
|
| 345 |
+
• Marked active bleeding from fetal blood sampling site or maternal immune thrombo- cytopenia in pregnancy.
|
| 346 |
+
|
| 347 |
+
• Vacuum is contraindicated below 32 weeks of gestation and should be used with extreme caution between 32+0 and 36+0 and should be discussed with consultant on-call).
|
| 348 |
+
|
| 349 |
+
Fetal head per abdomen >1/5 palpable.
|
| 350 |
+
|
| 351 |
+
• Apparent CPD.
|
| 352 |
+
|
| 353 |
+
•
|
| 354 |
+
|
| 355 |
+
Inexperience with the use of the equipment.
|
| 356 |
+
|
| 357 |
+
Vol. 43, No. 4, December 2021
|
| 358 |
+
|
| 359 |
+
SLCOG Guideline
|
| 360 |
+
|
| 361 |
+
10.3 Prerequisites of ventouse delivery
|
| 362 |
+
|
| 363 |
+
• Full dilatation of cervix and ruptured membranes.
|
| 364 |
+
|
| 365 |
+
• Careful pelvic examination to assess adequacy of pelvis, with special attention to architecture of pelvis to assess sacral hollow, ischial spines and sub-pubic arch.
|
| 366 |
+
|
| 367 |
+
• Fully engaged head and any de-flexion of head identified.
|
| 368 |
+
|
| 369 |
+
• Full explanation of the procedure and verbal consent of the woman, and need for her co- operation emphasized.
|
| 370 |
+
|
| 371 |
+
• Good regular contractions should be present. (If they are less frequent, then Oxytocin infusion should be set-up and caution needed in multiparous women and women with previous section).\n\n10.4 Basic rules
|
| 372 |
+
|
| 373 |
+
• The delivery should be completed in no longer than 15 minutes following application of the cup. (Fifteen minutes is given as the maximum time allowed, but the average time from insertion of the cup to delivery is normally six minutes15,16).
|
| 374 |
+
|
| 375 |
+
• The head should be delivered with no more than 3 synchronized pulls with maternal expulsive force.
|
| 376 |
+
|
| 377 |
+
• The procedure is abandoned if there is no descent after 2 pulls (actual head should descend and not just the caput).
|
| 378 |
+
|
| 379 |
+
• The cup should be reapplied no more than twice (discontinue after two pop-offs).
|
| 380 |
+
|
| 381 |
+
• The cup must be applied on flexion point. (Bird et.al demonstrated provided the cup is applied correctly over the flexion point and traction directed along the pelvic axis, autorotation of fetal head would occur in >90% of the fetal OP and OT positions17.
|
| 382 |
+
|
| 383 |
+
• Anterior placement of the cup (in relation to flexion point) will aggravate de-flexion, and off-center placement of the cup will cause asynclitism. Both the situations will increase failure rate due to larger diameter of engage- ment and increase the chance of fetal injury.
|
| 384 |
+
|
| 385 |
+
• After checking the correct application and ensuring that no maternal tissue is included in
|
| 386 |
+
|
| 387 |
+
341
|
| 388 |
+
|
| 389 |
+
SLCOG Guideline
|
| 390 |
+
|
| 391 |
+
the cup, pressure is raised to 0.8kg/cm2 almost straightaway. There is no advantage in stepwise increase in pressure.
|
| 392 |
+
|
| 393 |
+
•
|
| 394 |
+
|
| 395 |
+
Traction on the apparatus should coincide with uterine contractions and maternal voluntary effort. To avoid the cup detach- ment, ‘finger thumb’ position of the other hand is used.
|
| 396 |
+
|
| 397 |
+
• The use of sequential instruments is associated with an increased risk of trauma to the infant. However, the operator should assess the risk of performing a second stage caesarean section with a deeply impacted fetal head versus a forceps delivery following a failed vacuum.
|
| 398 |
+
|
| 399 |
+
• Beware of shoulder dystocia, after the ven- touse delivery. The association is co-incidental rather than causal.
|
| 400 |
+
|
| 401 |
+
10.5 Place of episiotomy for ventouse delivery
|
| 402 |
+
|
| 403 |
+
Episiotomy should be discussed with the woman prior to any instrumental delivery and formal consent obtained and documented. Episiotomy is not routinely required for ventouse delivery. Clinical judgement is advised.
|
| 404 |
+
|
| 405 |
+
Episiotomy may be necessary in case of:
|
| 406 |
+
|
| 407 |
+
• Rigid perineum.
|
| 408 |
+
|
| 409 |
+
• Big baby.
|
| 410 |
+
|
| 411 |
+
Fetal distress to hasten the delivery.
|
| 412 |
+
|
| 413 |
+
If the perineum seems to be splitting an episiotomy is often performed to limit the damage18. Episiotomy should be done under anesthesia. (Local block if regional anesthesia is not insitu). Episiotomy is always given medio-lateral (median, increases chance of 3rd / 4th degree tear. Premature episiotomy should be avoided and should be given at the time of crowning. (In case the instrument fails to deliver the baby and C/S is required).\n\n11. Forceps delivery
|
| 414 |
+
|
| 415 |
+
11.1 Indications
|
| 416 |
+
|
| 417 |
+
• Delay in the 2nd stage of labour.
|
| 418 |
+
|
| 419 |
+
Fetal distress in the second stage.
|
| 420 |
+
|
| 421 |
+
• After coming head of breech delivery.
|
| 422 |
+
|
| 423 |
+
342
|
| 424 |
+
|
| 425 |
+
• Maternal conditions requiring short second stage.
|
| 426 |
+
|
| 427 |
+
• Delivery of the head at cesarean section.
|
| 428 |
+
|
| 429 |
+
11.2 Choice of forceps over ventouse
|
| 430 |
+
|
| 431 |
+
• After coming head in breech vaginal delivery.
|
| 432 |
+
|
| 433 |
+
Face presentation (Mento-anterior).
|
| 434 |
+
|
| 435 |
+
Pre-term infants <36 weeks.
|
| 436 |
+
|
| 437 |
+
• Women under anesthesia and unable to generate substantial expulsion.
|
| 438 |
+
|
| 439 |
+
• A heavily bleeding scalp sample site.
|
| 440 |
+
|
| 441 |
+
• Significant caput in OA positions, when ventouse cup is likely to come off.
|
| 442 |
+
|
| 443 |
+
11.3 Pre-requisites for forceps delivery
|
| 444 |
+
|
| 445 |
+
• Appropriately experienced operator.
|
| 446 |
+
|
| 447 |
+
• Rupture of membranes.
|
| 448 |
+
|
| 449 |
+
Fully dilated cervix.
|
| 450 |
+
|
| 451 |
+
• Clear knowledge of the position of the fetal head (use of USS will be helpful if uncertain findings).
|
| 452 |
+
|
| 453 |
+
• Clinically adequate pelvis.
|
| 454 |
+
|
| 455 |
+
• Fetal head engaged at station +1 or lower (1/5 or less palpable abdominally).
|
| 456 |
+
|
| 457 |
+
• Adequate analgesia (regional/pudendal block).
|
| 458 |
+
|
| 459 |
+
• Empty bladder.
|
| 460 |
+
|
| 461 |
+
• An adequately informed and consented (verbal) patient.
|
| 462 |
+
|
| 463 |
+
• Availability of pediatric support.
|
| 464 |
+
|
| 465 |
+
(The careful abdominal/pelvic examination for the fetal head station, position and fetal size is carried out as in ventouse protocol.)
|
| 466 |
+
|
| 467 |
+
• If episiotomy is given it should be meticulously sutured. Vaginal and rectal examination is mandatory after instrumental delivery.
|
| 468 |
+
|
| 469 |
+
• The woman and her partner if available are debriefed regarding the procedure.
|
| 470 |
+
|
| 471 |
+
• Accurate, legible documentation of the procedure should made. Postoperative care plan including prescription of antibiotics, analgesia and thromboprophylaxis should be carried out when needed.
|
| 472 |
+
|
| 473 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 474 |
+
|
| 475 |
+
11.4 Management of a failed attempted forceps delivery
|
| 476 |
+
|
| 477 |
+
• If the forceps cannot be applied easily, or if the blades does not lock, or if there is lack of decent with moderate traction and maternal pushing, it is prudent to abandon the forceps delivery and resort to an emergency caesarean section.
|
| 478 |
+
|
| 479 |
+
• When attempting rotational forceps, the rotation should be achieved with ease and if not should discontinue the procedure.
|
| 480 |
+
|
| 481 |
+
• The procedure should be abandoned and resorted to an emergency caesarean section if the birth is not imminent even after 3 pulls of a correctly applied instrument and a correct direction in traction.
|
| 482 |
+
|
| 483 |
+
• If resorted to an emergency caesarean section due to failed forceps, the obstetrician should be aware that there is an increased risk of head impaction and be ready to dis-impact the head with known maneuvers.
|
| 484 |
+
|
| 485 |
+
• The neonatology team should be informed clearly about the failed forceps as there is increased risk of neonatal morbidity following caesarean section for failed forceps.\n\n12. Prophylactic antibiotics
|
| 486 |
+
|
| 487 |
+
• Following instrumental vaginal birth, it is recommended to give a single prophylactic dose of intravenous antibiotics to prevent maternal infection.
|
| 488 |
+
|
| 489 |
+
• Amoxicillin and clavulanic acid single dose can be used for this purpose after confirming allergy status.
|
| 490 |
+
|
| 491 |
+
13. Postnatal care following instrumental delivery
|
| 492 |
+
|
| 493 |
+
• Postnatal care following instrumental vaginal delivery requires the need to assess the requirement of thromboprophylaxis to prevent thromboembolism, adequate pain relief, voiding function, pelvic floor rehabilitation and debriefing about the events in current birth and about future births.
|
| 494 |
+
|
| 495 |
+
• For pain relief NSAIDs and paracetamol administered is adequate.
|
| 496 |
+
|
| 497 |
+
Vol. 43, No. 4, December 2021
|
| 498 |
+
|
| 499 |
+
SLCOG Guideline
|
| 500 |
+
|
| 501 |
+
• Routine bladder emptying should be encouraged after instrumental vaginal birth to prevent urinary retention. It is prudent to document the timing and the volume of the first void urine following an instrumental delivery.
|
| 502 |
+
|
| 503 |
+
14. Postnatal psychological morbidity
|
| 504 |
+
|
| 505 |
+
• Difficult childbirth can leave a traumatic experience in women and ultimately result in fear of future childbirth. It will also impact quality of life with her partner and family, ultimately leading to psychological morbidity.
|
| 506 |
+
|
| 507 |
+
• Shared decision making with the woman, good communication, and continuous support during and immediately after the childbirth have the potential to reduce the psychological morbidity following instrumental childbirth.
|
| 508 |
+
|
| 509 |
+
• It is best practice to discuss the indications for the instrumental delivery, how the complications were managed and to advise regarding future births. This should ideally be done by the obstetrician who attended the procedure.
|
| 510 |
+
|
| 511 |
+
• It should be informed that there is a high possibility of a successful spontaneous vaginal birth in the future pregnancies.
|
| 512 |
+
|
| 513 |
+
15. Clinical governance
|
| 514 |
+
|
| 515 |
+
15.1 Proper documentation
|
| 516 |
+
|
| 517 |
+
a. Documentation should include detailed information on the assessment, decision making and conduct of the procedure, a plan for postnatal care and counselling for future pregnancies.
|
| 518 |
+
|
| 519 |
+
b. Use of a standard proforma for this purpose is recommended and is best to be audited at regular intervals.
|
| 520 |
+
|
| 521 |
+
c. Training the staff with using mannequins and accreditation of the trainees.\n\n15.2 Obtaining cord blood
|
| 522 |
+
|
| 523 |
+
d. If facilities are available, cord blood be obtained in instrumental delivery, and this should include arterial as well as venous blood sampling. The
|
| 524 |
+
|
| 525 |
+
343
|
| 526 |
+
|
| 527 |
+
SLCOG Guideline
|
| 528 |
+
|
| 529 |
+
PH and base deficit can be documented in the patient operative notes.
|
| 530 |
+
|
| 531 |
+
e. Institutes may strive to provide obstetric care units with required facilities to perform cord blood gases.
|
| 532 |
+
|
| 533 |
+
15.3 Risk management
|
| 534 |
+
|
| 535 |
+
Adverse outcomes, including failed instrumental deliveries, major obstetric haemorrhage, fetal injuries, and morbidity, OASI, shoulder dystocia and associated complications should trigger risk management meeting with unit consultant. Adequate steps can be taken to reduce these events in the future and to properly manage such complications. Frequent audits should be undertaken on these complication rates and trends.
|
| 536 |
+
|
| 537 |
+
References
|
| 538 |
+
|
| 539 |
+
1. NHS Maternity Statistics, England 2016-17 [https://digital.nhs.uk/data-information/ publications/statistical/nhs-maternity-statistics/ 2016-17].
|
| 540 |
+
|
| 541 |
+
2. Demissie K, Rhoads GG, Smulian JC, Balasubra- manian BA, Gandhi K, Joseph KS, et al. Operative vaginal delivery and neonatal and infant adverse outcomes: population based retrospective analysis. BMJ 2004; 329: 24-9.
|
| 542 |
+
|
| 543 |
+
3. Towner D, Castro MA, Eby-Wilkens E, Gilbert WM. Effect of mode of delivery in nulliparaous women on neonatal intracranial injury. N Engl J Med 1999; 341: 1709-14.
|
| 544 |
+
|
| 545 |
+
4. NHS Maternity Statistics, England 2016-17 [https:/ /digital.nhs.uk/ data-and information /publications/ statistical/nhs-maternity-statistics/ 2016-17]. last accessed 04 February 2021.
|
| 546 |
+
|
| 547 |
+
5. Philpott RH. The recognition of cephalopelvic disproportion. Clinics in Obstet Gynaecol 1982; 9: 609-24.
|
| 548 |
+
|
| 549 |
+
6. Murphy DJ, et al. Cohort study of operative delivery in the second stage of labour and standard of obstetric care. BJOG 2003; 110: 610-15.
|
| 550 |
+
|
| 551 |
+
7. Kean LH, Baker PN, Edelstone DI. Best Practice
|
| 552 |
+
|
| 553 |
+
344
|
| 554 |
+
|
| 555 |
+
in Labor Ward management, Scotland: Elsevier Science Limited, 2002.
|
| 556 |
+
|
| 557 |
+
8. O’Connel MO, Hussain J, Maeclennan FA, Lindow SW. Factors associated with prolonged second stage of labour – a case-controlled study of 364 nulliparous labours. J Obstet Gynaecol 2003; 23: 255-7.
|
| 558 |
+
|
| 559 |
+
9. Paterson CM, Saunders NG, Wadsworth J. The characteristics of the second stage of labour in 25,069 singleton deliveries in the North West Thames Health Region 1988. BJOG 1992; 99: 377-80.
|
| 560 |
+
|
| 561 |
+
10. Arulkumaran S, Ingemarsson I, Ratnam SS. Oxy- tocin augmentation in dysfunctional labour after previous caesarean section. BJOG 1989; 96: 939-41.
|
| 562 |
+
|
| 563 |
+
11. Chelmow D, Laros RK. Maternal and Neonatal Outcomes After Oxytocin Augmentation in Patients Undergoing a Trial of Labour After Prior Cesarean Delivery. Obstet Gynecol 1992; 80: 966-71.
|
| 564 |
+
|
| 565 |
+
12. Weerasekera DS, Premartane S. A randomised prospective trial of the obstetric forceps versus vacuum extraction using defined criteria. J Obstet Gynaecol 2002; 22: 344-5.
|
| 566 |
+
|
| 567 |
+
13. Miksovsky P, et al. CME Review Article: Obstetric vacuum extraction: state of the art in the new millennium. Obstet Gynecol Survey 2001; 56: 736- 51.
|
| 568 |
+
|
| 569 |
+
14. Lowe B. Fear of failure: a place for trial of instrumental delivery. BJOG 1987; 94: 60-6.
|
| 570 |
+
|
| 571 |
+
15. Johanson R, Cox C, Grady K, Howell C. Managing obstetric emergencies and trauma, The MOET Course Manual. RCOG Press 2003.
|
| 572 |
+
|
| 573 |
+
16. Johanson RB, et al. North Staffordshire/Wigan assisted delivery trial. BJOG 1989; 96: 537-44.
|
| 574 |
+
|
| 575 |
+
17. Bird GC. The importance of flexion in vacuum extraction delivery. BJOG 1976; 83: 194-200.
|
| 576 |
+
|
| 577 |
+
18. De Jonge ETM, Lindeque BG. A properly conducted trial of a ventouse can prevent unexpected failure of instrumental delivery. SAMJ 1991; 70: 545-6.
|
| 578 |
+
|
| 579 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 580 |
+
|
| 581 |
+
SLCOG Guideline
|
| 582 |
+
|
| 583 |
+
SLCOG Guideline\n\nAnnexure 1
|
| 584 |
+
|
| 585 |
+
——yyYYt COM OPERATION NOTES: FORCEPS /VENTOUSE DELIVERY 4, NAMC® secs: emeeeernene E RE 2eBHT! scm Date? wescsseememeseeesceememrrecsenies Time Of Delivery: sesecvsssseseeesseereecrseey Operator: 2.2.2... 02.0. cee cece eeeeeeeeeeeeeeeeeee es Anaesthetist: ...............0:..0eceeeeeeeee ee Type: Forceps: Ventouse: Neville Barnes /Simpson's Kiwi Cup Wrigleys Soft Cup Keillands Hard Cup Indications: 1. Anaesthesia: GA / Spinal / Epidural / Pudendal / Local Infiltration Head Position: OA / OT / OP / Other Head Station: O / +1 / +2 / +3 Moulding: no / + / 2+ [| 3+ Caput:: no f/ * | 2 | BF Meconium: no / yes Application method: Direct / Wandering Rotation: no / easy / mod /diff Traction: easy / mod / diff Number of Pulls Delivery Comments:
|
| 586 |
+
|
| 587 |
+
Vol 43, No. 4, December 2021
|
| 588 |
+
|
| 589 |
+
345
|
| 590 |
+
|
| 591 |
+
SLCOG Guideline
|
| 592 |
+
|
| 593 |
+
SLCOG Guideline
|
| 594 |
+
|
| 595 |
+
Annexure 1 (Continued)
|
| 596 |
+
|
| 597 |
+
346
|
| 598 |
+
|
| 599 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 600 |
+
|
| 601 |
+
SLCOG Guideline
|
| 602 |
+
|
| 603 |
+
SLCOG Guideline
|
| 604 |
+
|
| 605 |
+
Annexure 2
|
| 606 |
+
|
| 607 |
+
POSTPARTUM BLADDER CARE FOLLOWING INSTRUMENTAL DELIVERY
|
| 608 |
+
|
| 609 |
+
Vol 43, No. 4, December 2021
|
| 610 |
+
|
| 611 |
+
347
|
src/processed_markdown/Breech/Breech.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "Breech"\n\n---\n\nManagement of Breech Presentation
|
| 2 |
+
|
| 3 |
+
Clinical
|
| 4 |
+
|
| 5 |
+
Clinical
|
| 6 |
+
|
| 7 |
+
• Abdominal examination: the head of the fetus is in the upper part of the uterus.
|
| 8 |
+
|
| 9 |
+
X-ray of the
|
| 10 |
+
|
| 11 |
+
pelvis to
|
| 12 |
+
|
| 13 |
+
confirm
|
| 14 |
+
|
| 15 |
+
presentation is
|
| 16 |
+
|
| 17 |
+
to be avoided.
|
| 18 |
+
|
| 19 |
+
Ultra sound
|
| 20 |
+
|
| 21 |
+
• Auscultation locates the fetal heart at a higher location than expected with a vertex presentation.
|
| 22 |
+
|
| 23 |
+
• conform the presenting part
|
| 24 |
+
|
| 25 |
+
•
|
| 26 |
+
|
| 27 |
+
localizatiion of placenta
|
| 28 |
+
|
| 29 |
+
• Vaginal examination: the buttocks and/or feet are felt. Thick, dark meconium is normal when membranes rupture in the second stage of labour.
|
| 30 |
+
|
| 31 |
+
• exclusion of
|
| 32 |
+
|
| 33 |
+
abnormalities,etc.
|
| 34 |
+
|
| 35 |
+
THE DIAGNOSIS OF BREECH CONFIRMED
|
| 36 |
+
|
| 37 |
+
— External cephalic version not acormamenaladt Wait till 36 completed wi —
|
| 38 |
+
|
| 39 |
+
: prior to 36 completed
|
| 40 |
+
|
| 41 |
+
36 weeks
|
| 42 |
+
|
| 43 |
+
uncomplicated breech at 37 to 40 weeks
|
| 44 |
+
|
| 45 |
+
uncomplicated (no extended or |] complicated (extended or flexed leg) breech presentation flexed leg) breech presentation at term at term
|
| 46 |
+
|
| 47 |
+
38 weeks
|
| 48 |
+
|
| 49 |
+
Delivery
|
| 50 |
+
|
| 51 |
+
No indication
|
| 52 |
+
|
| 53 |
+
for L.S.C.S
|
| 54 |
+
|
| 55 |
+
Relative indications for Absolute indications for Caesarean section Caesarean section Intrauterine growth restriction. Feto-pelvic disproportion Previous uterine scar -When the fetal weight is estimated to Hyperextension of the fetal head be 3.8 kg or more (Star gazer) Major degree placenta praevia -When the head cannot be flexed Pelvic or uterine tumors preventing Small pelvis or suspicious pelvic descent of presenting part. adequacy Major degrees of pelvic deformities. Footling presentation Gestation less than 34 weeks
|
| 56 |
+
|
| 57 |
+
Vaginal delivery
|
| 58 |
+
|
| 59 |
+
Sri Lanka College of Obstetrics and Gynaecology Health sector development Project Guidelines- Management of breech presentation
|
| 60 |
+
|
| 61 |
+
4 Ei = 3 "
|
| 62 |
+
|
| 63 |
+
=
|
| 64 |
+
|
| 65 |
+
=| -}
|
| 66 |
+
|
| 67 |
+
= 9 =o oo eo a =i m 5 >
|
| 68 |
+
|
| 69 |
+
on a
|
| 70 |
+
|
| 71 |
+
=| = S
|
| 72 |
+
|
| 73 |
+
5
|
| 74 |
+
|
| 75 |
+
a $ 4
|
src/processed_markdown/Intrapartum-fever-Dec-4/Intrapartum-fever-Dec-4.md
ADDED
|
@@ -0,0 +1,575 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "Intrapartum fever Dec 4"\n\n---\n\nSLCOG Guideline
|
| 2 |
+
|
| 3 |
+
SLCOG Guideline
|
| 4 |
+
|
| 5 |
+
Intrapartum Fever
|
| 6 |
+
|
| 7 |
+
J Karunasinghea on behalf of the Sri Lanka College of Obstetricians and Gynaecologists
|
| 8 |
+
|
| 9 |
+
Correspondence: Sri Lanka College of Obstetricians and Gynaecologists, No. 112, Model Farm Road, Colombo 08. E-mail: slcogoffice@gmail.com
|
| 10 |
+
|
| 11 |
+
1. Scope and background
|
| 12 |
+
|
| 13 |
+
a. Infectious causes
|
| 14 |
+
|
| 15 |
+
This guideline is focused on the aetiologies, manage- ment, and potential consequences of intrapartum fever. Management of some of the specific causes of intrapartum fever will be briefly discussed. Note that the scope of this guideline is restricted only to intra- partum care.
|
| 16 |
+
|
| 17 |
+
b. Non-infectious causes
|
| 18 |
+
|
| 19 |
+
a. Most common infection related aetiologies are
|
| 20 |
+
|
| 21 |
+
Intraamniotic infection (IAI)
|
| 22 |
+
|
| 23 |
+
• Urinary tract infection
|
| 24 |
+
|
| 25 |
+
• Respiratory tract infection including H1N1 influenza
|
| 26 |
+
|
| 27 |
+
The guideline will not provide information about management of septicaemia and Group B streptococcal (GBS) infection in pregnancy (refer relevant guidelines). For detailed management of Dengue fever and COVID-19, please refer to the National Guidelines.
|
| 28 |
+
|
| 29 |
+
• Any other pre-existing infection which could present as fever during labour
|
| 30 |
+
|
| 31 |
+
• Dengue fever and COVID-19 infection which should be given special consideration during pandemics
|
| 32 |
+
|
| 33 |
+
2. Summary of key recommendations
|
| 34 |
+
|
| 35 |
+
b. Non-infectious causes
|
| 36 |
+
|
| 37 |
+
2.1 Definition
|
| 38 |
+
|
| 39 |
+
Intrapartum fever is defined as the elevation of maternal oral temperature ≥39°C (≥102.2°F) on one reading or temperature between 38°C (>100.4°F) to 39°C (102.2°F) on two readings 30 minutes apart in a woman in labour1.
|
| 40 |
+
|
| 41 |
+
• Use of neuraxial anaesthesia is the most common cause of non-infectious cause of fever at term.
|
| 42 |
+
|
| 43 |
+
• Increased metabolism (eg: thyrotoxicosis), poor ventilation, delivering in an overheated room and drug fever are considered as some other causes for intrapartum fever.
|
| 44 |
+
|
| 45 |
+
Healthcare worker should measure oral temperature of all women in labour 4 hourly or whenever they show signs and symptoms of febrile illness. Temperature should be recorded in the partogram routinely. Whenever high temperature is detected, it should be recorded in a separate temperature chart.
|
| 46 |
+
|
| 47 |
+
Patients with following factors are considered high risk for intrapartum fever –
|
| 48 |
+
|
| 49 |
+
• Nulliparity
|
| 50 |
+
|
| 51 |
+
• Labour induction
|
| 52 |
+
|
| 53 |
+
• Prolonged labour
|
| 54 |
+
|
| 55 |
+
• Premature labour\n\n2.2 Aetiology
|
| 56 |
+
|
| 57 |
+
• Prolonged membrane rupture
|
| 58 |
+
|
| 59 |
+
Intraamniotic infection (IAI) and neuraxial anaesthesia are the most common causes for intrapartum fever2. Aetiology of the intrapartum fever is classified into two categories.
|
| 60 |
+
|
| 61 |
+
• Multiple digital vaginal examinations
|
| 62 |
+
|
| 63 |
+
• Exposure to intrauterine devices: – Intrau- terine pressure devices/ Foetal scalp electrodes
|
| 64 |
+
|
| 65 |
+
Sri Lanka Journal of Obstetrics and Gynaecology 2021; 43: 371-382
|
| 66 |
+
|
| 67 |
+
DOI: http://doi.org/10.4038/sljog.v43i4.8032
|
| 68 |
+
|
| 69 |
+
a Consultant Obstetrician and Gynaecologist, Castle Street Hospital for Women, Colombo, Sri Lanka
|
| 70 |
+
|
| 71 |
+
=
|
| 72 |
+
|
| 73 |
+
This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License, which
|
| 74 |
+
|
| 75 |
+
permits unrestricted use, distribution and reproduction in any medium provided the original author and source are credited.
|
| 76 |
+
|
| 77 |
+
Vol. 43, No. 4, December 2021
|
| 78 |
+
|
| 79 |
+
371
|
| 80 |
+
|
| 81 |
+
SLCOG Guideline
|
| 82 |
+
|
| 83 |
+
3. Diagnosis and investigations
|
| 84 |
+
|
| 85 |
+
Careful history and systemic examination are required. Special consideration should be given for abdominal tenderness, vaginal examination including characteristic of amniotic fluid and odour.
|
| 86 |
+
|
| 87 |
+
Investigations
|
| 88 |
+
|
| 89 |
+
Investigations are based on suspected aetiology. However, there are no specific investigations for intrapartum fever. Usually full blood count (FBC), blood culture, urine full report (UFR) and urine culture are performed according to the suspected aetiology. High vaginal swab culture is usually done when there is evidence of premature rupture of membranes (PROM). In endemic situations, rapid antigen for Dengue fever, H1N1 influenza and COVID-19 are vital for immediate management.
|
| 90 |
+
|
| 91 |
+
Biological markers – Many systemic reviews done in intra-partum fever concluded that, measurement of C-Reactive Protein (CRP) is unreliable for detecting intrauterine infection3.
|
| 92 |
+
|
| 93 |
+
4. Management
|
| 94 |
+
|
| 95 |
+
• Senior obstetrician’s opinion should be obtained in the management of all patients with intrapartum fever. It may be beneficial to have a multidisciplinary team approach involving the Obstetrician, Microbiologist, Physician and the Anaesthetist.
|
| 96 |
+
|
| 97 |
+
• Neonatology team should be notified and involved for every case of intrapartum fever. The presence of a senior medical officer from the neonatology team at the time of delivery is the minimum requirement.
|
| 98 |
+
|
| 99 |
+
• Antibiotics – Usually broad-spectrum antibiotics with coverage of GBS (Group B streptococcus) is initiated in all patients except those with pre- existing infection. Different antibiotic regimens are used according to the hospital/unit policy (See Table 1).
|
| 100 |
+
|
| 101 |
+
• All patients with intrapartum fever should have their pulse rate, blood pressure and respiratory rate checked every 15 minutes throughout the\n\n372
|
| 102 |
+
|
| 103 |
+
labour and the postpartum period. All healthcare professionals should have the knowledge to identify the signs and symptoms of sepsis. In case of suspected sepsis, a Modified Obstetric Early Warning Signs (MOEWS) chart should be maintained and the patient may need HDU or ICU care during the process of labour.
|
| 104 |
+
|
| 105 |
+
• CTG (cardiotocograph) – All patients with intrapartum fever should have a continuous foetal monitoring with CTG.
|
| 106 |
+
|
| 107 |
+
• General measures should be taken to reduce the body temperature by adequate hydration (IV/ oral fluids), removing blankets and clothing, applying a cool wet towel to the skin, lowering the room temperature, and providing anti- pyretics like paracetamol.
|
| 108 |
+
|
| 109 |
+
• Mode of delivery and timing of delivery – Decisions for timing and mode of delivery should be made by the senior consultant obstetrician considering the following factors
|
| 110 |
+
|
| 111 |
+
a) Severity of maternal infection
|
| 112 |
+
|
| 113 |
+
b) Duration and stage of labour
|
| 114 |
+
|
| 115 |
+
c) Gestational age
|
| 116 |
+
|
| 117 |
+
d) Foetal viability
|
| 118 |
+
|
| 119 |
+
• There is no indication to deliver the foetus immediately unless the cause of the fever is suspected chorioamnionitis.
|
| 120 |
+
|
| 121 |
+
5. Management of specific infections
|
| 122 |
+
|
| 123 |
+
Management of Intraamniotic infection (Chorio- amnionitis or IAI)
|
| 124 |
+
|
| 125 |
+
IAI is defined as infection or inflammation of the amniotic fluid, membranes, placenta and/or decidua4.
|
| 126 |
+
|
| 127 |
+
Diagnosis is based on maternal pyrexia 38°C (100.4°F) orally, and at least the presence of two of the following findings5.
|
| 128 |
+
|
| 129 |
+
• Maternal tachycardia (>100bpm)
|
| 130 |
+
|
| 131 |
+
• Foetal tachycardia (>160bpm)
|
| 132 |
+
|
| 133 |
+
• Uterine tenderness
|
| 134 |
+
|
| 135 |
+
• Foul odour of the amniotic fluid
|
| 136 |
+
|
| 137 |
+
• Maternal leukocytosis (>15,000cells/mm3)
|
| 138 |
+
|
| 139 |
+
Once the diagnosis of the IAI is made, commencement of broad-spectrum antibiotics and delivery is indicated.
|
| 140 |
+
|
| 141 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 142 |
+
|
| 143 |
+
6. Maternal and neonatal consequences of intrapartum fever
|
| 144 |
+
|
| 145 |
+
6.1 Maternal consequences
|
| 146 |
+
|
| 147 |
+
• Dysfunctional labour
|
| 148 |
+
|
| 149 |
+
• Greater likelihood of caesarean delivery
|
| 150 |
+
|
| 151 |
+
• Uterine atony
|
| 152 |
+
|
| 153 |
+
• Postpartum haemorrhage
|
| 154 |
+
|
| 155 |
+
• Postpartum endometritis
|
| 156 |
+
|
| 157 |
+
• Septic pelvic thrombophlebitis
|
| 158 |
+
|
| 159 |
+
6.2 Neonatal consequences
|
| 160 |
+
|
| 161 |
+
• Meconium Aspiration Syndrome
|
| 162 |
+
|
| 163 |
+
• Hyaline Membrane Disease (HMD)
|
| 164 |
+
|
| 165 |
+
• Neonatal Seizures
|
| 166 |
+
|
| 167 |
+
•
|
| 168 |
+
|
| 169 |
+
Intrapartum stillbirth
|
| 170 |
+
|
| 171 |
+
• Early neonatal or infant death
|
| 172 |
+
|
| 173 |
+
• Birth asphyxia
|
| 174 |
+
|
| 175 |
+
• Neonatal encephalopathy cerebral palsy
|
| 176 |
+
|
| 177 |
+
• Needing assisted ventilation\n\n7. Postpartum period
|
| 178 |
+
|
| 179 |
+
Antibiotics started for confirmed or suspected intraamniotic infection should not be continued auto- matically in the postpartum period. Continuation of the antibiotic treatment should be decided on case-by-case basis considering the clinical state and the investi- gations. Continuation of the temperature monitoring chart and close observation of the neonate is recom- mended4.
|
| 180 |
+
|
| 181 |
+
7.1 Introduction
|
| 182 |
+
|
| 183 |
+
Fever during labour (intrapartum fever) is an important clinically relevant obstetric event associated with a range of maternal and neonatal complications. The prevalence of intrapartum fever has increased recently due to increase use of neuraxial anaesthesia. Studies indicate 6.8 percent or 1 in 15 women in labour have fever6.
|
| 184 |
+
|
| 185 |
+
Even though there can be both infectious and non- infectious contributing causes, most pregnant women with intrapartum fever are presumed to have an intraamniotic infection (IAI) and are managed with broad spectrum antibiotics. IAI and neuraxial anaesthesia administration are the two most common
|
| 186 |
+
|
| 187 |
+
Vol. 43, No. 4, December 2021
|
| 188 |
+
|
| 189 |
+
SLCOG Guideline
|
| 190 |
+
|
| 191 |
+
contributing causes of intrapartum fever. Many risk factors such as nulliparity, prolonged labour and premature rupture of membranes are common to both. An individualised approach involving a senior obstetrician is recommended for management of labour. In addition, some pre-existing conditions may require involvement of a multi-disciplinary team management.
|
| 192 |
+
|
| 193 |
+
8. Recommendations and discussions
|
| 194 |
+
|
| 195 |
+
8.1 Definition
|
| 196 |
+
|
| 197 |
+
Intrapartum fever is defined as elevation of maternal oral temperature 39°C (102.2°F) on one reading or temperature between 38°C (>100.4°F) to 39°C (102.2°F) on two readings 30 minutes apart in a woman in labour.
|
| 198 |
+
|
| 199 |
+
Health care worker should measure oral temperature of all women in labour 4 hourly or whenever they show signs and symptoms of febrile illness. Temperature should be recorded in the partogram routinely. Whenever high temperature is detected, it should be recorded in a different temperature chart.
|
| 200 |
+
|
| 201 |
+
Elevated body temperature will occur when the hypothalamic thermo regulator is reset at the higher temperature by the endogenous pyrogens produced by specific host cells in response to infection, inflam- mation, injury or antigenic challenge. In some instances, due to the inability to reset the thermo- regulatory centre, hyperthermia may occur. For example, recreational drugs like ecstasy can lead to increase in the core temperature by blocking the sweating or vasodilatation. In this chapter the term fever will be used to describe the rise in maternal intrapartum temperature by any mechanism. Obser- vations of normal parturient shows a diurnal distribution of temperature with a peak from midnight to 2am and a nadir from 11am to noon7.
|
| 202 |
+
|
| 203 |
+
The temperature should be measured in the oral sublingual pocket with an electronic thermometer, since this is an accurate and convenient method for detecting maternal fever. Mouth breathing, hyper- ventilation, ingestion of ice or hot beverages and oxygen administration can affect the oral temperature. Temperature measurement should be undertaken at least 15 minutes after consuming hot or cold beverages8. Measurement of axillary temperature will have an error of 1°C-2°C lower than the oral temperature9.
|
| 204 |
+
|
| 205 |
+
373
|
| 206 |
+
|
| 207 |
+
SLCOG Guideline
|
| 208 |
+
|
| 209 |
+
Oral temperature is correlated better with intrauterine core temperature according to one study. Foetal/ intrauterine temperature is 0.2°C-0.9°C (0.4°F- 1.6°F) higher than maternal oral temperature8,10-13.\n\n8.2 Aetiology and risk factors
|
| 210 |
+
|
| 211 |
+
IAI and neuraxial anaesthesia are the most common causes for intra-partum fever.
|
| 212 |
+
|
| 213 |
+
Aetiology of the intrapartum fever is classified into two categories.
|
| 214 |
+
|
| 215 |
+
a. Infectious causes
|
| 216 |
+
|
| 217 |
+
b. Non-infectious causes
|
| 218 |
+
|
| 219 |
+
a. Most common infection related aetiologies are
|
| 220 |
+
|
| 221 |
+
Intra-amniotic infection (IAI)
|
| 222 |
+
|
| 223 |
+
• Urinary tract infection
|
| 224 |
+
|
| 225 |
+
• Respiratory tract infection
|
| 226 |
+
|
| 227 |
+
• Any other pre-existing infection which could be present as fever during labour
|
| 228 |
+
|
| 229 |
+
• Special consideration should be given to dengue fever and COVID-19 infection
|
| 230 |
+
|
| 231 |
+
b. Use of neuraxial anaesthesia is the most common non-infectious cause of intrapartum fever.
|
| 232 |
+
|
| 233 |
+
Increased metabolism (eg: thyrotoxicosis), poor ventilation, delivering in an overheated room and drug fever are also considered as some other causes for intrapartum fever.
|
| 234 |
+
|
| 235 |
+
The pathophysiology of the intra-partum fever associated with neuraxial anaesthesia is not well understood. It has been attributed to –
|
| 236 |
+
|
| 237 |
+
• Direct effect of local anaesthetics on endothelial cells, trophoblast cells or leukocytes to induce proinflammatory or inhibit anti-inflammatory cytokines release, which will act on thermo- regulatory centre to reset the temperature14-18.
|
| 238 |
+
|
| 239 |
+
• Both neuraxial anaesthesia and IAI share same risk factors.
|
| 240 |
+
|
| 241 |
+
• Reduced heat loss – parturient with epidural anaesthesia have less pain induced hyper- ventilation and less perspiration because of sympathetic block2.
|
| 242 |
+
|
| 243 |
+
In general, increased in temperature >38°C is usually observed 4 hours following insertion of epidural anaesthesia19,20. Nulliparous are more likely to have
|
| 244 |
+
|
| 245 |
+
374
|
| 246 |
+
|
| 247 |
+
longer labour and likely to have intrapartum fever than multiparous (risk 13-33%)21. There is no difference in the maternal temperature elevation in parturient who receive CSE (combined spinal and epidural anaesthesia) compared to epidural alone. There is no known effective method to prevent neuraxial anaesthesia related temperature elevation.
|
| 248 |
+
|
| 249 |
+
Patients with following factors are considered high risk for intrapartum fever –
|
| 250 |
+
|
| 251 |
+
• Nulliparity
|
| 252 |
+
|
| 253 |
+
• Labour induction
|
| 254 |
+
|
| 255 |
+
• Prolonged labour
|
| 256 |
+
|
| 257 |
+
• Premature labour
|
| 258 |
+
|
| 259 |
+
• Prolonged membrane rupture
|
| 260 |
+
|
| 261 |
+
• Multiple digital vaginal examinations
|
| 262 |
+
|
| 263 |
+
• Exposure to intrauterine devices: – Intrauterine pressure devices – Foetal scalp electrodes
|
| 264 |
+
|
| 265 |
+
However above-mentioned conditions are risk factors for both IAI and neuraxial anaesthesia. Since there are no intrapartum clinical or laboratory findings that can reliably distinguish IAI and neuraxial anaesthesia related elevated maternal temperature, broad spectrum anti- biotics are usually administered in this situation, resulting in overtreatment of mothers.
|
| 266 |
+
|
| 267 |
+
Other sources of fever could be due to urinary tract infection, respiratory tract infection, influenza, pneu- monia and appendicitis that began during the antepartum period.\n\n8.3 Diagnosis and investigations
|
| 268 |
+
|
| 269 |
+
Careful history and systemic examination are required. Special consideration should be given for abdominal tenderness, vaginal examination including characteristic of amniotic fluid and odour.
|
| 270 |
+
|
| 271 |
+
Investigations are based on suspected aetiology. However, there are no specific investigations for intra- partum fever. Usually full blood count (FBC), blood culture, urine full report (UFR) and urine culture are performed according to the suspected aetiology. High vaginal swab culture is usually done when there is evidence of premature rupture of membranes (PROM). In endemic situations, rapid antigen for Dengue fever, H1N1 influenza and COVID-19 are vital for immediate management.
|
| 272 |
+
|
| 273 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 274 |
+
|
| 275 |
+
Biological markers – Many systemic reviews done in intra-partum fever concluded that, measurement of C-Reactive Protein (CRP) is unreliable for detecting intra-uterine infection3.
|
| 276 |
+
|
| 277 |
+
• White Blood Cell count/ Differential count (WBC/DC) – It is recommended to take WBC/ DC in labouring women who are clinically ill or having a high temperature. Since elevated WBC count is a normal physiological occurrence in labour, the value of this is limited. The mean values of WBC count vary from 10,000 - 29,000 cells/microlitre. Usually, the mean count increases linearly throughout the labour22. With other evidence of infection, the presence of leukocytosis will support the diagnosis, especially when accompanied by a left shift.
|
| 278 |
+
|
| 279 |
+
• Blood culture – Even though there is no imme- diate benefit of doing blood culture in intrapartum women, it will be useful for the subsequent management as appropriate antibiotic therapy is important in patients with bacteraemia, for the prevention of progressing to sepsis and shock. It is highly recommended to obtain the blood cultures from the patients with following features23,24.
|
| 280 |
+
|
| 281 |
+
• Fever >39°C (102.2°F)
|
| 282 |
+
|
| 283 |
+
• Chills
|
| 284 |
+
|
| 285 |
+
• Hypothermia
|
| 286 |
+
|
| 287 |
+
• Leukocytosis with left shift
|
| 288 |
+
|
| 289 |
+
• Neutropenia
|
| 290 |
+
|
| 291 |
+
• Development of otherwise unexplained organ dysfunction
|
| 292 |
+
|
| 293 |
+
Usually, blood cultures are not routinely performed in patients with suspected IAI as delivery and empirical antibiotic therapy is effective in 80-90% of these patients.
|
| 294 |
+
|
| 295 |
+
• Urine tests – Urinary dipstick is important in a labouring woman for the rapid diagnosis of a urinary tract infection. This is easy to perform, convenient and low cost. Sample could be obtained from a clean catch midstream urine, straight catheter, or an indwelling catheter. Urine culture is important when the patient is clinically ill, but not practical as a first line diagnosis test.
|
| 296 |
+
|
| 297 |
+
• Rapid antigen test – In dengue fever detecting
|
| 298 |
+
|
| 299 |
+
Vol. 43, No. 4, December 2021
|
| 300 |
+
|
| 301 |
+
SLCOG Guideline
|
| 302 |
+
|
| 303 |
+
the NS1 antigen is important since early intervention with proper fluid management is necessary.
|
| 304 |
+
|
| 305 |
+
In suspected COVID-19 infection, rapid antigen test is strongly recommended, because symp- tomatic or asymptomatic patients in endemic situation need early isolation in the management. Real time PCR has a value if available, for patients who are found to be having fever despite negative Rapid antigen.
|
| 306 |
+
|
| 307 |
+
• High vaginal swab – It is routinely taken in women with PROM. Positive culture for potential pathogens does not correlate well with the risk, or developing chorioamnionitis; how- ever, they are useful in determining the organisms when the chorioamnionitis is diagnosed and directing the antibiotic therapy.\n\n8.4 Management of intra-partum fever
|
| 308 |
+
|
| 309 |
+
Senior obstetrician’s opinion should be obtained in the management of all patients with intrapartum fever. It may be beneficial to have a multidisciplinary team approach involving the Obstetrician, Microbiologist, Physician and the Anaesthetist.
|
| 310 |
+
|
| 311 |
+
Neonatology team should be notified and involved for every case of intrapartum fever. The presence of a senior medical officer from the neonatology team at the time of delivery is the minimum requirement.
|
| 312 |
+
|
| 313 |
+
Antibiotics – Usually broad-spectrum antibiotics with coverage of GBS (Group B streptococcus) is initiated in all patients except those with pre-existing infection. Different antibiotic regimens are used according to the hospital/unit policy.
|
| 314 |
+
|
| 315 |
+
All patients with intrapartum fever should have their pulse rate, blood pressure and respiratory rate checked every 15 mins throughout the labour and the postpartum period. All healthcare professionals should know the signs and symptoms of sepsis. In case of sepsis, patient may need HDU or ICU care. In case of suspected sepsis, a Modified Obstetric Early Warning Signs (MOEWS) chart should be maintained and the patient may need HDU or ICU care during the process of labour.
|
| 316 |
+
|
| 317 |
+
Clinical signs and symptoms of sepsis are – pyrexia, hypothermia, tachycardia, tachypnoea, hypoxia, hypotension, oliguria, impaired consciousness and
|
| 318 |
+
|
| 319 |
+
375
|
| 320 |
+
|
| 321 |
+
SLCOG Guideline
|
| 322 |
+
|
| 323 |
+
failure to respond to treatment. These signs including pyrexia, may not always be present and are not necessarily related to the severity of the sepsis25. Refer to quick Sequential Organ Failure Assessment (qSOFA) score for early detection of suspected patients with sepsis Table 2.
|
| 324 |
+
|
| 325 |
+
CTG (cardiotocograph)
|
| 326 |
+
|
| 327 |
+
All patients with intrapartum fever should have a continuous foetal monitoring with CTG.
|
| 328 |
+
|
| 329 |
+
Intrauterine infection is associated with abnormal foetal heart trace, but there is no specific CTG pattern that indicate early onset neonatal sepsis.
|
| 330 |
+
|
| 331 |
+
Foetal tachycardia may occur due to maternal pyrexia or intrauterine infection. If Foetal tachycardia occurred secondary to maternal pyrexia, foetal tachycardia will subside once the normalisation of the maternal tem- perature is achieved.
|
| 332 |
+
|
| 333 |
+
Changes in baseline variability or new onset decele- rations must prompt measurement of maternal mean arterial pressure (MAP), hypoxia and acidaemia.\n\nGeneral measures
|
| 334 |
+
|
| 335 |
+
Measures should be taken to reduce the body tem- perature by adequate hydrations (IV/oral fluids), removing blankets and clothing, applying a cool wet towel to the skin, lowering the room temperature and providing anti-pyretics like paracetamol.
|
| 336 |
+
|
| 337 |
+
Mode of delivery and timing of delivery – Decisions for timing and mode of delivery should be made by the senior consultant obstetrician considering the following factors
|
| 338 |
+
|
| 339 |
+
a) Severity of maternal infection
|
| 340 |
+
|
| 341 |
+
b) Duration and stage of labour
|
| 342 |
+
|
| 343 |
+
c) Gestational age
|
| 344 |
+
|
| 345 |
+
d) Foetal viability
|
| 346 |
+
|
| 347 |
+
There is no indication to deliver the foetus immediately unless the cause of the fever is suspected chorioa- mnionitis.
|
| 348 |
+
|
| 349 |
+
Expediting the delivery with maternal instability may increase the risk of maternal and foetal mortality unless the infection is intrauterine.
|
| 350 |
+
|
| 351 |
+
376
|
| 352 |
+
|
| 353 |
+
8.5 Management of specific infections
|
| 354 |
+
|
| 355 |
+
Management of Intra-amniotic infection (Chorioa- mnionitis or IAI).
|
| 356 |
+
|
| 357 |
+
IAI is defined as infection or inflammation of the amniotic fluid, membranes, placenta and/or decidua.
|
| 358 |
+
|
| 359 |
+
Diagnosis is based on maternal pyrexia 38°C (100.4°F) orally, and at least the presence of two of the following findings
|
| 360 |
+
|
| 361 |
+
• Maternal tachycardia (>100bpm)
|
| 362 |
+
|
| 363 |
+
• Foetal tachycardia (>160bpm)
|
| 364 |
+
|
| 365 |
+
• Uterine tenderness
|
| 366 |
+
|
| 367 |
+
• Foul odour of the amniotic fluid
|
| 368 |
+
|
| 369 |
+
• Maternal leukocytosis (>15,000cells/mm3)
|
| 370 |
+
|
| 371 |
+
Other clinical and laboratory criteria are insensitive for IAI.
|
| 372 |
+
|
| 373 |
+
“Triple I” is another terminology proposed by an expert panel in 2015, replacing IAI, which indicate intra uterine infection, inflammation or both1, 27. The organisms involved in the chorioamnionitis usually present in the lower genital tract.
|
| 374 |
+
|
| 375 |
+
Usually, a presumptive diagnosis is made depending on the above findings. However, for the definitive diagnosis of IAI amniotic fluid gram stain, culture or placental histology showing features of an infection is necessary.
|
| 376 |
+
|
| 377 |
+
Even though the positive amniotic fluid culture is the gold standard for the diagnosis, it is of limited value in clinical practice as the results may not be available for up to 3 days from sampling. Maternal C-Reactive protein and Leukocytosis have low sensitivity and specificity to detect the chorioamnionitis. Combination of maternal blood and amniotic fluid biomarkers (interleukin 6 >7.9ng/ml, Glucose <15mg/dl) could improve the accuracy of the diagnosis. Ultrasono- graphic evaluation of the foetal thymus is more sensitive to diagnose chorioamnionitis than the foetal biophysical profile26. Foetuses complicated with chorioamnionitis were found to have small thymus in ultrasound scan.
|
| 378 |
+
|
| 379 |
+
Delivery is indicated once the diagnosis of intraamniotic infection is made. It is also important to treat with broad-spectrum antibiotics with the coverage of group
|
| 380 |
+
|
| 381 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 382 |
+
|
| 383 |
+
B streptococcus to reduce the maternal and neonatal morbidity. Patient should initially be started on intra- venous antibiotics2. See the Table 1 below for regimens of antibiotic combinations.
|
| 384 |
+
|
| 385 |
+
Usually, the IAI is associated with labour abnormalities, caesarean section, uterine atony, PPH, endometritis and septic pelvic thrombophlebitis. Chorioamnionitis is very important as it can lead serious maternal complications such as septic shock, postpartum haemorrhage, adult respiratory syndrome, intensive care admissions and rarely maternal death. Forty – seventy percent of pre- term birth and 1-13% of term births with preterm rupture of membranes or spontaneous labour are complicated with chorioamnionitis28. Early onset neonatal meningitis, neurodevelopment delay, pneumonia, respiratory distress, sepsis and death are some of the neonatal complications of IAI.\n\nManagement of UTI
|
| 386 |
+
|
| 387 |
+
Urinary tract infections are common during pregnancy. The presence of fever, flank tenderness, nausea, vomiting, costo-vertebral angle tenderness, with or without lower urinary tract symptoms like – dysuria, frequency, urgency, suprapubic pain and haematuria, may indicate the presence of upper or complicated urinary tract infection. Simple cystitis may present without fever. Empirical antibiotic treatment is indicated for UTI. Commencement of the antibiotic regimen is customised according to the unit/hospital policy. This may need to be changed according to the sensitivity pattern of the urine culture and clinical response later.
|
| 388 |
+
|
| 389 |
+
Management of respiratory tract infection
|
| 390 |
+
|
| 391 |
+
Upper respiratory tract infections will present with nasal congestion, rhinorrhoea, sore throat, malaise and cough. Fever, if present is usually of low grade. These patients do not need any specific antibiotics, except for symptomatic management and simple antipyretics. If the patient present with sudden onset rigors followed by fever, productive cough, purulent sputum and pleuritic chest pain high possibility of pneumonia should be considered. Treatment and management are similar to the non-pregnant individual, but chest X-Ray could be delayed until after delivery. Pregnant mothers can be treated safely with Azithromycin or/ and Ceftriaxone.
|
| 392 |
+
|
| 393 |
+
Antiviral prophylaxis should commence immediately if indicated for mothers suspected to have H1N1 influenza.
|
| 394 |
+
|
| 395 |
+
Vol. 43, No. 4, December 2021
|
| 396 |
+
|
| 397 |
+
SLCOG Guideline
|
| 398 |
+
|
| 399 |
+
Patient with severe lower respiratory tract infection may need to be positioned comfortably in propped-up (Fowler’s) position. They need close monitoring of vital signs, especially the respiratory rate and oxygen saturation. Patients with severe respiratory failure may need transferring to intensive care unit (ICU) and early delivery.
|
| 400 |
+
|
| 401 |
+
Management of dengue fever
|
| 402 |
+
|
| 403 |
+
The management of dengue fever depends on the phase of the fever. Patients in the critical or leaking phase, are considered in the high-risk category and need to be managed in an ICU setting during labour. (See National guidelines on dengue fever in pregnancy).\n\nManagement of COVID-19
|
| 404 |
+
|
| 405 |
+
In a pandemic situation patient may present without any symptoms or fever. Therefore, all patients presen- ting to labour suite may need a COVID-19 screening with Rapid antigen or Real time PCR.
|
| 406 |
+
|
| 407 |
+
Early diagnosis and patient isolation at the appropriate setting is of paramount importance, with adequate personal protective equipment (PPE). Maternal pulse rate, blood pressure, respiratory rate and oxygen saturation should be monitored throughout the labour.
|
| 408 |
+
|
| 409 |
+
Decision making in labour should be precise to avoid obstetric emergencies, since the delay is anticipated in transferring, organising and performing procedures with adequate isolation and personal protective equipments (PPE). Patients who are on prophylaxis enoxaparin should be discontinued of it, 12 hours before the onset of labour or induction. (see the national guideline on Management of COVID-19 infection in pregnancy).
|
| 410 |
+
|
| 411 |
+
8.6 Maternal and neonatal consequences of intrapartum fever
|
| 412 |
+
|
| 413 |
+
Neonatal consequences
|
| 414 |
+
|
| 415 |
+
• Meconium Aspiration Syndrome
|
| 416 |
+
|
| 417 |
+
• Hyaline Membrane Disease (HMD)
|
| 418 |
+
|
| 419 |
+
• Neonatal Seizures
|
| 420 |
+
|
| 421 |
+
Intrapartum stillbirth
|
| 422 |
+
|
| 423 |
+
• Early neonatal or infant death
|
| 424 |
+
|
| 425 |
+
377
|
| 426 |
+
|
| 427 |
+
SLCOG Guideline
|
| 428 |
+
|
| 429 |
+
• Birth asphyxia
|
| 430 |
+
|
| 431 |
+
• Neonatal encephalopathy and cerebral palsy
|
| 432 |
+
|
| 433 |
+
• Needing assisted ventilation
|
| 434 |
+
|
| 435 |
+
When the labouring woman is having fever, peripartum transfer of the infection to the fetus is one the major concerns. The presence of intraamniotic infection can give rise to short term effects to the new-born like septicaemia, meningitis and pneumonia. Long term outcomes are cerebral palsy and neurodevelopmental delay.
|
| 436 |
+
|
| 437 |
+
Once the micro-organisms enter the foetal mucosa, it induces a localised and subsequently a systemic inflammatory response called foetal inflammatory response syndrome (FIRS). FIRS affect multiple organ functions including the hematopoietic system, immune system, thymus heart, adrenal glands, skin, lung, brain and gut29,30.
|
| 438 |
+
|
| 439 |
+
There is no definite method to differentiate intrapartum fever due to neuraxial anaesthesia from chorio- amnionitis. Hence, there is increased tendency for neonatal sepsis screening and treating with antibiotics. However, fever due to neuraxial anaesthesia is not associated with increased rate of proven sepsis. But, even in the absence of documented infection, neuraxial anaesthesia related intra-partum pyrexia may be associated with adverse neonatal outcome. When the mother is having temperature during labour, neonate should be closely observed for sepsis. Especially neonates with low birth weight, prematurity, and hypothermia at birth, maternal Group B streptococcal colonization, preeclampsia and maternal hypertension should have a full septic screening31.
|
| 440 |
+
|
| 441 |
+
Maternal consequences
|
| 442 |
+
|
| 443 |
+
• Labour abnormalities (dysfunctional labour)
|
| 444 |
+
|
| 445 |
+
• Greater likelihood of caesarean delivery
|
| 446 |
+
|
| 447 |
+
• Uterine atony
|
| 448 |
+
|
| 449 |
+
• Postpartum haemorrhage
|
| 450 |
+
|
| 451 |
+
378
|
| 452 |
+
|
| 453 |
+
• Postpartum endometritis
|
| 454 |
+
|
| 455 |
+
• Septic pelvic thrombophlebitis
|
| 456 |
+
|
| 457 |
+
Maternal outcome depends on the causes of the intrapartum fever. Almost all the women with intrapartum fever are likely to receive antibiotics. One study indicated that even low risk nulliparous women with intrapartum fever have double the chance of requiring a caesarean delivery or assisted vaginal delivery than those without intrapartum fever regardless of receiving neuraxial anaesthesia32.\n\n9. Clinical governance
|
| 458 |
+
|
| 459 |
+
Possibility of chorioamnionitis should be suspected whenever a woman in labour develop fever as it is a condition associated with high perinatal morbidity and mortality. All measures should be taken to prevent the occurrence of chorioamnionitis.
|
| 460 |
+
|
| 461 |
+
• Optimum sterility should be maintained during vaginal examinations and procedures like artificial rupture of membranes, membrane sweeping, Foley catheter insertion etc.
|
| 462 |
+
|
| 463 |
+
• Minimise the number of vaginal examinations, especially for those with prelabour rupture of membranes and those who are in labour.
|
| 464 |
+
|
| 465 |
+
• Plan the vaginal examination in such a way that only the decision-making staff member will perform it. Avoid repeated vaginal examinations done by different categories of staff in short intervals.
|
| 466 |
+
|
| 467 |
+
All mothers with intrapartum fever should have their management discussed with the senior obstetrician and should also get neonatal team involvement.
|
| 468 |
+
|
| 469 |
+
All mothers who are suspected of having chorioamnionitis should be counselled regarding their management and possible neonatal consequences.
|
| 470 |
+
|
| 471 |
+
Maintenance of partogram and MOEWS chart in suspected sepsis are of paramount importance in the management.
|
| 472 |
+
|
| 473 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 474 |
+
|
| 475 |
+
SLCOG Guideline
|
| 476 |
+
|
| 477 |
+
Annexure 1. Intrapartum fever management algorithm
|
| 478 |
+
|
| 479 |
+
Vol. 43, No. 4, December 2021
|
| 480 |
+
|
| 481 |
+
379
|
| 482 |
+
|
| 483 |
+
SLCOG Guideline
|
| 484 |
+
|
| 485 |
+
Table 1. Different antibiotic regimens to be used in intrapartum fever
|
| 486 |
+
|
| 487 |
+
Regimen Doses 1. Ampicillin and Gentamycin Ampicillin IV 2g every 6 h and Gentamicin 2mg/kg IV load followed by 1.5mg/kg 8 h or 5mg/kg IV every 24 h 2. Cefuroxime + Metronidazole Cefuroxime 750mg IV 8 h + Metronidazole 500mg IV 8 h 3. Ceftriaxone, Metronidazole and clarithromycin Ceftrixone 1g IV every 24 h, Metronidazole IV 500mg every 8 h, and clarithromycin 500mg oral every 12 h 4. Ampicillin and Azithromycin Ampicillin 1.5g IV every 6 h and Azithromycin oral 500mg every 24 h 5. Ampicillin 3g IV every 6 6. Piperacillin-Tazobactum 4.5g IV every 8 h 7. Ertapenem 1g IV every 24 h 8. Mild penicillin allergy – Cefuroxime and Cefuroxime 1.5g loading dose,750mg 8 h and Gentamycin Gentamicin 2mg/kg IV load followed by 1.5mg /kg every 8 h or 5mg/kg IV every 24 h 9. For severe penicillin allergy – Clindamycin Clindamycin 600-800mg IV every 8h or Vancomycin or Vancomycin and Gentamicin 1g IV every 12h (slow infusion over 1 hr) and Gentamycin 2mg/kg IV load followed by 1.5 mg/kg every 8 h or 5mg/kg IV every 24 h
|
| 488 |
+
|
| 489 |
+
IV- Intravenous, h - hourly
|
| 490 |
+
|
| 491 |
+
Table 2. qSOFA scoring
|
| 492 |
+
|
| 493 |
+
Parameter Value Score Blood pressure < 100mmHg 1 Respiratory rate > 22 bpm 1 Level of consciousness GCS < 15 1 Score of 2 or more: suggestive of sepsis
|
| 494 |
+
|
| 495 |
+
380
|
| 496 |
+
|
| 497 |
+
Sri Lanka Journal of Obstetrics and Gynaecology\n\nReferences
|
| 498 |
+
|
| 499 |
+
1. Higgins RD, Saade G, Polin RA, Grobman WA, Buhimschi IA, Watterberg K, et al. Evaluation and management of women and newborns with a maternal diagnosis of chorioamnionitis: Summary of a Workshop. Obstet Gynecol. 2016; 127(3): 426-36.
|
| 500 |
+
|
| 501 |
+
2. Katherine TC. Intrapartum fever. In: Up To Date, Vincenzo B (Ed), David LH (Ed), Up To Date, Waltham, MA. (Accessed on July 20, 2021.)
|
| 502 |
+
|
| 503 |
+
3. Evers AC, Nijhuis L, Koster MP, Bont LJ, Visser GH. Intrapartum fever at term: diagnostic markers to individualize the risk of fetal infection: a review. Obstet Gynecol Surv. 2012; 67(3): 187.
|
| 504 |
+
|
| 505 |
+
4. Committee on Obstetric. Practice Committee Opinion No. 712. Intrapartum management of intraamniotic infection. Obstet Gynecol 2017; 130(2): e95-e101.
|
| 506 |
+
|
| 507 |
+
5. Newton ER. Chorioamnionitis and intraamniotic infection. Clin Obstet Gynecol 1993; 36: 795.
|
| 508 |
+
|
| 509 |
+
6. Towers CV, Yates A, Zite N, et al. Incidence of fever in labor and risk of neonatal sepsis. Am J Obstet Gynecol 2017; 216: 596.e1.
|
| 510 |
+
|
| 511 |
+
7. Acker DB, Schulman EB, Ransil BJ, et al. The normal parturient’s admission temperature. Am J Obstet Gynecol 1987; 157: 308.
|
| 512 |
+
|
| 513 |
+
8. Banerjee S, Cashman P, Yentis SM, Steer PJ. Maternal temperature monitoring during labor: concordance and variability among monitoring sites. Obstet Gynecol 2004; 103: 287.
|
| 514 |
+
|
| 515 |
+
9. Wartzek T, Mühlsteff J, Imhoff M. Temperature measurement. Biomed Tech (Berl) 2011; 56: 241.
|
| 516 |
+
|
| 517 |
+
10. Sciscione AC, Zainia T, Leet T, et al. A new device for measuring intrauterine temperature. Am J Obstet Gynecol 2001; 184: 1431.
|
| 518 |
+
|
| 519 |
+
11. Macaulay JH, Randall NR, Bond K, Steer PJ. Continuous monitoring of fetal temperature by non-invasive probe and its relationship to maternal temperature, fetal heart rate, and cord arterial oxygen and pH. Obstet Gynecol 1992; 79: 469.
|
| 520 |
+
|
| 521 |
+
12. Adamson SK Jr, Towell ME. Thermal Homeostasis in the fetus and newborn. Anesthesiology 1965; 26: 531.
|
| 522 |
+
|
| 523 |
+
13. Walker D, Walker A, Wood C. Temperature of the
|
| 524 |
+
|
| 525 |
+
Vol. 43, No. 4, December 2021
|
| 526 |
+
|
| 527 |
+
SLCOG Guideline
|
| 528 |
+
|
| 529 |
+
human fetus. J Obstet Gynaecol Br Commonw 1969; 76: 503.
|
| 530 |
+
|
| 531 |
+
14. Smulian JC, Bhandari V, Vintzileos AM, et al. Intrapartum fever at term: serum and histologic markers of inflammation. Am J Obstet Gynecol 2003; 188: 269.
|
| 532 |
+
|
| 533 |
+
15. Goetzl L, Evans T, Rivers J, et al. Elevated maternal and fetal serum interleukin-6 levels are associated with epidural fever. Am J Obstet Gynecol 2002; 187: 834.
|
| 534 |
+
|
| 535 |
+
16. De Jongh RF, Bosmans EP, Puylaert MJ, et al. The influence of anaesthetic techniques and type of delivery on peripartum serum interleukin-6 concentrations. Acta Anaesthesiol Scand 1997; 41: 853.
|
| 536 |
+
|
| 537 |
+
17. Sultan P, David AL, Fernando R, Ackland GL. Inflammation and epidural-related maternal fever: proposed mechanisms. Anesth Analg 2016; 122: 1546.
|
| 538 |
+
|
| 539 |
+
18. Wohlrab P, Boehme S, Kaun C, et al. Ropivacaine activates multiple proapoptotic and inflammatory signaling pathways that might subsume to trigger epidural-related maternal fever. Anesth Analg 2020; 130: 321.
|
| 540 |
+
|
| 541 |
+
19. Lieberman E, Lang JM, Frigoletto F Jr, et al. Epidural analgesia, intrapartum fever, and neonatal sepsis evaluation. Pediatrics 1997; 99: 415.
|
| 542 |
+
|
| 543 |
+
20. Goetzl L, Rivers J, Zighelboim I, et al. Intrapartum epidural analgesia and maternal temperature regulation. Obstet Gynecol 2007; 109: 687.
|
| 544 |
+
|
| 545 |
+
21. Goetzl L. Epidural analgesia and maternal fever: a clinical and research update. Curr Opin Anaesthesiol 2012; 25: 292.
|
| 546 |
+
|
| 547 |
+
22. Acker DB, Johnson MP, Sachs BP, Friedman EA. The leukocyte count in labor. Am J Obstet Gynecol 1985; 153: 737.
|
| 548 |
+
|
| 549 |
+
23. Bates DW, Sands K, Miller E, et al. Predicting bacteremia in patients with sepsis syndrome. Academic Medical Center Consortium Sepsis Project Working Group. J Infect Dis 1997; 176: 1538.
|
| 550 |
+
|
| 551 |
+
24. Smith-Elekes S, Weinstein MP. Blood cultures. Infect Dis Clin North Am 1993; 7: 221.
|
| 552 |
+
|
| 553 |
+
25. Royal College of Obstetricians and Gynaecologists. Bacterial Sepsis in Pregnancy. Green-top Guideline No. 64a. London: RCOG; 2012.\n\n381
|
| 554 |
+
|
| 555 |
+
SLCOG Guideline
|
| 556 |
+
|
| 557 |
+
26. Catańo Sabogal CP, Fonseca J, Garcķa-Perdomo HA. Validation of diagnostic tests for histologic chorioamnionitis: systematic review and meta- analysis. Eur J Obstet Gynecol Reprod Biol 2018; 228: 13-26.
|
| 558 |
+
|
| 559 |
+
27. Ona S, Easter SR, Prabhu M, et al. Diagnostic validity of the proposed eunice kennedy shriver national institute of child health and human development criteria for intrauterine inflammation or infection. Obstet Gynecol 2019; 133(1): 33-9.
|
| 560 |
+
|
| 561 |
+
28. Tita AT, Andrews WW. Diagnosis and management of clinical chorioamnionitis. Clin Perinatol 2010; 37(2): 339-54.
|
| 562 |
+
|
| 563 |
+
29. Kim CJ, Romero R, Chaemsaithong P, et al. Acute chorioamnionitis and funisitis: definition, pathologic
|
| 564 |
+
|
| 565 |
+
382
|
| 566 |
+
|
| 567 |
+
features, and clinical significance. Am J Obstet Gynecol 2015; 213(4 Suppl): S29-S52.
|
| 568 |
+
|
| 569 |
+
30. Gotsch F, Romero R, Kusanovic JP, et al. The fetal inflammatory response syndrome. Clin Obstet Gynecol 2007; 50(3): 652-83.
|
| 570 |
+
|
| 571 |
+
31. Paules C, Moreno E, Gonzales A, et al. Amniotic fluid sludge as a marker of intra-amniotic infection and histological chorioamnionitis in cervical insufficiency: a report of four cases and literature review. J Matern Fetal Neonatal Med 2016; 29(16): 2681-4.
|
| 572 |
+
|
| 573 |
+
32. American Association of Pro-Life Obstetricians Gynecologists. AAPLOG practice bulletin no. 3: previable induction of labor for chorioamnitis. Issues Law Med 2018; 33(2): 247-56.
|
| 574 |
+
|
| 575 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
src/processed_markdown/Management-of-Normal-Labourchart/Management-of-Normal-Labourchart.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "Management of Normal Labourchart"\n\n---\n\nManagement of Uncomplicated labour
|
| 2 |
+
|
| 3 |
+
Painful contractions — | Not in labour ——~* | Observe in antenatal ward °Show Effacement & progressive ~ | Uncertain i Review after 2 hours dilatation of cervix — | Established labour t Transfer to the labour suite Admission CTG to be done in all three groups and interpreted before decision is made (Y) Identify risk factors by, Review antenatal records. © Detailed clinical history o Examination Urine for protein = Monitoring by Partogram Maintain Partogram*(X) — Progress of labour © Cervical dilatation o Decent of the presenting part o Uterine contractions Routine Maternal condition care in soo o Pulse, BP, Temperature & hydration. labour suit —=}> eaintrclict o Evaluation of drugs(oxytocin, antibiotics, Opioid -Pethidine Anti hypertensives, Analgesics Regional analgesia-Epidural © Undistended bladder-catheterize if Other-spinal analgesia indicated Combined spinal-epidural analgesia Inhalational analgesia-Entonox Pudendal block for episiotomy/forceps/vacuum Fetal condition © Intermittent auscultation of fetal heart o Liquor volume o Meconeum in liquor P jonin; Most comfortable Second stage position ———==> Diagnosis Supine position-avoided v Vaginal examination for full dilatation Y Perineal distention v Anal dilatation - Medio-lateral Episiotomy At the time of crowning Delivery LOxytocies Third stage 3.Controlled cord traction 1949 pvoy poq sy) UT payUauINDOp aq plnoys snoqery Jo }WawWaseurW ou) UT sdais [TY suon{puoo ondase Japun 3no passes aq pnoys snoqer] jo }uoWeseuLW oy) UT sdajs [TV Active management 4.Examine the 2.Cord clamp ‘ placenta
|
| 4 |
+
|
| 5 |
+
r u o b a l f o e g a t s d n o c e
|
| 6 |
+
|
| 7 |
+
S
|
| 8 |
+
|
| 9 |
+
Delivery
|
| 10 |
+
|
| 11 |
+
r u o b a l f o e g a t s d r i h T
|
| 12 |
+
|
| 13 |
+
placenta
|
| 14 |
+
|
| 15 |
+
5. Observation for signs of
|
| 16 |
+
|
| 17 |
+
o Haemorrhage
|
| 18 |
+
|
| 19 |
+
o Utrine fundal level
|
| 20 |
+
|
| 21 |
+
o Evidence of collapse
|
| 22 |
+
|
| 23 |
+
o Respiratory difficulty
|
| 24 |
+
|
| 25 |
+
o Unusual behaviouror
|
| 26 |
+
|
| 27 |
+
m u t r a p - t s o P
|
| 28 |
+
|
| 29 |
+
Monitoring
|
| 30 |
+
|
| 31 |
+
Mother should be closely monitored in the labour room for at least two hours
|
| 32 |
+
|
| 33 |
+
o Abdominal pain
|
| 34 |
+
|
| 35 |
+
Sri Lanka College of Obstetrics and Gynaecology Health sector development Project Guidelines- Management of Uncomplicated labour
|
src/processed_markdown/Management-of-thrombocytopaenia-in-pregnancy-Sept-5/Management-of-thrombocytopaenia-in-pregnancy-Sept-5.md
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---\n\ncitation: "Management of thrombocytopaenia in pregnancy Sept 5"\n\n---\n\nSLCOG Guideline
|
| 2 |
+
|
| 3 |
+
SLCOG Guideline
|
| 4 |
+
|
| 5 |
+
Management of thrombocytopaenia in pregnancy
|
| 6 |
+
|
| 7 |
+
D L W Dasanayakea, Y Costab, A Weerawardana c on behalf of Sri Lanka College of Obstetricians and Gynaecologists
|
| 8 |
+
|
| 9 |
+
Correspondence: Sri Lanka College of Obstetricians and Gynaecologists, No. 112, Model Farm Road, Colombo 08. E-mail: slcogoffice@gmail.com
|
| 10 |
+
|
| 11 |
+
1. Scope and background
|
| 12 |
+
|
| 13 |
+
This guideline aims to describe the diagnostic approach to investigating thrombocytopaenia found in pregnancy, followed by a brief discussion on managing specific causes of thrombocytopaenia. This provides evidence- based information to health professionals to formulate a rational care pathway.
|
| 14 |
+
|
| 15 |
+
A platelet count of less than 150×109/L is defined as thrombocytopenia. Maternal thrombocytopaenia is in most cases mild and has no adverse outcome for both mother and fetus. Rarely a platelet count may be the presenting feature of a significant disorder with life threatening complications. Therefore management of thrombocytopaenia during pregnancy is challenging in both diagnostic as well as management of delivery.
|
| 16 |
+
|
| 17 |
+
2. Summary of key recommendations 2.1 Initial assessment\n\n2.2 Diagnosis of specific causes for thrombo- cytopaenia
|
| 18 |
+
|
| 19 |
+
A multidisciplinary approach with the haematologist and the obstetrician is required for optimal care.
|
| 20 |
+
|
| 21 |
+
If thrombocytopenia is confirmed, careful history, examination and laboratory workup is essential for the diagnosis.
|
| 22 |
+
|
| 23 |
+
A blood picture examination is vital to find the cause for thrombocytopenia. Microangiopathic hemolytic anaemia (MAHA) in the blood picture, which is a hemolytic process with red cell fragmentation and thrombocytopenia, can be associated with severe Preeclampsia(PE), HELLP syndrome, TTP (Throm- botic Thrombocytopaenic Purpura), aHUS (atypical Haemolytic Uraemic Syndrome), AFLP(Acute Fatty Liver in Pregnancy) and Disseminated Intravascular Coagulation (DIC).
|
| 24 |
+
|
| 25 |
+
A platelet count below 150×109/L should warrant assessment for thrombocytopaenia during pregnancy. Errors during blood collection and automated haematology analysis may yield falsely low values. Hence low platelet counts should be reconfirmed with a repeat Full Blood Count (FBC) and a request for a manual platelet count.
|
| 26 |
+
|
| 27 |
+
To differentiate between above conditions apart from a good clinical assessment, serum creatinine, lactate dehydrogenase (LDH), Prothrombin Time (PT), Activated Partial Thromboplastin Time (APPT), liver function tests (bilirubin direct/ indirect, albumin, total protein, transferases, and alkaline phosphatase) and ultrasound scan of abdomen are required.
|
| 28 |
+
|
| 29 |
+
Sri Lanka Journal of Obstetrics and Gynaecology 2021; 43: 259-268
|
| 30 |
+
|
| 31 |
+
DOI: http://doi.org/10.4038/sljog.v43i3.8020
|
| 32 |
+
|
| 33 |
+
a Consultant Obstetrician and Gynaecologist, Mahamodara Teaching Hospital, Galle, Sri Lanka
|
| 34 |
+
|
| 35 |
+
b Consultant Haematologist, Colombo North Teaching Hospital, Ragama, Sri Lanka
|
| 36 |
+
|
| 37 |
+
c Consultant Haematologist, De Zoysa Maternity Hospiatl for Women, Colombo, Sri Lanka
|
| 38 |
+
|
| 39 |
+
Vol. 43, No. 3, September 2021
|
| 40 |
+
|
| 41 |
+
259
|
| 42 |
+
|
| 43 |
+
SLCOG Guideline
|
| 44 |
+
|
| 45 |
+
Gestational Thrombocytopaenia (GT) is the most common reason for low platelets in pregnancy. It is a diagnosis of exclusion. GT commonly develops in the latter half of the pregnancy, and the platelet count is usually above 70×109/L. The diagnosis of GT is less likely if the platelet count falls below 70×109/L.
|
| 46 |
+
|
| 47 |
+
Incidence of Immune-Thrombocytopaenic Purpura (ITP) is approximately in 1/1000-1/10 000 pregnancies. It is the commonest cause of a low platelet count presenting in the first and second trimesters.
|
| 48 |
+
|
| 49 |
+
PE is the most common cause of thrombocytopenia associated with MAHA presenting in the late second or the third trimester of pregnancy. Infrequently, it may appear during the first week postpartum.
|
| 50 |
+
|
| 51 |
+
HELLP syndrome may be a variant of PE characterized by more severe thrombocytopenia, more fulminant MAHA and profoundly elevated liver function tests.
|
| 52 |
+
|
| 53 |
+
Even though it is rare, microangiopathies such as TTP, aHUS and AFLP should be carefully looked into when the woman presents with acute clinical features.
|
| 54 |
+
|
| 55 |
+
Patients with Antiphospholipid Syndrome (APLS) and Systemic Lupus Erythematosus (SLE) may also present with thrombocytopenia.
|
| 56 |
+
|
| 57 |
+
Antinuclear Antibodies (ANA), thyroid function test, antiphospholipid antibodies and viral screening should be considered if clinically indicated.\n\n2.3 Management of GT
|
| 58 |
+
|
| 59 |
+
Antenatal platelet count should be monitored every 2 to 4 weeks.
|
| 60 |
+
|
| 61 |
+
No special management is required.
|
| 62 |
+
|
| 63 |
+
When the platelet count is less than 100×109/L, the woman should be referred to an anaesthetist prior to delivery.
|
| 64 |
+
|
| 65 |
+
GT is not associated with neonatal thrombocytopenia.
|
| 66 |
+
|
| 67 |
+
2.4 Management of ITP in pregnancy
|
| 68 |
+
|
| 69 |
+
In ITP, a multidisciplinary approach involving the obstetrician, haematologist, anaesthetist, transfusion physician and neonatologist are required for optimal care.
|
| 70 |
+
|
| 71 |
+
260
|
| 72 |
+
|
| 73 |
+
FBC should be monitored at 2-4 weeks intervals or more frequently if indicated.
|
| 74 |
+
|
| 75 |
+
If the platelet count is less than 30×109/L or bleeding manifestations are present, first-line therapy is oral corticosteroids, and if a rapid platelet increment is required as in impending delivery or significant blee- ding, intravenous immunoglobulin (IVIg) should be administered.
|
| 76 |
+
|
| 77 |
+
Treatment to increase the platelet count for delivery is initiated by 36 weeks or earlier if early delivery is planned.
|
| 78 |
+
|
| 79 |
+
Delivery should be planned in a setting where 24 hours blood bank facilities and ICU care are available.
|
| 80 |
+
|
| 81 |
+
The obstetric team should liaise with the haematologist, the transfusion physician and the anaesthetist when planning delivery.
|
| 82 |
+
|
| 83 |
+
Platelets count of at least 50×109 /L should be obtained for safe delivery.
|
| 84 |
+
|
| 85 |
+
If platelet count of less than 50×109/L, platelet concentrate should be available on-site for transfusion if necessary.
|
| 86 |
+
|
| 87 |
+
Caesarean delivery is reserved for obstetric indications only.
|
| 88 |
+
|
| 89 |
+
At a platelet count of ≥ 80×109/L, in the absence of other hemostatic abnormalities, regional anaesthesia can be performed.
|
| 90 |
+
|
| 91 |
+
IgG antibodies in ITP are known to cross the placenta, causing thrombocytopenia in the fetus and neonate. The occurrence of intracranial haemorrhage (ICH) is a major neonatal concern. Measures should be taken to avoid traumatic delivery to the baby and the mother during delivery. Scalp electrodes, fetal blood sampling, vacuum and difficult forceps delivery should be avoided. If instrumental delivery is indicated, forceps is the choice.
|
| 92 |
+
|
| 93 |
+
Prophylactic measures should be taken to prevent Postpartum Haemorrhage (PPH), which includes active management of the third stage of labour, oxytocin infusion and intravenous tranexamic acid.
|
| 94 |
+
|
| 95 |
+
Pregnant women who are on long term steroids should have regular blood sugar monitoring with PPBS and blood pressure monitoring.
|
| 96 |
+
|
| 97 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 98 |
+
|
| 99 |
+
Non-Steroidal Anti-Inflammatory drugs (NSAIDs) should be avoided for postpartum or postoperative analgesia in women with thrombocytopenia due to increased hemorrhagic risk.\n\n2.5 Management of thrombocytopaenia due to PE, HELLP syndrome and AFLP
|
| 100 |
+
|
| 101 |
+
Urgent delivery should be arranged as it is the mainstay of treatment.
|
| 102 |
+
|
| 103 |
+
Maternal corticosteroids should be administered considering fetal maturity to reduce fetal respiratory morbidity.
|
| 104 |
+
|
| 105 |
+
If DIC present, supportive care with FFP, platelet and cryoprecipitate should be administered with advice from the haematologist.
|
| 106 |
+
|
| 107 |
+
2.6 Management of thrombotic thrombo- cytopaenic purpura/atypical hemolytic uraemic
|
| 108 |
+
|
| 109 |
+
syndrome
|
| 110 |
+
|
| 111 |
+
Despite the diagnostic challenge, plasma exchange (plasmapheresis) needs to be commenced as soon as TTP/aHUS is suspected. Management requires a multidisciplinary approach with the transfusion physician, the obstetrician and the haematologist. Plasma transfusions should be given if there is any delay in plasmapheresis.
|
| 112 |
+
|
| 113 |
+
In TTP, plasmapheresis should continue daily until the platelet count is maintained in the normal range (>150×109/L) for a minimum of 2 days.
|
| 114 |
+
|
| 115 |
+
Platelet transfusions are contraindicated as they are known to precipitate or exacerbate thrombosis.
|
| 116 |
+
|
| 117 |
+
3. Introduction
|
| 118 |
+
|
| 119 |
+
Thrombocytopenia is a common haematological condition affecting 7-10% of the pregnant population1. It occurs four times more frequently in pregnancy than in non-pregnant women and is the second leading cause of blood disorders in pregnancy after anaemia2. Thrombocytopaenia is defined as a platelet count of less than 150×109/L.
|
| 120 |
+
|
| 121 |
+
GT accounts for 70-80% of all cases of thrombo- cytopaenia in pregnancy. Hypertensive disorders explain approximately 20% of thrombocytopenia, and immune thrombocytopenia accounts for about 3-4%.
|
| 122 |
+
|
| 123 |
+
Vol. 43, No. 3, September 2021
|
| 124 |
+
|
| 125 |
+
SLCOG Guideline
|
| 126 |
+
|
| 127 |
+
Other etiologies such as TTP and HUS are considered rare in pregnancy but carry high morbidity and mortality for both the mother and fetus3.
|
| 128 |
+
|
| 129 |
+
4. Recommendations and discussion\n\n4.1 Initial assessment
|
| 130 |
+
|
| 131 |
+
A platelet count below 150×109/L should warrant assessment for thrombocytopaenia during pregnancy. Errors during blood collection and automated haematology analysis may yield falsely low values. Hence low platelet counts should be reconfirmed with a repeat FBC and a request for a manual platelet count. All new patients presenting with thrombocytopenia need reconfirmation of the low platelet number with a repeat FBC and a manual platelet count. The repeat FBCsample should be taken from a direct, uncom- plicated venipuncture and added into an EDTA tube and mixed well. This will prevent minute clot formation in the sample leading to erroneously low platelet values. Assessing the manual platelet count will exclude any errors in automated platelet analysis.
|
| 132 |
+
|
| 133 |
+
If large platelet aggregates are detected in the blood smear taken from an EDTA sample with thrombo- cytopenia reported in the automated FBC results, it is considered as EDTA induced pseudo thrombocytopenia. If it is necessary to obtain the accurate platelet number, blood should be collected into acitrated tube and sent to the laboratory for analysis within 15 minutes of collection. As the platelets can undergo deterioration in a citrated sample, immediate analysis is vital, and the laboratory should be informed of the procedure before collecting blood from the patient to a citrated sample. When thrombocytopenia is confirmed, careful history, examination, and laboratory workup are needed to arrive at a diagnosis.
|
| 134 |
+
|
| 135 |
+
History should include.
|
| 136 |
+
|
| 137 |
+
• recent history of fever (to exclude viral infections such as dengue fever)
|
| 138 |
+
|
| 139 |
+
• the presence of severe headaches and other neurological manifestations (seen in PE and TTP)
|
| 140 |
+
|
| 141 |
+
• past history of thrombocytopenia (favouring ITP)
|
| 142 |
+
|
| 143 |
+
• symptomatic anaemia and recurrent infections (bone marrow failure/haematological malignancy)
|
| 144 |
+
|
| 145 |
+
• past history of pregnancy-associated thrombo- cytopenia
|
| 146 |
+
|
| 147 |
+
• history of connective tissue disorders (SLE and APLS)
|
| 148 |
+
|
| 149 |
+
261
|
| 150 |
+
|
| 151 |
+
SLCOG Guideline
|
| 152 |
+
|
| 153 |
+
• hypothyroidism
|
| 154 |
+
|
| 155 |
+
• liver disease
|
| 156 |
+
|
| 157 |
+
• drug history
|
| 158 |
+
|
| 159 |
+
• past and family history of bleeding disorders (rare inherited bleeding disorders such as type IIB Von Willebrand disease).
|
| 160 |
+
|
| 161 |
+
On examination, it is uncommon to detect bleeding manifestations unless the platelet count is significantly low. It is vital to check the blood pressure (PE, HELLP syndrome), abdominal tenderness (PET, HELLP syn- drome, AFLP), anaemia, lymphadenopathy, hepatos- plenomegaly (haematological malignancy) and neurological manifestations (severe PE, TTP).
|
| 162 |
+
|
| 163 |
+
Reduction of serum platelet counts is arbitrarily considered mild if the count is <150×109/L, moderate at 50-100×109/L and severe at <50×109/L.\n\n4.2 Diagnosis of specific causes for thrombo- cytopaenia
|
| 164 |
+
|
| 165 |
+
A multidisciplinary approach with the haematologist and the obstetrician is required for optimal care.
|
| 166 |
+
|
| 167 |
+
If thrombocytopenia is confirmed, careful history, examination and laboratory workup is essential for the diagnosis.
|
| 168 |
+
|
| 169 |
+
A blood picture examination is vital to find the cause for thrombocytopenia. MAHA in the blood picture, a hemolytic process with red cell fragmentation and thrombocytopenia, can be associated with severe PE, HELLP syndrome, TTP, aHUS, AFLP and DIC4.
|
| 170 |
+
|
| 171 |
+
To differentiate between above conditions apart from a good clinical assessment, serum creatinine, lactate dehydrogenase (LDH), Prothrombin Time (PT), Activated Partial Thromboplastin Time (APPT), liver function tests (bilirubin direct/ indirect, albumin, total protein, transferases, and alkaline phosphatase) and ultrasound scan abdomen are required.
|
| 172 |
+
|
| 173 |
+
GT is the most common reason for low platelets in pregnancy5. It is a diagnosis of exclusion. GT commonly develops in the latter half of the pregnancy, and the platelet count is usually above 70×109/L. The diagnosis of GT is less likely if the platelet count falls below 70×109/L.\n\n262
|
| 174 |
+
|
| 175 |
+
The incidence of ITP is approximately in 1/1000- 1/10 000 pregnancies. It is the commonest cause of a low platelet count presenting in the first and second trimesters6.
|
| 176 |
+
|
| 177 |
+
PE is the most common cause of thrombocytopenia associated with MAHA presenting in the late second or third trimester of pregnancy. Infrequently, it may appear during the first week postpartum7.
|
| 178 |
+
|
| 179 |
+
HELLP syndrome may be a variant of PE characterized by more severe thrombocytopenia, more fulminant MAHA and profoundly elevated liver function tests5. Even though it is rare, microangiopathies such as TTP, aHUS and AFLP should be carefully looked into when the woman presents with acute clinical features.
|
| 180 |
+
|
| 181 |
+
Patients with APLS and SLE may also present with thrombocytopenia.
|
| 182 |
+
|
| 183 |
+
ANA, thyroid function test, antiphospholipid antibodies and viral screening should be considered if clinically indicated.
|
| 184 |
+
|
| 185 |
+
GT is a condition with mild to moderate platelet drop and is a diagnosis of exclusion. The platelet count in GT is usually above 70×109/L. The patient is asymp- tomatic, and thrombocytopenia is commonly detected in the second half of pregnancy. The platelet count spontaneously reverts to normal within the first two months of postpartum but can recur in subsequent pregnancies.
|
| 186 |
+
|
| 187 |
+
The incidence of ITP is approximately in 1/1000-1/10 000 pregnancies. It is the commonest cause of a low platelet count presenting in the first and second trimesters6. Despite improved understanding of the pathophysiology, there is no specific diagnostic test, and, like GT, it is a diagnosis of exclusion. The presence of other autoimmune phenomena or a low platelet count during pre-pregnancy can help to diagnose.
|
| 188 |
+
|
| 189 |
+
Thrombocytopaenia associated with hypertensive disorders is the most frequent causes in the late second trimester onwards8.Therefore PE screening should be carried out to rule out hypertensive variants (HELLP, AFLP).
|
| 190 |
+
|
| 191 |
+
HELLP syndrome, which affects 0.6% of pregnant women, is a severe variant of pre-eclampsia. However, in 15-20% of cases of HELLP syndrome, neither hypertension nor proteinuria is present9.
|
| 192 |
+
|
| 193 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 194 |
+
|
| 195 |
+
AFLP occurs in 1 in 5000 to 10 000 pregnancies and is more common with multiple gestations than in singletons. Up to 75% of women present with nausea or vomiting, and 50% have abdominal pain or signs and symptoms similar to PE. Although it is often difficult to differentiate HELLP from AFLP, evidence of hepatic insufficiency, including hypoglycemia, DIC, or encephalopathy, is seen more often in AFLP5.
|
| 196 |
+
|
| 197 |
+
TTP is an acute life-threatening disorder associated
|
| 198 |
+
|
| 199 |
+
with thrombocytopenia, MAHA and microvascular thrombosis. It results from a deficiency of the enzymeADAMTS13, required to cleave secreted ultra- large von Willebrand factor molecules (ULVWF). An inherited deficiency or acquired reduction of ADAMTS13 due to IgG autoantibodies to ADAMTS13 leads to persistence of ULVWF molecules resulting in abnormal platelet aggregation and microvascular thrombosis. Pregnancy is an important precipitant of acute TTP, accounting for approximately 5-10% of all cases of TTP in women4. TTP classically consists of a pentad of thrombocytopenia, MAHA, neurological signs, renal impairment and fever. However, TTP commonly presents without the full spectrum of the pentad. Laboratory features indicating a diagnosis of TTP are MAHA with many schistocytes in the blood picture, increased Lactate dehydrogenase (LDH), which is often out of proportion to the degree of haemolysis due to associated tissue ischemia, normal PT/APTT and possibly elevated serum creatinine
|
| 200 |
+
|
| 201 |
+
level10.
|
| 202 |
+
|
| 203 |
+
aHUS is a rare MAHA associated with pregnancy. The majority of cases occur during the postpartum period. The patient has MAHA, thrombocytopenia and severe renal impairment. The outcome is severe, with two- thirds of cases developing end-stage renal failure within one month4.\n\n4.3 Management of GT
|
| 204 |
+
|
| 205 |
+
Antenatal platelet count should be monitored every 2 to 4 weeks.
|
| 206 |
+
|
| 207 |
+
No special management is required.
|
| 208 |
+
|
| 209 |
+
When the platelet count is less than 100×109/L, the woman should be referred to an anaesthetist prior to delivery.
|
| 210 |
+
|
| 211 |
+
GT is not associated with neonatal thrombocytopenia.
|
| 212 |
+
|
| 213 |
+
Vol. 43, No. 3, September 2021
|
| 214 |
+
|
| 215 |
+
SLCOG Guideline
|
| 216 |
+
|
| 217 |
+
GT does not require treatment except periodic moni- toring of platelet count. The thrombocytopenia resolves spontaneously. If the thrombocytopenia persists beyond 6 to 8 weeks, the patient should undergo further haematological investigations.\n\n4.4 Management of ITP in pregnancy
|
| 218 |
+
|
| 219 |
+
In ITP, a multidisciplinary approach involving the obstetrician, haematologist, anaesthetist, transfusion physician and neonatologist, is required for optimal care.
|
| 220 |
+
|
| 221 |
+
FBC should be monitored at 2-4 weeks intervals or more frequently if indicated.
|
| 222 |
+
|
| 223 |
+
If the platelet count is less than 30 ×109/L or bleeding manifestations are present, first-line therapy is oral corticosteroids, and if a rapid platelet increment is required as in impending delivery or significant bleeding, IVIg should be given.
|
| 224 |
+
|
| 225 |
+
Treatment to increase the platelet count for delivery is initiated by 36 weeks or earlier if early delivery is planned.
|
| 226 |
+
|
| 227 |
+
Delivery should be planned in a setting where 24 hours blood bank facilities and ICU care are available.
|
| 228 |
+
|
| 229 |
+
The obstetric team should liaise with the haematologist, the transfusion physician and the anaesthetist when planning delivery.
|
| 230 |
+
|
| 231 |
+
Platelets count of at least 50×109 /L should be obtained for safe delivery.
|
| 232 |
+
|
| 233 |
+
If platelet count of less than 50×109/L, platelet concentrate should be available on-site for transfusion if necessary.
|
| 234 |
+
|
| 235 |
+
Caesarean delivery is reserved for obstetric indications only.
|
| 236 |
+
|
| 237 |
+
At a platelet count ≥ 80×109/L, regional anaesthesia can be performed in the absence of other hemostatic abnormalities.
|
| 238 |
+
|
| 239 |
+
IgG antibodies in ITP are known to cross the placenta, causing thrombocytopenia in the fetus and neonate. The occurrence of intracranial haemorrhage (ICH) is a major neonatal concern. Measures should be taken to avoid traumatic delivery to the baby and the mother
|
| 240 |
+
|
| 241 |
+
263
|
| 242 |
+
|
| 243 |
+
SLCOG Guideline
|
| 244 |
+
|
| 245 |
+
during delivery. Scalp electrodes, fetal blood sampling, vacuum and difficult forceps delivery should be avoided. If instrumental delivery is indicated, forceps is the choice.
|
| 246 |
+
|
| 247 |
+
Prophylactic measures should be taken to prevent Postpartum Haemorrhage (PPH), which includes active management of the third stage of labour, oxytocin infusion and intravenous tranexamic acid.
|
| 248 |
+
|
| 249 |
+
Pregnant women who are on long term steroids should have regular blood sugar monitoring with PPBS and blood pressure monitoring.
|
| 250 |
+
|
| 251 |
+
Non-Steroidal Anti-Inflammatory drugs (NSAIDs) should be avoided for postpartum or postoperative analgesia in women with thrombocytopenia due to increased hemorrhagic risk.
|
| 252 |
+
|
| 253 |
+
In ITP, a multidisciplinary approach involving the obstetrician, haematologist, transfusion physician, anaesthetist and neonatologist, is required for optimal care.
|
| 254 |
+
|
| 255 |
+
Women with no bleeding manifestations and platelet counts above 30×109/L do not require any treatment until 36 weeks gestation9.
|
| 256 |
+
|
| 257 |
+
If the platelet count is <30×109/L or bleeding mani- festations are present, first-line therapy is oral corticosteroids 0.25-1mg/kg daily (dose to be adjusted to achieve a safe platelet count) or if a rapid platelet increment is required as in impending delivery or significant bleeding, IVIg 1g/kg9.
|
| 258 |
+
|
| 259 |
+
IVIg has a relatively rapid therapeutic response (within 1-3 days). Prednisolone shows a therapeutic response within 2-14 days11.
|
| 260 |
+
|
| 261 |
+
Current recommendations aim for a platelet count of ≥ 50×109/L prior to labour and delivery as the risk of cesarean delivery is present with everylabour9.
|
| 262 |
+
|
| 263 |
+
For spinal anaesthesia, the British Committee for Haematology and Anaesthetic Guideline standards recommends a threshold of >80×1012,13. An anaesthetic consultation in the third trimester to discuss options for delivery is required.
|
| 264 |
+
|
| 265 |
+
While platelet transfusion alone is generally not effective in ITP, if an adequate platelet count has not been achieved and delivery is emergent, or if there is blee-\n\n264
|
| 266 |
+
|
| 267 |
+
ding, platelet transfusion in conjunction with IVIg can be considered9.
|
| 268 |
+
|
| 269 |
+
After delivery, close monitoring of the neonate is required as 21% to 28% will develop thrombocytopenia presumably from passive transfer of maternal auto- antibodies (IgG) against platelet antigens13. Less than 1% of neonates develop intracranial hemorrhage14. Risk for thrombocytopenia is increased if siblings had thrombocytopenia at delivery. Maternal platelet count during pregnancy does not impact the risk of thrombocytopenia in the neonate15. The mode of delivery is determined by the obstetric indications, with avoidance of procedures associated with an increased haemorrhagic risk to the fetus, such as fetal scalp electrode/fetal blood sampling and operative vaginal delivery14. A cord blood sample should be taken to check neonatal platelet count. Intramuscular injection of vitamin K should not be given if the platelet count is not available, but intravenous or subcutaneous vitamin K can be administered.
|
| 270 |
+
|
| 271 |
+
4.5 Management of thrombocytopaenia due to Pre-eclampsia/HELLP/AFLP
|
| 272 |
+
|
| 273 |
+
Urgent delivery should be arranged as it is the mainstay of treatment.
|
| 274 |
+
|
| 275 |
+
Maternal corticosteroids should be administered considering fetal maturity to reduce fetal respiratory morbidity.
|
| 276 |
+
|
| 277 |
+
If DIC present, supportive care with FFP, platelet and cryoprecipitate should be administered with advice from the haematologist.
|
| 278 |
+
|
| 279 |
+
PET affects 4% of all first pregnancies16. Thrombo- cytopenia is the commonest abnormality, occurring in up to 50% of women with pre-eclampsia. HELLP syndrome is a serious complication specific to preg- nancy characterized by haemolysis, elevated liver enzymes, and low platelets. It occurs in about 0.5- 0.9% of pregnancies and 10-20% of cases with severe pre-eclampsia17. As delivery is the definitive mode of treatment for maternal concerns, steroid should be administered for fetal lung maturity. Supportive care with the correction of clotting derangement following delivery should be arranged. Careful observation is needed to detect DIC as a complication in 20% of women with HELLP syndrome18. AFLP treatment consists of supportive management and resuscitation of the mother and prompt delivery of the fetus, irres- pective of the gestational age.
|
| 280 |
+
|
| 281 |
+
Sri Lanka Journal of Obstetrics and Gynaecology\n\n4.6 Management of thrombotic thrombo- cytopaenic purpura and atypical haemolytic uraemic syndrome
|
| 282 |
+
|
| 283 |
+
Despite the diagnostic challenge, plasma exchange (plasmapheresis) needs to be commenced as soon as TTP/aHUS is suspected. Management requires a multidisciplinary approach with the transfusion physician, the obstetrician and the haematologist. Plasma transfusions should be given if there is any delay in plasmapheresis.
|
| 284 |
+
|
| 285 |
+
In TTP, plasmapheresis should continue daily until the platelet count is maintained in the normal range (>150×109/L)for a minimum of 2 days.
|
| 286 |
+
|
| 287 |
+
Platelet transfusions are contraindicated as they are known to precipitate or exacerbate thrombosis.
|
| 288 |
+
|
| 289 |
+
Plasmapheresis is the first-line therapy in TTP and aHUS. Plasmapheresis removes substances promoting platelet-aggregation and is successful with TTP but is less successful with HUS. Plasma infusion should be considered if there is any delay in plasmapheresis.
|
| 290 |
+
|
| 291 |
+
Clinical governance
|
| 292 |
+
|
| 293 |
+
According to the national recommendation, all pregnant women should have a FBC at booking and repeated at 26 to 28 weeks of gestation. Haemoglobin and platelet count should be recorded in maternity notes.\n\nReferences
|
| 294 |
+
|
| 295 |
+
1. Verdy E, Bessous V, Dreyfus M, Kaplan C, Tchernia G, Uzan S. Longitudinal analysis of platelet count and volume in normal pregnancy. Thrombosis and Haemostasis 1997; 77: 806-7.
|
| 296 |
+
|
| 297 |
+
2. Gernsheimer T, James AH, Stasi R. How I treat thrombocytopenia in pregnancy blood 2013; 121(1): 38-47.
|
| 298 |
+
|
| 299 |
+
3. Burrows RF, Kelton JG. Thrombocytopenia at delivery: a prospective survey of 6715 deliveries. American Journal of Obstetrics and Gynecology 1990; 162: 732-4.
|
| 300 |
+
|
| 301 |
+
4. Mari R. Thomas, Susan Robinson, Marie A. Scully: How we manage thrombotic microangiopathies in pregnancy: British Journal of Haematology 2016; (173): 821-30.
|
| 302 |
+
|
| 303 |
+
5. Douglas B. Cines, Lisa D. Levine: Thrombo- cytopenia in pregnancy: Blood 2017; 130(21): 2271-7.
|
| 304 |
+
|
| 305 |
+
6. Gill KK, KeltonJG Management of idiopathic
|
| 306 |
+
|
| 307 |
+
Vol. 43, No. 3, September 2021
|
| 308 |
+
|
| 309 |
+
SLCOG Guideline
|
| 310 |
+
|
| 311 |
+
thrombocytopenic purpura in pregnancy, Semin Hematol. 2000; 37(3): 275-89.
|
| 312 |
+
|
| 313 |
+
7. Terry Gernsheimer, Andra H. James,Roberto Stasi: How I treat thrombocytopenia in pregnancy: Blood 2013; 12(1): 38-47.
|
| 314 |
+
|
| 315 |
+
8. Provan D and et al. International consensus report on the investigation and management of primary immune thrombocytopenia. Blood 2010; 115(2): 168-86.
|
| 316 |
+
|
| 317 |
+
9. Rajasekhar A, Gernsheimer T, Stasi R, James AH. Clinical Practice Guide on Thrombocytopenia in Pregnancy. American Society of Hematology. Available at http://www.hematology.org/Clinicians/ Guidelines-Quality/Quick-Reference.aspx. 2013; Accessed on 14.04.2021.
|
| 318 |
+
|
| 319 |
+
10. Scully M, Hunt BJ, Benjamin S, Liesner R, Rose P, Peyvandi F, Cheung B, Machin SJ; British Committee for Standards in Haematology. Guidelines on the diagnosis and management of thrombotic thrombocytopenic purpura and other thrombotic microangiopathies. Br J Haematol 2012; 158(3): 323-35.
|
| 320 |
+
|
| 321 |
+
11. Ciobanu AM, Colibaba S, Cimpoca B, Peltecu G, Panaitescu AM. Thrombocytopenia in Pregnancy. Maedica (Bucur) 2016; 11(1): 55-60.
|
| 322 |
+
|
| 323 |
+
12. Gill KK, Kelton JG. Management of idiopathic thrombocytopenic purpura in pregnancy. Semin Hematol. 2000; 37(3): 275-89.
|
| 324 |
+
|
| 325 |
+
13. Eslick R, McLintock C. Managing ITP and thrombocytopenia in pregnancy. Platelets 2020; 31: 300-6.
|
| 326 |
+
|
| 327 |
+
14. Provan D, Arnold DM, Bussel JB, et al. Updated international consensus report on the investigation and management of primary immune thrombo- cytopenia. Blood Adv 2019; 3(22): 3780-817.
|
| 328 |
+
|
| 329 |
+
15. Payne SD, Resnik R, Moore TR, et al. Maternal characteristics and risk of severe neonatal thrombo- cytopenia and intracranial hemorrhage in preg- nancies complicated by autoimmune thrombo- cytopenia. Am J Obstet Gynecol 1997; 177: 149-55.
|
| 330 |
+
|
| 331 |
+
16. HernÃindez-DÃaz S, Toh S, Cnattingius S. Risk of pre-eclampsia in first and subsequent pregnancies: prospective cohort study BMJ 2009; 338: b2255 doi:10.1136/BMJ.b2255, assessed on 14.04.2021. Thrombosis and Haemostasis,1997; 77: 806- 807.
|
| 332 |
+
|
| 333 |
+
17. Kirkpatrick CA. The HELLP syndrome. ActaClin Belg. 2010; 65(2): 91-7.
|
| 334 |
+
|
| 335 |
+
18. Martin JN Jr, Rinehart BK, May WL, Magann EF, Terrone DA, Blake PG. The spectrum of severe pre-eclampsia: comparative analysis by HELLP (hemolysis, elevated liver enzyme levels, and low platelet count) syndrome classification. Am J Obstet Gynecol. 1999; 180(6 Pt 1): 1373-84.
|
| 336 |
+
|
| 337 |
+
265
|
| 338 |
+
|
| 339 |
+
SLCOG Guideline\n\nAppendix
|
| 340 |
+
|
| 341 |
+
Etiological workup
|
| 342 |
+
|
| 343 |
+
Diagnosis Gestational Thrombocytopenia Immune Thrombocytopenic Purpura (ITP) Thrombotic Thrombocytopenic Purpura (TTP) Atypical Haemolytic Uraemic Syndrome (aHUS) Pre-eclampsia, Eclampsia, Haemolysis, Elevated liver enzymes and low platelet count syndrome (HELLP) Hereditary thrombocytopenia Pseudo thrombocytopenia Viral infections: HIV, Epstein-Barr virus Medications: heparin-induced Leukaemia/Lymphoma Severe Vitamin B12 or Folate Deficiency Splenomegaly Proportion Pathophysiology About 75% Physiological dilution, accelerated destruction About 3% Immune destruction, suppressed production Peripheral consumption, microthrombi Peripheral consumption, microthrombi About 15-20% Peripheral consumption, microthrombi Bone marrow underproduction Laboratory artefact Secondary autoimmune thrombocytopenia, Marrow suppression Immunological reaction Failure of platelet production, bone marrow infiltration Failure of platelet production Splenic sequestration
|
| 344 |
+
|
| 345 |
+
266
|
| 346 |
+
|
| 347 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|
| 348 |
+
|
| 349 |
+
SLCOG Guideline
|
| 350 |
+
|
| 351 |
+
Initial detection of a pregnant woman with thrombocytopenia. Confirm thrombo- cytopenia with repeat FBC and manual platelet count
|
| 352 |
+
|
| 353 |
+
!
|
| 354 |
+
|
| 355 |
+
Thrombocytopenia confirmed Good clinical assessment Blood picture and haematology referral
|
| 356 |
+
|
| 357 |
+
"A
|
| 358 |
+
|
| 359 |
+
MAHA absent in blood picture
|
| 360 |
+
|
| 361 |
+
LFT, ANA,TSH, Viralstudies, US scan abdomen, DAT, PT/APTT
|
| 362 |
+
|
| 363 |
+
If underlying pathology detected treat the cause
|
| 364 |
+
|
| 365 |
+
}
|
| 366 |
+
|
| 367 |
+
Monitor counts, Regular haematological review, Steroids, Anticoagulation
|
| 368 |
+
|
| 369 |
+
MAHA present in the blood picture LFT, PET screening, LDH, PT/APTT, Creatinine, US scan abdomen, RBS
|
| 370 |
+
|
| 371 |
+
|
|
| 372 |
+
|
| 373 |
+
Severe PET, HELLP, AFLP Stabilize the mother
|
| 374 |
+
|
| 375 |
+
TTP, aHUS Plasmapheresis, Deliver the baby
|
| 376 |
+
|
| 377 |
+
If the platelet count less than 70×109/L with no identifiable cause, ITP should be considered
|
| 378 |
+
|
| 379 |
+
• Monitor counts
|
| 380 |
+
|
| 381 |
+
• Avoid NSAIDs /Aspirin
|
| 382 |
+
|
| 383 |
+
• Treatment to elevate count if bleeding or platelet less than 30×109/L
|
| 384 |
+
|
| 385 |
+
• Take haematology advice regarding IM injections
|
| 386 |
+
|
| 387 |
+
• Elevate platelet count to 50×109/L for antenatal procedures
|
| 388 |
+
|
| 389 |
+
• At 35-36wk, treat to keep platelet count above 80×109/L to allow epidural anaesthesia and delivery
|
| 390 |
+
|
| 391 |
+
• Document the need to avoid traumatic delivery – avoid ventouse, forceps, scalp sampling, scalp electrodes
|
| 392 |
+
|
| 393 |
+
•
|
| 394 |
+
|
| 395 |
+
Inform neonatologist – paediatric alert to be sent
|
| 396 |
+
|
| 397 |
+
• Cord blood for neonatal platele count, if less than normal-monitor for thrombocytopenia, nadir 3-5 days
|
| 398 |
+
|
| 399 |
+
Vol. 43, No. 3, September 2021
|
| 400 |
+
|
| 401 |
+
267
|
| 402 |
+
|
| 403 |
+
SLCOG Guideline
|
| 404 |
+
|
| 405 |
+
1. New presentation of thrombocytopenia in 1st / 2nd trimester: Check for: drugs: pre-pregnancy FBC: medical disorder; auto-immune phenomena: renal/liver functions
|
| 406 |
+
|
| 407 |
+
2. Presentation of patient with known platelet disorder Platelet count >100×109/l
|
| 408 |
+
|
| 409 |
+
Platelet count <80 - 100×109/l
|
| 410 |
+
|
| 411 |
+
In
|
| 412 |
+
|
| 413 |
+
|
|
| 414 |
+
|
| 415 |
+
In all cases exclude presence red cell fragments
|
| 416 |
+
|
| 417 |
+
indicating thrombotic microangiopathy
|
| 418 |
+
|
| 419 |
+
Monthly checks by midwife / GP
|
| 420 |
+
|
| 421 |
+
Refer back if platelet count
|
| 422 |
+
|
| 423 |
+
!
|
| 424 |
+
|
| 425 |
+
In 1/2" trimester low
|
| 426 |
+
|
| 427 |
+
platelet counts probabably secondary to immune
|
| 428 |
+
|
| 429 |
+
; 24/3" trimesters Anytime: Refer back if known ITP in 3" |) ?BP, Proteinuria Fever, . . neurological trimester TLFTs signs — Check maternal platelet count: *PET; HELLP ‘nereatinine A If <34 weeks: try . risk of low neonatal platelet count F Raise platelet count to : to stabilize. © Likely TTP — ensure measures to avoid wary K : ~>Plasmapheresis >50x10°/1 for ante-natal 22 WEEKS: procedures.
|
| 430 |
+
|
| 431 |
+
80-100 10°/1 bleeding
|
| 432 |
+
|
| 433 |
+
process.
|
| 434 |
+
|
| 435 |
+
Monitor monthly, treat if : bleeding or platelet count <20-30*10°/1
|
| 436 |
+
|
| 437 |
+
traumatic delivery and check cord platelet count
|
| 438 |
+
|
| 439 |
+
Advise avoidance of
|
| 440 |
+
|
| 441 |
+
NSAIDS, aspirin, IM injections.
|
| 442 |
+
|
| 443 |
+
Assess balance of risks.
|
| 444 |
+
|
| 445 |
+
Deliver when possible
|
| 446 |
+
|
| 447 |
+
From 35-36 weeks, aim to raise platelet count >80×109 /l if possible, to allow for epidural. May require combination of treatments
|
| 448 |
+
|
| 449 |
+
Monitor more frequently, depending on level, treatment and rate of change of platelet count\n\nDocument need for atraumatic delivery: advise avoid ventouse, rotational forceps, scalp clips/sampling Ensure paediatric alert sent
|
| 450 |
+
|
| 451 |
+
Take cord sample to assess neonatal platelet count. If < normal, needs monitoring over next few days – nadir is at 2-5 days
|
| 452 |
+
|
| 453 |
+
Safe levels of platelets for interventions
|
| 454 |
+
|
| 455 |
+
Intervention
|
| 456 |
+
|
| 457 |
+
Platelet count
|
| 458 |
+
|
| 459 |
+
Antenatal, no invasive procedures planned >20 Vaginal delivery >50 Operative or instrumental delivery >50 Epidural anaesthesia >80
|
| 460 |
+
|
| 461 |
+
268
|
| 462 |
+
|
| 463 |
+
Sri Lanka Journal of Obstetrics and Gynaecology
|