Spaces:
Runtime error
Runtime error
| from smolagents import CodeAgent, HfApiModel, load_tool | |
| import yaml | |
| from smolagents import tool | |
| from duckduckgo_search import DDGS | |
| from tools.final_answer import FinalAnswerTool | |
| from Gradio_UI import GradioUI | |
| def DuckDuckGoSearchTool(query: str) -> str: | |
| """ | |
| Инструмент для поиска информации в интернете с помощью DuckDuckGo. | |
| Args: | |
| query: Поисковый запрос. | |
| """ | |
| with DDGS() as ddgs: | |
| results = [r for r in ddgs.text(query, max_results=5)] # Ограничиваем до 5 результатов | |
| if not results: | |
| return "По вашему запросу ничего не найдено." | |
| formatted_results = "\n\n".join( | |
| f"**Заголовок:** {r['title']}\n**Ссылка:** {r['href']}\n**Краткое содержание:** {r['body']}" | |
| for r in results | |
| ) | |
| return formatted_results | |
| final_answer = FinalAnswerTool() | |
| model = HfApiModel( | |
| max_tokens=2096, | |
| temperature=0.5, | |
| model_id='Qwen/Qwen2.5-Coder-32B-Instruct', # Возможно, эта модель перегружена | |
| custom_role_conversions=None, | |
| ) | |
| # Import tool from Hub | |
| image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) | |
| with open("prompts.yaml", 'r') as stream: | |
| prompt_templates = yaml.safe_load(stream) | |
| # Ключевое изменение: обновленный system_prompt в стиле Thought-Action-Observation | |
| system_prompt = """ | |
| Ты — профессиональный поисковый ассистент, аналог Perplexity. Твоя задача — предоставлять исчерпывающие и точные ответы на запросы пользователей, основываясь на информации из нескольких источников в интернете. | |
| Ты должен действовать в цикле **Thought-Action-Observation**: | |
| * **Thought:** Сначала обдумай задачу. Определи, какую информацию нужно найти и какие шаги предпринять. Сформулируй план действий. *Всегда начинай с Thought.* | |
| * **Action:** Выполни действие, используя доступные инструменты. В твоем распоряжении *только* инструмент `DuckDuckGoSearchTool` для поиска и `final_answer` для окончательного ответа. Используй `DuckDuckGoSearchTool` с правильным аргументом (`query`). Код должен быть на Python и заключен в теги ` ```py ` и ` ```<end_code> `. | |
| * **Observation:** Получи результат действия (вывод `print()` в коде). Оцени результат. Если нужно, перейди к следующему шагу (Thought). Если ответ найден, используй `final_answer`. | |
| **Правила:** | |
| 1. **Всегда следуй циклу Thought-Action-Observation.** Каждый шаг должен присутствовать. | |
| 2. **Используй только доступные инструменты.** Не выдумывай несуществующие инструменты. | |
| 3. **Правильно вызывай инструменты.** Передавай аргументы *напрямую*, а не в виде словаря. Например, `DuckDuckGoSearchTool(query="столица Франции")`, а не `DuckDuckGoSearchTool({"query": "столица Франции"})`. | |
| 4. **Анализируй несколько источников.** Не ограничивайся одним результатом поиска. | |
| 5. **Формируй сводку (саммари).** Ответ должен быть кратким, ёмким и содержать ссылки на источники (или названия сайтов, если ссылки не помещаются). | |
| 6. **Пиши на русском языке.** | |
| 7. **Если информации недостаточно, сообщи об этом.** Не придумывай ответ. | |
| 8. **Не сохраняй результаты поиска в переменные для следующего шага. Используй `print()`.** Результат `print()` автоматически попадет в Observation. Это *единственный* способ передать информацию между шагами. | |
| 9. **Переменные сохраняются между шагами.** Если ты определил переменную на одном шаге, она будет доступна на следующих. | |
| 10. **Нельзя использовать один и тот же запрос дважды.** Если ты уже искал что-то, не повторяй поиск с тем же запросом. | |
| **Пример (не копируй его полностью, адаптируй под задачу):** | |
| Пользователь: Какая самая высокая гора в мире? | |
| Thought: Мне нужно найти самую высокую гору в мире. Я буду использовать DuckDuckGoSearchTool для поиска информации. | |
| Action: | |
| ```py | |
| print(DuckDuckGoSearchTool(query="самая высокая гора в мире")) | |
| ```<end_code> | |
| Observation: (Здесь будет вывод DuckDuckGoSearchTool, содержащий несколько результатов поиска) | |
| Thought: Я получил несколько результатов. Нужно проанализировать их, найти наиболее авторитетные источники и убедиться, что информация совпадает. Затем я сформирую сводку и верну ответ. | |
| Action: | |
| ```py | |
| # (Здесь мог бы быть код для дополнительного анализа, если бы были другие инструменты. | |
| # Но так как у нас только DuckDuckGoSearchTool, | |
| # мы предполагаем, что первый шаг уже дал достаточно информации) | |
| final_answer("Самая высокая гора в мире - Эверест (Джомолунгма). Высота - 8848.86 метров. Источники: Википедия (ссылка), National Geographic (ссылка).") | |
| ```<end_code> | |
| --- | |
| Доступные тебе инструменты: | |
| {%- for tool in tools.values() %} | |
| - {{ tool.name }}: {{ tool.description }} | |
| Takes inputs: {{tool.inputs}} | |
| Returns an output of type: {{tool.output_type}} | |
| {%- endfor %} | |
| Начни! | |
| """ | |
| prompt_templates['system_prompt'] = system_prompt | |
| agent = CodeAgent( | |
| model=model, | |
| tools=[DuckDuckGoSearchTool, final_answer, image_generation_tool], | |
| max_steps=6, | |
| verbosity_level=1, | |
| grammar=None, | |
| planning_interval=None, | |
| name=None, | |
| description=None, | |
| prompt_templates=prompt_templates | |
| ) | |
| GradioUI(agent).launch() |