pharma-rag-mcp
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)Вспомогательные модули
Модуль | Назначение |
| Обёртка модели эмбеддингов HuggingFace ( |
| Сборщик / загрузчик коллекций ChromaDB |
| Оценка качества поиска (Hit Rate, MRR, Context Precision) |
Related MCP server: DocAgent-MCP
База знаний
11 препаратов × 3 типа документов = 33 исходных файла:
Коллекция | Исходная папка | Содержимое |
|
| Сводки инструкций к препаратам в стиле FDA |
|
| Результаты клинических испытаний |
|
| Транскрипты звонков торговых представителей |
Препараты: 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 для выхода — агент выведет сводку сессии и сбросит память перед завершением.
Режимы источника ответа
Агент определяет и помечает, как был получен каждый ответ:
Значок | Значение |
| Ответ полностью основан на извлечённых фрагментах |
| Извлечённые факты объединены с общими знаниями; пункты вне базы помечены |
| Инструменты не вернули ничего релевантного; ответ дан на основе общих фармацевтических/продажных знаний |
Многоходовой контекст
Агент передаёт последние N ходов истории разговора в LLM на каждый вопрос, поэтому уточняющие вопросы, например "он меня проигнорировал, как мне снова вовлечь его?", получают ответ с учётом контекста. N задаётся в config.yaml:
agent:
history_window: 3 # number of prior turns to includeGradio UI (браузер)
python -m ui.appОткрывает чат-интерфейс по адресу http://localhost:7860.
Только MCP-сервер (транспорт stdio)
python -m mcp_server.serverЗагружает три коллекции ChromaDB и ожидает MCP JSON-RPC сообщения на stdin.
Зарегистрированные инструменты:
Инструмент | Описание |
| Поиск по документам инструкций к препаратам |
| Поиск по данным клинических испытаний |
| Поиск по заметкам с переговоров |
| Поиск по всем трём коллекциям, объединённый |
Оценка поиска
# 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 по каждой коллекции и в целом.
Конфигурация
Файл | Назначение |
| Модель Ollama и базовый URL (скопируйте из |
| Поведение агента (окно истории разговора) |
.env
Переменная | По умолчанию | Описание |
|
| Имя модели Ollama (должна быть загружена) |
|
| 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-журнал при выходе, что даёт полный аудит-след каждого запроса, использованного инструмента, режима источника и ответа во всех запусках.
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