From 401541e295d92677866c1202ff0b2c3a52f83137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=91=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 27 May 2026 14:30:22 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=BE=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=E2=84=963:=20=D0=9F=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B8=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D0=B9:=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 109 +++++++----------- 1 file changed, 42 insertions(+), 67 deletions(-) diff --git a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md index 5cbd0fd..ca70550 100644 --- a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md +++ b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md @@ -1,100 +1,75 @@ # Практическое задание №3: Память и подтверждение действий ## Описание проекта -В этом проекте реализован агент на базе LangGraph с поддержкой: -- **Памяти разговора** – сохранение истории сообщений в `MemorySaver`. -- **Подтверждения действия** – пауза перед вызовом любого инструмента, чтобы пользователь мог подтвердить или отменить действие. +В этом задании вы доработаете агента из предыдущих практических работ, добавив: +- **Память разговора** – агент будет помнить все сообщения в рамках одного диалога. +- **Механизм подтверждения** каждого вызова инструмента пользователем. -Агент использует модель GPT‑4o‑mini и простой инструмент поиска. Вывод осуществляется через библиотеку `rich`, что делает консольный интерфейс более читаемым. +Для красивого вывода в консоль используется библиотека `rich`. +Агент реализован на основе LangGraph и использует OpenAI LLM через `langchain_openai`. ---- +## Структура проекта +``` +project/ +├── solution.py # Основной скрипт с реализацией агента +└── README.md # Это файл +``` ## Установка зависимостей ```bash -# Создайте виртуальное окружение (необязательно, но рекомендуется) +# Создайте виртуальное окружение (рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты -pip install -r requirements.txt +pip install rich langgraph langchain_openai openai ``` -`requirements.txt` содержит: - -```text -langchain-openai>=0.2.0 -langgraph>=0.1.0 -rich>=13.0.0 -python-dotenv # для удобного управления переменными окружения (необязательно) -``` - -> **Важно**: Установите ключ OpenAI в переменной окружения `OPENAI_API_KEY`. -> Можно создать файл `.env` с содержимым: -> ```dotenv -> OPENAI_API_KEY=sk-... +> **Важно** +> Для работы с OpenAI вам понадобится переменная окружения `OPENAI_API_KEY`. +> ```bash +> export OPENAI_API_KEY="sk-..." > ``` ---- +## Запуск скрипта -## Запуск - -### 1. Основной скрипт (`solution.py`) ```bash python solution.py ``` -Скрипт запускает интерактивный чат‑бот, который: -1. Принимает ввод пользователя. -2. Пауза перед каждым вызовом инструмента `search`. -3. Показывает пользователю сообщение о предстоящем действии и ожидает подтверждения (`y`/`n`). -4. Если пользователь подтверждает – инструмент вызывается; иначе действие отменяется. +Скрипт запускает интерактивный чат. Введите сообщение, и агент ответит, используя инструмент `echo_tool` при необходимости. Перед каждым вызовом инструмента пользователь будет запрашиваться о подтверждении. -### 2. Тестовый скрипт (если есть) -Если в проекте присутствует файл `test_solution.py`, его можно запустить так: +### Пример работы -```bash -pytest test_solution.py ``` - ---- - -## Пример использования - -```text $ python solution.py -🤖: Здравствуйте! Чем могу помочь? -🧑: Какую погоду будет завтра в Москве? - -🤖: Я собираюсь выполнить поиск по запросу "погода завтра Москва". Продолжить? (y/n) y -🔍 Выполняю инструмент search... -Результаты поиска по запросу 'погода завтра Москва': ... - -🤖: Похоже, завтра в Москве будет облачно с небольшой вероятностью осадков. Есть ли ещё что‑то, чем могу помочь? +🤖: Hello! How can I help you today? +🧑: Tell me a joke. +🤔 (пауза) Вы хотите вызвать инструмент? [y/n]: y +🤖: Why did the scarecrow win an award? Because he was outstanding in his field! ``` -Если пользователь вводит `n`: - -```text -🤖: Я собираюсь выполнить поиск по запросу "погода завтра Москва". Продолжить? (y/n) n -🤖: Операция отменена. Чем ещё могу помочь? -``` - ---- - ## Как это работает -1. **MemorySaver** сохраняет состояние разговора, позволяя агенту помнить предыдущие сообщения. -2. `interrupt_before=['tools']` заставляет агент остановиться перед каждым вызовом инструмента. -3. Внутри цикла обработки сообщений пользователь получает запрос на подтверждение и вводит `y`/`n`. -4. После подтверждения инструмент вызывается через LangGraph, а результат возвращается в поток. +1. **Память** + - `MemorySaver` сохраняет состояние диалога. + - Каждый запрос отправляется с конфигурацией `{"configurable": {"thread_id": "разговор-1"}}`, чтобы все сообщения в рамках одного разговора были связаны. + +2. **Подтверждение** + - Параметр `interrupt_before=["tools"]` заставляет агент остановиться перед вызовом любого инструмента. + - В момент паузы пользователь получает запрос на подтверждение (`y/n`). Если ответ `n`, инструмент не вызывается, и агент продолжает работу. + +3. **Инструмент** + - Простой эхо‑инструмент `echo_tool` возвращает введённый текст. Его можно заменить любым другим действием (поиск в интернете, работа с базой данных и т.д.). + +## Что дальше + +- Добавьте более сложные инструменты. +- Реализуйте сохранение диалогов в файл или БД для дальнейшего анализа. +- Настройте разные `thread_id` для параллельных разговоров. --- -## Что можно улучшить - -- Добавить более сложные инструменты (например, API погоды). -- Реализовать хранение истории в базе данных вместо памяти в RAM. -- Поддержать несколько параллельных разговоров с разными `thread_id`. - ---- \ No newline at end of file +**Автор:** *[Ваше имя]* +**Дата:** 27 мая 2026 г. \ No newline at end of file