# Экзамен: Структурированный вывод (Pydantic) ## 📖 Описание В этом проекте реализована цепочка LangChain, которая из произвольного текста извлекает **валидированный объект Pydantic** без ручного разбора строк. Текст может описывать либо человека, либо встречу. На основе простого определения типа текста выбирается подходящая схема (`PersonInfo` или `MeetingNotes`) и выводится структурированный результат. ### Что умеет проект | Функция | Что делает | |---------|------------| | **Определение типа текста** | На основе эвристики (ключевых слов) выбирается схема | | **Pydantic‑модели** | `PersonInfo` и `MeetingNotes` с полями и описаниями | | **Chain** | Prompt → LLM → PydanticOutputParser | | **CLI** | Ввод текста вручную или выбор из двух встроенных примеров | | **Вывод** | `model_dump()` + краткая сводка | --- ## ⚙️ Установка зависимостей ```bash # Создайте виртуальное окружение (рекомендовано) python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate # Установите зависимости pip install langchain-core langchain-openai pydantic python-dotenv ``` > **Важно**: > - Требуется Python ≥ 3.10. > - Для работы с OpenAI понадобится переменная окружения `OPENAI_API_KEY`. > - Если вы хотите использовать Ollama, замените `ChatOpenAI` на `ChatOllama` и установите `langchain-ollama`. --- ## 🚀 Запуск ### 1. Запуск скрипта ```bash python solution.py ``` После запуска появится меню: ``` Выберите вариант: 1. Ввести текст вручную 2. Использовать пример "Person" 3. Использовать пример "Meeting" ``` Выберите нужный номер и следуйте инструкциям. После обработки вы увидите: ``` === Структурированный вывод === { "name": "Иван Иванов", "age": 30, "profession": "Разработчик", "skills": ["Python", "FastAPI", "Docker"] } Краткая сводка: 4 поля, 1 необязательное. ``` ### 2. Запуск через CLI‑аргументы ```bash python solution.py --text "Встреча с командой по проекту X..." ``` или ```bash python solution.py --example person ``` Аргументы: | Параметр | Описание | |----------|----------| | `--text` | Текст, который нужно проанализировать | | `--example` | `person` или `meeting` – использовать встроенный пример | | `--model` | Имя модели LLM (по умолчанию `gpt-4o-mini`) | --- ## 📄 Пример использования ```python from solution import process_text text = """ Меня зовут Мария Петрова, мне 28 лет. Я работаю аналитиком данных в компании "DataCorp". Мои навыки: SQL, Python, Tableau, машинное обучение. """ result = process_text(text) print(result.model_dump()) ``` Вывод: ```json { "name": "Мария Петрова", "age": 28, "profession": "аналитик данных", "skills": ["SQL", "Python", "Tableau", "машинное обучение"] } ``` --- ## 📚 Структура проекта ``` . ├── solution.py # Основной скрипт ├── .env # Переменные окружения (не включено в репозиторий) ├── README.md # Это файл └── requirements.txt # (опционально) список зависимостей ``` --- ## 🔧 Как это работает 1. **Определение типа** – простая эвристика ищет ключевые слова (`"встреча"`, `"команда"`, `"протокол"`) для выбора схемы `MeetingNotes`; иначе – `PersonInfo`. 2. **Prompt** – шаблон, который подставляет текст и задает формат вывода в JSON. 3. **LLM** – генерирует ответ в нужном формате. 4. **PydanticOutputParser** – валидирует и преобразует JSON в объект Pydantic. 5. **Вывод** – `model_dump()` + краткая сводка. --- ## 📦 Зависимости | Пакет | Версия | Зачем | |-------|--------|-------| | `langchain-core` | ≥ 1.0.0 | Основные компоненты LangChain | | `langchain-openai` | - | LLM‑интеграция | | `pydantic` | - | Валидация схем | | `python-dotenv` | - | Загрузка переменных окружения | --- ## 📬 Поддержка и вопросы Если возникли вопросы, откройте issue в репозитории или напишите в чат проекта. ---