pharma-rag-mcp
pharma-rag-mcp
Ein vollständig lokales, End-to-End-System für Retrieval-Augmented Generation (RAG) für pharmazeutische Vertriebsinformationen – aufgebaut mit LangChain, ChromaDB, Ollama und dem Model Context Protocol (MCP).
Das System nimmt Arzneimittelkennzeichnungen, klinische Studiendokumente und Vertriebsgesprächsnotizen in eine lokale Vektordatenbank auf, stellt sie als MCP-Tools bereit und beantwortet natürlichsprachliche Fragen über einen LangGraph-ReAct-Agenten, der von einem lokal laufenden LLM unterstützt wird.
Architektur
data/sources/ ← raw .txt files (drug labels, trials, call notes)
│
▼
data/ingest.py ← loads, splits into chunks, embeds with all-MiniLM-L6-v2
│
▼
chroma_db/ ← persisted ChromaDB collections (384-dim vectors)
├── drug_info/
├── competitor_intel/
└── pitch_content/
│
▼
mcp_server/server.py ← MCP server over stdio — exposes 4 retrieval tools
│ (MCP JSON-RPC)
▼
agent/agent.py ← LangGraph ReAct agent (ChatOllama + MCP tools)
│
▼
ui/app.py ← Gradio chat interface (browser)Unterstützende Module
Modul | Zweck |
| HuggingFace-Embedding-Modell-Wrapper ( |
| ChromaDB-Collection-Builder / -Lader |
| Bewertung der Retrieval-Qualität (Hit Rate, MRR, Context Precision) |
Related MCP server: DocAgent-MCP
Wissensbasis
11 Medikamente × 3 Dokumenttypen = 33 Quelldateien:
Sammlung | Quellordner | Inhalt |
|
| Zusammenfassungen von Arzneimittelkennzeichnungen im FDA-Stil |
|
| Ergebnisse klinischer Studien |
|
| Transkripte von Vertriebsgesprächen |
Medikamente: Dupixent, Eliquis, Entresto, Farxiga, Fasenra, Jardiance, Rinvoq, Skyrizi, Trelegy Ellipta, Trulicity, Xarelto
Voraussetzungen
Python 3.13+
Ollama läuft lokal mit einem heruntergeladenen Modell:
ollama pull llama3.2Eine Python- virtuelle Umgebung mit installierten Abhängigkeiten (siehe Einrichtung).
Einrichtung
# 1. Clone and enter the project
git clone <repo-url>
cd pharma-rag-mcp
# 2. Create and activate a virtual environment
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS / Linux:
source .venv/bin/activate
# 3. Install dependencies
pip install -r requirements.txt
# 4. Configure environment (optional — defaults work out of the box)
cp .env.example .env
# Edit .env to set OLLAMA_MODEL and OLLAMA_BASE_URL if needed
# 5. Build the vector database (only needed once)
python -m data.run_ingestAusführen des Systems
Jede Ebene kann unabhängig verwendet werden. Starten Sie Ollama, bevor Sie den Agenten oder die Benutzeroberfläche verwenden.
Agent (CLI)
python -m agent.agentInteraktiver Befehlszeilen-Chat mit zweistufigem Speicher:
Sitzungsspeicher – Abfrage, aufgerufene Tools, Quellenmodus und Antwort jedes Turns werden für den aktuellen Lauf im RAM gehalten.
Langzeitspeicher – beim Beenden wird die Sitzung (mit Zeitstempeln) an
memory/long_term.jsonauf der Festplatte angehängt.
Geben Sie eines von bye, close, end, exit, goodbye, quit ein, um zu beenden – der Agent gibt eine Sitzungszusammenfassung aus und leert den Speicher, bevor er beendet wird.
Antwort-Quellenmodi
Der Agent erkennt und kennzeichnet, wie jede Antwort erzeugt wurde:
Abzeichen | Bedeutung |
| Antwort vollständig auf abgerufenen Chunks basierend |
| Abgerufene Fakten kombiniert mit allgemeinem Fachwissen; Punkte außerhalb der Wissensbasis sind inline mit |
| Tools haben nichts Relevantes zurückgegeben; Antwort aus allgemeinem Pharma-/Vertriebswissen |
Multi-Turn-Kontext
Der Agent übergibt bei jeder Frage die letzten N Turns des Gesprächsverlaufs an das LLM, sodass Folgefragen wie „er hat mich ignoriert, wie komme ich wieder ins Gespräch?" im Kontext beantwortet werden. N wird über config.yaml gesteuert:
agent:
history_window: 3 # number of prior turns to includeGradio-UI (Browser)
python -m ui.appÖffnet eine Chat-Oberfläche unter http://localhost:7860.
Nur MCP-Server (stdio-Transport)
python -m mcp_server.serverLädt die drei ChromaDB-Sammlungen und wartet auf MCP-JSON-RPC-Nachrichten auf stdin.
Registrierte Tools:
Tool | Beschreibung |
| Arzneimittelkennzeichnungsdokumente durchsuchen |
| Klinische Studiendaten durchsuchen |
| Vertriebsgesprächsnotizen durchsuchen |
| Alle drei Sammlungen durchsuchen, zusammengeführt |
Retrieval-Evaluierung
# Evaluate all three collections
python -m eval.evaluate
# Evaluate one collection with k=5
python -m eval.evaluate --collection drug_info --k 5Gibt Hit Rate, MRR und Context Precision pro Sammlung und insgesamt aus.
Konfiguration
Datei | Zweck |
| Ollama-Modell und Basis-URL (Kopie von |
| Agentenverhalten (Fenster des Gesprächsverlaufs) |
.env
Variable | Standard | Beschreibung |
|
| Ollama-Modellname (muss zuerst heruntergeladen werden) |
|
| Ollama-HTTP-Daemon-URL |
config.yaml
agent:
history_window: 3 # prior turns passed to LLM for multi-turn contextProjektstruktur
pharma-rag-mcp/
├── config.yaml # Agent configuration
├── data/
│ ├── ingest.py # IngestionPipeline class
│ ├── run_ingest.py # CLI: build + spot-check all collections
│ └── sources/
│ ├── drug_labels/ # 11 × drug label .txt files
│ ├── clinical_trials/# 11 × clinical trial .txt files
│ └── call_notes/ # 11 × sales call note .txt files
├── rag/
│ ├── embeddings.py # EmbeddingModel (all-MiniLM-L6-v2)
│ └── vectorstore.py # VectorStoreManager (ChromaDB)
├── mcp_server/
│ ├── server.py # MCP server entrypoint (stdio)
│ └── tools.py # 4 retrieval tool definitions
├── agent/
│ └── agent.py # PharmaAgent + CLI loop with memory
├── ui/
│ └── app.py # Gradio chat UI
├── eval/
│ └── evaluate.py # Hit Rate / MRR / Context Precision
├── memory/
│ └── long_term.json # Persisted session history (auto-created)
├── chroma_db/ # Persisted vector collections (git-ignored)
├── .env.example
├── pyproject.toml
└── requirements.txtWichtige Designentscheidungen
Lokal zuerst – keine Cloud-APIs, keine API-Schlüssel. Embeddings über HuggingFace, Vektorspeicher über ChromaDB, Generierung über Ollama.
MCP als Retrieval-Schicht – der MCP-Server trennt Retrieval und Generierung sauber. Jeder MCP-kompatible Client kann die Suchtools aufrufen.
Adaptive Antwortmodi – der Agent erkennt automatisch, ob eine Frage allein aus der Wissensbasis beantwortet werden kann, eine Kombination mit allgemeinem Fachwissen erfordert oder vollständig außerhalb der Wissensbasis liegt. Jede Antwort ist klar gekennzeichnet, sodass der Benutzer immer die Quelle kennt.
Gleitendes Verlaufsfenster – nur die letzten N Turns werden an das LLM gesendet, wodurch die Nutzung des Kontextfensters begrenzt bleibt und dennoch natürliche Multi-Turn-Gespräche unterstützt werden.
Zweistufiger Speicher – der Sitzungsspeicher (im RAM) wird beim Beenden in ein persistentes JSON-Protokoll geleert, wodurch ein vollständiger Prüfpfad für jede Abfrage, jedes verwendete Tool, jeden Quellenmodus und jede Antwort über alle Läufe hinweg entsteht.
This server cannot be deployed
Maintenance
Related MCP Connectors
Medical RAG: semantic search for clinical guidelines, drug interactions, diagnoses & EHR data.
Medical RAG: semantic search for clinical guidelines, drug interactions, diagnoses & EHR data.
Salesforce-grounded retrieval, diagnoses, and a vetted-Force marketplace for MCP clients.
Cloud or self-hosted knowledge for AI agents: hybrid search, reranking, GraphRAG, scoped MCP tools.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables natural language queries on technical specifications and automated code compliance checks using local RAG with vector search, integrated via MCP.-
- FlicenseNot gradedqualityDmaintenanceEnables local document question-answering and retrieval via MCP, supporting multi-turn conversation, intent recognition, and tools for document search, Q&A, and summarization.5-
- FlicenseNot gradedqualityCmaintenanceProvides read-only, citation-backed semantic search and retrieval-augmented generation over enterprise documents via standardized MCP tools, with local embeddings for privacy.-
- AlicenseNot gradedqualityBmaintenanceEnables AI tools to securely search and retrieve relevant, source-attributed chunks from private local documents via MCP, without sending document content to third-party services.2MIT