Files
brojs-task-6997111cd6d3a554…/answer.md
T
2026-05-12 21:57:50 +00:00

6.5 KiB
Raw Blame History

{ "task": { "_id": "6997111cd6d3a5544a3deffd", "title": "Создайть просто AI агент на Python с применением langchain", "description": "# Практическое задание: AI-агент на LangChain\n\n## Цель\n\nНаписать Python-скрипт, реализующий иерархического AI-агента с использованием библиотеки LangChain и локальной языковой модели.\n\n---\n\n## Контекст\n\nAI-агент — это языковая модель, которая умеет вызывать инструменты (функции) и принимать решения о том, какой инструмент использовать для ответа на вопрос пользователя.\n\nИерархический агент — это агент, у которого один из инструментов сам является агентом. Такой подход позволяет декомпозировать сложные задачи.\n\n---\n\n## Стек\n\n- Python 3.10+\n- LangChain — фреймворк для построения агентов\n- LM Studio — локальный сервер языковых моделей (поднимается на 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\npython\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\npython\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\npython\nanswer = agent.invoke({\n \"messages\": [\n {\"role\": \"human\", \"content\": \"твой вопрос\"}\n ]\n})\n\n\nРезультат — словарь с ключом messages. Последнее сообщение (answer['messages'][-1].content) содержит финальный ответ.\n\n### Декоратор @tool\n\npython\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\npython\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" } }