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() |