Skip to main content
Glama
pharma-rag-mcp

pharma-rag-mcp

by kartikeya788

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

rag/embeddings.py

Envoltorio del modelo de embeddings de HuggingFace (all-MiniLM-L6-v2)

rag/vectorstore.py

Constructor / cargador de colecciones de ChromaDB

eval/evaluate.py

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

drug_info

data/sources/drug_labels/

Resúmenes de etiquetas de medicamentos estilo FDA

competitor_intel

data/sources/clinical_trials/

Resultados de ensayos clínicos

pitch_content

data/sources/call_notes/

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.2
  • Un 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_ingest

Ejecució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.agent

Chat 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.json en 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

[Fuente: Base de conocimiento]

Respuesta fundamentada completamente en fragmentos recuperados

[Fuente: Base de conocimiento + Conocimiento general]

Hechos recuperados combinados con experiencia general; los puntos fuera de la base de conocimiento se marcan [GK] en línea

[Fuente: Solo conocimiento general]

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 include

Interfaz de usuario Gradio (navegador)

python -m ui.app

Abre una interfaz de chat en http://localhost:7860.

Solo servidor MCP (transporte stdio)

python -m mcp_server.server

Carga las tres colecciones de ChromaDB y espera mensajes JSON-RPC de MCP en stdin.

Herramientas registradas:

Herramienta

Descripción

search_drug_info

Buscar documentos de etiquetas de medicamentos

search_competitor_intel

Buscar datos de ensayos clínicos

search_pitch_content

Buscar notas de llamadas de ventas

search_all

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 5

Imprime Hit Rate, MRR y Precisión de Contexto por colección y en conjunto.


Configuración

Archivo

Propósito

.env

Modelo de Ollama y URL base (copiar de .env.example)

config.yaml

Comportamiento del agente (ventana de historial de conversación)

.env

Variable

Valor predeterminado

Descripción

OLLAMA_MODEL

llama3.2

Nombre del modelo de Ollama (debe descargarse primero)

OLLAMA_BASE_URL

http://localhost:11434

URL del daemon HTTP de Ollama

config.yaml

agent:
  history_window: 3   # prior turns passed to LLM for multi-turn context

Estructura 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.txt

Decisiones 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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language queries on technical specifications and automated code compliance checks using local RAG with vector search, integrated via MCP.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables local document question-answering and retrieval via MCP, supporting multi-turn conversation, intent recognition, and tools for document search, Q&A, and summarization.
    5
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    2
    MIT