pharma-rag-mcp
pharma-rag-mcp
Un sistema de Generación Aumentada por Recuperación (RAG) totalmente local y de extremo a extremo para inteligencia de ventas farmacéuticas, construido con LangChain, ChromaDB, Ollama y el Protocolo de Contexto de Modelo (MCP).
El sistema ingiere etiquetas de medicamentos, documentos de ensayos clínicos y notas de llamadas de ventas en una base de datos vectorial local, los expone como herramientas MCP y responde preguntas en lenguaje natural a través de un agente ReAct de LangGraph respaldado por un LLM que se ejecuta localmente.
Arquitectura
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)Módulos de soporte
Módulo | Propósito |
| Envoltorio del modelo de embeddings de HuggingFace ( |
| Constructor / cargador de colecciones de ChromaDB |
| Evaluación de calidad de recuperación (Hit Rate, MRR, Precisión de Contexto) |
Related MCP server: DocAgent-MCP
Base de conocimiento
11 medicamentos × 3 tipos de documentos = 33 archivos fuente:
Colección | Carpeta fuente | Contenidos |
|
| Resúmenes de etiquetas de medicamentos estilo FDA |
|
| Resultados de ensayos clínicos |
|
| Transcripciones de llamadas de representantes de ventas |
Medicamentos: Dupixent, Eliquis, Entresto, Farxiga, Fasenra, Jardiance, Rinvoq, Skyrizi, Trelegy Ellipta, Trulicity, Xarelto
Requisitos previos
Python 3.13+
Ollama ejecutándose localmente con un modelo descargado:
ollama pull llama3.2Un entorno virtual de Python con las dependencias instaladas (ver Configuración).
Configuración
# 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_ingestEjecución del sistema
Cada capa se puede usar de forma independiente. Inicia Ollama antes de usar el agente o la interfaz de usuario.
Agente (CLI)
python -m agent.agentChat interactivo de línea de comandos con memoria de dos niveles:
Memoria de sesión — la consulta de cada turno, las herramientas utilizadas, el modo de fuente y la respuesta se mantienen en RAM durante la ejecución actual.
Memoria a largo plazo — al salir, la sesión se añade (con marcas de tiempo) a
memory/long_term.jsonen disco.
Escribe cualquiera de bye, close, end, exit, goodbye, quit para salir: el agente imprimirá un resumen de la sesión y vaciará la memoria antes de terminar.
Modos de fuente de respuesta
El agente detecta y etiqueta cómo se produjo cada respuesta:
Insignia | Significado |
| Respuesta fundamentada completamente en fragmentos recuperados |
| Hechos recuperados combinados con experiencia general; los puntos fuera de la base de conocimiento se marcan |
| Las herramientas no devolvieron nada relevante; se respondió desde conocimiento general farmacéutico/de ventas |
Contexto multi-turno
El agente pasa los últimos N turnos del historial de conversación al LLM en cada pregunta, de modo que preguntas de seguimiento como "me ignoró, ¿cómo vuelvo a involucrarlo?" se responden en contexto. N se controla mediante config.yaml:
agent:
history_window: 3 # number of prior turns to includeInterfaz de usuario Gradio (navegador)
python -m ui.appAbre una interfaz de chat en http://localhost:7860.
Solo servidor MCP (transporte stdio)
python -m mcp_server.serverCarga las tres colecciones de ChromaDB y espera mensajes JSON-RPC de MCP en stdin.
Herramientas registradas:
Herramienta | Descripción |
| Buscar documentos de etiquetas de medicamentos |
| Buscar datos de ensayos clínicos |
| Buscar notas de llamadas de ventas |
| Buscar en las tres colecciones, combinadas |
Evaluación de recuperación
# Evaluate all three collections
python -m eval.evaluate
# Evaluate one collection with k=5
python -m eval.evaluate --collection drug_info --k 5Imprime Hit Rate, MRR y Precisión de Contexto por colección y en conjunto.
Configuración
Archivo | Propósito |
| Modelo de Ollama y URL base (copiar de |
| Comportamiento del agente (ventana de historial de conversación) |
.env
Variable | Valor predeterminado | Descripción |
|
| Nombre del modelo de Ollama (debe descargarse primero) |
|
| URL del daemon HTTP de Ollama |
config.yaml
agent:
history_window: 3 # prior turns passed to LLM for multi-turn contextEstructura del proyecto
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.txtDecisiones de diseño clave
Local primero — sin APIs en la nube, sin claves de API. Embeddings mediante HuggingFace, almacenamiento vectorial mediante ChromaDB, generación mediante Ollama.
MCP como capa de recuperación — el servidor MCP separa limpiamente la recuperación de la generación. Cualquier cliente compatible con MCP puede llamar a las herramientas de búsqueda.
Modos de respuesta adaptativos — el agente detecta automáticamente si una pregunta se puede responder solo desde la base de conocimiento, requiere combinarse con experiencia general, o cae completamente fuera de la base de conocimiento. Cada respuesta está claramente etiquetada para que el usuario siempre sepa la fuente.
Ventana de historial deslizante — solo los últimos N turnos se envían al LLM, manteniendo acotado el uso de la ventana de contexto mientras se admiten conversaciones naturales de múltiples turnos.
Memoria de dos niveles — la memoria de sesión (en RAM) se vacía a un registro JSON persistente al salir, lo que proporciona un rastro de auditoría completo de cada consulta, herramienta utilizada, modo de fuente y respuesta en todas las ejecuciones.
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