154 lines
5.5 KiB
Markdown
154 lines
5.5 KiB
Markdown
# Экзамен: Структурированный вывод (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 в репозитории или напишите в чат проекта.
|
||
|
||
--- |