pixel-art

Agentic AI x Longevity

Кейс: ИИ-агенты для извлечения биоактивности из патентов

Пайплайн для фильтрации и анализа научных публикаций и патентов

Краткий обзор

  • Автоматизация извлечения и структурирования данных о взаимодействиях лигандов и белков из патентов
  • Использование Agents Framework, OCR, OpenCV и других технологий (подробнее на слайде со стеком)
  • Результат: демонстрация подхода и формирование основы для последующего расширения и улучшения

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

Система состоит из 3-х основных модулей:

  • src/filtering — получение данных патентов
  • src/processing — обработка текста патентов с ИИ
  • src/orchestration — управление этапами работы

Поэтапная гибкая обработка: получение патентов → анализ → экспорт

Гибкий оркестратор обработки

                            
from pathlib import Path
from src.orchestration import create_patent_orchestrator
from src.constants import PATENTS_PER_BATCH

if __name__ == "__main__":
    orchestrator = create_patent_orchestrator(patent_per_batch=PATENTS_PER_BATCH)
    orchestrator.run(initial_context={"documents_path": Path("patents")})
  • Оркестратор управляет последовательностью шагов: поиск, извлечение, сбор, обработка, сохранение.
  • Поддержка восстановления прогресса (чекпоинты).
  • Каждый шаг — отдельный класс (Step/GeneratorStep).

Сборка оркестратора


def create_patent_orchestrator(
    patent_per_batch: int = 10, checkpoint_file: Path = Path("checkpoints/patents.pkl")
) -> FlexibleOrchestrator:
    """
    Создает стандартный оркестратор с полным циклом работы:
    
    Поиск и скачивание патентов ->
    Извлечение текстов ->
    Сбор документов ->
    Обработка документов <-> Сохранение результатов

    Args:
        patent_per_batch: Количество патентов для обработки за раз
        checkpoint_file: Путь к файлу чекпоинтов

    Returns:
        FlexibleOrchestrator: Стандартный оркестратор с полным циклом работы
    """
    from src.orchestration.steps import (
        CheckPatentsStep,
        ExtractTextsStep,
        CollectDocumentsStep,
        ProcessDocumentsStep,
        SaveResultsStep,
    )

    steps = [
        CheckPatentsStep(patent_per_batch),
        ExtractTextsStep(),
        CollectDocumentsStep(),
        ProcessDocumentsStep(),
        SaveResultsStep(),
    ]

    return FlexibleOrchestrator(steps, checkpoint_file)

Полный цикл работы

Поиск патентов

Скачивание PDF

Экстракция текстов

Обработка документов

Сохранение результатов

Ручной просмотр

Многоагентный Pipeline


class Pipeline:
    def __init__(self, txt_document: TxtDocument, output_dir: Path):
        self.searcher_agent = Agent(
            name="SearcherAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SearcherAgentResults
        )
        self.bioinf_agent = Agent(
            name="BioinfAgent", 
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )
        self.supervisor_agent = Agent(
            name="SupervisorAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SupervisorAgentResults
        )
        self.fix_agent = Agent(
            name="FixAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )

SearcherAgent: определяет наличие лиганд-белковых взаимодействий с оценкой уверенности

Многоагентный Pipeline


class Pipeline:
    def __init__(self, txt_document: TxtDocument, output_dir: Path):
        self.searcher_agent = Agent(
            name="SearcherAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SearcherAgentResults
        )
        self.bioinf_agent = Agent(
            name="BioinfAgent", 
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )
        self.supervisor_agent = Agent(
            name="SupervisorAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SupervisorAgentResults
        )
        self.fix_agent = Agent(
            name="FixAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )

BioinfAgent: извлекает взаимодействия, параметры (Ki, IC50, Kd, EC50), названия лигандов и белков

Многоагентный Pipeline


class Pipeline:
    def __init__(self, txt_document: TxtDocument, output_dir: Path):
        self.searcher_agent = Agent(
            name="SearcherAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SearcherAgentResults
        )
        self.bioinf_agent = Agent(
            name="BioinfAgent", 
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )
        self.supervisor_agent = Agent(
            name="SupervisorAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SupervisorAgentResults
        )
        self.fix_agent = Agent(
            name="FixAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )

SupervisorAgent: проверяет корректность результатов, определяет возможность исправления

Многоагентный Pipeline


class Pipeline:
    def __init__(self, txt_document: TxtDocument, output_dir: Path):
        self.searcher_agent = Agent(
            name="SearcherAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SearcherAgentResults
        )
        self.bioinf_agent = Agent(
            name="BioinfAgent", 
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )
        self.supervisor_agent = Agent(
            name="SupervisorAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=SupervisorAgentResults
        )
        self.fix_agent = Agent(
            name="FixAgent",
            instructions=...,
            model=DEFAULT_MODEL,
            output_type=BioinfAgentResults
        )

FixAgent: исправляет некорректные результаты на основе объяснений супервайзера и редактирует данные BioinfAgent

Выбор LLM для агентной архитектуры

Критерии отбора:

  • Высокая производительность в задачах рассуждений и генерации
  • Поддержка агентного режима (agent capabilities)
  • Возможность интеграции с внешними инструментами (tool calling)
  • Доступность (открытые веса, лицензия, ресурсы для запуска)
DeepSeek-R1 (8B) Qwen3 (8B) Llama 3.1 (8B) Mistral (7B) Gemma 3 (4B)

Выбор LLM для агентной архитектуры

Итоговым выбором стала модель Qwen3:

  • Гибридная архитектура (Dense + MoE), которая снизит нагрузку при масштабировании
  • Контекст до 128K токенов
  • Заточенность под работу в агентном режиме и использование инструментов

Характеристики модели

model_info

Запуск и развертывание

  • Для запуска проекта необходимо по меньшей мере 3 зависимости: Python, ollama, tesseract
  • Нужно будет скачать модель Qwen3 (или другую, если хочется) командой ollama pull qwen3
  • Так же необходим API-ключ от USPTO PatentsView, ссылка на его получение есть в README.md
  • После синхронизации зависимостей при помощи uv sync - можно запустить проект командой uv run main.py

Gradio UI

  • Запуск web-ui: uv run gradio-ui.py
  • Анализ текста — вводите текст или загружайте файл для поиска взаимодействий
  • Скачивание патентов — автоматический поиск и загрузка патентов USPTO по ключевым словам
  • Обработка патентов — запуск полного пайплайна для извлечения данных из всех загруженных PDF
  • Просмотр результатов — интерактивный просмотр и экспорт найденных взаимодействий в CSV
  • Скачивание файлов — загрузка исходных PDF и итоговых CSV из интерфейса

Gradio API

Сценарий работы (Python)

  • Подключение: используйте Client("http://localhost:7860/")
  • Вызов: метод predict() отправляет данные на нужный api_name
  • Работа с файлами: используйте handle_file() для передачи пути или URL файла

from gradio_client import Client

client = Client("http://localhost:7860/")

result = client.predict(
    "text",
    api_name="/process_single_text"
)
                            

Основные эндпоинты

  • /process_single_text — анализ переданного текста ИИ агентами
  • /process_uploaded_file — то же, что и предыдущий, но для загружаемого файла
  • /download_patents — скачивание патентов на сервере Gradio с параметрами ключевых слов и ограничением по количеству
  • /run_full_pipeline — полный цикл обработки, такой же, как при обычном запуске проекта
  • /download_pdf_file, /download_csv_file — скачивание файлов с сервера Gradio
  • /create_combined_export — объединение данных отдельных патентов в один CSV

Потенциальные направления развития

  • Интеграция с другими источниками различных данных: Arxiv, PubMed, UniProt
  • Улучшение качества OCR дополнительными и более совершенными обработками
  • Создание интеллектуальной системы работы с pdf и дополнительный анализ через vision LLM
  • Внедрение специализированных ML-моделей, таких как ChemBERT, BioBERT и других

Потенциальные направления развития

  • Создание интеллектуальной системы работы с pdf и дополнительный анализ через vision LLM
  • Внедрение специализированных ML-моделей, таких как ChemBERT, BioBERT и других
  • Создание более качественного web-интерфейса для работы с пайплайном через FastAPI
  • Горизонтальное масштабирование системы через распределенные вычисления с переходом на vLLM или использование нескольких узлов с ollama и собственной балансировкой нагрузки

Технологический стек

Python Ollama Tesseract Pandas Pydantic OpenAI Agents g4f PyMuPDF pypdf OpenCV RDKit Loguru Rich Textual Tenacity USPTO PatentsView requests uv Pillow BeautifulSoup Gradio
pixel-art

Будущее биоинформатики уже здесь

Не смотря на то, что это скорее прототип большей системы, я надеюсь, что этот проект может стать частью чего-то большего, или просто вдохновить на это.

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

"От патента к биоактивности — за минуты, а не часы.""

Спасибо за внимание!

→ Давайте строить будущее уже сейчас