Update app.py
Browse files
app.py
CHANGED
|
@@ -7,56 +7,73 @@ from tools.final_answer import FinalAnswerTool
|
|
| 7 |
from Gradio_UI import GradioUI
|
| 8 |
|
| 9 |
@tool
|
| 10 |
-
def
|
| 11 |
"""Генерирует релевантные ключевые слова для заданной темы
|
| 12 |
Args:
|
| 13 |
-
topic:
|
| 14 |
-
|
| 15 |
"""
|
| 16 |
import random
|
| 17 |
-
from
|
| 18 |
|
| 19 |
-
#
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
"обзор", "курс", "уроки", "для начинающих",
|
| 24 |
-
"2023", "идеи", "примеры", "методы", "технологии",
|
| 25 |
-
"тренды", "планы", "стоимость", "бесплатно", "преимущества"
|
| 26 |
-
]
|
| 27 |
-
|
| 28 |
-
# Разбиваем тему на основные слова
|
| 29 |
-
seed_words = [word.strip() for word in topic.split() if len(word) > 3]
|
| 30 |
|
| 31 |
-
#
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
|
| 39 |
-
#
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
candidates.add(f"{topic} {modifier}")
|
| 43 |
-
for word in seed_words:
|
| 44 |
-
candidates.add(f"{modifier} {word}")
|
| 45 |
-
candidates.add(f"{word} {modifier}")
|
| 46 |
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
-
#
|
| 55 |
-
|
| 56 |
-
|
|
|
|
| 57 |
|
| 58 |
-
|
| 59 |
-
return ", ".join(results[:max(max_results, 1)])
|
| 60 |
|
| 61 |
# Initialize components
|
| 62 |
final_answer = FinalAnswerTool()
|
|
@@ -80,7 +97,7 @@ with open("prompts.yaml", 'r') as stream:
|
|
| 80 |
agent = CodeAgent(
|
| 81 |
tools=[
|
| 82 |
image_generation_tool,
|
| 83 |
-
|
| 84 |
final_answer,
|
| 85 |
DuckDuckGoSearchTool()
|
| 86 |
],
|
|
|
|
| 7 |
from Gradio_UI import GradioUI
|
| 8 |
|
| 9 |
@tool
|
| 10 |
+
def generate_keywords(topic: str, max_keywords: int = 30) -> str:
|
| 11 |
"""Генерирует релевантные ключевые слова для заданной темы
|
| 12 |
Args:
|
| 13 |
+
topic: Тема для генерации (на русском языке)
|
| 14 |
+
max_keywords: Максимальное количество возвращаемых ключевых слов
|
| 15 |
"""
|
| 16 |
import random
|
| 17 |
+
from collections import deque
|
| 18 |
|
| 19 |
+
# Инициализация компонентов генерации
|
| 20 |
+
base_words = [w.strip().lower() for w in topic.split() if len(w) > 2]
|
| 21 |
+
if not base_words:
|
| 22 |
+
return "Необходимо указать более конкретную тему"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
+
# Паттерны для генерации
|
| 25 |
+
patterns = [
|
| 26 |
+
["вопросы", "что такое", "как сделать", "почему", "когда", "где найти"],
|
| 27 |
+
["топ", "лучшие", "рейтинг", "самые популярные"],
|
| 28 |
+
["методы", "способы", "технологии", "решения"],
|
| 29 |
+
["обзор", "отзывы", "сравнение", "виды"],
|
| 30 |
+
["курс", "урок", "обучение", "самоучитель"],
|
| 31 |
+
["2025", "новинки", "тренды", "будущее"],
|
| 32 |
+
["для начинающих", "профессиональные", "премиум"],
|
| 33 |
+
["бесплатно", "купить", "заказать", "стоимость"],
|
| 34 |
+
["преимущества", "недостатки", "польза", "вред"],
|
| 35 |
+
["идеи", "примеры", "кейсы", "истории успеха"]
|
| 36 |
+
]
|
| 37 |
|
| 38 |
+
# Генерация вариантов
|
| 39 |
+
keywords = set()
|
| 40 |
+
queue = deque([(0, [], base_words)])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
+
while queue:
|
| 43 |
+
level, current, remaining = queue.popleft()
|
| 44 |
+
|
| 45 |
+
if level >= 3 or not remaining:
|
| 46 |
+
if current:
|
| 47 |
+
keywords.add(" ".join(current))
|
| 48 |
+
continue
|
| 49 |
+
|
| 50 |
+
# Добавляем паттерны
|
| 51 |
+
if level == 0:
|
| 52 |
+
for pattern_group in patterns:
|
| 53 |
+
for p in pattern_group:
|
| 54 |
+
new_phrase = [p] + current
|
| 55 |
+
queue.append((level+1, new_phrase, remaining))
|
| 56 |
+
|
| 57 |
+
# Комбинируем слова
|
| 58 |
+
for i in range(len(remaining)):
|
| 59 |
+
next_word = remaining[i]
|
| 60 |
+
new_phrase = current + [next_word]
|
| 61 |
+
new_remaining = remaining[:i] + remaining[i+1:]
|
| 62 |
+
queue.append((level+1, new_phrase, new_remaining))
|
| 63 |
+
|
| 64 |
+
# Добавляем модификаторы
|
| 65 |
+
modifiers = ["", "2025", "курс", "обзор", "топ", "способы"]
|
| 66 |
+
for mod in modifiers:
|
| 67 |
+
if mod:
|
| 68 |
+
modified = current + [f"{next_word}-{mod}"]
|
| 69 |
+
queue.append((level+2, modified, new_remaining))
|
| 70 |
|
| 71 |
+
# Ранжирование и выборка
|
| 72 |
+
result = sorted(keywords,
|
| 73 |
+
key=lambda x: (-len(x.split()), x))
|
| 74 |
+
random.shuffle(result[:len(result)//2])
|
| 75 |
|
| 76 |
+
return ", ".join(result[:max(max_keywords, 1)])
|
|
|
|
| 77 |
|
| 78 |
# Initialize components
|
| 79 |
final_answer = FinalAnswerTool()
|
|
|
|
| 97 |
agent = CodeAgent(
|
| 98 |
tools=[
|
| 99 |
image_generation_tool,
|
| 100 |
+
generate_keywords,
|
| 101 |
final_answer,
|
| 102 |
DuckDuckGoSearchTool()
|
| 103 |
],
|