From 9b21da1d7611644dd91e62d8168c392d2ce10b16 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:25:37 +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 | 139 +++++++++--------- 1 file changed, 72 insertions(+), 67 deletions(-) diff --git a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md index c0e5347..69ef94e 100644 --- a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md +++ b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md @@ -1,102 +1,107 @@ # Практическое задание №3 – Память и подтверждение действий ## Описание проекта -В этом задании вы дорабатываете агента из предыдущих практических работ. -Новые возможности: -* **Память разговора** – агент запоминает все сообщения в рамках одного диалога. -* **Подтверждение перед вызовом инструмента** – пользователь подтверждает каждый запрос к инструменту. +В этом проекте реализован чат‑бот, построенный на **LangGraph** и **OpenAI LLM**, с добавленной памятью диалога и механизмом подтверждения каждого вызова инструмента пользователем. +Бот умеет: -Для красивого вывода используется библиотека `rich`. +- хранить историю общения в памяти (`MemorySaver`); +- прерываться перед каждым использованием внешнего инструмента (пауза `interrupt_before=['tools']`); +- запрашивать у пользователя подтверждение, прежде чем выполнять инструмент. + +## Структура проекта -## Структура репозитория ``` -project/ -├── solution.py # Основной скрипт с реализацией агента -└── README.md # Это файл +. +├── solution.py # основной скрипт с реализацией агента +└── README.md # это файл ``` ---- - ## Установка зависимостей ```bash -# Создайте виртуальное окружение (рекомендуется) +# Создайте виртуальное окружение (необязательно, но рекомендуется) python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты -pip install langchain-openai langgraph rich +pip install langgraph langchain openai rich ``` -> **Важно** -> Для работы с `ChatOpenAI` вам понадобится переменная окружения `OPENAI_API_KEY`. -> ```bash -> export OPENAI_API_KEY="sk-..." -> ``` +> **Важно** – для работы с OpenAI нужен ключ API. +> Если переменная окружения `OPENAI_API_KEY` не задана, скрипт автоматически создаст «заглушку» LLM, которая возвращает фиктивный ответ. ---- - -## Запуск проекта - -### 1. Откройте терминал и перейдите в корневую папку проекта. - -```bash -cd /путь/к/project -``` - -### 2. Активируйте виртуальное окружение (если не сделали это ранее). - -```bash -source .venv/bin/activate # Windows: .venv\Scripts\activate -``` - -### 3. Запустите скрипт `solution.py`. +## Как запустить ```bash python solution.py ``` -> Скрипт запускает интерактивный диалог с агентом. -> Введите сообщение, после чего агент предложит вам подтвердить вызов инструмента (в данном случае – эхо‑инструмент). -> Нажмите **Y** для подтверждения или **N** для отмены. +После запуска бот будет ждать ввода пользователя в консоли. +Пример взаимодействия: ---- +``` +User: Привет! +Bot: Здравствуйте! Чем могу помочь? +User: Сколько стоит 1 кг яблок? +Bot (пауза): Вы хотите вызвать инструмент "price_lookup" с аргументами {"item": "яблоки", "quantity_kg": 1}? +(Введите `yes` или `no`) +User: yes +Bot: Цена за 1 кг яблок составляет $3.50. +``` + +> В реальном запуске бот будет использовать OpenAI GPT‑4o (или другой выбранный LLM) и ваш собственный инструмент, который вы можете добавить в список `tools`. ## Пример использования -```text -$ python solution.py -🤖 Здравствуйте! Чем могу помочь? -User: Какой сегодня день недели? -🤖 (подтверждение) Вы хотите вызвать инструмент echo_tool с аргументом {"message": "Какой сегодня день недели?"}? -Y -✅ Эхо: Какой сегодня день недели? -🤖 Что ещё интересует вас? +```python +from langgraph.prebuilt import create_agent +from langchain.tools import BaseTool +from langgraph.checkpoint.memory import MemorySaver +from rich.console import Console + +# 1. Создаём LLM (или заглушку) +llm = ChatOpenAI(temperature=0) + +# 2. Определяем инструмент +class EchoTool(BaseTool): + name: str = "echo" + description: str = "Возвращает переданный текст." + def _run(self, text: str) -> str: + return f"Echo: {text}" + +tools = [EchoTool()] + +# 3. Создаём память +memory = MemorySaver() + +# 4. Конфигурируем агента с паузой и подтверждением +agent = create_agent( + model=llm, + tools=tools, + system_prompt="You are a helpful assistant.", + checkpointer=memory, # нужна для памяти и паузы + interrupt_before=['tools'], # остановка перед каждым вызовом инструмента +) + +# 5. Запускаем диалог +console = Console() +config = {"configurable": {"thread_id": "demo-thread"}} + +for chunk in agent.stream( + {"messages": [{"role": "user", "content": "Привет!"}]}, + config=config, + ): + console.print(chunk) ``` -* `🤖` – вывод агента. -* `User:` – ваш ввод. -* `✅` – результат работы инструмента после подтверждения. - ---- - -## Как это работает - -1. **MemorySaver** сохраняет все сообщения в состоянии графа, позволяя агенту «помнить» историю диалога. -2. Параметр `interrupt_before=['tools']` заставляет агент остановиться перед каждым вызовом инструмента и запросить подтверждение от пользователя. -3. Библиотека `rich` используется для красивого форматирования вывода в консоли. - ---- - ## Что дальше -* Добавьте собственные инструменты (например, поиск в интернете, вычисления и т.д.). -* Измените `system_prompt`, чтобы агент отвечал в нужном стиле. -* Попробуйте запустить несколько диалогов с разными `thread_id` – они будут независимыми. +- Добавьте собственные инструменты (например, поиск в интернете, работа с базой данных и т.д.). +- Настройте более сложный `system_prompt` для конкретных задач. +- Используйте разные `thread_id`, чтобы вести несколько независимых разговоров одновременно. --- -## Поддержка - -Если возникли вопросы или проблемы, откройте issue в репозитории. \ No newline at end of file +**Автор:** *Ваша команда* +**Дата:** 27 мая 2026 г. \ No newline at end of file