Экзамен: Структурированный вывод (Pydantic)

📖 Описание

В этом проекте реализована цепочка LangChain, которая из произвольного текста извлекает валидированный объект Pydantic без ручного разбора строк.
Текст может описывать либо человека, либо встречу. На основе простого определения типа текста выбирается подходящая схема (PersonInfo или MeetingNotes) и выводится структурированный результат.

Что умеет проект

Функция Что делает
Определение типа текста На основе эвристики (ключевых слов) выбирается схема
Pydantic‑модели PersonInfo и MeetingNotes с полями и описаниями
Chain Prompt → LLM → PydanticOutputParser
CLI Ввод текста вручную или выбор из двух встроенных примеров
Вывод model_dump() + краткая сводка

⚙️ Установка зависимостей

# Создайте виртуальное окружение (рекомендовано)
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. Запуск скрипта

python solution.py

После запуска появится меню:

Выберите вариант:
1. Ввести текст вручную
2. Использовать пример "Person"
3. Использовать пример "Meeting"

Выберите нужный номер и следуйте инструкциям. После обработки вы увидите:

=== Структурированный вывод ===
{
  "name": "Иван Иванов",
  "age": 30,
  "profession": "Разработчик",
  "skills": ["Python", "FastAPI", "Docker"]
}
Краткая сводка: 4 поля, 1 необязательное.

2. Запуск через CLI‑аргументы

python solution.py --text "Встреча с командой по проекту X..."

или

python solution.py --example person

Аргументы:

Параметр Описание
--text Текст, который нужно проанализировать
--example person или meeting – использовать встроенный пример
--model Имя модели LLM (по умолчанию gpt-4o-mini)

📄 Пример использования

from solution import process_text

text = """
Меня зовут Мария Петрова, мне 28 лет. Я работаю аналитиком данных в компании "DataCorp".
Мои навыки: SQL, Python, Tableau, машинное обучение.
"""

result = process_text(text)
print(result.model_dump())

Вывод:

{
  "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 в репозитории или напишите в чат проекта.


S
Description
Решения домашних заданий
Readme 30 KiB
Languages
Python 100%