6.8 KiB
Техническое задание (Версия 2.0): Интеграция AI-аналитики в parser-service
Задача: Модифицировать существующий parser-service для обогащения новостей аналитическими данными (саммари, теги, тональность) в момент парсинга, перед сохранением в базу данных.
Контекст: Мы отказываемся от создания отдельного analytics-service в пользу более простой, монолитной архитектуры. Аналитика должна стать неотъемлемой частью процесса парсинга. Каждая новость, попадающая в базу данных, должна уже содержать сгенерированные AI-данные.
1. Архитектурные изменения
- Никаких новых сервисов. Вся логика реализуется внутри существующего
parser-service. - Синхронный процесс: Новый воркфлоу для каждой новости: Парсинг -> Аналитика -> Сохранение в MongoDB.
- Новый компонент: Внутри
parser-serviceнеобходимо создать новый сервис/компонент (например,OllamaAnalyticsService), который будет отвечать за все взаимодействия с API Ollama.
2. Основные требования
2.1. Создание OllamaAnalyticsService
В проекте parser-service создайте новый сервис, который будет инкапсулировать логику общения с Ollama.
- Взаимодействие с API Ollama:
- Хост:
http://185.35.223.45:11434 - Модель:
gemma3:1b - Клиент: Использовать
WebClientдля HTTP-запросов к эндпоинту/api/generate.
- Хост:
- Основной метод: У сервиса должен быть публичный метод, например
Analytics analyzeText(String text), который принимает сырой текст статьи и возвращает готовый объектAnalyticsсо всеми заполненными полями.
2.2. Модификация существующих парсеров
Необходимо изменить логику каждого существующего парсера (KursivParserService, KapitalParserService и т.д.).
Новый алгоритм работы для метода parseAndSaveRssFeed():
- Получить и разобрать данные из RSS-ленты.
- Для каждой новости, после извлечения
raw_text, вызвать методanalyzeTextиз новогоOllamaAnalyticsService. - Получить в ответ заполненный объект
Analytics. - Установить этот объект в поле
analyticsу сущностиMarketItem. - Только после этого сохранить полностью обогащенный
MarketItemв MongoDB.
Примерный псевдокод для KursivParserService:
@Service
public class KursivParserService implements ParserService {
@Autowired
private OllamaAnalyticsService analyticsService; // Новый сервис
@Autowired
private MarketItemRepository repository;
@Override
public List<MarketItem> parseAndSaveRssFeed() {
// ... логика получения данных из RSS ...
for (RssItem rssItem : feedItems) {
MarketItem marketItem = new MarketItem();
marketItem.setTitle(rssItem.getTitle());
marketItem.setRawText(rssItem.getText());
// ... установить остальные поля ...
// === НОВЫЙ ШАГ ===
// Вызываем аналитику ПЕРЕД сохранением
Analytics analyticsData = analyticsService.analyzeText(rssItem.getText());
marketItem.setAnalytics(analyticsData);
// ==================
// Сохраняем уже обогащенный объект
repository.save(marketItem);
}
// ... вернуть результат ...
}
}
2.3. Промпты для Ollama
Используйте следующие промпты для каждой аналитической задачи внутри OllamaAnalyticsService:
- Саммари:
Напиши краткое саммари следующей новостной статьи на русском языке. Ответ должен содержать только саммари из 3-4 предложений, без лишних вступлений. Статья: [Текст статьи] - Теги:
Извлеки 5-7 ключевых слов или тегов из текста новостной статьи. В ответе дай только список тегов через запятую, без нумерации и заголовков. Статья: [Текст статьи] - Тональность:
Определи тональность текста новостной статьи. В ответе дай только одно слово латиницей: positive, negative или neutral. Статья: [Текст статьи] - Сущности (JSON):
Извлеки из текста имена людей, названия компаний и географические локации. В ответе дай только JSON объект следующей структуры: {"persons": [], "companies": [], "locations": []}. Статья: [Текст статьи]
Критерии выполнения
- Новый сервис
OllamaAnalyticsServiceсоздан внутри проектаparser-service. - Существующие парсеры (
KursivParserServiceи др.) модифицированы для вызоваOllamaAnalyticsServiceперед сохранением данных. - Все новые записи, сохраняемые в MongoDB, сразу содержат заполненное поле
analytics. - Процесс парсинга теперь может занимать больше времени, это ожидаемое поведение.
- Реализована базовая обработка ошибок (например, если Ollama недоступен, поле
analyticsостается пустым, но парсинг не прерывается).