From d3c8d75b541bdad07622fa71272c123ed79ff26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D0=BD=D0=B0=D1=80=20=D0=9C=D0=B8=D1=80=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D0=B8=D1=82=D0=BE=D0=B2?= Date: Tue, 12 May 2026 21:57:50 +0000 Subject: [PATCH] Add answer.md --- answer.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 answer.md diff --git a/answer.md b/answer.md new file mode 100644 index 0000000..d636765 --- /dev/null +++ b/answer.md @@ -0,0 +1,26 @@ +{ + "task": { + "_id": "6997111cd6d3a5544a3deffd", + "title": "Создайть просто AI агент на Python с применением langchain", + "description": "# Практическое задание: AI-агент на LangChain\n\n## Цель\n\nНаписать Python-скрипт, реализующий **иерархического AI-агента** с использованием библиотеки LangChain и локальной языковой модели.\n\n---\n\n## Контекст\n\n**AI-агент** — это языковая модель, которая умеет вызывать инструменты (функции) и принимать решения о том, какой инструмент использовать для ответа на вопрос пользователя.\n\n**Иерархический агент** — это агент, у которого один из инструментов сам является агентом. Такой подход позволяет декомпозировать сложные задачи.\n\n---\n\n## Стек\n\n- Python 3.10+\n- [LangChain](https://python.langchain.com/) — фреймворк для построения агентов\n- [LM Studio](https://lmstudio.ai/) — локальный сервер языковых моделей (поднимается на `http://localhost:1234`)\n\n### Установка зависимостей\n\n```\npip install langchain==1.2.10 langchain-openai==1.1.9\n```\n\n---\n\n## Задание\n\nРеализуй агента-помощника по **планированию списка покупок**. Агент должен уметь:\n\n1. Принимать от пользователя список продуктов\n2. Для каждого продукта узнавать примерную цену (через отдельный субагент)\n3. Считать итоговую стоимость корзины\n\n### Требования к реализации\n\n#### 1. Подключение к модели\n\nПодключись к локальной LLM через OpenAI-совместимый API:\n\n```python\nfrom langchain_openai import ChatOpenAI\nfrom pydantic import SecretStr\n\nllm = ChatOpenAI(\n model='<название модели в LM Studio>',\n base_url='http://localhost:1234/v1',\n api_key=SecretStr('fake'),\n temperature=0.7,\n)\n```\n\n#### 2. Инструмент с субагентом\n\nСоздай инструмент `get_price(product: str, city: str) -> str` с декоратором `@tool`.\n\nВнутри инструмента создай **субагента** (`create_agent`), который будет генерировать реалистичную цену на продукт в указанном городе, опираясь на исторические данные о ценах. Субагент должен возвращать ответ в виде таблицы:\n\n```\n| Продукт | Цена (руб.) | Магазин |\n```\n\n#### 3. Главный агент\n\nСоздай главного агента с системным промптом `'Ты помощник по планированию покупок'`, передай ему инструмент `get_price`.\n\n#### 4. Запрос и вывод\n\nЗадай агенту вопрос в духе:\n```\nПомоги составить список покупок: молоко, хлеб, яблоки. Я нахожусь в Казани.\n```\n\nВыведи все сообщения из ответа — как промежуточные вызовы инструментов, так и финальный ответ агента.\n\n---\n\n## Подсказки\n\n### Создание агента\n\n```python\nfrom langchain.agents import create_agent\n\nagent = create_agent(\n model=llm,\n tools=[my_tool], # список инструментов (опционально)\n system_prompt='...',\n)\n```\n\n### Вызов агента\n\n```python\nanswer = agent.invoke({\n \"messages\": [\n {\"role\": \"human\", \"content\": \"твой вопрос\"}\n ]\n})\n```\n\nРезультат — словарь с ключом `messages`. Последнее сообщение (`answer['messages'][-1].content`) содержит финальный ответ.\n\n### Декоратор `@tool`\n\n```python\nfrom langchain.tools import tool\n\n@tool\ndef my_tool(param: str) -> str:\n \"\"\"Описание инструмента — модель читает его, чтобы понять, когда вызывать инструмент.\"\"\"\n ...\n return result\n```\n\n### Вывод цепочки сообщений\n\nКаждое сообщение может быть либо текстом (`message.content`), либо вызовом инструмента (`message.tool_calls`). Пример функции форматирования:\n\n```python\ndef format_message(message) -> str:\n if message.content:\n return message.content\n return f\"{message.tool_calls[0]['name']}({message.tool_calls[0]['args']})\"\n```\n\n---\n\n## Ожидаемый результат\n\nПри запуске скрипта в консоли должна появиться цепочка вроде:\n\n---\nget_price({'product': 'молоко', 'city': 'Казань'})\n---\nget_price({'product': 'хлеб', 'city': 'Казань'})\n---\nget_price({'product': 'яблоки', 'city': 'Казань'})\n---\nВот список покупок для Казани:\n\n```\n| Продукт | Цена (руб.) | Магазин |\n|---------|-------------|---------|\n| Молоко | 89 | Магнит |\n| Хлеб | 45 | Пятёрочка |\n| Яблоки | 120/кг | Перекрёсток |\n\n**Итого:** ~254 руб.\n---\n```", + "course": "698b49da77cb6d4d2e43ce78", + "lesson": { + "_id": "69948b8dbfaf8d43a8e7ef85", + "name": "Простой AI агент на Python", + "date": "2026-02-17T15:30:00.000Z", + "id": "69948b8dbfaf8d43a8e7ef85" + }, + "gradeType": "passfail", + "maxScore": 100, + "assignmentType": "individual", + "allowSubmissions": true, + "allowRevisions": true, + "creator": { + "sub": "8ae348ab-f32e-46c7-9960-8b7fdf0e4c0e", + "name": "Александр Примаков" + }, + "teamGrades": [], + "created": "2026-02-19T13:33:16.894Z", + "id": "6997111cd6d3a5544a3deffd" + } +} \ No newline at end of file