An autonomous, agentic pipeline for discovering, enriching, ranking, and synthesizing machine learning research papers.
[📽️ Watch the full system walkthrough and agent execution here]
Keeping up with the exponential growth of ML research is impossible. Hundreds of papers are published continuously across research platforms and repositories. Most researchers rely on basic keyword searches or social media threads, missing critical cross-domain connections.
The Research Intelligence System is a single-agent research pipeline that combines deterministic data processing with probabilistic models to automate the research workflow:
The current implementation uses a single DeepAgents agent with specialized tools, rather than a multi-agent architecture.
(Architecture diagram generated below. For an editable version, see the Excalidraw instructions at the bottom of this file.)
The editable architecture source is available at docs/images/architecture.excalidraw.
The system is divided into four distinct layers, ensuring separation of concerns and making it easy to swap out components:
Paper Pydantic model.SentenceTransformers (local, offline, open-source) to generate dense vector representations of abstracts.DeepAgents agent coordinates search, embedding generation, ranking, and technical synthesis through specialized tools.SentenceTransformers. No paper abstracts are sent to external APIs for vectorization.app/llm/factory.py.| Category | Technology | Why we use it |
|---|---|---|
| Orchestration | DeepAgents / LangChain | Tool calling and multi-step agent orchestration. |
| LLM Provider | DeepSeek (via langchain-deepseek) | Fast and reasoning models for enrichment and synthesis. |
| Vector DB | Qdrant | Rust-based, blazing fast, and fully self-hostable via Docker. |
| Relational DB | PostgreSQL + SQLAlchemy | The gold standard for relational data. Alembic handles schema migrations. |
| Embeddings | SentenceTransformers | Open-source, runs locally on CPU/GPU, no API keys required. |
| Validation | Pydantic V2 | Strict data validation from API ingestion to database storage. |
| Scheduling | APScheduler | Robust cron-like scheduling for weekly research jobs. |
This project is built as a reference implementation for modern ML Engineering practices:
PaperRepository abstracts all database operations. The business logic never writes raw SQL.app/llm/factory.py centralizes LLM instantiation, allowing easy swapping between "Fast" (routing) and "Smart" (reasoning) models.BaseCollector and BaseEmbeddingService define interfaces. Adding a new source (e.g., HuggingFaceCollector) requires zero changes to the core pipeline.git clone https://github.com/MarcosSete/research-agent-2.git
cd research-agent-2
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
Start the database and vector store:
docker-compose up -d
Copy the example environment file and add your API keys:
cp .env.example .env
Edit .env and add your DEEPSEEK_API_KEY.
Apply the SQLAlchemy schemas to PostgreSQL:
alembic upgrade head
Execute the research pipeline manually to test the connection:
python -m app.planner.research_agent
Leave the cron job running to automatically collect papers every Sunday at 08:00:
python -m app.scheduler.run_scheduler
Each user's research preferences are configured in:
config/research_profile.yaml
This is the main file you should edit to personalize the system's research behavior. You do not need to modify the agent code to define your interests.
interests:
- Deep Learning
- Reinforcement Learning
- Probabilistic Machine Learning
- Deep Generative Modeling
- Graph Neural Network
- Causal Machine Learning
priority:
Deep Learning: 100
Reinforcement Learning: 80
Probabilistic Machine Learning: 70
Deep Generative Modeling: 60
Graph Neural Network: 50
Causal Machine Learning: 40
ignored:
- Healthcare
- Biology
favorite_authors:
- Richard Sutton
- Yoshua Bengio
- Yann LeCun
favorite_conferences:
- NeurIPS
- ICML
- ICLR
reading_level: advanced
max_daily_papers: 20
summary_style: technical
| Field | Description |
|---|---|
interests | Topics you want to research. They are used as the basis for paper discovery and the semantic research profile. |
priority | Relative weight of each interest in the ranking. Higher values give that interest greater influence on the semantic profile. |
ignored | Topics or domains you want to avoid in the results. |
favorite_authors | Authors you consider relevant to your research. |
favorite_conferences | Conferences you consider relevant to your research. |
reading_level | Expected technical level for the paper synthesis, such as beginner, intermediate, or advanced. |
max_daily_papers | Configured limit of papers considered per execution/period. |
summary_style | Desired synthesis style, such as technical. |
priorityThe priority section does not represent percentages or points directly added to each paper. It defines the relative importance of your interests within the profile used by the ranking system.
For example:
priority:
Deep Learning: 100
Reinforcement Learning: 80
Graph Neural Network: 50
This means:
The values are relative. You can use, for example, 100 / 80 / 50, 10 / 8 / 5, or other proportional values.
Important: interests listed under priority should correspond to the interests defined under interests.
config/research_profile.yaml.python -m app.planner.research_agent
The pipeline will use the updated profile on the next execution.
This project is designed to be a collaborative effort. If you want to contribute, here are the areas that currently make the most sense:
BaseCollector interface.app/ranking/scorer.py. Contributions can improve scoring behavior, add well-justified ranking signals, or improve the handling of research-profile preferences.docs/images/architecture.excalidraw synchronized with the implementation when the architecture changes.research-agent-2/
├── app/
│ ├── collectors/ # ArXiv, Semantic Scholar, Hugging Face
│ ├── config/ # Application settings and research profile loader
│ ├── database/ # SQLAlchemy models, repository, session
│ ├── embeddings/ # Local embeddings and Qdrant integration
│ ├── llm/ # LLM factory and topic enrichment
│ ├── models/ # Domain models
│ ├── planner/ # Single-agent research orchestration
│ ├── ranking/ # Paper scoring
│ ├── reports/ # Markdown and JSON report persistence
│ ├── scheduler/ # Weekly APScheduler job
│ ├── skills/ # Agent tools
│ └── synthesis/ # Technical research synthesis
├── docs/
│ └── images/ # Architecture source (.excalidraw) and rendered diagram
├── scripts/ # Local execution and utility scripts
├── migrations/ # Alembic DB migrations
└── config/ # YAML profiles (research_profile.yaml)
This project is open-source under the MIT License. Built with ❤️ by the ML Engineering community.
115 commits
Python
98.8%
Mako
1.2%
An autonomous, agentic pipeline for discovering, enriching, ranking, and synthesizing machine learning research papers.
[📽️ Watch the full system walkthrough and agent execution here]
Keeping up with the exponential growth of ML research is impossible. Hundreds of papers are published continuously across research platforms and repositories. Most researchers rely on basic keyword searches or social media threads, missing critical cross-domain connections.
The Research Intelligence System is a single-agent research pipeline that combines deterministic data processing with probabilistic models to automate the research workflow:
The current implementation uses a single DeepAgents agent with specialized tools, rather than a multi-agent architecture.
(Architecture diagram generated below. For an editable version, see the Excalidraw instructions at the bottom of this file.)
The editable architecture source is available at docs/images/architecture.excalidraw.
The system is divided into four distinct layers, ensuring separation of concerns and making it easy to swap out components:
Paper Pydantic model.SentenceTransformers (local, offline, open-source) to generate dense vector representations of abstracts.DeepAgents agent coordinates search, embedding generation, ranking, and technical synthesis through specialized tools.SentenceTransformers. No paper abstracts are sent to external APIs for vectorization.app/llm/factory.py.| Category | Technology | Why we use it |
|---|---|---|
| Orchestration | DeepAgents / LangChain | Tool calling and multi-step agent orchestration. |
| LLM Provider | DeepSeek (via langchain-deepseek) | Fast and reasoning models for enrichment and synthesis. |
| Vector DB | Qdrant | Rust-based, blazing fast, and fully self-hostable via Docker. |
| Relational DB | PostgreSQL + SQLAlchemy | The gold standard for relational data. Alembic handles schema migrations. |
| Embeddings | SentenceTransformers | Open-source, runs locally on CPU/GPU, no API keys required. |
| Validation | Pydantic V2 | Strict data validation from API ingestion to database storage. |
| Scheduling | APScheduler | Robust cron-like scheduling for weekly research jobs. |
This project is built as a reference implementation for modern ML Engineering practices:
PaperRepository abstracts all database operations. The business logic never writes raw SQL.app/llm/factory.py centralizes LLM instantiation, allowing easy swapping between "Fast" (routing) and "Smart" (reasoning) models.BaseCollector and BaseEmbeddingService define interfaces. Adding a new source (e.g., HuggingFaceCollector) requires zero changes to the core pipeline.git clone https://github.com/MarcosSete/research-agent-2.git
cd research-agent-2
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
Start the database and vector store:
docker-compose up -d
Copy the example environment file and add your API keys:
cp .env.example .env
Edit .env and add your DEEPSEEK_API_KEY.
Apply the SQLAlchemy schemas to PostgreSQL:
alembic upgrade head
Execute the research pipeline manually to test the connection:
python -m app.planner.research_agent
Leave the cron job running to automatically collect papers every Sunday at 08:00:
python -m app.scheduler.run_scheduler
Each user's research preferences are configured in:
config/research_profile.yaml
This is the main file you should edit to personalize the system's research behavior. You do not need to modify the agent code to define your interests.
interests:
- Deep Learning
- Reinforcement Learning
- Probabilistic Machine Learning
- Deep Generative Modeling
- Graph Neural Network
- Causal Machine Learning
priority:
Deep Learning: 100
Reinforcement Learning: 80
Probabilistic Machine Learning: 70
Deep Generative Modeling: 60
Graph Neural Network: 50
Causal Machine Learning: 40
ignored:
- Healthcare
- Biology
favorite_authors:
- Richard Sutton
- Yoshua Bengio
- Yann LeCun
favorite_conferences:
- NeurIPS
- ICML
- ICLR
reading_level: advanced
max_daily_papers: 20
summary_style: technical
| Field | Description |
|---|---|
interests | Topics you want to research. They are used as the basis for paper discovery and the semantic research profile. |
priority | Relative weight of each interest in the ranking. Higher values give that interest greater influence on the semantic profile. |
ignored | Topics or domains you want to avoid in the results. |
favorite_authors | Authors you consider relevant to your research. |
favorite_conferences | Conferences you consider relevant to your research. |
reading_level | Expected technical level for the paper synthesis, such as beginner, intermediate, or advanced. |
max_daily_papers | Configured limit of papers considered per execution/period. |
summary_style | Desired synthesis style, such as technical. |
priorityThe priority section does not represent percentages or points directly added to each paper. It defines the relative importance of your interests within the profile used by the ranking system.
For example:
priority:
Deep Learning: 100
Reinforcement Learning: 80
Graph Neural Network: 50
This means:
The values are relative. You can use, for example, 100 / 80 / 50, 10 / 8 / 5, or other proportional values.
Important: interests listed under priority should correspond to the interests defined under interests.
config/research_profile.yaml.python -m app.planner.research_agent
The pipeline will use the updated profile on the next execution.
This project is designed to be a collaborative effort. If you want to contribute, here are the areas that currently make the most sense:
BaseCollector interface.app/ranking/scorer.py. Contributions can improve scoring behavior, add well-justified ranking signals, or improve the handling of research-profile preferences.docs/images/architecture.excalidraw synchronized with the implementation when the architecture changes.research-agent-2/
├── app/
│ ├── collectors/ # ArXiv, Semantic Scholar, Hugging Face
│ ├── config/ # Application settings and research profile loader
│ ├── database/ # SQLAlchemy models, repository, session
│ ├── embeddings/ # Local embeddings and Qdrant integration
│ ├── llm/ # LLM factory and topic enrichment
│ ├── models/ # Domain models
│ ├── planner/ # Single-agent research orchestration
│ ├── ranking/ # Paper scoring
│ ├── reports/ # Markdown and JSON report persistence
│ ├── scheduler/ # Weekly APScheduler job
│ ├── skills/ # Agent tools
│ └── synthesis/ # Technical research synthesis
├── docs/
│ └── images/ # Architecture source (.excalidraw) and rendered diagram
├── scripts/ # Local execution and utility scripts
├── migrations/ # Alembic DB migrations
└── config/ # YAML profiles (research_profile.yaml)
This project is open-source under the MIT License. Built with ❤️ by the ML Engineering community.
115 commits
Python
98.8%
Mako
1.2%