From 1a4c854b85fb4215178d5e4a115ef85c313ae636 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:22:50 +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 | 128 ++++++++---------- 1 file changed, 53 insertions(+), 75 deletions(-) diff --git a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md index 93622cc..c0e5347 100644 --- a/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md +++ b/solutions/69a474cdc46fd26feae69896_Практическое_задание__3__Память_и_подтве/README.md @@ -1,13 +1,15 @@ -# Практическое задание №3: Память и подтверждение действий +# Практическое задание №3 – Память и подтверждение действий ## Описание проекта -В этом задании вы доработаете агента из предыдущих практических работ, добавив: -- **Память разговора** – агент будет помнить все сообщения в рамках одного диалога. -- **Механизм подтверждения** перед вызовом любого инструмента – пользователь сможет согласовать действие. +В этом задании вы дорабатываете агента из предыдущих практических работ. +Новые возможности: -Для более приятного вывода используется библиотека `rich`. +* **Память разговора** – агент запоминает все сообщения в рамках одного диалога. +* **Подтверждение перед вызовом инструмента** – пользователь подтверждает каждый запрос к инструменту. -## Структура проекта +Для красивого вывода используется библиотека `rich`. + +## Структура репозитория ``` project/ ├── solution.py # Основной скрипт с реализацией агента @@ -24,101 +26,77 @@ python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate # Установите все необходимые пакеты -pip install rich langgraph langchain-openai langchain-core +pip install langchain-openai langgraph rich ``` > **Важно** -> `langgraph` и `langchain-openai` автоматически подтянут нужные версии OpenAI SDK. -> Если у вас нет ключа API, создайте переменную окружения `OPENAI_API_KEY`. - -```bash -export OPENAI_API_KEY="sk-..." -``` +> Для работы с `ChatOpenAI` вам понадобится переменная окружения `OPENAI_API_KEY`. +> ```bash +> export OPENAI_API_KEY="sk-..." +> ``` --- -## Запуск скрипта +## Запуск проекта -### 1️⃣ Запустите файл напрямую +### 1. Откройте терминал и перейдите в корневую папку проекта. + +```bash +cd /путь/к/project +``` + +### 2. Активируйте виртуальное окружение (если не сделали это ранее). + +```bash +source .venv/bin/activate # Windows: .venv\Scripts\activate +``` + +### 3. Запустите скрипт `solution.py`. ```bash python solution.py ``` -Скрипт откроет интерактивный чат, где вы можете задавать вопросы. При каждом вызове инструмента агент сначала спросит подтверждение. +> Скрипт запускает интерактивный диалог с агентом. +> Введите сообщение, после чего агент предложит вам подтвердить вызов инструмента (в данном случае – эхо‑инструмент). +> Нажмите **Y** для подтверждения или **N** для отмены. -> **Пример** -> ``` -> Пользователь: Привет! -> Агент: Здравствуйте! Чем могу помочь? -> Пользователь: Напиши мне список покупок. -> Агент: Вы хотите вызвать инструмент `echo_tool` с аргументом `text="список покупок"`? (y/n) -> y -> Эхо: список покупок -> ``` +--- -### 2️⃣ Запуск в режиме потоковой передачи +## Пример использования -Если вы хотите видеть ответы по частям, можно запустить скрипт так: - -```bash -python solution.py --stream +```text +$ python solution.py +🤖 Здравствуйте! Чем могу помочь? +User: Какой сегодня день недели? +🤖 (подтверждение) Вы хотите вызвать инструмент echo_tool с аргументом {"message": "Какой сегодня день недели?"}? +Y +✅ Эхо: Какой сегодня день недели? +🤖 Что ещё интересует вас? ``` -Внутри `solution.py` реализован флаг `--stream`, который переключает режим вывода. +* `🤖` – вывод агента. +* `User:` – ваш ввод. +* `✅` – результат работы инструмента после подтверждения. --- -## Пример использования кода +## Как это работает -```python -from rich.console import Console -from langgraph.checkpoint.memory import MemorySaver -from langgraph.prebuilt import create_chat_agent -from langchain_openai import ChatOpenAI - -# 1. Консоль для красивого вывода -console = Console() - -# 2. Создаём LLM -llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) - -# 3. Определяем инструмент -def echo_tool(args: dict) -> str: - return f"Эхо: {args.get('text', '')}" - -# 4. Память и агент с паузой перед инструментом -memory = MemorySaver() -agent = create_chat_agent( - llm=llm, - tools=[echo_tool], - system_prompt="Ты — полезный ассистент, который сначала спрашивает подтверждение перед вызовом инструмента.", - checkpointer=memory, - interrupt_before=['tools'], # остановка перед каждым инструментом -) - -# 5. Запускаем диалог -config = {"configurable": {"thread_id": "разговор-1"}} -for chunk in agent.stream({"messages": [HumanMessage(content="Напиши мне список покупок")]}, config=config): - console.print(chunk) -``` +1. **MemorySaver** сохраняет все сообщения в состоянии графа, позволяя агенту «помнить» историю диалога. +2. Параметр `interrupt_before=['tools']` заставляет агент остановиться перед каждым вызовом инструмента и запросить подтверждение от пользователя. +3. Библиотека `rich` используется для красивого форматирования вывода в консоли. --- -## Что дальше? +## Что дальше -- Добавьте собственные инструменты (например, поиск в интернете, работа с файлами и т.д.). -- Изучите другие параметры `create_chat_agent`, такие как `interrupt_after` или `max_output_tokens`. -- Попробуйте использовать разные модели (`gpt-4o-mini`, `claude-3.5-sonnet` и др.) – просто поменяйте аргумент `model`. +* Добавьте собственные инструменты (например, поиск в интернете, вычисления и т.д.). +* Измените `system_prompt`, чтобы агент отвечал в нужном стиле. +* Попробуйте запустить несколько диалогов с разными `thread_id` – они будут независимыми. --- -## Полезные ссылки +## Поддержка -| Тема | Ссылка | -|------|--------| -| LangGraph Docs | https://langgraph.org/docs/ | -| LangChain OpenAI | https://python.langchain.com/docs/integrations/providers/openai | -| Rich Library | https://rich.readthedocs.io/en/latest/introduction.html | - ---- \ No newline at end of file +Если возникли вопросы или проблемы, откройте issue в репозитории. \ No newline at end of file