Skip to main content
Glama
kartikeya788

pharma-rag-mcp

by kartikeya788

pharma-rag-mcp

Полностью локальная, сквозная система Retrieval-Augmented Generation (RAG) для фармацевтической аналитики продаж — построена на LangChain, ChromaDB, Ollama и Model Context Protocol (MCP).

Система загружает инструкции к препаратам, документы клинических испытаний и заметки с переговоров в локальную векторную базу данных, предоставляет их в виде MCP-инструментов и отвечает на вопросы на естественном языке через агента LangGraph ReAct, работающего на локально запущенной LLM.


Архитектура

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)

Вспомогательные модули

Модуль

Назначение

rag/embeddings.py

Обёртка модели эмбеддингов HuggingFace (all-MiniLM-L6-v2)

rag/vectorstore.py

Сборщик / загрузчик коллекций ChromaDB

eval/evaluate.py

Оценка качества поиска (Hit Rate, MRR, Context Precision)


Related MCP server: DocAgent-MCP

База знаний

11 препаратов × 3 типа документов = 33 исходных файла:

Коллекция

Исходная папка

Содержимое

drug_info

data/sources/drug_labels/

Сводки инструкций к препаратам в стиле FDA

competitor_intel

data/sources/clinical_trials/

Результаты клинических испытаний

pitch_content

data/sources/call_notes/

Транскрипты звонков торговых представителей

Препараты: Dupixent, Eliquis, Entresto, Farxiga, Fasenra, Jardiance, Rinvoq, Skyrizi, Trelegy Ellipta, Trulicity, Xarelto


Предварительные требования

  • Python 3.13+

  • Ollama запущен локально с загруженной моделью:

ollama pull llama3.2
  • Виртуальное окружение Python с установленными зависимостями (см. Setup).


Установка

# 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

Запуск системы

Каждый слой можно использовать независимо. Запустите Ollama перед использованием агента или интерфейса.

Агент (CLI)

python -m agent.agent

Интерактивный чат в командной строке с двухуровневой памятью:

  • Память сессии — запрос, использованные инструменты, режим источника и ответ каждого хода хранятся в оперативной памяти во время текущего запуска.

  • Долговременная память — при выходе сессия добавляется (с временными метками) в memory/long_term.json на диске.

Введите любое из bye, close, end, exit, goodbye, quit для выхода — агент выведет сводку сессии и сбросит память перед завершением.

Режимы источника ответа

Агент определяет и помечает, как был получен каждый ответ:

Значок

Значение

[Source: Knowledge Base]

Ответ полностью основан на извлечённых фрагментах

[Source: Knowledge Base + General Knowledge]

Извлечённые факты объединены с общими знаниями; пункты вне базы помечены [GK] в тексте

[Source: General Knowledge only]

Инструменты не вернули ничего релевантного; ответ дан на основе общих фармацевтических/продажных знаний

Многоходовой контекст

Агент передаёт последние N ходов истории разговора в LLM на каждый вопрос, поэтому уточняющие вопросы, например "он меня проигнорировал, как мне снова вовлечь его?", получают ответ с учётом контекста. N задаётся в config.yaml:

agent:
  history_window: 3   # number of prior turns to include

Gradio UI (браузер)

python -m ui.app

Открывает чат-интерфейс по адресу http://localhost:7860.

Только MCP-сервер (транспорт stdio)

python -m mcp_server.server

Загружает три коллекции ChromaDB и ожидает MCP JSON-RPC сообщения на stdin.

Зарегистрированные инструменты:

Инструмент

Описание

search_drug_info

Поиск по документам инструкций к препаратам

search_competitor_intel

Поиск по данным клинических испытаний

search_pitch_content

Поиск по заметкам с переговоров

search_all

Поиск по всем трём коллекциям, объединённый

Оценка поиска

# Evaluate all three collections
python -m eval.evaluate

# Evaluate one collection with k=5
python -m eval.evaluate --collection drug_info --k 5

Выводит Hit Rate, MRR и Context Precision по каждой коллекции и в целом.


Конфигурация

Файл

Назначение

.env

Модель Ollama и базовый URL (скопируйте из .env.example)

config.yaml

Поведение агента (окно истории разговора)

.env

Переменная

По умолчанию

Описание

OLLAMA_MODEL

llama3.2

Имя модели Ollama (должна быть загружена)

OLLAMA_BASE_URL

http://localhost:11434

URL HTTP-демона Ollama

config.yaml

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

Структура проекта

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

Ключевые проектные решения

Локальность прежде всего — никаких облачных API, никаких ключей API. Эмбеддинги через HuggingFace, векторное хранилище через ChromaDB, генерация через Ollama.

MCP как уровень поиска — MCP-сервер чётко разделяет поиск и генерацию. Любой MCP-совместимый клиент может вызывать инструменты поиска.

Адаптивные режимы ответа — агент автоматически определяет, можно ли ответить на вопрос только из базы знаний, требуется ли объединение с общими знаниями, или вопрос полностью вне базы. Каждый ответ чётко помечен, чтобы пользователь всегда знал источник.

Скользящее окно истории — в LLM отправляются только последние N ходов, что ограничивает использование контекстного окна, сохраняя при этом поддержку естественных многоходовых разговоров.

Двухуровневая память — память сессии (в оперативной памяти) сбрасывается в постоянный JSON-журнал при выходе, что даёт полный аудит-след каждого запроса, использованного инструмента, режима источника и ответа во всех запусках.

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