Skip to content

Commit 56b5a0e

Browse files
author
Alexander Cherednikov
committed
Minor fixes
1 parent 6260f73 commit 56b5a0e

4 files changed

Lines changed: 61 additions & 28 deletions

File tree

README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ rag-vectors-presentation/
126126
├── src/
127127
│ ├── Command/ # Консольные команды для демо
128128
│ ├── Service/ # Основная бизнес-логика
129-
│ │ ├── ImprovedRAGService.php # Главная RAG реализация
130-
│ │ ├── OllamaEmbeddingService.php # Векторные эмбеддинги
129+
│ │ ├── RAGService.php # Главная RAG реализация
130+
│ │ ├── EmbeddingConfigService.php # Векторные эмбеддинги
131131
│ │ └── LlamaService.php # Интеграция с LLM
132132
│ ├── DTO/ # Объекты передачи данных
133133
│ └── Exception/ # Кастомные исключения
@@ -167,19 +167,16 @@ rag-vectors-presentation/
167167

168168
### Смена модели
169169

170-
Чтобы использовать другую модель, измените её в файлах:
170+
Чтобы использовать другую модель, измените её в файле:
171171

172-
1. **src/Service/Embedding/TransformersEmbeddingService.php** (строка ~30)
173-
2. **src/Service/ImprovedRAGService.php** (строка ~200)
174-
3. **src/Command/ProductsSearchCommand.php** (строка ~68)
175-
4. **src/Command/ProductsVectorizeCommand.php** (строка ~109)
172+
1. **src/Service/EmbeddingConfigService.php** (константа EMBEDDING_MODEL)
176173

177174
```php
178-
// Заменить эту строку:
179-
$this->embedder = pipeline(Task::Embeddings, 'onnx-community/Qwen3-Embedding-0.6B-ONNX');
175+
// В src/Service/EmbeddingConfigService.php заменить:
176+
private const string EMBEDDING_MODEL = 'onnx-community/Qwen3-Embedding-0.6B-ONNX';
180177

181178
// На выбранную модель:
182-
$this->embedder = pipeline(Task::Embeddings, 'onnx-community/all-MiniLM-L6-v2');
179+
private const string EMBEDDING_MODEL = 'onnx-community/all-MiniLM-L6-v2';
183180
```
184181

185182
> ⚠️ **Важно**: При смене модели нужно заново проиндексировать товары командой `php bin/console products:vectorize`
@@ -235,26 +232,29 @@ curl http://localhost:11434/api/tags
235232

236233
```php
237234
// Прямое использование сервиса
238-
$ragService = $container->get(ImprovedRAGService::class);
239-
$result = $ragService->search("мощная видеокарта для игр");
240-
241-
echo "Запрос: " . $result->query . "\n";
242-
echo "Ответ: " . $result->response . "\n";
243-
foreach ($result->products as $product) {
244-
echo "- {$product['name']} (релевантность: {$product['similarity']})\n";
235+
$ragService = $container->get(RAGService::class);
236+
$result = $ragService->searchWithContext("мощная видеокарта для игр", "session_id");
237+
238+
echo "Исходный запрос: " . $result->originalQuery . "\n";
239+
echo "Оптимизированный запрос: " . $result->optimizedQuery . "\n";
240+
echo "AI Ответ: " . $result->aiResponse . "\n";
241+
foreach ($result->documents as $doc) {
242+
echo "- {$doc['payload']['name']} (релевантность: " . round($doc['score'] * 100, 1) . "%)\n";
245243
}
246244
```
247245

248246
### Кастомная RAG реализация
249247

250248
```php
251-
use App\Service\RAGServiceInterface;
249+
use App\Service\RAGService;
250+
use App\DTO\RAGSearchResult;
252251

253-
class MyCustomRAGService implements RAGServiceInterface
252+
class MyCustomRAGService extends RAGService
254253
{
255-
public function search(string $userQuery): RAGSearchResult
254+
public function searchWithContext(string $userQuery, string $sessionId): RAGSearchResult
256255
{
257-
// Ваша логика RAG здесь
256+
// Ваша кастомная логика RAG здесь
257+
return parent::searchWithContext($userQuery, $sessionId);
258258
}
259259
}
260260
```

src/Command/ProductsChatCommand.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ private function handleSearchQuery(string $query, SymfonyStyle $io): void
6868
if ($result->hasResults()) {
6969
$this->displayChatResults($result->documents, $result->aiResponse, $io);
7070
} else {
71-
$io->warning('Товары не найдены');
71+
$io->warning('Товары не найдены в базе данных');
72+
$io->text('Попробуйте изменить формулировку запроса или использовать другие ключевые слова.');
7273
}
7374
} catch (\Exception $e) {
7475
$io->error('Ошибка поиска: '.$e->getMessage());
@@ -80,12 +81,27 @@ private function handleSearchQuery(string $query, SymfonyStyle $io): void
8081
*/
8182
private function displayChatResults(array $results, string $aiResponse, SymfonyStyle $io): void
8283
{
83-
$io->section('Рекомендации');
84+
$io->section('Найдено товаров в БД: '.count($results));
8485

86+
$tableData = [];
87+
foreach ($results as $i => $result) {
88+
$payload = $result['payload'] ?? [];
89+
$score = $result['score'] ?? 0;
90+
$name = $payload['name'] ?? 'Неизвестно';
91+
$brand = $payload['brand'] ?? 'Н/Д';
92+
$price = isset($payload['price']) ? number_format($payload['price'] / 100, 0, '.', ' ').'' : 'Н/Д';
93+
$relevance = round($score * 100, 1).'%';
94+
95+
$tableData[] = [$i + 1, $name, $brand, $price, $relevance];
96+
}
97+
98+
$io->table(['#', 'Товар', 'Бренд', 'Цена', 'Релевантность'], $tableData);
99+
100+
$io->section('AI Рекомендация');
85101
$cleanResponse = strip_tags(str_replace(['**', '*', '#', '`'], '', $aiResponse));
86102
$io->text($cleanResponse);
87103

88-
$io->section('Найденные товары');
104+
$io->section('Подробное описание товаров');
89105

90106
foreach ($results as $i => $result) {
91107
if (!isset($result['payload'])) {

src/Command/RAGDemoCommand.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ private function displayRAGSteps(RAGSearchResult $result, SymfonyStyle $io): voi
138138
private function displayCompactResult(RAGSearchResult $result, SymfonyStyle $io): void
139139
{
140140
if ($result->hasResults()) {
141+
// Показываем найденные товары компактно
142+
$io->text('Найдено товаров: '.$result->getResultCount());
143+
144+
$tableData = array_map(function (array $doc, int $i): array {
145+
$payload = $doc['payload'];
146+
$price = number_format($payload['price'] / 100, 0, '.', ' ').'';
147+
$relevance = round($doc['score'] * 100, 1).'%';
148+
149+
return [$i + 1, $payload['name'], $payload['brand'], $price, $relevance];
150+
}, $result->documents, array_keys($result->documents));
151+
152+
$io->table(['#', 'Товар', 'Бренд', 'Цена', 'Релевантность'], $tableData);
153+
154+
// AI Рекомендация
141155
$io->text('AI Рекомендация:');
142156
$io->block($result->aiResponse, null, 'fg=green');
143157
} else {

src/Service/LlamaService.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,20 @@ private function buildConstrainedResponsePrompt(array $searchResults, string $or
163163
НАЙДЕННЫЕ ТОВАРЫ (только эти товары существуют в наличии):
164164
$resultsText
165165
166-
СТРОГИЕ ПРАВИЛА:
166+
КРИТИЧЕСКИ ВАЖНЫЕ ПРАВИЛА:
167167
1. Рекомендуй ТОЛЬКО товары из списка выше
168168
2. НЕ упоминай товары, которых нет в списке
169-
3. НЕ добавляй информацию о характеристиках, которых нет в описании
170-
4. Выбери ОДИН лучший товар из списка
169+
3. ЗАПРЕЩЕНО добавлять любую информацию о характеристиках (количество ядер, архитектура, частоты), которой НЕТ в описании товара
170+
4. Используй ТОЛЬКО информацию из поля "Описание" каждого товара
171+
5. Выбери ОДИН лучший товар из списка
171172
172173
ЗАДАЧА: Дай краткую профессиональную рекомендацию (2-3 предложения):
173174
- Какой товар из списка лучше всего подходит
174-
- Почему именно этот вариант (на основе описания и категории)
175+
- Почему именно этот вариант (основываясь СТРОГО на тексте описания)
175176
- Укажи точную цену
176177
178+
ВАЖНО: НЕ придумывай технические характеристики - используй только текст из описания товара.
179+
177180
Пиши на русском языке, будь дружелюбным и компетентным.
178181
PROMPT;
179182
}

0 commit comments

Comments
 (0)