timsmykov's picture
Update app.py
a6f9b2b verified
raw
history blame
7.28 kB
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
@tool
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()