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

26 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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"
}
}